12 Ocak 2015 Pazartesi

C Programlama Yapılar (Structures)

Herkese selamlar bu makalemde C Programlama Dilinde önemli bir yeri olan Yapılar (Structures) hakkında bildiklerimi paylaşmak istiyorum. 

Yapılar (structures) içinde aynı veya farklı veri tipinde birden fazla eleman saklayabildiğimiz bileşik veri tipidir. Programlarımızda değişkenleri kullandığımız için büyük önemleri vardır. Örneğin dizilerde hafızada bir takım yerler açılır, bu hafıza kısımlarını doldururken belirlemiş olduğunuz değişken tipinin dışına çıkamayız...işte yapılar saysesinde farklı veri tiplerinde birden fazla eleman saklayabiliriz.

struct insan{
       string isim;
       float boy;
       int kilo;
}insan birey; //birey nesnesi

Eğer veri tipi tanımlamayıp sadece değişken tanımlamak istiyorsak bunu şu şekilde gerçekleştirebiliriz;

struct {
       string isim;
       float boy;
       int kilo;
}birey; 

Yapılara İlk Değer Atama : Tüm değişkenlere yapabildiğimiz gibi yapı değişkenlerine de tanımları sırasında ilk değer ataması yapabiliriz.
insan birey={"ibrahim bayraktar",1,74,100}; //birey yapı değişkeni

Yapı Elemanlarına Erişim: Yapıda yer alan elemanlara, nokta (.) operatörü ile erişebiliriz.
yapıDegiskeni.elemanAdı

Örnek :
cout<<kitap1.isim;
kitap1.yayinyili+=5;
if(kitap1.baski>35)...

kitaplar kitap1,kitap2;
cin>>kitap1.isim>>kitap1.yayinyili>>kitap1.baski;
kitap2=kitap1;

Yapı Elemanlarına Erişim Örnek :
#include <stdio.h>
#include <conio.h>
#include <cstdlib>
#include <iostream>

using namespace std;
struct rasyonel_erisim //yapiyi tanımliyoruz.
{
int pay, payda;
};
int main(int argc, char *argv[])
{
    rasyonel_erisim sayi1,sayi2,sonuc;
    cout<<"1.Sayinin Pay ve Paydasini Giriniz:";
    cin>>sayi1.pay>>sayi1.payda;  //burada sayilar okunuyor
    cout<<"2.Sayinin Pay ve Paydasini Giriniz:";
    cin>>sayi2.pay>>sayi2.payda; 
    sonuc.pay=sayi1.pay * sayi2.pay;
    sonuc.payda=sayi1.payda*sayi2.payda; //pay ve paydaları carpiyoruz
    cout<< sayi1.pay<<"/"<<sayi1.payda<<" x ";
    cout<< sayi2.pay<<"/"<<sayi2.payda<<" = ";
    cout<<sonuc.pay<<"/"<<sonuc.payda<<endl; //sonucu yazdiriyoruz
    getch();
}

İç İçe Structures: Bir yapının elemanı başka bir yapı olabilir. Bu durumdaki yapılara iç içe yapı (nested structures) adı verilir.

struct tarih {
       string ay;
       int yil,gun;
}; 
struct insan {
       string isim;
       float boy;
       int  kilo;
       struct tarih dogumTarihi;
};
insan icice;
icice.dogumtarihi.gun=17;

İç İçe Structures Örnek :
#include <stdio.h>
#include <conio.h>
#include <cstdlib>
#include <iostream>

using namespace std;

struct personelBilgi {
    char * isim;
    char * soyisim;
    char * Egitim;

  };

struct personelKayit{
  char * kayitYapanPersonel;
  char * kayitTarihi;
  struct personelBilgi personel;
};

int main(){

  struct personelKayit pk001;

  pk001.kayitYapanPersonel="Ibrahim BAYRAKTAR";
  pk001.kayitTarihi="12.01.2015";
  pk001.personel.isim="FISTIKCI";
  pk001.personel.soyisim="SAHAP";
  pk001.personel.Egitim="Lisans";

  printf("Kayit Islemini Yapan Personel: %s\n", pk001.kayitYapanPersonel);
  printf("Kayit Tarihi: %s\n", pk001.kayitTarihi);

  printf("Personel Isim: %s\n", pk001.personel.isim);
  printf("Personel Soyisim: %s\n", pk001.personel.soyisim);
  printf("Personel Egitim Duzeyi: %s\n", pk001.personel.Egitim);

  getch();
}

C Programlama Dizi Örnekleri

