Kayıtlar

döngü etiketine sahip yayınlar gösteriliyor

28 : CPP Dilinde new Operatörü ile Dinamik Dizi Oluşturma

cpp dilinde dinamik bellek kullanımı c diline göre daha kolay. Bir önceki örnekte c dilinde malloc yada calloc kullanarak bir dizi oluşturup rastgele sayılar atamıştık. Bunu cpp dilinde yapmak istersek new operatörü kullanabiliriz. new operatörü sadece dizi değil struct, class gibi birimleri de yaratmada kullanılabilir. Bu tiplerle örnekler yaptığımızda new operatörünün nasıl kullanıldığını da inceleyeceğiz. Yine aynı şekilde bir dizi üretip rastgele sayılar atayıp bastıracağız. Sadece kaç adet sayı olacağını kullanıcıdan isteyeceğiz. dinamiknew.cpp #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int i, num; int *data; time_t t; printf("Kac adet sayi olusturulsun: "); scanf("%d", &num); data = new int[num]; if(data == NULL) { printf("Hata!! Bellek yetersiz \n"); exit(0); } srand((unsigned) time(&t)); for(i = 0; i < num; ++i) { ...

26 : Fonksiyonda Birden Fazla Değişkeni Güncellemek

Resim
Bir fonksiyonun birden fazla değişken dönüşü olamayacağını söylemiştik. Birden fazla değişken bir dizi halinde ise nasıl kullanacağımızı da gördük. Peki bu değişkenler birbirinden ayrı tiplerde değişkenler ise nasıl güncelleyebiliriz? Şimdi bir örnek uyduracağım. Diyeceğim ki bir fonksiyonum olsun. Rastgele boyutlu bir matris üretsin. Matrisin boyutları en çok 5x5 en az 1x1 olsun. Değerler 0 ile 1 arasında olsun ve rastgele seçilsin yine. Fonksiyonda bu değerler yazdırılsın ve sonra main fonksiyonda biz de tekrar yazdırıp doğru mu alıyoruz matrisi kontrol edebilelim. Önce matrisi oluşturacak bir fonksiyon yazmam gerekiyor. Rastgele sayılarla nasıl çalışılır görmüş de olacağız bu sayede. Ancak boyutun da rastgele olması bizim için problem. Çünkü main fonksiyonunda yazdırmak istediğimizde sınırları nasıl belirleyeceğimizi bilmemiz gerekir. Bunun için de bu boyut değerlerini fonksiyondan öğrenmemiz gerekir. rastgele_matris.c #include <stdio.h> #include <time.h> #include...

25 : Pointer ile Dizi Elemanlarına Ulaşma

Bir dizi, bellekte aynı tip verilerden oluşan bloğu ifade eder. Önceki örnekte bir işaretçinin bellekte verinin tutulduğu bir adresi ifade ettiğini söylemiştik. Aynı şekilde dizinin ismi de bu veri bloğunun başlangıç adresini ifade eder. Bir dizi değişkeni ile bir pointer değişkeni arasında benzerlikler bulunur. Aşağıdaki örnekte bir dizi tanımlayacağız ve bunu print ettireceğiz. Daha sonra tekrar pointer kullanarak ulaşıp print ettireceğiz ki fark olmadığını görelim. dizi_pointer.c #include <stdio.h> int main() { int data[7] = {12, 2, 4, 55, 132, 1567, 43}; int i = 0; printf("-- Girilen sayilar -- \n"); printf("Dizi ile: \n"); for(i = 0; i < 7; ++i) { printf("%d ", data[i]); } printf("\nPointer ile: \n"); for(i = 0; i < 7; ++i) { printf("%d ", *(data + i)); } printf("\n"); return 0; } Burada dikkat edilmesi gereken nokta *data ifadesinin data dizisinin i...

23 : İki Karakter Dizisini Birleştirme

