1. sayfa
List.EXE derken? bir program mı? eğer program ise açıp verileri tuttuğu memory alanını okuyarak yapabilirsin, başka birşey ise bilgi ver ona göre birşey diyeyim. |
void FileRead(PersonalInformation* PI) Bu şekilde ("List.exe") diye dosya oluşturdum girdiğim isimleri programda iken listeliceğim bir komuta ihtiyacım var |
Anlatımın yanlış, List.exe senin yazdığın program, list.txt ise senin database in. senin yapmak istediğin şey ise List.txt nin içeriğini listelemek. Doğru anlamışmıyım? |
bu konuları daha yeni öğreniyorum yaptığım programı komple vereyim anlatmaktan daha kolay olur :)
işte bu şekilde girdiğim ismi, soyismi, ve notu List.exe ye kaydediyorum (bu database mi oluyo?). kaydettiğim isimleri program içinde listelemem lazım. şöle bir şey mümkün mü? if döngüsü ile örneğin if (key=='S') show ("List.exe") gibi |
burda yaptığın en büyük yanlış şu; programın mantıklı bir algoritması yok. önce bir kağıdı alıp akış diyagramı yapman gerekir. program çalıştı, biz ne tür seçenekleri kullanıcı önüne koyucaz? ya kayıt ekleme yada kayıtları listeleme gibi, dolayısıyla bizim en başa 3 seçenek koymamız gerek 1-Yeni Kayıt Ekle 2-Kayıtları Listele 3-Çıkış gibi, tabi burada şu var adamın kaç tane kayıt eklemek istediğni biliyor muyuz? yada kaç kez kayıtları listeletmek isteyeceğini? hayır bilmiyoruz, ama ne zaman çıkmak istediğini biliyoruz, menü ekranında 3 e basınca yani biz bir sonsuz döngü yapalım burdan çıkmanın yoluda, menüde, 3 tuşuna basmak olsun.
yalnız yukarda atof kısmına dikkat et, yaptığın program varsayılan olarak ingilizcedir, 75.800 sayısını ingilizcede, 75 tam binde 800 şeklinde okursun, bu sayı türkçede 75 bin 800 demek, yani notu girerken, küsüratından önce nokta at, virgül değil anlamadığın yer olursa sor. artık gerisini kendin yaparsın zaten. |
@eserb teşekkürler hocam baya faydalı oldu listeleme kodunu kullandım, menü yapmak istemiyorum görünüş basit ama kodlar iyi olmalı yinede seçim sunuyorum (devam et, listele ve çık). son hali şu şekilde
şimdi buna yapmam gereken girilen tüm notların ortalamasını almak :) |
while (!file.eof()) kısmının 1 satır üstüne float toplam = 0; float ogrencisayisi = 0; yaz float fnot = atof(sNot.c_str()); kısmının alt satırına ogrencisayisi++; toplam += fnot; yazarsan zaten her ögrencinin notunu birbiriyle toplamış ve kaç öğrenci olduğuna öğrenmiş olursun while (!file.eof()) dönsünün çıkışına cout << "not ortalaması: " << (toplam / ogrencisayisi ); yazarsan, ortalamayı ekranda görürsün. yalnız çok çalışman lazım! Eğer abim gibi üniversitede makina mühendisliğinde programlama dersi görüp sonrada gidip yağdan-pastan, kopan halatlardan, devrilen vinçlerden başka birşeyle boğuşmayacaksan tabi... |
hocam büyüksün üniversite ikinici sınıf öğrencisiyim ama inan hiçbir şey öğrettikleri yok internet sayesinde bende kendimi geliştirmeye çalışıyorum elimizden geldiğince Allah büyük. çok teşekkür ederim sana |
Arkadaşım eğer zamanın varsa ve bu işte istekliysen programla uğraşmayı bırak, otur kendine sağlam bir temel at önce. Senin seviyene göre 10-15 gün sıkı bir çalışma yeterli olur. Eğer vakit yoksa bence "kopya çek". Yani bir şekilde hazır kod kullan, illaki ben yapacam deme. Çünkü yazdığın kod ezbere yazılmış gibi. eserb arkadaşın dediği gibi, mantıklı bir algoritma değil bu. Daha exe, file, object, memory kavramları bile kafanda tam oturmamış. Bak ben sana bazı şeylerden bahsedeyim. Yazdığın kod kendi başına çalışamaz, cpu nun anlayıp çalıştırabileceği bir formata dönüştürülmesi gerekir. Derleyici yazdığın program kodunu okuyup bir ikili (binary) dosya üretir. Bu dosyanın uzantısı windows larda exe'dir. İçerisinde senin programının haricinde işletim sistemi ile ilgili sistem çağrıları, startup kodu vs. bulunur. Programında kullandığın bütün değişkenler, diziler, nesneler bellekte (ram, cpu önbelleği, sanal bellek vs. bizi ilgilendirmez) saklanır. Veriler program (exe) çalışırken işlemci ve bellek arasında dolaşıp dururlar ama program sonlanınca uçup giderler. Program sonlansa da pc kapatılsa da kaybolmasını istemediğin veriler varsa bunları uygun biryere kaydetmelisin (genellikle harddisk e). Bunun için programına dosya işlemleri yapacak kodlar eklemelisin. Şimdi dönelim senin programına. Daha önce öğrenci bilgilerinin saklanmasına gerek olmadığını söylemiştin. Ama halen dosya fonksiyonları kullanıyorsun. Önce bilgileri alıp dosyaya yazıp sonra da aynı bilgiyi tekrar okumanın hiçbir mantığı yok. Zaten dosyada kayıtlı verin olduğu zaman bunları okuyup hafızaya atacak bir "load" fonksiyonun olmalı. Ama senin kodda daha önceki kayıtlara hiçbir erişim metodu yok. Neyse kısaca fstream e falan ihtiyacın yok. Yapman gereken şey girilecek en fazla öğrenci bilgisi için uygun yer açmak ve orayı kullanmak. Tahminen en fazla 50 giriş yapılabilir. struct Personel { string adi_soyadi; // adı ve soyadını ayrı da yazabilirsin tabi. float not; }; Personel ogrenci[50]; int id; Buyur sana 50 öğrencinin bilgisini saklayacak hafıza alanı. id değişkeni sıradaki öğrenci numarasını tutacak. Öğrenci kaydı (belleğe) şöyle yapılabilir. getline(cin, ogrenci[id].adi_soyadi); cin >> ogrenci[id].not; ++id; İsim ve notları yazdırmak için şöyle bir döngü yeter. int n = 0; for(; n < id; n++) cout << ogrenci[n].adi_soyadi << ogrenci[n].not; Şu kod not ortalamasını verir. int n = 0; float ortalama, toplam = 0.0; for(; n < id; n++) toplam += ogrenci[n].not; ortalama = toplam / id - 1; Şu da en büyük notu verir. int n = 0; float enbuyuk = ogrenci[0].not; for(; n < id; n++) { if(ogrenci[n].not > enbuyuk) enbuyuk = ogrenci[n].not; } İnşallah yardımcı olur. Sıfırdan bir algoritma çıkarmalısın. Aslında kodundaki hataları söylemedim; Açılmış olan dosyayı arka arkaya tekrar açmak, aynı isimde hem giriş hem çıkış dosyasını ayrı ayrı açmak, açılan dosyayı kapatmamak, gereksiz yere goto ile dallanmak gibi. Mesela programdan çıkış şöyle birşey olmalı: char key; do { cin.get(key); ... ... } while(key != 'c'); return 0; // end of main() c ye basılırsa döngüden çıkılır, aksi halde devam edilir. |
1. sayfa
birde bu dosyanın içindeki double türünden olan sayıların ortalamasını nasıl alırım?
teşekkürler
< Bu mesaj bu kişi tarafından değiştirildi form -- 19 Kasım 2010; 18:19:00 >