Bildirim
c dilinde telefon defteri için örnek kod
Daha Fazla
Bu Konudaki Kullanıcılar:
Daha Az
2 Misafir - 2 Masaüstü
Giriş
Mesaj
-
-
İ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 ?
-
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
Ip işlemleri
Bu mesaj IP'si ile atılan mesajları ara Bu kullanıcının son IP'si ile atılan mesajları ara Bu mesaj IP'si ile kullanıcı ara Bu kullanıcının son IP'si ile kullanıcı ara
KAPAT X
Bu mesaj IP'si ile atılan mesajları ara Bu kullanıcının son IP'si ile atılan mesajları ara Bu mesaj IP'si ile kullanıcı ara Bu kullanıcının son IP'si ile kullanıcı ara
KAPAT X