Bir karakter dizisini başka bir karakter dizisinin sonuna ekleyerek yeni bir karakter dizisi oluşturmayı inceleyeceğiz. Bunun için önce birinci dizinin boyutunu bulup daha sonra ikinci dizinin elemanlarını bu dizinin devamına kopyalayacağız. birlestir.c #include <stdio.h> int main() { char yazi1[100] = "ccppornekleri"; char yazi2[] = ".blogspot.com"; int i = 0; int count = 0; int j = 0; for (i = 0; yazi1[i] != '\0'; i++) { count++; } printf("count = %d i = %d \n",count, i); for (j = 0; yazi2[j] != '\0'; j++) { yazi1[count+j] = yazi2[j]; } yazi1[count+j] = '\0'; printf("%s \n", yazi1); return 0; } İlk for döngüsü ile null karaktere kadar olan karakterleri sayıyoruz ve ilk dizinin boyutunu buluyoruz. count burada boyutu tutuyor ancak print ettirdiğimiz count ve i sayılarından anlaşılacağı üzere i değişkeni de kullanılabilirdi. Aynı sayıyı tutmuş oluyorl...

22 : Karakter Dizisi Boyutu

Bir karakter dizisini başka bir yere kopyalayacağınız zaman ya da karakter dizisi üzerinde üzerinde herhangi bir işlem yapacağınız zaman, bir karakter arama olabilir örneğin, karakter dizisinin boyutunu bilmeniz gerekebilir. Boyutu bulmak ileriki aşamalarda bizim için bir amaç değil sadece küçük bir adım olsa da karakter dizilerinde çalışırken nasıl hareket edeceğimizi görmemiz açısından şuan faydalı olacaktır. boyut.c #include <stdio.h> #include <string.h> //strlen icin eklendi int main() { char site_adi[50] = "ccppornekleri.blogspot.com"; int i = 0; int sayac = 0; for (i = 0; site_adi[i] != '\0'; i++) { sayac++; } printf("%s \n",site_adi); printf("boyut = %d \n",sayac); printf("Boyut = %ld \n", strlen(site_adi)); return 0; } Yaptığımız şey aslında c kütüphanelerinde zaten tanımlı. strlen fonksiyonu kullanılarak bir string'in boyutu bulunabilir. Bu fonksiyonu kullanmak...

21 : Matrisler

Resim
Diziler tek boyutlu olabildiği gibi birden çok boyutlu da olabilir. Her bir dizi elemanı başka bir diziyi saklıyor gibi düşünülebilir. Tek boyutlu diziler [] ile tanımlanırken iki boyutlu diziler [][] ile tanımlanır. Örnek olarak iki matrisin çarpımı örneği verilebilir. matrix.c #include <stdio.h> void carpim(int mat1[4][3], int mat2[3]); int main() { int i = 0, j = 0; int matrix1[4][3] = {{1, 1, 1}, {2, 2, 2}, {1, 1, 1}, {2, 2, 2}}; int matrix2[3] = {2, 3, 4}; printf("Matris 1 : \n"); for (i = 0; i < 4; i++) { for(j = 0; j < 3; j++) { printf("%d ", matrix1[i][j]); } printf("\n"); } printf("Matris 2 : \n"); for (i = 0; i < 3; i++) { printf("%d \n",matrix2[i]); } printf("\n"); carpim(matrix1, matrix2); } void carpim(int mat1[4...

Diziler - 19 : Bir pikselin renk kodları nasıl belirtilir.

