2. Dereceden Denklemin Köklerini Bulan Program [crayon-5bb74e5b18b15225541464/] C++ 2.dereceden denklemin köklerini bulan program [crayon-5bb74e5b18b25989362529/] ÇIKTI;
C++ 2. dereceden denklemin köklerini bulan program [crayon-5bb74e5b18b2c485851819/] YAZAR:Fatma AKTAŞ SEÇME SIRALAMA ALGORİTMASI Öncelikle seçme sıralama algoritmasını işleyişinden bahsedelim.bu algoritmada dizinin ilk elmanı dizinin sonuna kadar olan diğer elemanlarla karşılaştırılır.eğer önceki eleman sonraki elemandan büyükse yer değiştirlir. -Elemanları 5 1 4 2 8 olan diziyi ele alalım. BİRİNCİ DÖNGÜ -(5 1 4 2 8)>>(1 5 4 2 8) -(1 5 4 2 8)>>(1 4 5 2 8) -(1 4 5 2 8)>>(1 4 2 5 8)
-(1 4 2 5 8)>>(1 4 2 5 8) İKİNCİ DÖNGÜ -(1 4 2 5 8)>>(1 2 4 5 8) -(1 2 4 5 8)>>(1 2 4 5 8) -(1 2 4 5 8)>>(1 2 4 5 8) Buradaki mantığa bakacak olursak n elemanlı bir dizi için birinci döngü 1 ile n-1 arasında,ikinci döngü ise 2 ile n arasında çalışmış olur. Şimdi birde kodlarını inceleyelim. [crayon-5bb74e5b19a82315391265/] YAZAR:Miraç KESKİN KAYNAKLAR -Mühendislik Öğrencileri İçin Temel Klavuz C++/C -http://tr.wikipedia.org/wiki/sıralama_algoritması
Diziler (Arrays) Çok Boyutlu Diziler ÇOK BOYUTLU DİZİLER Birden fazla indis numarası ile elemanlarına ulaşılan dizilere çok boyutlu diziler denir. Bunlardan en sık kullanılanı çift boyutlu dizilerdir. Bu diziler sayesinde değerler, bir tablodaki veriler gibi düşünülebilirler. Bu tip dizilerde her elemana ulaşmak için satır indisi ve sütun indisi kullanılır. C dilindeki dizilerin boyutları ikiden de fazla olabilir. Bir sınır olmamakla beraber 12 boyuta kadar destekler. Biz burada çift boyutlu dizileri ele alacağız. Tanımlama: dizinintürü dizininadı [satır sayısı][sütun sayısı]; ÖRNEK: int a[3][4]; /* 3 satırlı, 4 sütunlu int türünde değerler alabilen bir dizi */ float b[5][3]; /*5 satırlı 3 sütunlu float türünde değerler alabilen bir dizi */ Örnekte verilen ilk dizi tanımlamasındaki birinci köşeli parantez içerisinde verilen değer satır sayısı, ikinci köşeli parantez içerisinde verilen değerde sütun sayısıdır. Bu dizi 3 4 lük bir tablo gibi düşünülebilir. Ancak bellekte tutulma şeklinin ardışık olduğu unutulmamalıdır. Sütun 0 Sütun 1 Sütun 2 Sütun 3 Satır 0 a[0][0] a[0][1] a[0][2] a[0][3] Satır 1 a[1][0] a[1][1] a[1][2]
a[1][3] Satır 2 a[2][1] a[2][3] a[2][0] a[2][2] ÇİFT BOYUTLU DİZİLERE İLK DEĞER ATANMASI Tıpkı tek boyutlu dizilerde olduğu gibi ilk değer ataması aşağıdaki şekilde yapılır. int a[3][4]={ {4, 5, 3, 1}, {0, 4, 3, 1}, {1, 9, 7, 2 } }; Yine tek boyutlu dizilerde olduğu gibi eleman sayısından daha az değer girilirse, diğer elemanların ilk değerleri sıfır yada boş olur. İçteki küme işaretleri kullanılmadan yapıları bir ilk atamada, elemanlar ilk hücreden itibaren sırası ile yerleştirilirler. ÖRNEK: 3 4 lük çift boyutlu bir dizi içerisine klavyeden girilen değerleri, tablo halinde ekrana yazdıran programı yazınız. 1. /*Tablo halinde ekrana yazdıran program */ 2. #include <stdio.h> 3. int main() 4. { 5. int a[3][4], satir, sutun; 6. for( satir = 0 ; satir < 3 ; satir++ ) { 7. printf( %d. satirindaki elemanlar:, satir ); 8. /* satırdaki elemanlar */ 9. for ( sutun = 0 ; sutun < 4 ; sutun++ ) 10. /* bir seferde girilmiş olacak */ 11. scanf( %d, &a[satir][sutun]) ; 12. } 13. printf( \n TABLO \n ); 14. for ( satir = 0 ; satir <3 ; satir++ ) {
15. 16. 17. 18. 19. 20. 21. printf( %d. satır:, satir ) ; for( sutun = 0 ; sutun < 4 ; sutun++ ) printf( %d, a[satir][sutun] ); printf( \n ); /*bir alt satıra geçmek için*/ } return 0; } ÖRNEK: Elemanları klavyeden girilen 4 6 lık bir dizinin sütun toplamlarını ekrana yazan programı yazınız. 1. /* iki boyutlu dizinin sütun toplamları */ 2. #include <stdio.h> 4. #define N 4 /* Satır sayısı sabiti */ 5. #define M 5 /* Sütun sayısı sabiti */ 6. int main() 7. { 8. int a[n][m]; 9. int sutun[m] = ( 0 ); /* İlk 10. değerleri 0 ata */ int i, j; 11. for( i = 0 ; i < N ; i++ ) { 12. printf( %d. satır, i); 13. /* satırdaki elemanlar */ 14. for ( j = 0 ; j < M ; j++ ) 15. /* bir seferde girilmiş olacak */ 16. scanf( %d, &a[i][j] ); 17. } 18. for ( i = 0 ; i < N ; i++ ) 19. for( j = 0 ; j < M ; j++ ) 20. sutun[j] = sutun[j] + a[i][j]; /* sütun 21. toplamı */ printf( \n \n 22. ); for( j = 0 ; j < 6 ; j++) 23. printf( %d, sutun[j] );
24. 25. } return 0; ÇOK BOYUTLU DİZİLERİN FONKSİYONLARA PARAMETRE OLARAK GÖNDERİLMESİ Çok boyutlu bir dizi, fonksiyona parametre olarak gönderilecekse, tek boyutlularda olduğu gibi sadece adı yazılır. Gönderilen dizi değişkeni karşılayan tanımlamada ise gönderilen dizinin boyutu kadar köşeli parantez açılır ve kapatılır. İlk köşeli parantez içerisine eleman sayısını ifade eden değer yazılmaz. Fakat diğerlerine eleman sayıları verilmek zorundadır. Derleyici bu değerleri elemanların hafızaya yerleşimlerini tanımlamak için kullanılır. Dizi kaç boyutlu olursa olsun bellek ardışık tek boyutlu hücrelerden oluşur. Dolayısıyla indis numaraları ne olursa olsun bütün dizi elemanları bellekte ardışık olarak saklanmak zorundadır. Örneğin; }; int a[2][3] = { {13, 12, 8}, {10, 50, 2} gibi bir dizi tanımlandığında elemanları bellekte tutulur. Yani çift boyutlu diziler tablo halinde bellekte tutulmaz. Her bir satır verilen sütun sayısı kadar sonraki hücreler içerisinde tutulur. Zaten her bir satır tek boyutlu bir dizi gibi düşünülebilir. Bütün satırlar uç uca eklenerek belleğe yerleşir. Derleyici bir sonraki satırın başlangıçtan kaç eleman sonra başladığını sütun sayısından anlar. Bu nedenle ilk satır sayısı haricindeki diğer değerler fonksiyonda karşılayan değişkenin ikinci ve daha sonraki köşeli parantezleri içerisine yazılmalıdır.
ÖRNEK: Kendisine gönderilen 3 4 lük bir diziyi ekrana tablo halinde yazan fonksiyonu main() fonksiyonu ile beraber yazınız. 1. #include <stdio.h> 3. #define N 3 /* Satır sayısı sabiti */ 4. #define M 4 /* Sütun sayısı sabiti */ 6. void diziyaz ( int [] [M] ); /*prototip tanımlaması */ 8. int main() 9. { 10. 11. int a[n][m] = { {4, 5, 3, 1}, 12. {0, 4, 3, 1}, 13. {1, 9, 7, 2} }; 14. diziyaz ( a ); 15. return 0; 16. } 17. void diziyaz ( int b[] [M] ) 18. { 19. int sutun; 20. int satir; 21. 22. for( satir = 0 ; satir < N ; satir++) { 23. printf( %d. satırdaki elemanlar:, satir ); 24. for( sutun = 0 ; sutun < M ; sutun++) 25. printf( %d, b[satir][sutun] ); 26. printf( \n ) ; /* bir alt satıra geçmek için */ 27. } 28. }
Diziler (Arrays) Tek Boyutlu Diziler TEK BOYUTLU DİZİLER Tek boyutta dizileri tanımlamanın genel kullanımı aşağıdaki biçimdedir. C99 öncesi, C Dili standartlarına göre; dizinin eleman sayısı, ya belli bir sayı ya da önceden #define önişlemci direktifi ile tanımlanmış sembolik bir sabit olmalıdır. Değişken olamaz. C99 standardı ile birlikte dizinin eleman sayısı değişkende olabilmektedir. Genel kullanımdaki köşeli parantez isteğe bağlı anlamında değildir. Köşeli parantez sembolü dizi tanımlamalarında mutlaka yazılmalıdır. GK: dizinintürü dizininadı [ ElemanSayısı ] ; ÖRNEK: int sayilar[6]; /* 6 elemanlı, her elemanı int olan dizi*/ char kodlar[15]; /*15 elemanlı, her elemanı char olan dizi*/ float boylar[5]; /*5 elemanlı, her elemanı float olan dizi*/ double notlar[7]; /*7 elemanlı, her elemanı double olan dizi*/ Derleyici ilk örnekteki gibi bir komutla karşılaştığında 6 adet sayının saklanacağı bellek alanı ayırır. Bir tam sayı 2 byte (DOS ta) uzunluğunda olduğuna göre dizinin bellekte kaplayacağı alan 2*6=12 byte olacaktır. Bu alanın başlangıç adresini, dizi adına aktarır. TEK BOYUTLU DİZİLERE DEĞER ATAMASI Dizinin elemanlarına ulaşmak için dizinin ismi ve köşeli
parantez içerisinde indis numarası yazmak yeterlidir. Aşağıdaki örnekleri inceleyelim; sayilar[0] = -12; /* 0 numaralı elemanına -12 değerini ata */ sayilar[2] = sayilar[4] + 3; /*dizinin 2 numaralı elemanına 4 numaralı elemanının 3 fazlasını ata */ for( i=0 ; i<6 ; i++) /*0 dan 6 ya kadar. 6 Dahil değil */ sayilar[i] = 0 /* dizinin elemanlarına 0 değerini ata */ Yukarıda döngü değişkeni ile dizi elemanlarına erişim yöntemi gösterilmiştir. Bu örnekten sonra aşağıdaki ifadelerin birbirlerinden farkını vurgulamak yerinde olacaktır. sayilar[i] + 1 ve sayilar[i+1] İlk gösterim dizinin i numaralı indisindeki elemanın bir fazlası anlamına gelir. İkinci gösterim ise dizinin i nin bir fazlası indisindeki elemanı anlamına gelir. Dolayısıyla; sayilar[i] + 1 =/= sayilar[i +1] (Eşit değildir) TEK BOYUTLU DİZİLERE İLK DEĞER ATANMASI Bir önceki konuda dizinin elemanlarına nasıl değer atandığı belirtilmiştir. Tanımlandıkları anda ilk değer ataması ise aşağıdaki şekilde yapılır; int puanlar[5] = {4, 6, 3, 1, 8}; İlk değer atama işleminde küme parantezi (brace) kullanılır. Küme işaretinden sonra (;) kullanılmasına dikkat ediniz. Böyle bir ilk değer atamasından sonra dizinin elemanları şöyle yerleşir; puanlar[0] = 4 puanlar[1] = 5 puanlar[2] = 3 puanlar[3] = 1
puanlar[4] = 8 Küme işaretleri içerisine dizinin eleman sayısından daha fazla eleman yazıldığında, bir yazım hatası ortaya çıkar. Eleman sayısından daha az eleman yazıldığında ise, diğer elemanlar otomatik olarak sıfır değerini alırlar. İlk değer ataması yapılmayan dizilerin elemanları bellekteki rastgele değerlerden oluşur. Ancak dizi static yada global tanımlanmış ise ilk değer ataması yapılmasa dahi elemanlarının değerleri sıfır ya da boştur. Ayrıca ilk değer ataması yapıldığında eleman sayısını yazma zorunluluğu yoktur. Ne kadar eleman yazılmışsa eleman sayısı o olur. ÖRNEK /*Klavyeden girilen 5 adet sayısı tersinden yazar*/ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. #include <stdio.h> int main() { int sayilar[5]; /* Beş elemanlı tamsayı dizi*/ int indis; printf( 5 adet sayi giriniz: \n ); for( indis = 0 ; indis < 5 ; indis++ ) scanf( %d, &sayilar[indis] ); printf( Girilen sayilar(sondan basa) : \n ); for( indis = 4 ; indis >= 0 ; indis ) printf( %d\n, sayilar[indis]); return 0; } ÖRNEK: Klavyeden girilen 20 adet nottan, ortalamadan büyük olanları yazan program. 1. #include <stdio.h> 2. int main()
3. { 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. } int notlar[20]; int i; double toplam = 0; double ortalama; printf( 20 adet notu giriniz: \n ) ; for( i = 0 ; i < 20 ; i++) { scanf( %d, ¬lar[i] ); toplam = toplam + notlar[i]; } ortalama = toplam / 20 ; printf( Sinifin ortalamasi = %.2f\n, ortalama); printf ( Ortalamadan yuksek olan notlar\n ); for ( i = 0 ; i < 20 ; i++) if( notlar[i] > ortalama) printf( %d \n, notlar[i] ); return 0 ; C++ Dilinde Bazı Temel Algoritmalar Bazı eşyalar için her eve lazım derler. Az sonra bahsedeceğimiz algoritmalar da her kodcuya lazım cinsten. Sayının tek mi çift mi olduğuna karar veren programdan, çarpım tablosu yapan programa kadar karşımıza çok sık çıkan bazı algoritmalardan bahsedeceğiz. Önce akış şeması ile programın algoritmasını ardından C++ kodunu ve en son olarak programın ekran çıktısını vereceğiz.
Tek-Çift Sayı Bulma Girilen bir sayının tek veya çift olduğuna dair karar vermenin en basit yolu sayıyı 2 ye bölmek ve bölümden kalan sayının 0 a eşit olup olmadığına bakmaktır. Yani sayının 2 ye göre modunu aldığımızda sonuç 0 ise sayı çift eğer değilse tektir. Şimdi algoritmayı akış şeması ile gösterelim [crayon-5bb74e5b1a218100735394/]
Tam Bölünebilirliği Ölçme Bu algoritmanın amacı kullanıcıdan alınan 2 sayıdan ilk sayının ikinci sayıya tam bölünüp bölünmediğine karar vermektir. Bu algoritmada da mod kavramını kullanacağız. Yani ilk sayı ikinci sayıya tam bölünürse mod=0 olacaktır. [crayon-5bb74e5b1a225239535068/]
Çarpım Tablosu Yazdırma Çarpım tablosunda 1 den 10 a kadar tüm sayıları sırasıyla birbirleri ile çarpıp ekrana yazacağız. Önce x=1 yazılır 1 den 10 a kadar olan y değerleri ile çarpılır. Bu şekilde x tek tek arttırılarak x=10 olana kadar devam eder. Bunun için iç içe for döngüsü kullanacağız.
[crayon-5bb74e5b1a22f851422566/]
En Büyük Sayı Bulma Kullanıcının girdiği N kadar sayının en büyüğünü bulmak için en büyük sayıyı saklayacağımız enbuyuk isimli değişken bir de sayac tanımlamalıyız ve kullanıcıdan N adet sayı almalıyız. Daha sonra program girilen sayı ile daha önceki en büyük sayıyı karşılaştırır eğer yeni sayı daha büyükse yer değiştirir. Böylece en büyük sayı her zaman enbuyuk değişkeninde saklanmış olur. [crayon-5bb74e5b1a23d242899442/]
Asal Sayı Belirleme Asal sayı demek 1 ve kendisinden başka sayıya bölünemeyen sayı demektir. Bir sayının asal olup olmadığını bulmak için sayıyı 1 ve kendisi hariç, kendisinden önceki tüm sayılara bölünüp bölünemeyeceğini kontrol etmeliyiz. Eğer sayı kendisinden önceki bir sayıya tam bölünürse sayımızın asal olmadığını anlarız.
[crayon-5bb74e5b1a248342298891/]
Rastgele Sayı Üretme Sayısal lotoda 1 den 49 a kadar 6 farklı sayı gereklidir. Bu algoritmada da kendi sayısal lotomuz için 1-49 arası birbirinden farklı 6 sayı üreteceğiz. C++ dilinde rastgele sayı üretmek için rand() ve her üretimde farklı sayı elde etmek için srand(time(null) ifadesini kullanacağız. time(null) kullanabilmek için <ctime> kütüphanesini eklememiz gerekiyor. [crayon-5bb74e5b1a251847210760/] Üçgen Alanı Hesaplama Üçgenin alanını önce taban ile yüksekliği çarparız sonra sonucu ikiye bölerek buluruz. Yani formülümüz (a*h)/2 dir.
[crayon-5bb74e5b1a25f833779861/] Daire Alan Hesaplama İşlemleri Dairenin alanı pi sayısını verilen yarıçapın karesi ile çarparak bulunuz yani formülü pi*r*r dir. Eğer dairenin tamamı değilde bir diliminin alanı istenirse. O dilimin a açısına ihtiyaç vardır. Bu sefer alan formülümüz a*pi*r*r/360 olur.
[crayon-5bb74e5b1a267682691636/] Kombinasyon Hesaplama N elemanlı bir kümenin r li kombinasyonu C(n,r)n!/r!(n-r)! formülü ile hesaplanır. Burada bir kaç tane faktöriyel işlemi olduğu için gerektiğinde kullanmak üzere bir faktöriyel fonksiyonu yazmak faydalı olur.
[crayon-5bb74e5b1a270910177718/] Fibonacci Sayı Serisini Yazdırma Fibonacci sayıları 0,1,1,2,3 şeklinde başlayarak her eleman önceki iki sayının toplamı olarak devam eder. Fibonacci dizisinin ilk N terimini yazdıran algoritma şu şekildedir:
[crayon-5bb74e5b1a286764444316/]
Girilen Kelimenin Tersten Yazılması Bu algoritmada string veri tipinin bize sunduğu dizi özelliği için dizinin elemanlarını sondan başak yazdıracağız.
[crayon-5bb74e5b1a28f950540169/] Herkese İyi Kodlamalar Hazırlayan: Ömer KOYUNCU Bu yazı Fahrettin Erdinç in Mühendislik Öğrencileri İçin Temel Kılavuz C / C++ adlı kitabı referans alınarak hazırlanmıştır. Kaynakça: ERDİNÇ Fahrettin, Mühendislik Öğrencileri İçin Temel Kılavuz C / C++, Abaküs Kitap, İstanbul, 2016
Akış Şeması (Flowchart) nedir? Akış Şeması (Flowchart) nedir? Algoritma nedir? Algoritma nedir?