dizi - cobanoglu
Transkript
dizi - cobanoglu
Diziler Yrd.Doç.Dr.Bülent ÇOBANOĞLU Dizi (Array) Nedir? Bellekte sürekli yer kaplayan artarda sıralanmış aynı türden verilerin oluşturduğu kümeye dizi (array) denir. Dizi, çok fazla miktardaki tek tip verinin, tek bir isimle saklandığı / depolandığı bellek alanıdır. Diziler bir nevi bileşik değişkenlerdir. Tanımdan da anlaşılacağı üzere dizi elemanlarının “aynı tip elemanlardan oluşmuş olması” gerekir. Dizi Nasıl Tanımlanır? Dizi tanımlama şekilleri, kullanılan programlama dillerine göre farklılık gösterse de temel mantık aynıdır. Yani dizinin adı, eleman sayısı (boyutu) ve tipi belirtilir. Dizi tanımlarken; o dizinin adını ve indisini (dizi içerisindeki elemanlara erişmek amacıyla onun kaçıncı eleman olduğunu belirten numarasını) yazmak gerekir. Değişken tanımlamada olduğu gibi dizi tanımlamada da dizi elemanlarının veri tipini mutlaka belirtmemiz gerekir. Dizi Nasıl Tanımlanır? C \ C++ Tip diziadı [Eleman Sayısı]; Tamsayı dizi örnekleri (İçerisinde tamsayıları sakladığımız 6 elemanlı bir A dizisi) - int int int int A [6]; boyut=6; A[boyut]; A[] = {8, 9, 12, 4, 1, 0}; Karakter dizi örnekleri char A[] = “sau”; char A[] = {‘s’, ‘a’, ‘u’, ‘\0’}; String dizi örnekleri char *gun; char gun[][5]= {"Paz","Sali","Çarş","Per"}; string gun [7]; // C++ için Not: C\C++ dillerinde karakter boyutları tanımlanırken dikkatli olmak gerekir. Çünkü karakter (char) dizilerin en son elemanı NULL(‘\0’) olacaktır İndis (Index) Nedir? Dizilerde değişken ismini takiben parantez içerisinde belirtilen numaraya indis adı verilir. C\C++ ve Java dillerinde dizilerin ilk elemanı, 0. indisli elemanıdır. Son elemanı da dizi tanımında belirtilen eleman sayısının 1 eksiğidir. A[7] 1.eleman 2.eleman 3.eleman 4.eleman 5.eleman 6.eleman 7.eleman A[0] A[1] A[2] A[3] A[4] A[5] A[6] 5 7 9 23 45 12 04 Dizi ve indislere isim verirken dikkat edilmesi gereken hususlar: Dizileri tanımlamada değişken tanımlama kuralları geçerlidir. İndis değeri negatif olamaz. İndisler tamsayı veya tamsayı üreten bir değer olmalıdır. İndis değeri en az 1 olmalıdır. Dizi tanımlama esnasında indis değeri verilmez (yani boyutu belirtilmez) ise dizinin boyutu tanımlanan eleman sayısı kadardır. Örneğin; int A[ ]={0, 1, 2, 3, 4, 5}; şeklindeki tanımlamada dizinin boyutu 6 dır. Dizinin ilk indis değeri 0 (sıfır) dır. Dolayısıyla n elemanlı bir dizinin n. elemanının indis değeri ‘n-1’ dir. Diziler Olmasaydı, Programcı Ne Yapardı? Dizi Elemanlarına Nasıl Değer Aktarırım? Her bir elemana ayrı ayrı değer girilebilir: int dizi[100]; dizi[0] = 2; dizi[1] = 3; .. Tüm elemanlara bir kerede, dizi tanımlaması sırasında değer girilebilir: Tip dizi[ ] = { değer1, değer2, değer3, ... , değer100 }; Bir döngü içerisinde indis numarası belirtilerek değer aktarılabilir. for(int i = 0; i<100 ; i++) { dizi [i] = 5; //dizi[i]=i; } Dizi Elemanlarına Nasıl Değer Aktarırım? Örnek 1. “0, 1, 2, 3, 4, 5” sayılarını A dizisine aktarıp ekranda gösteren programı yazınız. Dizi elemanlarının dışarıdan(klavyeden) girilmesi Dizi elemanları ya da dizi boyutunu dışarıdan (klavyeden) da girebiliriz. Bunun için for döngü yapısını kullanabiliriz #include <stdio.h> #include <conio.h> main() { int Say[5]; int i, rakam; for (i= 0; i< 5; i++) { printf ("Gir dizi elemanlarini\n"); scanf("%d", &rakam); Say[i] = rakam; } printf ("Yaz diziyi ekrana \n"); for (i= 0; i< 5; i++) { printf("%d ", Say[i]); } getch(); } Soru: Dizi boyutunun dışarıdan girildiği ( N elemanlı ) bir dizinin tüm elemanlarını toplayan programı yazınız. { Eleman değerleri 1 ile 100 arasında rastgele girilsin } Fonksiyonlara parametre olarak dizi aktarımı Fonksiyona bir dizinin aktarımı aşağıdaki şekilde tanımlanır; Tip fonksiyonAdi (tip diziadi[], ….) // void notlariAl(int progNot[]) gibi Soru: ‘Programlama’ dersinden kalanların ve geçenlerin sayısını veren programı yazınız { Programlama dersine ait başarı notları bilgisayar tarafından rastgele üretilecektir}. Çözüm #include <iostream> #include <stdio.h> #include <stdlib.h> #include <time.h> using namespace std; int A[24];//genel bir dizi void notlariAl(int []); int kalanlariBul (int [], int); int main() { srand(time(0)); int kalan, gnot=50; notlariAl(A); kalan=kalanlariBul(A, gnot); cout << " kalanlar..: " << kalan; cout << " geçenler..: " << 24-kalan; return 0; } void notlariAl(int A[]) { int i; for (i=0; i<24; i++) { A[i]=1+rand()%100; cout << A[i] << " "; } } int kalanlariBul (int A[], int gnot) { int i,k=0; for (i=0;i<24;i++) { if (A[i]<gnot) k++; } return k; } Dizi Elemanlarının Sıralanması (BubbleSort Alg. göre Algoritması #include<stdlib.h> #include<stdio.h> int main() { int i,j,enk; int say[]= {50, 20, 45, 82, 25, 63, 34, 12, 23, 8}; printf ("Dizinin Sırasız hali.: "); for (i=0; i<10;i++) { printf ("%d ", say[i]); } // Dizi elemanları sıralanıyor for (i = 0; i < 10; i++) { for (j = i+1; j <= 10; j++) { if (say[i] > say[j]) { enk=say[i]; say[i]=say[j]; say[j]=enk; } } } //Kod devamı printf ("\nDizinin Sıralı hali.: "); for (i=0; i<10;i++) { printf ("%d ", say[i]); } printf("\nEn küçüğü.:%d",say[0]); printf("\nEn büyüğü.:%d",say[12]); system("PAUSE"); return 0; } İKİ BOYUTLU DİZİLER (MATRİSLER) Bellekte art arda sıralanmış satır ve sütunlardan oluşan yapıya iki boyutlu dizi ya da matris adı verilir. İki boyutlu dizileri aşağıdaki şekilde gösteririz. Matris Tanımlama: Tip Dizi_adı [satir_boyutu][sütun_boyutu]; int A [4] [7]; Örnek: Aşağıdaki matrisi oluşturup, ekranda gösteren programı yazınız. Soru: 10 kişilik bir sınıftaki öğrencilerin her birinin bir dersten aldığı 4 notu (Vize, KısaSınav1, KısaSınav2, Ödev, Final) bir A matrisine atayan ve ortalamaları ile birlikte aşağıdaki gibi ekranda gösteren programı yazınız. ÇÖZÜM #include <stdio.h>//printf,scanf #include <conio.h>//getch #include <iostream>//cout, cin #include <stdlib.h>//rand() #include <time.h>//time using namespace std; int main() { srand(time(0)); int A[10][7];// 10 satır, 7 sütunlu elemanlı int i,j; printf ("No\tKs1\tKs2\tOdev\tVize\tFinal\tOrtalama\n"); for (i=0; i<10; i++) // satırı verir { A[i][0]=i; //numaralar for (j=1; j<6; j++) // sütunu verir { A[i][j]=1+rand()%100;//notlar } A[i][6]=(A[i][1]*0.1+ A[i][2]*0.1+A[i][3]*0.2+ A[i][4]*0.6)*0.5+A[i][5]*0.5; } //Devam for (i=0;i<10;i++) { for (j=0;j<7;j++) { printf ("%d\t",A[i][j]); } printf ("\n"); //satır atla } getch(); return 0; } Örnek. 3*4 elemanlı bir A matrisinin içindeki tek sayıları tek boyutlu B dizisine, çift sayıları ise tek boyutlu C dizisine aktaran C/C++ programını yazınız. { 3*4 lük A matrisinin elemanları 1 ile 9 arasında rastgele üretilecektir} #include <stdio.h> #include <conio.h> int main() { printf ("A Matrisi\n"); int A [3][4]; int B[12]; int C[12]; int s1=0, s2=0; int i,j; //A matrisinin elemanları giriliyor for (i=0; i<3; i++){ for (j=0; j<4; j++) { A[i][j]=1+ rand()%9; printf("%d", A[i][j]); } printf("\n"); } // A matrisinden B ve C dizileri oluşturuluyor for (i=0; i<3; i++){ for (j=0; j<4; j++){ if (A[i][j]%2!=0) {B[s1]=A[i][j]; s1=s1+1;} else { C[s2]=A[i][j]; s2=s2+1;} }} printf("B dizisinin elemanları..:"); for ( i=0; i<s1; i++) { printf ("%d ", B[i]); } printf("\nC dizisinin elemanları..:"); for ( i=0; i<s2; i++) { printf("%d ", C[i]); } getch(); } Karakter Dizileri (Stringler) char *suit[4] = {"Hearts", "Diamonds", "Clubs", "Spades" }; char suit [] [10] = { "Hearts", "Diamonds", "Clubs", "Spades" }; String dizi elemanlarını ekranda alt alta gösteren program #include <iostream> #include <conio.h> using namespace std; int main() { char ad [] [10] = { "Hearts", "Diamonds", "Clubs", "Spades" }; for (int i=0; i<4; i++) { cout << ad[i] << endl; } getch(); }