Şimdi Ara

c dilinde telefon defteri için örnek kod

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
14
Cevap
0
Favori
7.745
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • linked list kullanılarak yazılan telefon defteri/öğrenci kayıtları için örnek kodlar arıyorum. bu kayıtlar text dosyasına kaydedilecek, her program çalıştırıldığında dosyandan okuyup listeye yerleştirecek. c++ da yazılan bir şeyler var ama c için bulamadım. yardım ederseniz çok sevinirim.



  • İnan ki böyle programları okuyup anlamaya çalışmak, sıfırdan yazmaktan daha zordur. Bağlı liste son derece basit bir veri yapısı. Düğümü dosyaya yazıp okuma işini çözersen gerisi kolay.
  • hangi fonksiyonu nasıl, nerede kulanmışlar filan diye bakmak istiyorum. bir de kod yazarken sentaks hataları yapıyorum, onları düzeltmem lazım.
  • yok mu örnek verecek?
  • Geç oldu ama kendim bir örnek yazdım. Detaylı şekilde denemedim hata çıkabilir.
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    #include <string.h>

    struct _TelDef { //Telefon bilgilerini tutan yapı
    char adi[30];
    char soyadi[30];
    char tel_num[12];
    struct _TelDef *sonraki; //Listedeki bir sonraki yapıyı gösteren işaretçi
    } *_baslangic; //Listenin başlangıç adresini tutar
    typedef struct _TelDef TelDef;

    void kisiOku(TelDef *dugum, FILE *dosya) //Dosyadan kişi bilgisi okur
    {
    fgets(dugum->adi, 30, dosya); // Satırı okur ve ilk parametrede gösterilen yere yazar
    fgets(dugum->soyadi, 30, dosya);
    fgets(dugum->tel_num, 12, dosya);
    dugum->adi[strlen(dugum->adi) - 1] = '\0'; //Beklenmedik karakter dönüşümü
    dugum->soyadi[strlen(dugum->soyadi) - 1] = '\0';
    dugum->tel_num[strlen(dugum->tel_num) - 1] = '\0';
    }

    void defteriOku() //Dosyayı okur, her kişi için bir düğüm oluşturup bilgileri
    { //saklar ve düğümleri birbirine bağlar
    TelDef *dugum;
    FILE *dosya = fopen("telefon defteri.tlf", "r");
    if(!dosya)
    return;

    if(fgetc(dosya) == '#') { //Dosyada # işareti ile başlayan bölüm bir kişi bilgisidir
    _baslangic = dugum = (TelDef *) malloc(sizeof(TelDef)); /* İlk kişi için
    yer ayrılır ve başlangıç adresi olarak kaydedilir.*/

    kisiOku(dugum, dosya);
    }
    else {
    fclose(dosya); // Dosya boş ise kapat ve çık.
    return;
    }

    while(fgetc(dosya) == '#') { /*Devam eden kişiler içinde yer ayrılır ve
    dugumlere kaydedilir*/

    dugum->sonraki = (TelDef *) malloc(sizeof(TelDef));
    dugum = dugum->sonraki;
    kisiOku(dugum, dosya);
    }
    dugum->sonraki = NULL;
    fclose(dosya);
    }

    bool yeniKisiEkle(TelDef *kisi) //Eklenecek yeni kişi için düğüm oluşturur ve
    { //hem belleğe hem de dosyaya yazar.
    TelDef *dugum = _baslangic;
    FILE *dosya = fopen("telefon defteri.tlf", "a");
    if(!dosya)
    return false;

    fprintf(dosya, "#%s\n", kisi->adi);
    fprintf(dosya, "%s\n", kisi->soyadi);
    fprintf(dosya, "%s\n", kisi->tel_num);
    fclose(dosya);

    if(dugum) {
    while(dugum->sonraki) //Listenin sonuna gelene kadar devam et
    dugum = dugum->sonraki;
    dugum->sonraki = (TelDef *) malloc(sizeof(TelDef));
    dugum = dugum->sonraki;
    }
    else //Liste boş ise ilk düğüm
    _baslangic = dugum = (TelDef *) malloc(sizeof(TelDef));
    dugum->sonraki = NULL;

    strcpy(dugum->adi, kisi->adi);
    strcpy(dugum->soyadi, kisi->soyadi);
    strcpy(dugum->tel_num, kisi->tel_num);
    return true;
    }

    char* numarayiBul(char adi[], char soyadi[]) //Ad ve soyada bakarak numarayı bulur
    {
    TelDef *dugum = _baslangic;
    while(dugum) {
    if(!strcmp(adi, dugum->adi) && !strcmp(soyadi, dugum->soyadi))
    return dugum->tel_num;
    dugum = dugum->sonraki;
    }

    return NULL;
    }

    void dokumAl() //Bütün listeyi yazdırır
    {
    TelDef *dugum = _baslangic;
    if(!dugum)
    printf("\nListe bos!\n");

    while(dugum) {
    printf("%s\n%s\n%s\n\n", dugum->adi, dugum->soyadi, dugum->tel_num);
    dugum = dugum->sonraki;
    }
    }

    int main()
    {
    char ch, *numara;
    TelDef kisi;

    defteriOku(); //Bunu mutlaka çağırıyoruz
    do {
    fflush(stdin);
    printf("\n(Y)eni kisi ekle:\n(N)umara bul:\nDoku(m) al\n(C)ik:\n");
    ch = getchar();

    if(ch == 'y') {
    fflush(stdin);
    printf("Eklenecek kisi\nAdi: ");
    gets(kisi.adi);
    printf("Soyadi: ");
    gets(kisi.soyadi);
    printf("Telefon numarasi: ");
    gets(kisi.tel_num);

    if(yeniKisiEkle(&kisi))
    printf("\nKisi eklendi\n");
    else
    printf("\nEklenemedi!\n");
    }

    if(ch == 'n') {
    fflush(stdin);
    printf("Bulunacak kisi\nAdi: ");
    gets(kisi.adi);
    printf("Soyadi: ");
    gets(kisi.soyadi);

    numara = numarayiBul(kisi.adi, kisi.soyadi);
    if(numara)
    printf("\nNumara: %s\n", numara);
    else
    printf("\nKisi bulunamadi!\n");
    }

    if(ch == 'm')
    dokumAl();
    } while(ch != 'c');

    return 0;
    }

    main i istediğin gibi düzenleyebilirsin. Dikkat etmen gereken şey dosyaya elle müdahale etmemek. Sorun olursa burdayım.




  • quote:

    Orijinalden alıntı: elektro_gadget

    Geç oldu ama kendim bir örnek yazdım. Detaylı şekilde denemedim hata çıkabilir.

    main i istediğin gibi düzenleyebilirsin. Dikkat etmen gereken şey dosyaya elle müdahale etmemek. Sorun olursa burdayım.


    teşekkürler. yeterli gözüküyor. hemen incelemeye ve üstünde çalışmaya başlıyorum.
  • bu kısmı geçtim. şimdi isimleri yerleştireceğim. ama alfabetik sıralı olacak. onu nasıl yapacağım? sayı olsa büyük/küçük diye bakılırda burada nasıl olacak? özel fonksiyon mu var?
  • Bildiğim kadarıyla c'de bağlı listeleri sıralayan hazır bir fonksiyon yok. Olsa bile, kişi bilgilerinden bir parametre seçip (mesela adı) onu küçük mü veya büyük mü diye karşılaştırabilesin ki sıralanabilsin. Neyse ki iki stringi karşılaştırabilen strcmp var. Bu fonksiyonun aldığı ilk parametre ikincisinden önce geliyorsa (alfabetik olarak) -1, sonra geliyorsa 1, aynı ise 0 döndürür. Böylece isimden yola çıkarak hangi düğümü nereye bağlayacağını bulabilirsin. Tabi sıralama algoritması sana kalmış.
  • dosyadan isim soyadı filan okumaya çalışıyorum ama beceremedim. internette sscanf ve strtok fonksiyonlarınu gördüm. ama bunları nasıl kullanıcağımı bilmiyorum. dosyam isim/soyisim.... şeklinde her satırda bir kişi var.
  • quote:

    Orijinalden alıntı: elektro_gadget

    Geç oldu ama kendim bir örnek yazdım. Detaylı şekilde denemedim hata çıkabilir.
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    #include <string.h>

    struct _TelDef { //Telefon bilgilerini tutan yapı
    char adi[30];
    char soyadi[30];
    char tel_num[12];
    struct _TelDef *sonraki; //Listedeki bir sonraki yapıyı gösteren işaretçi
    } *_baslangic; //Listenin başlangıç adresini tutar
    typedef struct _TelDef TelDef;

    void kisiOku(TelDef *dugum, FILE *dosya) //Dosyadan kişi bilgisi okur
    {
    fgets(dugum->adi, 30, dosya); // Satırı okur ve ilk parametrede gösterilen yere yazar
    fgets(dugum->soyadi, 30, dosya);
    fgets(dugum->tel_num, 12, dosya);
    dugum->adi[strlen(dugum->adi) - 1] = '\0'; //Beklenmedik karakter dönüşümü
    dugum->soyadi[strlen(dugum->soyadi) - 1] = '\0';
    dugum->tel_num[strlen(dugum->tel_num) - 1] = '\0';
    }

    void defteriOku() //Dosyayı okur, her kişi için bir düğüm oluşturup bilgileri
    { //saklar ve düğümleri birbirine bağlar
    TelDef *dugum;
    FILE *dosya = fopen("telefon defteri.tlf", "r");
    if(!dosya)
    return;

    if(fgetc(dosya) == '#') { //Dosyada # işareti ile başlayan bölüm bir kişi bilgisidir
    _baslangic = dugum = (TelDef *) malloc(sizeof(TelDef)); /* İlk kişi için
    yer ayrılır ve başlangıç adresi olarak kaydedilir.*/

    kisiOku(dugum, dosya);
    }
    else {
    fclose(dosya); // Dosya boş ise kapat ve çık.
    return;
    }

    while(fgetc(dosya) == '#') { /*Devam eden kişiler içinde yer ayrılır ve
    dugumlere kaydedilir*/

    dugum->sonraki = (TelDef *) malloc(sizeof(TelDef));
    dugum = dugum->sonraki;
    kisiOku(dugum, dosya);
    }
    dugum->sonraki = NULL;
    fclose(dosya);
    }

    bool yeniKisiEkle(TelDef *kisi) //Eklenecek yeni kişi için düğüm oluşturur ve
    { //hem belleğe hem de dosyaya yazar.
    TelDef *dugum = _baslangic;
    FILE *dosya = fopen("telefon defteri.tlf", "a");
    if(!dosya)
    return false;

    fprintf(dosya, "#%s\n", kisi->adi);
    fprintf(dosya, "%s\n", kisi->soyadi);
    fprintf(dosya, "%s\n", kisi->tel_num);
    fclose(dosya);

    if(dugum) {
    while(dugum->sonraki) //Listenin sonuna gelene kadar devam et
    dugum = dugum->sonraki;
    dugum->sonraki = (TelDef *) malloc(sizeof(TelDef));
    dugum = dugum->sonraki;
    }
    else //Liste boş ise ilk düğüm
    _baslangic = dugum = (TelDef *) malloc(sizeof(TelDef));
    dugum->sonraki = NULL;

    strcpy(dugum->adi, kisi->adi);
    strcpy(dugum->soyadi, kisi->soyadi);
    strcpy(dugum->tel_num, kisi->tel_num);
    return true;
    }

    char* numarayiBul(char adi[], char soyadi[]) //Ad ve soyada bakarak numarayı bulur
    {
    TelDef *dugum = _baslangic;
    while(dugum) {
    if(!strcmp(adi, dugum->adi) && !strcmp(soyadi, dugum->soyadi))
    return dugum->tel_num;
    dugum = dugum->sonraki;
    }

    return NULL;
    }

    void dokumAl() //Bütün listeyi yazdırır
    {
    TelDef *dugum = _baslangic;
    if(!dugum)
    printf("\nListe bos!\n");

    while(dugum) {
    printf("%s\n%s\n%s\n\n", dugum->adi, dugum->soyadi, dugum->tel_num);
    dugum = dugum->sonraki;
    }
    }

    int main()
    {
    char ch, *numara;
    TelDef kisi;

    defteriOku(); //Bunu mutlaka çağırıyoruz
    do {
    fflush(stdin);
    printf("\n(Y)eni kisi ekle:\n(N)umara bul:\nDoku(m) al\n(C)ik:\n");
    ch = getchar();

    if(ch == 'y') {
    fflush(stdin);
    printf("Eklenecek kisi\nAdi: ");
    gets(kisi.adi);
    printf("Soyadi: ");
    gets(kisi.soyadi);
    printf("Telefon numarasi: ");
    gets(kisi.tel_num);

    if(yeniKisiEkle(&kisi))
    printf("\nKisi eklendi\n");
    else
    printf("\nEklenemedi!\n");
    }

    if(ch == 'n') {
    fflush(stdin);
    printf("Bulunacak kisi\nAdi: ");
    gets(kisi.adi);
    printf("Soyadi: ");
    gets(kisi.soyadi);

    numara = numarayiBul(kisi.adi, kisi.soyadi);
    if(numara)
    printf("\nNumara: %s\n", numara);
    else
    printf("\nKisi bulunamadi!\n");
    }

    if(ch == 'm')
    dokumAl();
    } while(ch != 'c');

    return 0;
    }

    main i istediğin gibi düzenleyebilirsin. Dikkat etmen gereken şey dosyaya elle müdahale etmemek. Sorun olursa burdayım.

    konu biraz eski ama araştırma sırasında buldum ve işime yarayan bir örnek olduğu için yorum yazma gereksinimi duydum. hocam programı denedim sorunsuz çalışıo fakat buna bi kayıt silme ve kayıt değiştirme olayını nasıl ekleriz?




  • Bu console application mı açıklık getirirseniz sevinirim hata veriyor
  • quote:

    Orijinalden alıntı: efsanevi58

    Bu console application mı açıklık getirirseniz sevinirim hata veriyor

    console hocam
  • quote:

    Orijinalden alıntı: elektro_gadget

    Geç oldu ama kendim bir örnek yazdım. Detaylı şekilde denemedim hata çıkabilir.
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    #include <string.h>

    struct _TelDef { //Telefon bilgilerini tutan yapı
    char adi[30];
    char soyadi[30];
    char tel_num[12];
    struct _TelDef *sonraki; //Listedeki bir sonraki yapıyı gösteren işaretçi
    } *_baslangic; //Listenin başlangıç adresini tutar
    typedef struct _TelDef TelDef;

    void kisiOku(TelDef *dugum, FILE *dosya) //Dosyadan kişi bilgisi okur
    {
    fgets(dugum->adi, 30, dosya); // Satırı okur ve ilk parametrede gösterilen yere yazar
    fgets(dugum->soyadi, 30, dosya);
    fgets(dugum->tel_num, 12, dosya);
    dugum->adi[strlen(dugum->adi) - 1] = '\0'; //Beklenmedik karakter dönüşümü
    dugum->soyadi[strlen(dugum->soyadi) - 1] = '\0';
    dugum->tel_num[strlen(dugum->tel_num) - 1] = '\0';
    }

    void defteriOku() //Dosyayı okur, her kişi için bir düğüm oluşturup bilgileri
    { //saklar ve düğümleri birbirine bağlar
    TelDef *dugum;
    FILE *dosya = fopen("telefon defteri.tlf", "r");
    if(!dosya)
    return;

    if(fgetc(dosya) == '#') { //Dosyada # işareti ile başlayan bölüm bir kişi bilgisidir
    _baslangic = dugum = (TelDef *) malloc(sizeof(TelDef)); /* İlk kişi için
    yer ayrılır ve başlangıç adresi olarak kaydedilir.*/

    kisiOku(dugum, dosya);
    }
    else {
    fclose(dosya); // Dosya boş ise kapat ve çık.
    return;
    }

    while(fgetc(dosya) == '#') { /*Devam eden kişiler içinde yer ayrılır ve
    dugumlere kaydedilir*/

    dugum->sonraki = (TelDef *) malloc(sizeof(TelDef));
    dugum = dugum->sonraki;
    kisiOku(dugum, dosya);
    }
    dugum->sonraki = NULL;
    fclose(dosya);
    }

    bool yeniKisiEkle(TelDef *kisi) //Eklenecek yeni kişi için düğüm oluşturur ve
    { //hem belleğe hem de dosyaya yazar.
    TelDef *dugum = _baslangic;
    FILE *dosya = fopen("telefon defteri.tlf", "a");
    if(!dosya)
    return false;

    fprintf(dosya, "#%s\n", kisi->adi);
    fprintf(dosya, "%s\n", kisi->soyadi);
    fprintf(dosya, "%s\n", kisi->tel_num);
    fclose(dosya);

    if(dugum) {
    while(dugum->sonraki) //Listenin sonuna gelene kadar devam et
    dugum = dugum->sonraki;
    dugum->sonraki = (TelDef *) malloc(sizeof(TelDef));
    dugum = dugum->sonraki;
    }
    else //Liste boş ise ilk düğüm
    _baslangic = dugum = (TelDef *) malloc(sizeof(TelDef));
    dugum->sonraki = NULL;

    strcpy(dugum->adi, kisi->adi);
    strcpy(dugum->soyadi, kisi->soyadi);
    strcpy(dugum->tel_num, kisi->tel_num);
    return true;
    }

    char* numarayiBul(char adi[], char soyadi[]) //Ad ve soyada bakarak numarayı bulur
    {
    TelDef *dugum = _baslangic;
    while(dugum) {
    if(!strcmp(adi, dugum->adi) && !strcmp(soyadi, dugum->soyadi))
    return dugum->tel_num;
    dugum = dugum->sonraki;
    }

    return NULL;
    }

    void dokumAl() //Bütün listeyi yazdırır
    {
    TelDef *dugum = _baslangic;
    if(!dugum)
    printf("\nListe bos!\n");

    while(dugum) {
    printf("%s\n%s\n%s\n\n", dugum->adi, dugum->soyadi, dugum->tel_num);
    dugum = dugum->sonraki;
    }
    }

    int main()
    {
    char ch, *numara;
    TelDef kisi;

    defteriOku(); //Bunu mutlaka çağırıyoruz
    do {
    fflush(stdin);
    printf("\n(Y)eni kisi ekle:\n(N)umara bul:\nDoku(m) al\n(C)ik:\n");
    ch = getchar();

    if(ch == 'y') {
    fflush(stdin);
    printf("Eklenecek kisi\nAdi: ");
    gets(kisi.adi);
    printf("Soyadi: ");
    gets(kisi.soyadi);
    printf("Telefon numarasi: ");
    gets(kisi.tel_num);

    if(yeniKisiEkle(&kisi))
    printf("\nKisi eklendi\n");
    else
    printf("\nEklenemedi!\n");
    }

    if(ch == 'n') {
    fflush(stdin);
    printf("Bulunacak kisi\nAdi: ");
    gets(kisi.adi);
    printf("Soyadi: ");
    gets(kisi.soyadi);

    numara = numarayiBul(kisi.adi, kisi.soyadi);
    if(numara)
    printf("\nNumara: %s\n", numara);
    else
    printf("\nKisi bulunamadi!\n");
    }

    if(ch == 'm')
    dokumAl();
    } while(ch != 'c');

    return 0;
    }

    main i istediğin gibi düzenleyebilirsin. Dikkat etmen gereken şey dosyaya elle müdahale etmemek. Sorun olursa burdayım.

    Konuyu hortlatmak zorundayım :) bir sorum olacak hocam . Ben kişileri satır satır okutmak istiyorum ve kişi bilgilerini virgülle ayırmak istiyorum . Nasıl yaparım ?




  • Guest-BF8E9B238 G kullanıcısına yanıt

    Konuyu hortlatmak gibi olacak hocam kusura bakmayın ama içimden teşekkür etmek geldi. Allah sizden razı olsun. Sizin sayenizde eksiğim olan bir çok eksiği görmüş oldum, öğrendim. Belki yıllar sonra bu yazıyı okuduğunuzda yüzünüzde bir tebessüm oluşturur diye bu dizeleri kaleme alıyorum. Allaha emanet olun.

  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.