Şimdi Ara

Hiçbiryerde Çözüm Bulamadım (2. sayfa)

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
42
Cevap
0
Favori
1.247
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: önceki 123
Sayfaya Git
Git
sonraki
Giriş
Mesaj
  • Aynı kodu C benzeterek yazdım. lakin while döngüsündeki DosyaIn >>ogr.numara >>ogr.isim>>ogr.puan şeklini nasıl yapacağım hakkımda pek bir şey bulamadım. sadece fscanf() ile çalışıyor.

    DosyaIn >>ogr.numara >>ogr.isim>>ogr.puan tam olarak çalışma mantığı ne? C++ sonuçta geliştirilmiş hali

    siralamaSayisi=1; olarak vermişsin ya sadece if içersinde ve siralamaSayisi++ yaparak artırma yoluna gitmişsin bunu derleyici nasıl anlıyor. Sıralama işlemi mantığını size okulda nasıl öğrettiler açıklar mısın.

    eklenen:

    /*
    * C program to read N names, store them in the form of an array
    * and sort them in alphabetical order. Output the given names and
    * the sorted names in two columns side by side.
    */

    #include <stdio.h>
    #include <string.h>
    void main()
    {

    char name[10][8], tname[10][8], temp[8];
    int i, j, n;

    printf("Enter the value of n
    ");
    scanf("%d", &n);
    printf("Enter %d names n
    ", n);

    for (i = 0; i < n; i++)
    {
    scanf("%s", name[i]);
    strcpy(tname[i], name[i]);
    }

    for (i = 0; i < n - 1 ; i++)
    {
    for (j = i + 1; j < n; j++)
    {
    if (strcmp(name[i], name[j]) > 0)
    {
    strcpy(temp, name[i]);
    strcpy(name[i], name[j]);
    strcpy(name[j], temp);
    }
    }
    }

    printf("
    ----------------------------------------
    ");
    printf("Input NamestSorted names
    ");
    printf("------------------------------------------
    ");

    for (i = 0; i < n; i++)
    {
    printf("%s\t\t%s
    ", tname[i], name[i]);
    }

    printf("------------------------------------------
    ");

    }

    https://www.sanfoundry.com/c-program-sort-names-alphabetical-order/

    buldum hepsi birbirine benzer sıralamada 0 yapıp bir artırılarak yapılıyor bunun mantığı nasıl işleniyor

    strcpy(temp, name[i\]);
    strcpy(name[i\], name[j\]);
    strcpy(name[j\], temp);

    bütün sıralama şekilleri buna benziyor. bu kısmı nasıl anlamalıyız.



    < Bu mesaj bu kişi tarafından değiştirildi berce -- 29 Aralık 2018; 9:33:10 >




  • quote:

    Orijinalden alıntı: berce

     
    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 :)
    dosyaIn olan okuma yapmak için oluşturmak için dosyaOut olanı yaratmıştım. dosyaIn olanı kaldırırsan dosyadan okuma yapamaz




  • quote:

    Orijinalden alıntı: berce

    Aynı kodu C benzeterek yazdım. lakin while döngüsündeki DosyaIn >>ogr.numara >>ogr.isim>>ogr.puan şeklini nasıl yapacağım hakkımda pek bir şey bulamadım. sadece fscanf() ile çalışıyor.

    DosyaIn >>ogr.numara >>ogr.isim>>ogr.puan tam olarak çalışma mantığı ne? C++ sonuçta geliştirilmiş hali

    siralamaSayisi=1; olarak vermişsin ya sadece if içersinde ve siralamaSayisi++ yaparak artırma yoluna gitmişsin bunu derleyici nasıl anlıyor. Sıralama işlemi mantığını size okulda nasıl öğrettiler açıklar mısın.

    eklenen:

    /*
    * C program to read N names, store them in the form of an array
    * and sort them in alphabetical order. Output the given names and
    * the sorted names in two columns side by side.
    */

    #include <stdio.h>
    #include <string.h>
    void main()
    {

    char name[10][8], tname[10][8], temp[8];
    int i, j, n;

    printf("Enter the value of n
    ");
    scanf("%d", &n);
    printf("Enter %d names n
    ", n);

    for (i = 0; i < n; i++)
    {
    scanf("%s", name[i]);
    strcpy(tname[i], name[i]);
    }

    for (i = 0; i < n - 1 ; i++)
    {
    for (j = i + 1; j < n; j++)
    {
    if (strcmp(name[i], name[j]) > 0)
    {
    strcpy(temp, name[i]);
    strcpy(name[i], name[j]);
    strcpy(name[j], temp);
    }
    }
    }

    printf("
    ----------------------------------------
    ");
    printf("Input NamestSorted names
    ");
    printf("------------------------------------------
    ");

    for (i = 0; i < n; i++)
    {
    printf("%s\t\t%s
    ", tname[i], name[i]);
    }

    printf("------------------------------------------
    ");

    }

    https://www.sanfoundry.com/c-program-sort-names-alphabetical-order/

    buldum hepsi birbirine benzer sıralamada 0 yapıp bir artırılarak yapılıyor bunun mantığı nasıl işleniyor

    strcpy(temp, name[i\]);
    strcpy(name[i\], name[j\]);
    strcpy(name[j\], temp);

    bütün sıralama şekilleri buna benziyor. bu kısmı nasıl anlamalıyız.
    benim kodumda yazdığım sıralamSayisinin olayıyla altta verdiğin örneğin sıralama olayı farklı. ben sıralamasıSayısı vererek tüm dosyada numarası 1 olan ogrenciyi bulup başka dosyaya başa yazdırdım. sonra sayiyi 1 arttirip numarası 2 olan öğrenciyi dosyada arayıp diğer dosyada 1 nolu ogrencinin altına yazdım. sonra asıl dosyayı silip yeni dosyanın ismini değiştirince sanki sıralama yapılmış gibi duruyor ama farklı dosya üzerine yazmalar yapılmış oluyor tabi kullanıcı bunu görmüyor.


    altta verdiğim strcpy kodunun işlevi de şu


    #include <iostream>

    using namespace std;

    int main()
    {
    int myArray[] = { 34,53,12,4,32,7,83,5,1,21};
    int temp = 0;
    int form = 1;
    for (int i = 0; i < 10; i++)
    {
    for (int k = 0; k < (9 - i); k++)
    {
    if (myArray[k] > myArray[k + 1])
    {
    form = 0;
    temp = myArray[k]; // burasi
    myArray[k] = myArray[k + 1]; // burasi
    myArray[k + 1] = temp; // burasi
    }

    }
    if (form)
    {
    break;
    }
    }

    for (int i = 0; i < 10; i++)
    cout << myArray[i] << ",";
    }



    < Bu mesaj bu kişi tarafından değiştirildi Guest-DA02D78F4 -- 29 Aralık 2018; 12:1:3 >




  • Revivo72 dediği kısım vardı for döngüsü içersinde ona gerek yok demişti. ama o olmadan yeni bir dosya oluşturamıyorum.
    ifstream dosyaIn("ogrenci.txt", ios::in); for içinde bunu silerek yerine dosyaIn.open() function kullandım. zaten bu yazdığım function ifstream altında çalışıyor.
  • Orjinal kodda 17. satır ifstream dosyaIn("ogrenci.txt", ios::in); ve for içinde aynı satır tekrar var. for 'dan önceki dosyaIn.close() 'u ve for içindeki ifstream dosyaIn("ogrenci.txt", ios::in) aynı anda silin; bu satırlar gereksiz görünüyor. Ben sildim ve program aynen çalıştı.



    Fakat dosya işlemleri ayrıntı bence ; ana konu struct tipinde objeleri sıralamak ve onu STL list sınıfı ile yapınca çözüm bence cok sadeleşiyor. Benim yukardaki STL list'li çözüme dosya işlemlerini kolaylıkla ekleyebilirim fakat ana konu o değil.



    C++ 'ı C'ye cevirince C++ ın C'den aslında ne kadar farklı olduğu da görülmüş oluyor.

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • Onu bende stl list olaraka yapamaya uğraşacağım. C++ evet gerçekten c'den çok farklı özellikle >> ve << cout ve diğerlerinde kullanılan bu işaretlerini getirdiği kolaylıklar C'de yok
  • quote:

    Orijinalden alıntı: Tuğkan-0153

    Orjinal kodda 17. satır ifstream dosyaIn("ogrenci.txt", ios::in); ve for içinde aynı satır tekrar var. for 'dan önceki dosyaIn.close() 'u ve for içindeki ifstream dosyaIn("ogrenci.txt", ios::in) aynı anda silin; bu satırlar gereksiz görünüyor. Ben sildim ve program aynen çalıştı.



    Fakat dosya işlemleri ayrıntı bence ; ana konu struct tipinde objeleri sıralamak ve onu STL list sınıfı ile yapınca çözüm bence cok sadeleşiyor. Benim yukardaki STL list'li çözüme dosya işlemlerini kolaylıkla ekleyebilirim fakat ana konu o değil.



    C++ 'ı C'ye cevirince C++ ın C'den aslında ne kadar farklı olduğu da görülmüş oluyor.
    hocam dediğiniz kodu buraya atar mısınız yanlış yerleri mi siliyorum çünkü dosyayı tekrar tekrar kapat aç yapmayınca ben de çalışmıyor. yani çalışıyor program ama sıralamayı yapmıyor. oluşan dosya boş kalıyor. bunun nedeninin kursörün sonda olduğunu düşündüğümden dosyayı aç kapa yaparak kursörü başa çekiyordum.




  • berce B kullanıcısına yanıt
    Üstat string mecbur kullanıyoruz isimden dolayı yani onu engellemenin bir yolu da yok
  • Dosyayı aç / kapa yaparak kursörü başa çekmek pek ideal görünmüyor. Fakat zaten sıralamayı döngüyle yaptırmak hataya açık bir yöntem. Doğru yöntem STL list sınıfı kullanmak; nitekim STL list ile yazdığım koda dosya rutin işlemlerini de ekledim ve hatasız çalışıyor. Görüldüğü gibi yazdırma döngüsünde dosya aç/kapa gibi bir işleme gerek olmadan yazıyor. Ha bu yöntemde STL list nesnesi hafızada tutulduğu için milyon öğrenci olursa RAM şişebilir, fakat birkaç ek satır ile işlemi RAM 'den alıp dosya işlemlerine de aktarabiliriz, fakat konu bu değil, konu öğrencileri numarasına göre sıralamak :)

    Hiçbiryerde Çözüm Bulamadım
     
    #include <iostream>
    #include <list>
    #include <cstring>
    #include <fstream>

    using namespace std;

    struct Ogrenci {
    int numara;
    string isim;
    int puan;
    Ogrenci():
    numara(0),
    isim(""),
    puan(0){}
    Ogrenci(
    int numara,
    const string isim,
    int puan
    ):
    numara(numara),
    isim(isim),
    puan(puan){}
    };

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

    int main()
    {
    Ogrenci ogr[4];
    string cikis_dosya_ismi = "ogrenci_siralanmis.txt";
    ifstream giris_dosya("ogrenci.txt", ios::in);
    remove(cikis_dosya_ismi.c_str());
    ofstream cikis_dosya(cikis_dosya_ismi.c_str() , ios::app);

    int numara;
    string isim;
    int puan;

    list<Ogrenci> ogrenci_listesi;

    while (giris_dosya >> numara >> isim >> puan){
    ogrenci_listesi.push_back(Ogrenci(numara, isim, puan));
    }giris_dosya.close();
    ogrenci_listesi.sort(sort_no_ile);
    list<Ogrenci>::iterator p = ogrenci_listesi.begin();
    while (p != ogrenci_listesi.end()) {
    cikis_dosya << p->numara <<"\t"<< p->isim <<"\t"<< p->puan <<"\t"<< endl;
    p++;
    }
    cikis_dosya.close();
    cout << "iralandi ve "<< cikis_dosya_ismi <<" 'e yazildi"<< endl;
    return 0;
    }




  • hocam veri yapıları dersini aldıktan sonra daha programı daha stabil yapabilirim ama şuan listelerin işlevleri hakkında pek fikrim yok :D haklısınızdır yani ben bilgim dahilinde yorum yattım probleme :D

    teşekkürler ekstra düzeltmeler ve yorumlamalar için.
  • Üstad Teşekkürler ve herkese

    bu resimde gösterdiğim kısımlar ne oluyor. Onları araştırma yapacağım.

    boolean en pratik yollardan birisi tabi bu sürekli program yazmakla elde edilebilecek bir durum.

    Hiçbiryerde Çözüm Bulamadım
  • yok ben onu engellemek istemiyorum :) sadece c++ verdiğidi bu avantajı c'ye şartlar dahilinde aktarmayı amaçlıyorum. şöyle sorayım >> << bu işaretlerin yaptığı görev ne? ne olarak geçiyor overload mı ?
  • berce B kullanıcısına yanıt
    Üstat bu arada çok teşekkürler , sıralama fonksiyonu sayende oldu ben c++'dan c ye çevirememiştim ,teşekkürler ! :)
  • GSkill fN kullanıcısına yanıt
    Ne demek bildiğimi paylaşırım. ben onun farklı bir şeklini yapmak için uğraşıyorum. zaman alabilir Daha değişik yolları var çünkü



    < Bu mesaj bu kişi tarafından değiştirildi berce -- 30 Aralık 2018; 10:48:22 >
  • berce B kullanıcısına yanıt
    C++ 'da struct = class hemen hemen. Sebebi de C ile uyumlu olacak sekilde tasarlandığı için dahil edilen struct komutunun bir class gibi kullanılabilecek şekilde genişletilmesi, nitekim o yüzden struct parametlerle kullanıldığında struct tipi değişkenin nasıl oluşturulacağı, aynen class konstrüktöründe olduğu gibi tanımlanıyor. İlk blokta
    Ogrenci():   
    numara(0),
    isim(""),
    puan(0){}

    parametresiz değişken oluşturmada ne yapılacağı tanımlanıyor, yani numara = 0 isim = "" puan = 0 yapılıyor {} içinde ister struct üye değişkeni / member variable tanımlarsın ister herhangi bir kod yazabilirsin, yani örneğin numara(0) yazmak yerine
     
    Ogrenci():
    isim(""),
    puan(0){numara=0; cout << "parametresiz ogrenci olusturuldu!" << endl;}

    seklinde de yazsan program hatasız derlenir.

    Bu arada şimdi fark ettim; programdaki Ogrenci ogr[4] satırına gerek yok cunku programı ilk yazdığımda

       while (giris_dosya >> numara >> isim >> puan){  
    ogrenci_listesi.push_back(Ogrenci(numara, isim, puan));
    }


    yerine
    for (int i=0; i<4, i++) { 
    giris_dosya >> numara >> isim >> puan;
    ogr[i].numara = numara;
    ogr[i].isim = isim;
    ogr[i].puan = puan
    }


    kullandığım için gerekliydi o. döngüyü while ile yapınca ogr ara değişkenine gerek kalmadığı için ogr[4] tanımına da gerek kalmıyor, onu ve struct tanımındaki
    Ogrenci():
    numara(0),
    isim(""),
    puan(0){}

    kısmını silersen program hatasız derlenir.

    sort_no_ile fonksiyonunu ise STL - list sınıfı Ogrenci tipi değişkenle oluşturulduğu için ( list<Ogrenci> ogrenci_listesi ) list sınıfının sort metodu için oluşturmak zorundayım. list<int> tamsayi_listesi seklinde int tipi değişkenle oluştursaydım öyle birşeye gerek kalmazdı cunku o zaman zatenrenci listenin neye göre sıralanacağı belli fakat Ogrenci tipi değiskende belli o yüzden soldaki.numara < sagdaki.numara diye belirtmek zorundasın; aynı sekilde sort_puan_ile adında bir fonksiyon yazıp return soldaki.puan< sagdaki.puan puana göre de sıralabilirsin. Aynı tanımlama Java'daki Collection Framework'te de yapılıyor; coğu tip tanımlı / typed dilde bu tanımlamalar gerekiyor.




  • Hiçbiryerde Çözüm Bulamadım

    yukardaki hatayı verdi derler iken yukardaki hatayı verdi. Sorun tam olarak nerdeki?


    struct Ogrenci {
    int numara;
    string isim;
    int puan;
    Ogrenci(
    int numara,
    const string isim,
    int puan
    ):
    numara(numara), //bu kısım class yapısına benzemiyor. yani struct'ta bu yapıları ekleyebilir miyiz ki? hiç görmedim.
    isim(isim),
    puan(puan){}
    };



    < Bu mesaj bu kişi tarafından değiştirildi berce -- 31 Aralık 2018; 16:16:20 >




  • berce B kullanıcısına yanıt
    Kullandığın derleyici MS C/C++ old için hata veriyor. Ya kodu veya derleme seçeneklerini MS derleyiciye uygun olacak sekilde düzenlemelisin ya da macOS veya Windows ta GCC 5.1 + derleyici kullanmalısın. Benim kodu 2009 Mac mini'deki GCC-6.1 ve 2008 Lenovo'daki TDM-GCC-5.1 ile sorunsuz derledim.



    struct = class derken yani hemen hemen aynı yani struct initialization daki o numara(numara) syntax 'ı class'ta olmayabilir fakat zaten görüntüden belli degil mi: üye değişken olan numaraya, struct parametresi olarak gelen numarayı veriyor. Kafa karıştırıcı olduysa veya class gibi olsun diyorsan onu silip { numara = numara; } da diyebilirsin... Bu konuda Herbert Schild'in C++ Complete Reference 2003 kitabını tavsiye ederim, bu tür şeyleri cok iyi anlatıyor. Google'da PDF olarak var.

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • Kafa karıştırıcı değil sadece tutorialspoint.com/cplusplus/ gibi sitelerde bunu bulamadım. şöyle söyleyeyim. internette baktığım structure syntax benzemiyor'da teşekkürler kitap önerin için :) ben standart struct gördümde :)
  • berce B kullanıcısına yanıt
    C++ 'yi öğrenmek için 3 kitap aldım 3'ünde de tam öğrenemedim; Herbert Schildt'in 2003 basımı kitabını tesadüfen aldıktan sonra tam manası ile öğrendim. Nitekim o sayede C++'yi hiç kullanmasam unutsam bile C++ kodları yazabiliyorum :) Aynı durum Java 'da da oldu; Java için de 1-2 kitap aldım fakat sıfırdım. O'Reilly 'nin Head First Java 'sını aldıktan sonra öğrendim. Bu dillerde kaynak cok önemli.

    < Bu ileti mini sürüm kullanılarak atıldı >
  • Hiçbiryerde Çözüm Bulamadım
    burda char -127-127 gösteriliyor ancak başka bir kitapda da -128-127 gösteriliyor mantıken toplamda negatifin 127 eşit olabilmesi için 0 sayıldığından dolayı -128 olması gerekiyor ama başka sitelerde böyle yazıyordu sonradan düzeltmişler

    Hiçbiryerde Çözüm Bulamadım




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