Şimdi Ara

Hiçbiryerde Çözüm Bulamadım

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
1 Misafir - 1 Masaüstü
5 sn
42
Cevap
0
Favori
1.246
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 123
Sayfaya Git
Git
sonraki
Giriş
Mesaj
  • Arkadaşlar herkese merhaba.Heryerde aradım (ingilizce kaynaklar dahil) hiçbiryerde çözümünü bulamadım.

    Arkadaşlar şimdi yapmak istediğim şey şu template biçiminde bir sıralama fonksiyonu yazmak istiyorum ancak bu template fonksiyon bir metin belgesi içinde hem isterse isimleri hem isterse numaraları sıralayacak ancak şöyle bir sıkıntımız var benim metin belgemin içi şöyle sıralı : (numara)(isim)(not)

    2 ahmet 60
    1 tayfun 50

    Şimdi numara sıralaması yapmak istediğimizde tayfunu bir üst sıraya notunu ve ismini taşıması lazım ancak birtürlü taşıyamıyorum önerileriniz neler ?

    NOT : Kaydetme fonksiyonu struct KAYDET
    {
    char isim[20];
    char numara[9];
    int not;
    }ogr[2];

    şeklinde yazıldı.



  • biraz uğraştırdı ama hallettim mis gibi sıralıyor dene bakalım :D


    #include <iostream>
    #include <fstream>
    using namespace std;

    struct Kaydet {

    char isim[20];
    int numara;
    int puan;
    };

    Kaydet ogr;

    void kayitSirala() {
    int siralamaSayisi = 1;
    int siralanacakOgrenciSayisi = 0;
    ofstream dosyaOut("ogrenci.tmp", ios::app);
    ifstream dosyaIn("ogrenci.txt", ios::in);

    while (dosyaIn >> ogr.numara >> ogr.isim >> ogr.puan) {
    if (ogr.numara > siralanacakOgrenciSayisi)
    {
    siralanacakOgrenciSayisi = ogr.numara;
    }
    }

    dosyaIn.close();


    for (int i = 0; i < siralanacakOgrenciSayisi; i++)
    {
    ifstream dosyaIn("ogrenci.txt", ios::in);
    while (dosyaIn >> ogr.numara >> ogr.isim >> ogr.puan)
    {
    if (ogr.numara == siralamaSayisi) {
    dosyaOut << ogr.numara << "\t" << ogr.isim << "\t" << ogr.puan << "\t" << endl;
    }
    }
    dosyaIn.close();
    siralamaSayisi++;
    }

    dosyaOut.close();
    remove("ogrenci.txt");
    rename("ogrenci.tmp", "ogrenci.txt");
    }

    int main() {

    kayitSirala();
    cout << "Ogrenciler siralandi :) ";
    system("pause");

    }


    ogrenciler.txt



    2 ahmet 60
    1 tayfun 50
    4 wepawet 100
    3 zelda 10



    < Bu mesaj bu kişi tarafından değiştirildi Guest-DA02D78F4 -- 26 Aralık 2018; 22:59:41 >




  • quote:

    Arkadaşlar herkese merhaba.Heryerde aradım (ingilizce kaynaklar dahil) hiçbiryerde çözümünü bulamadım.


    Kaynaklar çözüm değil, bilgi içindir. Herşeyin çözümü internette veya kitaplarda olsa zaten hiçir şey yapmaya gerek kalmaz. İşte okumuş ile alaylı arasındaki fark bu. Sen eğer bilgiyi öğrenip kendin çözüm bulamıyorsan, çok temelde bazı eksikliklerin var demektir, ilkokulda havuz problemlerini bile çözmemiş ezberleyip geçmişsindir muhtemelen...



    < Bu mesaj bu kişi tarafından değiştirildi seyfi84 -- 27 Aralık 2018; 0:59:18 >
  • seyfi84 S kullanıcısına yanıt
    Üstat umarım boş yaptığının farkına varırsın.Konulara sadece post kasmak için girme biraz yararlı olmaya bak.İlkokul hocandan çok dayak yemişsindir muhtemelen!!
  • ios::app bu ifade using namespace std ile yani std ilgili bunu buhttps://metacpan.org/pod/pp linkte gördüm.

    ön bir bilgi verirsen araştırma yapacağım. hatta ifadeyi kullanmaya gerek kalmadan bir kod yazarak tüm kodda app yazarak kullanabiliyorduk nerde gördüğümü hatırlamıyorum.
  • quote:

    Orijinalden alıntı: berce

    ios::app bu ifade using namespace std ile yani std ilgili bunu buhttps://metacpan.org/pod/pp linkte gördüm.

    ön bir bilgi verirsen araştırma yapacağım. hatta ifadeyi kullanmaya gerek kalmadan bir kod yazarak tüm kodda app yazarak kullanabiliyorduk nerde gördüğümü hatırlamıyorum.
    dahil olduğu ios isim uzayıyla ilgili bir fikrim yok maalesef. bununla ilgili araştırma yapmadım. sadece dosyalama işlemlerindeki anlamını biliyorum o kadar.
  • @Wepawet

    kodu denedim. it's been great :D but except first zero number

    ingilizce çok pratik isteyen bişey :)

    020 Ali 80
    şeklindeki bir kodu şöyle çıkartıyor

     
    20 Ali 80
    105 Ahmet 70
    250 feyzi 90
    340 hakan 60
    780 mehmet 80


    yani başında sıfır varsa 0 siliyor program. Öğrenmeye devam
  • quote:

    Orijinalden alıntı: Guest-DA02D78F4

    dahil olduğu ios isim uzayıyla ilgili bir fikrim yok maalesef. bununla ilgili araştırma yapmadım. sadece dosyalama işlemlerindeki anlamını biliyorum o kadar.

    Alıntıları Göster
    :: iki tane iki nota üstüteyi sormuştum. bunu okulda size ne diye öğrettiler ayrıca eğer hala üniversitede okuyorsan bilirsin yada size ne öğretmişlerdi programlama olarak c++ başka
  • çeviririm üstdad sıkıntı yok. programlama pratik yapılarak kazanılır. sana vereceğim. linkte bir çok programlama dili için pratik örnekler var bir bak :)https://www.programiz.com/cpp-programming https://www.programiz.com/c-programming https://courses.cs.washington.edu/courses/cse373/99au/assignments/fileIO.html

    ben yazarken sende bir bak öğrenmiş olursun.

    ben özel mesaj gönderemiyorum. cep telefonu onayı olmadığı için



    < Bu mesaj bu kişi tarafından değiştirildi berce -- 27 Aralık 2018; 12:12:34 >




  • quote:

    Orijinalden alıntı: berce

    :: iki tane iki nota üstüteyi sormuştum. bunu okulda size ne diye öğrettiler ayrıca eğer hala üniversitede okuyorsan bilirsin yada size ne öğretmişlerdi programlama olarak c++ başka

    Alıntıları Göster
    bildiğim kadarıyla o aitlik sağlıyor. yani ios::app derken ben ios isim uzayındaki appi kullan demek istiyorum. mesela en üstte "using namespace std;" yazmasaydım cout un basına std::cout yazmalıydım. çünkü cout std isim uzayına ait. ama en başta genel olarak std isim uzayını kullan dediğim için direk cout yazabiliyorum. böyle olunca farklı bir isim uzayından çağrı yapmak istediğimde başına isim uzayının adını yazıp 2 tane :: kullanıyorum.

    bu arada daha 1.sınıfım ve daha 1.dönem bitmedi :D




  • Bu C yazılmış hali daha güzel olabilir ama versiyon 1

    wepawet kardeşin arkadaşın yapmış olduğunu c uyarladım.

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


    struct Kaydet {
    char isim[20];
    int numara;
    int puan;
    }ogr;

    void kayitSirala() {
    int siralamaSayisi = 1;
    int siralanacakOgrenciSayisi = 0;
    FILE *outfile;
    outfile=fopen("ogrenci.tmp","w+");
    FILE *infile;
    infile=fopen("ogrenci.txt","r");

    if (infile == NULL)
    {
    perror("Error while opening the file.");
    exit(EXIT_FAILURE);
    }

    //pointer int değerlerinde & operatorünü kullanacaksın.

    while (fscanf(infile,"%d" "%s" "%d",&ogr.numara,ogr.isim,&ogr.puan) !=EOF) {
    if (ogr.numara > siralanacakOgrenciSayisi)
    {
    siralanacakOgrenciSayisi = ogr.numara;

    }
    }

    fclose(infile);


    for (int i = 0; i < siralanacakOgrenciSayisi; i++)
    {
    infile=fopen("ogrenci.txt","r");
    while (fscanf(infile,"%d" "%s" "%d",&ogr.numara,ogr.isim,&ogr.puan) != EOF)
    {
    if (ogr.numara == siralamaSayisi) {
    //dosyaOut << ogr.numara << "\t" << ogr.isim << "\t" << ogr.puan << "\t" << endl;
    fprintf(outfile,"%d\t" "%s\t" "%d
    ",ogr.numara,ogr.isim,ogr.puan);


    }
    }
    fclose(infile);
    siralamaSayisi++;
    }

    fclose(outfile);
    remove("ogrenci_yeni.txt");
    rename("ogrenci.tmp", "ogrenci_yeni.txt");



    }

    int main() {
    kayitSirala();
    printf("Ogrenciler siralandi :) ");
    system("pause");

    }



    1 Ahmet 70
    2 Ali 80
    3 hakan 60
    9 feyzi 90
    10 mehmet 80
    7 hakan 60
    8 Ahmet 70
    11 Ali 80
    12 Wepawet 100
    4 mehmet 80
    5 feyzi 90
    6 Ali 80
    13 Ahmet 70

    Dene istersen



    < Bu mesaj bu kişi tarafından değiştirildi berce -- 28 Aralık 2018; 5:12:40 >




  •  while (fscanf(infile,"%d" "%s" "%d",&ogr.numara,ogr.isim,&ogr.puan) !=EOF) 
    //while içersindeki fscanf daha bir identifier eşitleyerek yapmaya çalıştım ama olmadı.
    int c;
    c=fscanf(infile,"%d" "%s" "%d",&ogr.numara,ogr.isim,&ogr.puan);
    while (c !=EOF)
    //dediğimde hatasız derliyor lakin program geç yanıt veriyor.
  • berce B kullanıcısına yanıt
    Üstat teşekkürler, sıralama tam istediğim gibi olmuş merak ettiğim şey acaba While içinde eofa eşit değil deyince neden kasıyor program?
  • @GSkill fN
    çünkü dosyayı okuyor orası geliştirilmesi lazım. daha iyi bir kod yazdığımda paylaşırım. sen nasıl bir dosya içeriği oluşturuyorsun onu paylaşır mısın?

    orda sayı string sayı formatından başka bir şey varsa kasıyor. bende düzgün çalşıyor tamamen yeniden farklı bir kod yazacağım o zaman düzelebilir.? Tabi beklemen lazım.



    < Bu mesaj bu kişi tarafından değiştirildi berce -- 28 Aralık 2018; 11:11:44 >
  • c++ programında ilk while döngüsü sonrası dosyaIn.close() gereksiz cunku sonra tekrar aynı dosyaIn kullanılıyor. For döngüsü içinde ifstream dosyaIn("ogrenci.txt", ios::in) tekrar tanımlamak da gereksiz cunku başta zaten tanımlanmıştı.

    Bir de sıralama C++ STL dahilindeki "list" sınıfının "sort" metodu ile yapılsa daha düzgün olurdu diye düşünüyorum yani örneğin (c++'ı cok kullanmadığım için syntax hatalı olabilir) list<Kaydet> şeklinde bir liste oluşturarak...

    ios::app 'taki app append in kısaltması ve dosyanın sonuna ekle anlanımda bir flag.
  • quote:

    Orijinalden alıntı: Tuğkan-0153

    c++ programında ilk while döngüsü sonrası dosyaIn.close() gereksiz cunku sonra tekrar aynı dosyaIn kullanılıyor. For döngüsü içinde ifstream dosyaIn("ogrenci.txt", ios::in) tekrar tanımlamak da gereksiz cunku başta zaten tanımlanmıştı.

    Bir de sıralama C++ STL dahilindeki "list" sınıfının "sort" metodu ile yapılsa daha düzgün olurdu diye düşünüyorum yani örneğin (c++'ı cok kullanmadığım için syntax hatalı olabilir) list<Kaydet> şeklinde bir liste oluşturarak...

    ios::app 'taki app append in kısaltması ve dosyanın sonuna ekle anlanımda bir flag.
    program tek açılıp kapanışta hatalı çalışıyordu bunun için tekrar kapat aç kapat aç yaptırdım. dosya açma kapama işlemlerini döngülerin dışına taşıyınca 2.döngüden çıkıp tekrar 1.döngüdeki 2.rotasyonda yine while'a girdiğinde işlemleri düzgün yapmıyor.

    tabi bunun çözümünü de biliyorum. tahminime göre kursörün pozisyonu döngü sonunda sonda kaldığı için okutmaya tekrar başladığımda kaldığı yerden devam ediyor. kaldığı yerde dosyanın sonuna denk geliyor bu yüzden program düzgün çalışmıyor. her for döngüsü tekrar dönüş yaptığında kursörü en başa çekersem sorun düzelebilirdi ama o an aklıma dosyayı açıp kapatarak kursörün başa kendiliğinden çekileceği geldi ve onu yazdım :D

    eğer programda biraz daha hızlanma isteniyorsa aç kapalar kaldırılsa bile tek açılış yeterli değil kursörü başa çekecek komutları da yazmak gerekli.

    bu arada daha veri yapıları dersini almadım bu yüzden bağlı listeler tarzı şeyleri bilmiyorum o yüzden o kısma hiç girmedim bile.




  • Bahsettiğim 2 satırı kaldırınca sorunsuz çalıştı bende:

    Hiçbiryerde Çözüm Bulamadım

    Problemi STL list çözmeyi sonra belki denerim
  • STL list sınıfı ile örnek demo amaçlı olduğundan dosya ac/kapa yapmadan direkt kod üzerinde ögrencileri tanımladım.

    STL list sınıfının avantajı ögrencilerin numarası yerine isimi ile de sıralayabilirsin veya başka sıralama kıstası dahi belirleyebilirsin... Bence bu sekilde hem daha düzgün hem daha sade....

    #include <iostream> 
    #include <list>
    #include <cstring>
    using namespace std;

    struct Kaydet {
    int numara;
    string isim;
    int puan;
    Kaydet():
    numara(0),
    isim(""),
    puan(0){}
    Kaydet(
    int numara,
    const char isim[20],
    int puan
    ):
    numara(numara),
    isim(isim),
    puan(puan){}
    };

    bool sort_no_ile ( const Kaydet & soldaki , const Kaydet & sagdaki )
    {
    return soldaki.numara < sagdaki.numara;
    }


    int main()
    {
    Kaydet ogr[4];

    ogr[0]={2,"ahmet",60};
    ogr[1]={1,"tayfun",50};
    ogr[2]={4,"wepawet",100};
    ogr[3]={3,"zelda",10};

    list<Kaydet> listem;
    listem.push_back(ogr[0]);

    listem.push_back(ogr[1]);
    listem.push_back(ogr[2]);
    listem.push_back(ogr[3]);

    listem.sort(sort_no_ile);
    list<Kaydet>::iterator p = listem.begin();
    p = listem.begin();
    while(p != listem.end()) {
    cout << p->isim << " ";
    p++;
    }
    return 0;
    }




  •  
    for (int i = 0; i < siralanacakOgrenciSayisi; i++)
    {
    dosyaIn.open("ogrenci.txt", ios::in); // bunu eklemez ise dosya yeni bir sıralanmış dosya oluşturmuyor.
    while (dosyaIn >> ogr.numara >> ogr.isim >> ogr.puan)
    {
    if (ogr.numara == siralamaSayisi) {
    dosyaOut << ogr.numara << "\t" << ogr.isim << "\t" << ogr.puan << "\t" << endl;
    }
    }
    dosyaIn.close();
    siralamaSayisi++;
    }

    dosyaOut.close();
    remove("ogrenci_yeni.txt");
    rename("ogrenci.tmp", "ogrenci_yeni.txt");
    }

    http://www.cplusplus.com/reference/fstream/ifstream/open/
    dosyaIn.open("ogrenci.txt", ios::in); bunu eklemden çalışmıyor zaten Wepawet ifstream eklemesinde amaç bu olabilir.

    Wepawet #include <cerror>
    dosyalar oluşturmadan çalıştırdığımızda dosya bulunamadı hatası alıyorsun. ama program yine çalışıyor. bunu sebebi ise olmayan dosyayı kaldırdığımızda oluşuyor o nasıl çözülecek ki boolen ile :)




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