Arama butonu
Bu konudaki kullanıcılar: 1 misafir, 1 mobil kullanıcı
13
Cevap
7877
Tıklama
0
Öne Çıkarma
c dilinde telefon defteri için örnek kod
.
14 yıl
Onbaşı
Konu Sahibi

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.



G
14 yıl
Yarbay

İ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.


Bu mesaja 1 cevap geldi.
.
14 yıl
Onbaşı
Konu Sahibi

hangi fonksiyonu nasıl, nerede kulanmışlar filan diye bakmak istiyorum. bir de kod yazarken sentaks hataları yapıyorum, onları düzeltmem lazım.


Bu mesaja 1 cevap geldi.
.
14 yıl
Onbaşı
Konu Sahibi

G
14 yıl
Yarbay

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.


Bu mesaja 4 cevap geldi.
.
14 yıl
Onbaşı
Konu Sahibi

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 mesaja 1 cevap geldi.
.
14 yıl
Onbaşı
Konu Sahibi

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?


Bu mesaja 1 cevap geldi.
G
14 yıl
Yarbay

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ış.


Bu mesaja 1 cevap geldi.
.
14 yıl
Onbaşı
Konu Sahibi

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.



L
13 yıl
Yüzbaşı

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?



E
12 yıl
Er

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


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @LynXMaSTeR
L
12 yıl
Yüzbaşı

quote:

Orijinalden alıntı: efsanevi58

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

console hocam



E
11 yıl
Çavuş

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 ?



H
5 yıl
Teğmen

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.




Bu mesajda bahsedilenler: @Guest-BF8E9B238
DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.