Önceki örneklerde bir sürü değişken tanımladık, kullanıcıdan değerler atamasını istedik. Bunların hepsi tek bir sayıyla yada karakterle tanımlanmıştı. Bir resme baktığımızda üzerinde binlerce farklı renkli noktalar görürüz. Bu her bir nokta pixel ismiyle ifade edilir ve her birinin farklı uzaylarda farklı değerleri vardır. En çok bildiğimiz RGB uzayını düşünürsek bir pixelin değerini belirtmek için R(kırmızı), G(yeşil) ve B(mavi) olarak 3 ayrı değer belirtmemiz gerekir. Örneğin 8 bitlik RGB uzayında 3 ana renk şöyle tanımlanır: Kırmızı  : 255, 0 , 0 Yeşil      : 0, 255, 0 Mavi     : 0, 0, 255 Bu değerleri kullanırken her bir pixel için 3 ayrı değişken mi tutmamız gerekir. Bir resimde alt sol pixele p1 dersem ve kodumda kullanmak istersem; varsayalım değerini değiştirmek istiyorum: p1_r , p1_g ve p1_b olarak 3 ayrı değişken mi oluşturmam gerekir. Ya da bir fonksiyona parametre olarak geçireceğim. Şu şekilde mi yazarım: renk_degistir(p1_r, ...

Fonksiyonlar - 15 : Aritmetik işlemler

Uzun kodlar yazılmaya başlandığında bazı kod parçaları tekrar edilmeye başlar. Ayrıca çok uzun satırlar kodun okunmasını zorlaştırır. Hata çözmedeki verim bir hayli düşer. Bu sebeplerden dolayı her işi kendi fonksiyonlarında yaptırmak daha doğru olur. Yani aritmetik bir işlem yapılırken aritmetik isimli bir fonksiyonda dört işlem yaptırmak yerine her işlem için ayrı bir fonksiyon yazmak daha doğru olur. Daha önce yazdığımız dört işlem kodunu fonksiyonlarla ve birden fazla kez işlem yapabilecek şekilde genişletelim. aritmetikfonksiyonlar.c #include<stdio.h> double topla (double sayi1, double sayi2); //prototipler double cikar (double sayi1, double sayi2); double carp (double sayi1, double sayi2); double bol (double sayi1, double sayi2); int main() { char islem; double sayi1, sayi2, sonuc; int bitir = 0; while(1) { printf("Islemi seciniz (+, -, *, /) cikis icin c: "); do{ islem = getchar(); }while (isspace(islem)); if (is...

14 : Konsol Giriş Kısıtlama - Karakter harici girişleri engelleme

Kod yazarken en önemli konulardan biri yazılan kodun hataya açık olmamasıdır. Hata çözme ilk olarak kodu yazarken yapılır. Kodu yazan kişi bütün açık kapıları düşünmelidir. Daha sonra çok kez test yapılır ve tekrar gözden geçirilir. Önceki örneklerimizde bir işlem yaparken bir limit belirleyip ve bunu son kullanıcıdan istiyoruz. Örneğin aritmetik işlem yaptırırken kullanıcıdan sayı girmesini bekliyoruz. Son kullanıcı bilerek ve ya bilmeyerek sayı girmesi gerekirken her hangi bir karakter girebilir. Bu gibi durumları kontrol etmediğimiz durumlarda kodda problemler oluşacaktır. Şuan bildiğimiz konulardan bir örnekle göstermek gerekirse, kullanıcının sadece küçük harf girmesini isteyelim. kucukharf.c #include<stdio.h> int main() { char islem; printf("Kucuk harf giriniz: "); do{ scanf("%c", &islem); }while (islem < 97 || islem > 122); return 0; } Burada bahsetmek istediğim ikinci bir konu ise do while döngüsü. Do w...

13 : Faktoriyel Hesabı

Bir sayının faktoriyel hesabı 1' den o sayıya kadar olan tam sayıların çarpımı ile bulunur. Negatif sayıların faktoriyeli yoktur. 0 faktoriyel ise 1' e eşittir. Bu bilgiler ışığında kodu yazalım. faktoriyel.c #include <stdio.h> int main() { int sayi, i; unsigned long long faktoriyel = 1; printf("Bir sayi giriniz: "); scanf("%d",&sayi); if (sayi < 0) { printf("Negatif sayilarin faktoriyeli yoktur.\n"); } else { for(i=2; i<=sayi; ++i) { faktoriyel *= i; } printf("%d faktoriyel = %llu \n", sayi, faktoriyel); } return 0; } Faktoriyel sonucunu atadığımız değişkeni unsigned long long seçtik çünkü sonuç hem negatif olamaz hem de bir çok tamsayı çarpımı olabileceği için çok büyük sayılar çıkabilir. Sayıyı kullanıcının girmesini istedikten sonra ilk kontrolümü negatif mi kontrolü. Çünkü daha önce söylediğimiz gibi...

12 : Yıldızlarla Üçgen Oluşturma - içiçe döngü

Döngü kullanarak tekrarlanan işleri yapmayı önceki örneklerde görmüştük. Şimdi bu bilgilerle aşağıdaki şekli oluşturalım: * * * * * * * * * * * * * * * Burada şekil oluşturulurken yine bir döngü kurup her indisi kontrol edip yeni bir printf fonksiyonu ile çizdirebiliriz. Kodu gösterirsek:  ucgen.c #include<stdio.h> int main() { int i = 0; for (i = 0; i < 5; i++) { if (i == 0) printf("* \n"); if (i == 1) printf("* * \n"); if (i == 2) printf("* * * \n"); if (i == 3) printf("* * * * \n"); if (i == 4) printf("* * * * * \n"); } return 0; } Burada yine aynı problemi görüyoruz. Bu üçgen 5 basamaklı bir üçgen. Ancak biz bu üçgeni 15 adımlı da yapmak isteyebilirdik. Aynı kodu 15 kere yazmak zorlaştı. Peki 150 adımlı olsa yapılabilir miydi? Bu tür problemler için iç içe döngüler kurabiliriz. Bu şekilde her bir döngü farklı bir b...

11 : Fibonacci Serisi

Tekrarlanan işleri for döngüsü ile yapabildiğimizi gördük. Ancak tek yöntem bu değil. Döngüler konusunun en popüler örneklerinden biri fibonacci serileridir. Bu örneği hem for döngüsü ile yapalım hem de bir diğer döngü olan while ile yapalım. Koda geçmeden önce fibonacci serisinden bahsedelim. Bu seri 1'den başlayıp bir sonraki sayıyı kendisi ve bir önceki sayıyı toplayarak bulmasıyla oluşur. Yani 1'den başlayan fibonacci serisi şöyle değerler alır. 1-1-2-3-5-8-13-21... Bu serinin popüler olmasının nedeni ise sonsuzdaki son iki değerin birbirine bölümünün altın oranı vermesi. Bunu da belirtmeden geçmeyelim. Burada sonsuza kadar gidebildiği için ve bizim bunu gerçekleştirmemiz olası olmadığı için kendimize bir durak noktası seçeceğiz. Örneğin 10 değer yazdırabiliriz.  fibonacci.c #include<stdio.h> int main() { int N = 10; int t1 = 0; int t2 = 1; int next = 0; int i = 0; for (i = 0; i < N; i++) { printf("%d ",t2); ...

Döngüler - 10 : 1' den 100'e kadar yazdırma

   printflerle konsolda yazılar yazdırabileceğimizi gördük. Ancak ben 1' den 100' e kadar yazdırmak istersem 100 tane printf kodu mu yazdıracağım. Peki 100 yerine 1000 yada 10000 istersem bu mümkün olacak mı? Bu gibi tekrarlanan durumlar için satır satır yazmaktansa döngüler kullanmak çok daha kolaydır. Bir örnekle görelim.  hello.c #include<stdio.h> int main() { printf("1\n"); printf("2\n"); printf("3\n"); printf("4\n"); printf("5\n"); printf("6\n"); printf("7\n"); printf("8\n"); printf("9\n"); printf("10\n"); return 0; } Burada 1 ile 10 arasındaki sayıları tek tek yazmak zorunda kaldık. 10 tane olduğu için çok uzun sürmedi. 100' e kadar yazmak istesek 10 kez daha yazmamız gerekecek tabii. Şimdi aynı çıktıyı bir döngü ile alalım. #include<stdio.h> int main() { int i = 0; // dongu icin bir indis olustu...