10
Oca'11

C Dosyalama – Kayıtları Telefon Kodlarına Göre Listeleme (C Programlama Dili)

Öncelikle büyükten küçüğe program ile nasıl sıralama yaptırılabilir buna bakmak lazım.Diyelim ki elimizde 4-1-8-5 rakamlarından oluşan bir integer sayı kümesi var.

……….

Tek tek elemanları ele alıp diger sayılar ile arasındaki büyüklük küçüklük ilişkisini incelemeliyiz.

1) 4 > 1 mi diye bakarız.Doğru ise bir işlem yok.

2) 4 > 8 diye bakarız.Yanlış ise 4 ile 8 yer değiştirsin. 8-1-4-5

3) 8 > 5 diye bakarız.Doğru ise işlem yok.

……….

Şimdi 2. sıradaki sayı için aynı işlemleri tekrarlıyoruz.

1) 1 > 4 diye bakarız.Yanlış olduğu için yer değiştiririz. 8-4-1-5

2) 4 > 5 Yanlış olduğundan yer değiştiririz. 8-5-1-4

……….

3. sıradaki sayı için de baktığımızda büyükten küçüğe sıralanmış olacaktır.

1) 1 > 4 Yanlış olduğundan yer değiştiririz. 8-5-4-1

Sayı Doğru şekilde sıralanmış oldu.

Farkettiğiniz gibi, bir sonraki sayıya baktığımızda işlemler hep birer azalıyor.

……….

Benzer bir mantıkla bir dosyadaki kayıtları telefon kodlarına göre sıralayarak, kayıtları şehir şehir ayırmış oluruz.

……….

Şimdi kullanıcıdan bir telefon numarası girmesini istedik ve alan kodu ile birlikte başında 0 olmadan uyarısını ekledik.2 tane telefon numarası olsun.

telefon numarası 1 : 224 247 00 63

telefon numarası 2: 284 365 08 13 (aramayı denemeyin sallama numaralar :))

1-Programa ilk önce kayıtların alan kodlarını tanıtmak lazım.Bunun için 3 kez dönen bir for açıp 2 farklı dizi içine numaraların ilk 3 hanesi alınır.

2-Hangisinin daha büyük olduğuna bakılır.Büyük olan başta değilse, kayıtlar birbiriyle yer değiştirir.

……….

Tüm bu işlemleri yapabilmek için 3 farklı diziye ihtiyaç var.Bu dizilerin isimleri ve boyutları şu şekilde olmalı:

.

char temp1[3]; //ilk telefonun ilk 3 hanesini alıcak.

char temp2[3]; //ikinci telefonun ilk 3 hanesini alıcak.

char temp3[100]; //İlgili kayıtlar yer değiştirirken verilerin kaybolmamasını sağlayacak.

……….

Programın kodları aşağıdaki gibidir.Ufak notlar ekledim kodlara;

/*Alan Kodlarına Göre Listeleme*/

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

void menu(void);
void ekle(void);
void listele(void);

struct sirket_kayitlari{
	char ad[30];
	char soyad[30];
	char telefon[12];
	char adres[100];
}kayit,kayitlar[40];

int eklenen=0,sayac1=0;

main(){
	menu();
}

void menu(){
int secim;

printf("1-Ekle /// 2-Tel Koduna Gore Listele ///\n\n");

printf("Seciminiz? : "); secim=getch();

  switch (secim){
   case '1':system("cls"); ekle(); menu(); break;     
   case '2':listele(); menu(); break;
   default:system("cls"); printf("Hatali Secim!\n\n"); menu();
  }

}

void ekle(void){

FILE *dosya;

system("cls");

printf("            KAYIT EKLE\n");
printf("\nAd : "); fflush(stdin); gets(kayit.ad);
printf("\nSoyad : "); fflush(stdin); gets(kayit.soyad);
printf("\nAlan Kodu Ile Birlikte Basinda 0 Olmadan Giriniz.");
printf("\nTel : "); fflush(stdin); gets(kayit.telefon);
printf("\nAdres : "); fflush(stdin); gets(kayit.adres);

dosya=fopen("sirket_kayitlari.txt","a");

fprintf(dosya,"%s\t\t%s\t\t%s\t\t\t%s\n",kayit.ad, kayit.soyad,kayit.telefon,kayit.adres);

fclose(dosya);

eklenen++;
}

