Algoritmalar ve Programlama I Ders 2: Ak** Diyagramlar

advertisement
Doç. Dr. Cemil Öz
Algoritmalar ve
Programlama I
Ders 8:DİZİ (VEKTÖR)
KAVRAMI
SAÜ Bilgisayar Mühendisliği Dr. Cemil Öz
Değişkenler isimlendirilirken her bir değişken için bir ad
kullanmak zorunludur. Bu ise değişken sayısının çok olması
durumunda uygun bir yöntem değildir. Bu durumda benzer
özelliklere sahip elemanları bir küme gibi düşünerek bu
doğrultuda işlem yapmak daha uygun olacaktır.
Belli özelliklere sahip bu elemanların oluşturdukları kümeler
dizi (array) olarak adlandırabilir.
Diziler, indisli değişkenler kullanılarak adlandırılırlar. Örneğin
n elemanlı bir A dizisi için A1, dizinin birinci elemanını ve An ,
dizinin son elemanını ifade etmektedir.
C programlamada, dizi adı herhangi bir geçerli değişken adı
olabilir, fakat indis kare parantez( [ .. ] ) içine alınmalıdır.
Örneğin 10 elemanlı bir A dizisinin elemanları sırasıyla A[1],
A[2], A[3],…, A[10] şeklinde ifade edilir.
Dizi, art arda gelen aynı tip verileri saklayan bellek elemanları
veya bellek hücreleri olarak tanımlanabilir.
Dizi tanımlanırken diziye bir isim verilir. Dizi tanımlandıktan
sonra programda bu isimle çağrılır.
C/C++ programlama dillerinde dizi bildirimi genel olarak
aşağıdaki şekilde yapılır;
DiziTipi DiziAdı[Büyüklük]
Örnek olarak 10 adet tam sayıyı tutacak bir A dizisi C/C++’ da
aşağıdaki şekilde bildirilebilir;
int A[10];
Bir dizi bellekte sabit büyüklükte bir yere yerleşir. Dizi
tanımlandıktan sonra program içerisinde dizinin bellekte
kapladığı alan miktarında artma veya azalma yapmak
mümkün değildir.
Örmeğin, 100 elemanlı bir dizi tanımlanırsa, program
içerisinde dizinin sadece 10 elemanı kullanılsa bile geri kalan
90 elemanı bellekte yer işgal etmeye devam eder. Bu nedenle
diziler tanımlanırken, dizilerde saklanılacak veri miktarı iyi
analiz edilmelidir.
Örnek 1: n elemanlı bir sayı dizisinin girişini yapan bir C/C++
programı yazalım ve akış diyagramını çizelim;
#include <stdio.h>
#include <conio.h>
int i,n;
int A[100];
void main(void)
{clrscr();
printf("dizi eleman sayisini giriniz: ");
scanf("%d",&n);
for(i=1;i<=n;i++)
{printf("dizi elemanı giriniz: ");
scanf("%d",&A[i]);
printf(" \n");
}
getch();
}
Örnek 2: Girilen n elemanlı bir sayı dizisinin en büyük elemanını bulan bir
C/C++ programı yazalım ve akış diyagramını çizelim;
#include <stdio.h>
#include <conio.h>
int i,eb,n;
int A[100];
void main(void)
{clrscr();
printf("dizi eleman sayisini giriniz: ");
scanf("%d",&n);
for(i=0;i<n;i++)
{printf("dizi elemani giriniz: ");
scanf("%d",&A[i]);
printf(" \n");
}
eb=A[0];
for(i=1;i<n;i++)
{
if(eb<A[i]) eb=A[i];
}
printf("en buyuk sayi= %d\n",eb);
getch();
}
Örnek 3:
Klavyeden okunan bir dizi harfin alfabetik sıraya konulmasını sağlayan ve
sonucu ekrana yazan bir bir C/C++ programı ve akış diyagramını Örnek
alg.4’ te oluşturduğumuz algoritma mantığına göre oluşturalım.
Daha önce oluşturduğumuz algoritmadan bir fark olarak, C’ de döngü
yapılarını öğrendiğimiz için yapısal programlama kavramında istenmeyen
“goto” deyimini kullanmadan akış diyagramını ve programı oluşturalım.
Gireceğimiz harfleri söz dizisi tipine sahip olan bir dizi değişkeninde
tutabiliriz. Fakat burada söz dizisinin son elemanı olan “NULL” karakterini
sıralamaya sokmadığımıza ve ayrıca söz dizisinin ilk elemanı 0 nolu indis
ile gösterildiğine dikkat edelim.
/* Karakter Siralama Programı*/
#include <stdio.h>
#include <conio.h>
char h[100];
char b;
int i,j,k,n;
void main(void)
{clrscr();
printf("karakter dizisi eleman sayisini giriniz: ");
scanf("%d",&n);
printf("karakter dizisini bosluksuz giriniz: ");
scanf("%s",h);
printf(" \n");
k=n;
for(i=0;i<n;i++) /* dizinin ilk elemani 0 indisinde
dizinin son elemani NULL*/
{ k--;
for(j=0;j<k;j++)
{
if(h[j+1]<h[j])
{ b=h[j];
h[j]=h[j+1];
h[j+1]=b;
}
}
}
printf("siralanmis dizi: = %s\n",h);
getch();
}
Örnek 5:
Girilen n elemanlı bir sayı dizisinde hem 4’e hem 5’e
bölünebilen sayıları bulan ve başka bir diziye yükleyen bir
C/C++ programı yazalım ve akış diyagramını çizelim.
Bir değer hem 4’ e hem de 5’ e bölünebiliyor ise en küçük
ortak katları olan 20’ ye de kalansız bölünebilmelidir. Yani bu
sayının mod 20’ ye göre değeri 0 olmalıdır.
#include <stdio.h>
#include <conio.h>
int i,k,say,n;
int A[100], C[100];
void main(void)
{clrscr();
printf("dizi eleman sayisini
giriniz: ");
scanf("%d",&n);
for(i=0;i<n;i++)
{printf("dizi elemani giriniz: ");
scanf("%d",&A[i]);
printf(" \n");
}
k=0; say=0;
for(i=0;i<n;i++)
{
if(A[i]%20==0)
{k++;
C[k]=A[i];
say++;
}
}
for(k=1;k<=say;k++)
{ printf("%d ",C[k]);
}
printf(" \n");
getch();
}
Seçme sıralama (selection sort) algoritması
Seçme
sıralama
algoritmalarındandır.
(selection
sort)
en
basit
sıralama
Dizideki ilk elemandan başlanır. Seçilen dizi elemanı ile bu
elemandan sonra gelen dizi elemanları sırası ile karşılaştırılır. Eğer
küçüklük/büyüklük (sıralama isteğine bağlı olarak) durumu var ise
yerleri değiştirilir.
İkinci etapta dizinin ikinci elemanı ile bu elemandan sonra gelen dizi
elemanları sırası ile karşılaştırılır ve aynı şekilde eğer
küçüklük/büyüklük durumu var ise yerleri değiştirilir.
Bu karşılaştırma işlemi sondan bir önceki eleman ile son elemanın
karşılaştırılmasına kadar devam eder ve aynı şekilde eğer
küçüklük/büyüklük durumu var ise yerleri değiştirilir.
Küçükten büyüğe doğru sıralama yapan seçme sıralama
(selection sort) algoritması için akış diyagramını çizelim;
sıralama algoritmasının C/C++ Programı;
/* Secme Siralama Algoritmasi*/
#include <stdio.h>
#include <conio.h>
int i,j,n,b;
int A[100];
void main(void)
{clrscr();
printf("dizi eleman sayisini giriniz: ");
scanf("%d",&n);
for(i=1;i<=n;i++)
{printf("A[%d]: ",i);
scanf("%d",&A[i]);
printf(" \n");
}
for(i=1;i<n;i++)
{for(j=i+1;j<=n;j++)
{if(A[j]<A[i])
{b=A[i]; A[i]=A[j]; A[j]=b;}
}
}
for(i=1;i<=n;i++)
{ printf("%d ",A[i]);
}
printf(" \n");
getch();
}
Kabarcık sıralama (bubble sort) algoritması
Bu algoritma başlangıçta yer değiştirme sıralaması olarak
adlandırılmıştır. Günümüzde kabarcık sıralaması olarak
adlandırılmasının nedeni dizi içindeki büyük elemanların
algoritmanın her adımında dizi sonuna doğru lineer olarak
ilerlemesidir.
Bu algoritmada baştan sona doğru yapılan taramalar ile arka
arkaya gelen (ardışık) elemanlar kıyaslanır. Eğer
küçüklük/büyüklük durumu var ise yerleri değiştirilir.
Küçükten büyüğe doğru sıralama yapan kabarcık sıralama
(bubble sort) algoritması için akış diyagramını çizelim;
Küçükten büyüğe doğru sıralama yapan kabarcık sıralama
(bubble sort) algoritması için akış diyagramını çizelim;
/* Kabarcik Siralama Algoritmasi*/
#include <stdio.h>
#include <conio.h>
int i,j,n,b;
int A[100];
void main(void)
{clrscr();
printf("dizi eleman sayisini giriniz: ");
scanf("%d",&n);
for(i=1;i<=n;i++)
{printf("A[%d]: ",i);
scanf("%d",&A[i]);
printf(" \n");
}
for(i=1;i<=n;i++)
{for(j=1;j<n;j++)
{if(A[j+1]<A[j])
{b=A[j]; A[j]=A[j+1]; A[j+1]=b;}
}
}
for(i=1;i<=n;i++)
{ printf("%d ",A[i]);
}
printf(" \n");
getch();
}
Yerleştirmeli sıralama (insertion sort) algoritması
Bu yöntem sıralama problemlerine getirilen basit ve temel
yaklaşımlardan biridir. Algoritmada dizinin ikinci elemanından
başlanarak elemanlar sırayla kontrol edilir.
Bu algoritmada her eleman, kendinden önceki alt dizideki
elemanlar ile karşılaştırılmakta ve daha küçük ise ilgili yerdeki
araya yerleştirilmektedir. Bu şekilde dizide geriye doğru
ilerlenir. Bu işlem seçilen dizi elemanından küçük değer
kalmayıncaya kadar devam eder.
İlk dizi elemanı doğru yere yerleştirildikten sonra bir sonraki
eleman seçilerek yukarıdaki işlemler tekrarlanır. İşlem dizinin
son elemanının seçimi ile tamamlanmış olur.
Yerleştirmeli sıralama (insertion sort) algoritması
Oyun kartlarının sıralanmasında ve yerleştirilmesinde de buna
benzer bir yöntem kullanılır. Önce desteden bir kart seçilip
kartın geleceği doğru yer bulunur ve bu yerden sonraki kartlar
kaydırılarak ilgili kart araya yerine yerleştirilir. Tüm kartlar
sıralanana kadar bu işleme devam edilir.
Bu yaklaşımdan yola çıkarak dizi elemanının doğru yere
yerleştirme işlemi, dizi elemanının geçici değişkende tutularak
kendisinden önce gelen, kendisinden büyük elemanların sağa
doğru kaydırılması ve boşalan yere bu elemanın
yerleştirilmesi ile gerçekleştirilir.
Küçükten büyüğe doğru sıralama yapan yerleştirmeli sıralama
(insertion sort) algoritması için akış diyagramı
/* Yerlestirmeli Siralama Algoritmasi*/
#include <stdio.h>
#include <conio.h>
int i,j,n,b;
int A[100];
void main(void)
{clrscr();
printf("dizi eleman sayisini giriniz: ");
for(i=2;i<=n;i++)
scanf("%d",&n);
{b=A[i]; j=i;
for(i=1;i<=n;i++)
while((b<A[j-1])&&(j>1))
{printf("A[%d]: ",i);
{A[j]=A[j-1]; j--;}
scanf("%d",&A[i]);
A[j]=b;
printf(" \n");
}
}
for(i=1;i<=n;i++)
{ printf("%d ",A[i]);
}
printf(" \n");
getch();
}
Dizilerde arama algoritmaları
Çoklu veriler içerisinde istenilen veriyi aramak amacı ile
kullanılan algoritmalar arasında en yaygın olarak
kullanılanları,
sıralı arama ve
ikili (binary) arama
algoritmalarıdır.
Sıralı arama algoritması
Yavaş olmasına rağmen basit olan bu algoritmada dizideki
tüm elemanlar sıra ile aranan değer ile karşılaştırılır. Bu işlem
değer bulunana kadar devam eder.
#include <stdio.h>
#include <conio.h>
int i,ara,n;
int A[100];
void main(void)
{clrscr();
printf("dizi eleman sayisini giriniz: ");
scanf("%d",&n);
for(i=0;i<n;i++)
{printf("dizi elemani giriniz: ");
scanf("%d",&A[i]);
printf(" \n");
}
printf("aranan deger: ");
scanf("%d",&ara);
for(i=0;i<n;i++)
{if(ara==A[i])
{printf("deger: %d, sirasi: %d",
A[i], i+1);
goto son;}
}
printf("aranan deger yok");
son:
getch();
}
İkili (binary) arama algoritması
İkili arama algoritmasının kullanılabilmesi için dizideki tüm
elemanların sıralı olması (küçükten büyüğe doğru olduğunu
varsayalım) gerekir.
Karşılaştırma işlemine dizinin ortasında bulunan elemandan
başlanır. Eğer aranan eleman dizinin orta elemanından küçük
ise dizinin ortadan sonraki üst kısmı atılır. Eğer aranan
eleman dizinin orta elemanından büyük ise dizinin ortadan
önceki alt kısmı atılır.
Bu şekilde dizi yarılanmış olur. Bir sonraki aşamada
karşılaştırma dizinin kalan parçasının orta elemanı ile yapılır.
Aranılan eleman bulununcaya kadar bu
yarılanarak karşılaştırma işlemi devam eder.
şekilde
dizi
Doç. Dr. Cemil Öz
Algoritmalar ve
Programlama I
SAÜ Bilgisayar Mühendisliği Dr. Cemil Öz
Download
Study collections