Örnek 1: 10 tamsayıyı 10 elemanlı bir diziye okuyup içlerinden negatif olanları negatif isimli bir diziye, pozitif olanlarını pozitif isimli diziye atan program.


#include <stdio.h>
#include <conio.h>
#include <cstdlib>
#include <iostream>

using namespace std;
void yazdir(int[], int);
int main(int argc, char *argv[])
{
    int sayilar[10], pozitif[10], negatif[10];
    int poz=0, neg=0;
    cout<<"10 Sayi Giriniz: ";
    for (int i=0; i<10;i++)
    {
        cin>>sayilar[i];
        if (sayilar[i]>0) pozitif[poz++]=sayilar[i];
        else if (sayilar[i]<0) negatif[neg++]=sayilar[i];        
    }
    cout<<"Girilen Sayilar: ";
    yazdir(sayilar,10);
    cout<<"Pozitif Sayilar: ";
    yazdir(pozitif,poz);
    cout<<"Negatif Sayilar: ";
    yazdir(negatif,neg);
    getch();
}
void yazdir(int a[], int boy)
{
     for (int j=0; j<boy;j++)
         cout<<a[j]<<" ";cout<<endl;
}   
 
Örnek 2: Birincisi 3 karakterden oluşan, ikincisi 6 karakterden oluşan iki kelimeyi iki diziye okutuyoruz. İlk kelimenin tüm harflerinin ikinci kelimede olup olmadığını ekrana yazdıralım.

#include <stdio.h>
#include <conio.h>
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    char birincikelime[3], ikincikelime[6];
    bool buldum=true;
    cout<<"Birinci Kelimeyi Giriniz: ";
    cin>>birincikelime;
    cout<<"Ikinci Kelimeyi Giriniz: ";
    cin>>ikincikelime;
    for (int i=0; i<3&&buldum;i++)
    {
        buldum=false;
        for(int j=0; j<6&&!buldum;j++)
        if (birincikelime[i]==ikincikelime[j]) buldum=true;
    }
    if (buldum) cout<<birincikelime<<" kelimesinin tum harfleri "<<ikincikelime<<" kelimesinde bulunmustur.";
    else cout<<birincikelime<<" kelimesinin tum harfleri"<<ikincikelime<<" kelimesinde bulunamamistir.";
    
    getch();
}


29 Aralık 2014 Pazartesi

Java Random kullanarak Sayısal Loto Örnek

package ORNEK14;
import java.util.Random; // random sayı üretmek için gerekli sınıf
import java.util.Scanner; // kullanıcıdan girdi almak için kullanılan sınıf

public class SAYISAL_LOTO {
    
public static void main(String[] args) {
                      
 Scanner s = new Scanner(System.in); // Scanner sınıfından değişkenimizi üretiyoruz
 System.out.println("KAÇ KOLON OYNAYACAKSINIZ?(1/8)");
 int kolonsayisi = s.nextInt(); // Değeri kolon sayısı olarak kullanalım.
 int kolon[][] = new int[8][6];

 for(int i=0;i<kolonsayisi;i++ ){
     for(int j=0;j<6;j++ ){
         Random rnd = new Random();
         int sayi=1+rnd.nextInt(49);
         if(sayi!=kolon[i][j]){ // Aynı kolondaki sayılar farklı olmalı.
         kolon[i][j]=sayi;
         }
     }
 }
 System.out.println("Oynanan Kolonlar:");

 for(int i=0;i<kolonsayisi;i++ ){
     System.out.println("");

     for(int j=0;j<6;j++ ){
        
         System.out.print(  kolon[i][j] + "  ");
        
     }
 }

     }
 }

9 Kasım 2014 Pazar

SQL Server 2012 "Edit Top 200 Rows" Satır Sayısını Değiştirme

SQL Server'da tablodaki verileri görmek ve editlemek istediğimizde "Edit Top 200 Rows"u açarız, fakat tablolarımızdaki verilen kimi zaman 200'den fazla olabiliyor. 


"Edit Top 200 Rows" sınırını arttırmak  için SQL Server'da neler yapabiliriz?

"Edit Top 200 Rows" seçeneğinde varsayılan değer 200 olan satır sayısını değiştirelim ve bütün tablolara sağ tıkladığımızda "Edit Top 2000 Rows" yapalım.  Menü araç çubuğundan Tools-Options'a giriyoruz.


Açılacak olan Options penceresinde "SQL Server Object Explorer"a tıklıyoruz.