void listele(void){

FILE *dosya;

int i,j=0,yandaki=0,sayac2=0;//yandaki : örneğin 1. sıradaki sayıdan sonra 2. sıradakine bakabilmek için tanımlandı.

char temp1[3],temp2[3],temp3[100];

system("cls");

printf("Ad\t\tSoyad\t\tTelefon\t\tAdres\n");
printf("--\t\t-----\t\t-------\t\t-----");

dosya=fopen("sirket_kayitlari.txt","r");

while(!feof(dosya)){

   fscanf(dosya,"%s %s %s %s",kayitlar[sayac1].ad, kayitlar[sayac1].soyad,kayitlar[sayac1].telefon,kayitlar[sayac1].adres);
   sayac1++;//kayıt sayısını tutuyor.

}//dosyadaki tüm kayıtlar struct yapısındaki bir diziye aktarıldı.

while(sayac1>0){//Bütün kayıtlara bakana kadar döngü devam etsin.

   while(sayac2<sayac1+j){

      for(i=0;i<3;i++){//2 şer 2 şer telefonların ilk 3 hanesine bakıp işlem yapmak için.

         temp1[i]=kayitlar[yandaki].telefon[i];//kontrol edilen telefon ancak tum telefonlar ile karşılaştırma yapıldığında değişeceğinden onun değişkenini(yandaki) farklı yaptım.
         temp2[i]=kayitlar[sayac2+1].telefon[i];
      }

      if(strcmp(temp2,temp1)>0){//büyük ise bilgilerin yerini değiştir.       
         strcpy(temp3,kayitlar[yandaki].telefon);
         strcpy(kayitlar[yandaki].telefon,kayitlar[sayac2+1].telefon);
         strcpy(kayitlar[sayac2+1].telefon,temp3);
         strcpy(temp3,kayitlar[yandaki].ad);
         strcpy(kayitlar[yandaki].ad,kayitlar[sayac2+1].ad);
         strcpy(kayitlar[sayac2+1].ad,temp3);

         strcpy(temp3,kayitlar[yandaki].soyad);
         strcpy(kayitlar[yandaki].soyad,kayitlar[sayac2+1].soyad);
         strcpy(kayitlar[sayac2+1].soyad,temp3);

         strcpy(temp3,kayitlar[yandaki].adres);
         strcpy(kayitlar[yandaki].adres,kayitlar[sayac2+1].adres);
         strcpy(kayitlar[sayac2+1].adres,temp3);
      }

      sayac2++;
   }

   sayac2=0;

   j++;// sayac 2 birsonraki islemlerini kayitlar dizisinin sıradaki elemanı için uygulamalı.Bunu j sayesinde yapıyor.

   sayac2+=j;
   sayac1--;//Her seferinde islem sayısı 1 azalacak.

   yandaki++;//yandaki sayıya geç.
}

fclose(dosya);

printf("\n");

i=0;

while(strcmp(kayitlar[i].ad,"")!=0){//tum kayıtları ekrana yazdır.

   printf("%s\t\t%s\t\t%s\t%s\n",kayitlar[i].ad, kayitlar[i].soyad,kayitlar[i].telefon,kayitlar[i].adres);

   i++;
}

printf("\n\n");
}

Sayaçların fazlalığı biraz kafa karıştırıyor eminim fakat programın düzgün çalışabilmesi için gerekliydi.İyi çalışmalar.

  • Nazan Ö.

    teşekkürler turgay.

  • Cem Demir

    Eline sağlık Turgay, baya uğraşmışsın. Açıklamalar da güzel.

  • gulay

    cok yararli oldu .tesekkurler=)

Yeni makaleleri E-Mail ile takip edin!