Ders 4 - Altan MESUT - Trakya Üniversitesi

Download Report

Transcript Ders 4 - Altan MESUT - Trakya Üniversitesi

PROGRAMLAMA DİLLERİNE
GİRİŞ
Ders 4: Diziler
Yrd. Doç. Dr. Altan MESUT
Trakya Üniversitesi
Bilgisayar Mühendisliği
Dizi (Array)
• Birbiri ile ilişkili verilerin bir sıra halinde
kaydedilmesi ve işlenmesi gerektiği
durumlarda diziler kullanılır.
• Dizi içindeki elemanların hepsi aynı veri
tipindedir ve bellekte artarda saklanırlar.
• Diziye eleman ekleme ve dizideki elamanları
okuma işlemleri genellikle döngüler
kullanılarak yapılır.
Dizi Tanımlama
• Bir dizi tanımı yapmak için veri türünden sonra []
kullanılır:
int[] sayilar;
• Dizinin eleman sayısını belirlemek veya
değiştirmek için new komutu kullanılır:
sayilar = new int[10];
• Eleman sayısı dizi tanımlandığı anda da new
komutu kullanılarak belirlenebilir:
char[] isim = new char[15];
• C dilinde eleman sayısı dizi tanımlanırken
verilmek zorunda idi (int sayilar[10]; şeklinde)
ve sonradan değiştirilemiyordu.
Dizilerde İndis Kullanımı
• Dizilerin ilk elemanının indisi sıfırdır:
– Önceki slaytta tanımladığımız sayılar dizisinin son elemanı
sayilar[9] olacağı için, eğer sayilar[10]’a değer
atanırsa derleme sırasında hata vermez, fakat program
çalışırken «IndexOutOfRangeException: Dizin, dizi
sınırlarının dışındaydı» yazılı bir hata mesajı görüntülenir
ve program sonlandırılır.
• Dizinin hangi elemanına değer atanacak ise köşeli
parantez içinde o elemanın indis değeri yazılmalıdır:
– sayilar[5] = 1500;
– isim[3] = 'K';
sayilar dizisinin 6. elemanına 1500,
isim dizisinin 4. elemanına da ‘K’
değerleri atanıyor.
1-10 arasındaki sayıların karesini bir diziye
kopyalayan ve ekranda gösteren program
static void Main(string[] args)
{
int i;
a dizisi daha küçük
boyutta tanımlansa idi
int[] a = new int[10];
yada a[i-1] yerine a[i]
kullanılsa idi program
for (i = 1; i <= 10; i++)
hatasız derlenir ama
{
doğru çalışmazdı.
a[i-1] = i * i;
Console.WriteLine(a[i-1]);
}
Bu program dizi kullanmadan yapılabilir miydi?
}
EVET
Girilen 10 tane tamsayıdan en büyüğünü
bularak ekranda gösteren program
static void Main(string[] args) {
Tek döngü ile yapılabilir miydi?
int[] sayilar = new int[10];
EVET
Dizi kullanmadan yapılabilir miydi?
int i, enBuyuk;
EVET (önceki derste yapmıştık)
for (i = 0; i < 10; i++)
1
<=
{
i
Console.Write((i + 1) + ". sayıyı giriniz : ");
sayilar[i] = Convert.ToInt32(Console.ReadLine());
}
i-1
enBuyuk = sayilar[0];
for (i = 1; i < 10; i++)
if (sayilar[i] > enBuyuk) enBuyuk = sayilar[i];
Console.WriteLine("En büyük sayı = " + enBuyuk);
}
Girilen 10 tane tamsayıyı girilme sırasının
tersinde ekranda gösteren program
static void Main(string[] args)
Tek döngü ile yapılabilir miydi?
{
HAYIR
Dizi kullanmadan yapılabilir miydi?
int[] sayilar = new int[10];
HAYIR
for (int i = 0; i < 10; i++)
{
Console.Write((i + 1) + ". sayıyı giriniz : ");
sayilar[i] = Convert.ToInt32(Console.ReadLine());
}
for (int i = 9; i >= 0; i--)
Console.WriteLine(sayilar[i]);
}
15 elemanlı bir sayı dizisine bilgi girişi yapılarak
elemanların toplamını bulan program
static void Main(string[] args) AKIŞ ŞEMASI:
{
Başla
int[] dizi = new int[15];
i,1,15,1
int toplam = 0;
for (int i = 0; i < 15; i++)
dizi(i)
{
Console.Write((i + 1) + ". eleman:
");
toplam=toplam+dizi(i)
dizi[i] = Int32.Parse(Console.ReadLine());
i
toplam += dizi[i];
}
toplam
Console.WriteLine("Toplam = " + toplam);
}
Dur
10 elemanlı iki dizinin eş indisli
elemanlarının toplamını gösteren program
static void Main(string[] args) {
int[] dizi1 = new int[10], dizi2 = new int[10];
for (int i = 0; i < 10; i++) {
Console.Write("İlk dizinin " + (i + 1) + ". elemanı : ");
dizi1[i] = Convert.ToInt32(Console.ReadLine());
}
for (int i = 0; i < 10; i++) {
Console.Write("İkinci dizinin " + (i + 1) + ". elemanı : ");
dizi2[i] = Convert.ToInt32(Console.ReadLine());
}
Console.WriteLine("İki dizinin elemanlarının toplamı : ");
for (int i = 0; i < 10; i++)
Console.WriteLine(dizi1[i] + dizi2[i]);
}
Dizilere ilk değer atama
• Dizi tanımlandığı anda ilk değerler atanabilir:
int[] a = { 10, 25, 15, 40, 30 };
char[] b = { 'A', 'l', 't', 'a', 'n' };
• Bu şekilde bir tanımlama yapıldığında dizinin
boyutu verilen eleman sayısına eşit olacak
şekilde belirlenir.
• Eğer dizi tanımlandıktan sonra elemanlar tek
tek girilseydi (a[0] = 10; a[1] = 25; ...),
öncesinde new ile boyut vermek gerekecekti.
10 elemanlı iki dizinin eş indisli
elemanlarının toplamını gösteren program
Daha önce yazdığımız programda kullanıcının 20
tane değer girmesi gerekiyordu. Bu programda
ise değerler programcı tarafından veriliyor:
static void Main(string[] args) {
int[] dizi1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int[] dizi2 = { 2, 7, 9, 2, 3, -1, 5, 7, 4, 1 };
Console.WriteLine("İki dizinin elemanlarının toplamı : ");
for (int i = 0; i < 10; i++)
Console.WriteLine(dizi1[i] + dizi2[i]);
}
Çok Boyutlu Diziler
• [ ile ] arasında 1 virgül ile 2 boyutlu dizi, 2
virgül ile 3 boyutlu dizi, ... tanımlanabilir:
int[,] matris = new int[3,3];
{ {7, 2, 1}, {4, 0, -1}, {5, 9, -4} }
7
4
5
2 1
0 -1
9 -4
char[,] isimler = new char[2,5];
{ {'A', 'l', 't', 'a', 'n'}, {'A', 'l', 'i', ' ', ' '} }
string[,] isimler2 = new string[2,2];
{ { "Altan", "Ali" }, { "Ahmet", "Veli" } };
char[,,] isimler2 = new char[2,2,5];
{{{'A', 'l', 't', 'a', 'n'}, {'A', 'l', 'i', ' ', ' '}},
{{'A', 'h', 'm', 'e', 't'}, {'V', 'e', 'l', 'i', ' '}}}
3x3 Kare Matris Toplama Programı
static void Main(string[] args){
int[,] matris1 = new int[3, 3], matris2 = new int[3, 3];
for (int i = 1; i <= 3; i++)
for (int j = 1; j <= 3; j++) {
Console.Write("İlk matris " + i + ". satır " + j + ". sütun: ");
matris1[i - 1, j - 1] = Convert.ToInt32(Console.ReadLine());
}
for (int i = 1; i <= 3; i++)
for (int j = 1; j <= 3; j++) {
Console.Write("İkinci matris " + i + ". satır " + j + ". sütun: ");
matris2[i - 1, j - 1] = Convert.ToInt32(Console.ReadLine());
}
for (int i = 0; i <= 2; i++) {
for (int j = 0; j <= 2; j++)
Console.Write("{0,5}", matris1[i, j] + matris2[i, j]);
Console.WriteLine();
}
}
Ekrana formatlı yazdırma hakkında bilgi için: hafta3-ödev2-AsalMükemmel.cs
Dizileri kapsayan dizi
• C dilinde iki boyutlu dizi [][] şeklinde
tanımlanır. C# dilinde ise bu kullanım dizilerin
dizisi (Jagged Array) anlamına gelir. İçerdiği her
dizi aynı sayıda elemana sahip olmayabilir.
int[][] numbers = {
new int[] {2,3,4},
new int[] {5,6,7,8,9}
};
Notlar
• C# dilinde new kullanımının faydası:
int[] sayilar;
Dizinin henüz sadece türü belli
büyüklüğü belli değil
sayilar = new int[10];
Şu anda 10 elemanlı olduğunu
belirledik
sayilar = new int[20];
Şimdi de 20 elemanlı olarak
yeniden tanımladık
• foreach (C: for each, VB: For Each) döngüsü ile dizinin
eleman sayısı kadar döngü adımı sağlanabilir:
int[] sayilar = {4, 5, 6, 1, 2, 3, -2, -1, 0};
foreach (int i in sayilar)
Console.WriteLine(i);
Ödevler
1. 10 elemanlı bir dizinin elemanlarının aritmetik
ortalamasını bulan programı yazınız.
2. Matris Çarpımı programı yazınız.
a.
Matrislerin boyutlarını kullanıcı belirleyecek ve
sonrasında değerleri girecektir.
b. Matrislerin boyutları çarpma işlemine göre uygun olması
için ilk matrisin sütun değeri ile ikinci matrisin satır
değeri eşit girilmesi sağlanacaktır.
3. Kullanıcının ENTER tuşuna basana kadar klavyeden
girdiği her şeyi tersten (sondan başa doğru)
gösteren programı yazınız.
Ödevler
4. 100 Adam ve 100 kapımız var. 1. adam 1’in katları
olan kapılardan, 2. adam 2’nin katları olan
kapılardan, ...., N. Adam N’in katları olan
kapılardan, ... , 100. Adam 100’ün katları olan
kapılardan geçerek kapıların konumlarını
değiştiriyor. (Kapı açıksa kapatıyor, kapalıysa
açıyor). En başta bütün kapıların kapalı olduğunu
kabul edersek, 100. adam da geçtikten sonra hangi
kapıların açık olduğunu bulan programı yazınız.
Ödevler
5. Romalı problemi: Roma’da Kral 21 kişinin
öldürülmesine karar veriyor. Cellat fazla
yorulmamak için öldürülecek olanları çember
biçiminde diziyor. Herkesin eline bir balta veriyor.
Öldürme kuralı olarak da 2. Kişi 3. Kişiyi öldürüyor.
5. Kişi 6. Kişiyi öldürüyor. Yani 2 kişi atlayıp 3. kişi
öldürülüyor. Bu son iki kişi kalana kadar sürüyor.
Son kalan iki kişi serbest bırakılacaktır. Serbest
bırakılan kişilerin hangi numaralar olduğunu bulan
programı yazınız.