Options penceresinde sağ kısımda "Value for Edit Top <n> Rows command" satırındaki 200'ü 2000 olarak değiştiriyoruz. Artık SQL Server'da hangi tabloya sağ tıklarsak "Edit Top 2000 Rows" olarak değiştiğini görebiliriz. 


Not: Options penceresinde "Value for Edit Top <n> Rows command" altında bulunan "Value for Select Top <n> Rows command" seçeneğinden de "Select Top 1000 Rows" değişikliğinide yapabiliriz.

Eğerki bu değişikliği SQL Server için varsayılan bir değer değilde belirli bir tabloda geçici olarak yapmak istiyorsak Tablomuzun üzerine sağ tıklayıp "Edit Top 200 Rows" açıyoruz. Tablomuz edit modunda açıldıktan sonra toolbardan "Show SQL Pane" butonuna tıklıyoruz.

Query ekranına tabloyu 200 satır olarak edit modda açan SQL kodu gelecek. Bu kodda 200 yazan yeri değiştirerek toolbardan "Execute SQL" butonuna tıklıyoruz.

SQL'de Hata Fırlatmak RAISERROR Kullanımı

Bazı durumlarda SQL serverın hata fırlatmasını beklemeden kendimiz sorgunun hata fırlatıp bitmesini isteriz. Örneğin TRY CATCH ile yakalanamayan hataları kullanıcıya bildirebilmek için TRY CATCH yapısı içinde RAISERROR fonksiyonunu kullanabiliriz. Veya yazdığımız SP yada Trigger hata vermeden bizim kendi kontrollerimiz ile hata fırlatmasını sağlayabiliriz. Ayrıca bu fonksiyon ile kullanıcıya istemiş olduğumuz mesajı verme hakkına da sahibiz. İstediğimiz durum SQL Hatası olmayıp bizim koyduğumuz kontrol neticesinde bir mantık hatası olabilir.

NOT : Örnek sorgulamada Northwind Database'i kullanacağım. bk: Nortwind Database Kurulumu

Genel Yapısı:
RAISERROR('Hata Mesajımız',ERROR_SEVERITY, ERROR_STATE) [WITH LOG]
Örnek: Northwind veritabanımızda sipariş numarası girilerek kayıtların listelenmesi ile ilgili bir sorguda RAISERROR fonksiyonunu kullanalım. Öncelikle hata oluşması durumunda verilecek mesajı sisteme tanımlayalım. Bunun için;
sp_addmessage @msgnum=90001,
@severity=11,
@msgtext='GİRİLEN SİPARİŞ NUMARASI 0 DAN KÜÇÜK VE 11100 DEN BUYUK OLAMAZ',
@with_log='true'

ERROR_SEVERITY değeri olarak 11 vermemizin nedeni severity değer aralığında 11-16 arası "Kullanıcıların düzeltebileceği hatalar" anlamına gelmesidir.Sisteme  yeni mesaj eklemek için "sp_addmessage" sistem saklı prosedürü kullanılır. Mesaj numarasını 90001 olarak vermemin özel bir nedeni yok sadece bilinmesi gereken nokta SQL Server mesaj numaralarının ilk 50000'i kendisine ayırmıştır ve eklenecek mesaj numarasının 50000'den büyük olması yeterlidir. "msgtext" ise hata durumunda verilecek mesajımızdır. Kullanıcı tanımlı mesajları silmek için "sp_dropmessages" sistem saklı prosedürü kullanılır. Gelelim örneğimize;

90001 numaralı hata mesajını sisteme ekledik. Şimdi verilen sipariş numarasına göre Northwind veritabanımızda Order Details tablosu içerisinde arayarak kayıtların listelenip listelenmeyeceğinin belirlendiği bir prosedür oluşturalım.
CREATE PROCEDURE SIPARIS_URUN_LISTE
(
@ID INT=NULL
)
AS
IF @ID IS NULL
BEGIN
RAISERROR ('SIPARIS NUMARASI GIRMELISINIZ',10,1)
RETURN 0
END
IF @ID<0 OR @ID>11100
BEGIN
RAISERROR (90001,10,1)
RETURN 0
END

SELECT * FROM [Order Details]
WHERE OrderID=@ID

Stored Procedure'müzde "ID" değişkenimizi int tipinde tanımladık ve NULL değerini atadık. Prosedürümüzün çalıştırılmasında değişkenimize herhangi bir değer atanmadıysa hata mesajı RAISERROR fonksiyonuyla bize döndürülecektir.

RAISERROR Kullanımı ile ilgili Detaylı bilgi için tıklayınız.

Copyright 2013-2017 | İbrahim BAYRAKTAR /dev/null Web Günlüğü