Peršokti į turinį
  • ŽAIDIMAI
  • , ŽAIDIMAI
  • ŽAIDIMAI

Uždavinio apie slidininkus failo skaitymas


Anonimas77

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 1344 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Recommended Posts

Teksto failas:

U1.TXT

Programos kodas:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

struct Slidininkas
{
    string Vardas;
    int Valandos;
    int Minutes;
    int Sekundes;


void ivedimas(int dalsk,int & finisavo, int & x);
void isvedimas();

};

void Slidininkas::ivedimas(int dalsk, int & finisavo, int & x)
{
  char nuskaitymas[20];
  ifstream fx ("U1.txt");
  fx>>dalsk;
  fx>>ws;

  for (int i=1; i<=x;i++)
 {
 fx.get (nuskaitymas, 20);
    Vardas=nuskaitymas;
    fx>>Valandos>>Minutes>>Sekundes>>ws;
 }
 fx>>finisavo;
 fx.close();

}

void Slidininkas::isvedimas() {
    cout<<"Vardas yra: "<<Vardas<<endl;
    cout<<"Laikas : "<<Valandos<<" "<<Minutes<<" "<<Sekundes<<endl;

}


int main () {
ifstream fx ("U1.txt");
    int x=1;
    int dalsk;
    int finisavo;
    fx >> dalsk;
    fx >> ws;
    fx.close();
Slidininkas objektas[dalsk+1];

for (int i=1; i<=dalsk; i++)
{
    objektas.ivedimas(dalsk, finisavo, x);
    x++;
}

for (int i=1; i<=dalsk; i++)
{
    objektas.isvedimas();

}
cout <<"//////////////////////////////////////////"<<endl;

Slidininkas objektas2[finisavo+1];

for (int i=1; i<=finisavo; i++)
{   x++;
    objektas2.ivedimas(dalsk, finisavo, x);

}

for (int i=1; i<=finisavo; i++)
{
    objektas2.isvedimas();

}
return 0;}

Nuskaitymo rezultas:

rezultas.jpg.d4d8f50e95dc2cf60823292877c90cf5.jpg

Kodėl kitos pusės tėksto neina normaliai nuskaityti ?

Nuoroda į komentarą
Dalintis per kitą puslapį

Gal būtų paprasčiau taip :)

 

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

struct Slidininkas
{
    string Vardas;
    int Valandos;
    int Minutes;
    int Sekundes;
};

void Skaityti(int &n, int &m, Slidininkas startas[], Slidininkas finisas[]);

int main () {
    Slidininkas startas[30];
    Slidininkas finisas[30];
    int n;
    int m;
    Skaityti(n, m, startas, finisas);


    for(int i = 0; i < n; i++)
    {
        cout << startas.Vardas << " ";
        cout << startas.Valandos << " ";
        cout << startas.Minutes << " ";
        cout << startas.Sekundes << endl;
    }
    cout << "////////////////////////////" << endl;
        for(int i = 0; i < m; i++)
    {
        cout << finisas.Vardas << " ";
        cout << finisas.Valandos << " ";
        cout << finisas.Minutes << " ";
        cout << finisas.Sekundes << endl;
    }
    
return 0;
}

void Skaityti(int &n, int &m, Slidininkas startas[], Slidininkas finisas[])
{
    char laikinas[21];
    ifstream fin("U1.txt");
    fin >> n;
    for(int i = 0; i < n; i++)
    {
        fin >> ws;
        fin.get(laikinas, 21);
        startas.Vardas = laikinas;
        fin >> startas.Valandos >> startas.Minutes >> startas.Sekundes;
    }
    fin >> m;
    for(int i = 0; i < m; i++)
    {
        fin >> ws;
        fin.get(laikinas, 21);
        finisas.Vardas = laikinas;
        fin >> finisas.Valandos >> finisas.Minutes >> finisas.Sekundes;
    }
    fin.close();
}

Nuoroda į komentarą
Dalintis per kitą puslapį

Visada forumuose naudok redaktoriaus kodo įterpimo funkciją arba kodą kažkur įkelk, kur veikia code highlighting. Taip pat suformatuok gražiai kodą, kad būtų lengviau kitiems skaityti. Šiaip, turiu daug pastabų, tikiuosi pravers:

  • Masyvų indeksai yra skaičiuojami ne nuo 1, o nuo 0, tai int i = 0, o cikluose ne <=, o <. Be to, kam tau tas kintamasis int x, kai cikle turi int i?
  • Negalima kurti fiksuoto dydžio masyvų naudojant kintamąjį jo dydžiui nusakyti. Mano naudojamas MSVC kompiliatorius net nekompiliuoja tokio kodo. Jei nori kintamo dydžio kolekcijos, gali naudoti STL konteinerius arba dinaminius masyvus. Jei nenori nei vieno, nei kito, apsirašyk kažkur masyvo dydžio konstantą ir ją naudok.
  • Skaitymą galima apibūdinti "iš didelio rašto išeita iš krašto". Pagirtina, kad nori bandyti rašyti perpanaudojamą ir OOP kodą, bet toks kodas OOP principų neatitinka: tavo klasėje (struktūroje) sugriaunamas SRPMetodai yra skirti darbui tik su konkrečiais objektais ir kuriami tik tada, kai tai yra logiška ir prasminga. Pavyzdžiui:
    struct Car
    {
        void start_engine();
        void turn_off_engine();
        void shift_gear_up();
        void shift_gear_down();
    }

    Taip pat, vis atidarydamas failą, nuo pradžių, skaitydamas kiekvieną vardą ir laiko duomenis bei vėl uždarydamas failą, švaistai kompiuterio resursus. Ir kodėl kas kartą vis nuskaitai finišavusių žmonių skaičių? Čia skaitymą reikėjo paprasčiausiai apsirašyti ne klasėje.

  • Vietoj išvedimo metodų galima naudoti << operatoriaus perkrovimą (overload). Tada naudojant std::cout nereikės kviesti jokių papildomų metodų.

  • Blogai skaitai vardą. Turi char masyvą sukurti vienu rašmeniu didesnį, kad galėtum gale įterpti nulinį rašmenį, nes C++ string'ai yra null-terminated.

  • Susikūręs slidininkų masyvą, tu jo realiai net nepanaudoji: juk nenaudoji [] operatoriaus. Tu int main() esančiuose cikluose naudotum tik pirmą masyvo elementą, jei vietoj . naudotum -> operatorių, bet dabar mano kompiliatorius vėlgi kodo nekompiliuoja. Nelabai suprantu, kaip pas tave konsolėje atsirado tokie rezultatai :huh:.
  • Nenaudok using namespace std. Apie tai gali paskaityti čia.
  • Vietoj std::endl, kuris iš esmės kviečia ir std::flush (ko tau nereikia), galima paprasčiausiai naudoti '\n'.
  • Logiška laiką išskirti į atskirą klasę.

Čia mano variantas, ištaisius šiuos pastebėjimus:

#include <fstream>
#include <iostream>
#include <string>

struct Laikas
{
    int valandos;
    int minutes;
    int sekundes;

    friend std::ostream& operator<<(std::ostream& strm, const Laikas& l)
    {
        return strm << "Laikas: " << l.valandos << ":" << l.minutes << ":" << l.sekundes << '\n';
    }
};

struct Slidininkas
{
    std::string vardas;
    Laikas laikas;

    friend std::ostream& operator<<(std::ostream& strm, const Slidininkas& s)
    {
        return strm << "Vardas yra: " << s.vardas << '\n' << s.laikas;
    }
};

void nuskaityk_slidininkus(std::ifstream& fin, Slidininkas* slidininkai, int n)
{
    for ( int i = 0; i < n; ++i )
    {
        const int vardo_ilgis = 20;
        char vardas[vardo_ilgis + 1] = {0};
        fin.get(vardas, vardo_ilgis);

        Laikas laikas;
        fin >> laikas.valandos >> laikas.minutes >> laikas.sekundes >> std::ws;

        slidininkai[i].vardas = vardas;
        slidininkai[i].laikas = laikas;
    }
}

int main()
{
    std::ifstream fin("U1.txt");
    if ( fin.fail() )
        return 1;

    int dalyviu_skaicius;
    fin >> dalyviu_skaicius >> std::ws;
    Slidininkas* dalyviai = new Slidininkas[dalyviu_skaicius];
    nuskaityk_slidininkus(fin, dalyviai, dalyviu_skaicius);

    int finisavusiu_skaicius;
    fin >> finisavusiu_skaicius >> std::ws;
    Slidininkas* finisave = new Slidininkas[finisavusiu_skaicius];
    nuskaityk_slidininkus(fin, finisave, finisavusiu_skaicius);

    fin.close();

    std::cout << "Dalyviai:\n";
    for ( int i = 0; i < dalyviu_skaicius; ++i )
        std::cout << dalyviai[i];

    std::cout << "\nFinišavę:\n";
    for ( int i = 0; i < finisavusiu_skaicius; ++i )
        std::cout << finisave[i];

    // Nepamirštam atlaisvinti atminties (arba pasimokom naudoti smart pointer'ius / STL konteinerius)!
    delete[] dalyviai;
    delete[] finisave;

    return 0;
}
Redaguota , nario Tautedorus
Nuoroda į komentarą
Dalintis per kitą puslapį

51 minutes prieš, Tautedorus parašė:

Visada forumuose naudok redaktoriaus kodo įterpimo funkciją arba kodą kažkur įkelk, kur veikia code highlighting. Taip pat suformatuok gražiai kodą, kad būtų lengviau kitiems skaityti. Šiaip, turiu daug pastabų, tikiuosi pravers:

  • Masyvų indeksai yra skaičiuojami ne nuo 1, o nuo 0, tai int i = 0, o cikluose ne <=, o <. Be to, kam tau tas kintamasis int x, kai cikle turi int i?
  • Negalima kurti fiksuoto dydžio masyvų naudojant kintamąjį jo dydžiui nusakyti. Mano naudojamas MSVC kompiliatorius net nekompiliuoja tokio kodo. Jei nori kintamo dydžio kolekcijos, gali naudoti STL konteinerius arba dinaminius masyvus. Jei nenori nei vieno, nei kito, apsirašyk kažkur masyvo dydžio konstantą ir ją naudok.
  • Skaitymą galima apibūdinti "iš didelio rašto išeita iš krašto". Pagirtina, kad nori bandyti rašyti perpanaudojamą ir OOP kodą, bet toks kodas OOP principų neatitinka: tavo klasėje (struktūroje) sugriaunamas SRPMetodai yra skirti darbui tik su konkrečiais objektais ir kuriami tik tada, kai tai yra logiška ir prasminga. Pavyzdžiui:
    
    struct Car
    {
        void start_engine();
        void turn_off_engine();
        void shift_gear_up();
        void shift_gear_down();
    }

    Taip pat, vis atidarydamas failą, nuo pradžių, skaitydamas kiekvieną vardą ir laiko duomenis bei vėl uždarydamas failą, švaistai kompiuterio resursus. Ir kodėl kas kartą vis nuskaitai finišavusių žmonių skaičių? Čia skaitymą reikėjo paprasčiausiai apsirašyti ne klasėje.

  • Vietoj išvedimo metodų galima naudoti << operatoriaus perkrovimą (overload). Tada naudojant std::cout nereikės kviesti jokių papildomų metodų.

  • Blogai skaitai vardą. Turi char masyvą sukurti vienu rašmeniu didesnį, kad galėtum gale įterpti nulinį rašmenį, nes C++ string'ai yra null-terminated.

  • Susikūręs slidininkų masyvą, tu jo realiai net nepanaudoji: juk nenaudoji [] operatoriaus. Tu int main() esančiuose cikluose naudotum tik pirmą masyvo elementą, jei naudotum -> operatorių, bet dabar mano kompiliatorius vėlgi kodo nekompiliuoja. Nelabai suprantu, kaip pas tave konsolėje atsirado tokie rezultatai :huh:.
  • Nenaudok using namespace std. Apie tai gali paskaityti čia.
  • Vietoj std::endl, kuris iš esmės kviečia ir std::flush (ko tau nereikia), galima paprasčiausiai naudoti '\n'.
  • Logiška laiką išskirti į atskirą klasę.

Čia mano variantas, ištaisius šiuos pastebėjimus:


#include <fstream>
#include <iostream>
#include <string>

struct Laikas
{
    int valandos;
    int minutes;
    int sekundes;

    friend std::ostream& operator<<(std::ostream& strm, const Laikas& l)
    {
        return strm << "Laikas: " << l.valandos << ":" << l.minutes << ":" << l.sekundes << '\n';
    }
};

struct Slidininkas
{
    std::string vardas;
    Laikas laikas;

    friend std::ostream& operator<<(std::ostream& strm, const Slidininkas& s)
    {
        return strm << "Vardas yra: " << s.vardas << '\n' << s.laikas;
    }
};

void nuskaityk_slidininkus(std::ifstream& fin, Slidininkas* slidininkai, int n)
{
    for ( int i = 0; i < n; ++i )
    {
        const int vardo_ilgis = 20;
        char vardas[vardo_ilgis + 1] = {0};
        fin.get(vardas, vardo_ilgis);

        Laikas laikas;
        fin >> laikas.valandos >> laikas.minutes >> laikas.sekundes >> std::ws;

        slidininkai[i].vardas = vardas;
        slidininkai[i].laikas = laikas;
    }
}

int main()
{
    std::ifstream fin("U1.txt");
    if ( fin.fail() )
        return 1;

    int dalyviu_skaicius;
    fin >> dalyviu_skaicius >> std::ws;
    Slidininkas* dalyviai = new Slidininkas[dalyviu_skaicius];
    nuskaityk_slidininkus(fin, dalyviai, dalyviu_skaicius);

    int finisavusiu_skaicius;
    fin >> finisavusiu_skaicius >> std::ws;
    Slidininkas* finisave = new Slidininkas[finisavusiu_skaicius];
    nuskaityk_slidininkus(fin, finisave, finisavusiu_skaicius);

    fin.close();

    std::cout << "Dalyviai:\n";
    for ( int i = 0; i < dalyviu_skaicius; ++i )
        std::cout << dalyviai[i];

    std::cout << "\nFinišavę:\n";
    for ( int i = 0; i < finisavusiu_skaicius; ++i )
        std::cout << finisave[i];

    // Nepamirštam atlaisvinti atminties (arba pasimokom naudoti smart pointer'ius / STL konteinerius)!
    delete[] dalyviai;
    delete[] finisave;

    return 0;
}

kas be ko tips'ai geri, bet tiek darbo, o kaži ar žmogui padės, nes abejoju ar žmogus turės noro aiškintis kas yra pointeriai, operatoriu panaudojimą struktūrose, etc.

Nuoroda į komentarą
Dalintis per kitą puslapį

  • ALFRED. pakeitė pavadinimą į Uždavinio apie slidininkus failo skaitymas

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 1344 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Prisijungti prie diskusijos

Palikti atsakymą galite iš karto, o užsiregistruoti vėliau. Jeigu jau turite paskyrą mūsų forume, Prisijunkite.

Svečias
Atsakyti šioje temoje...

×   Įklijuotas tekstas turi teksto formatavimą.   Pašalinti teksto formatavimą

  Galimi tik 75 veidukai.

×   Nuoroda buvo automatiškai įterpta.   Įterpti nuorodą paprastai

×   Jūsų ankstesnis pranešimas buvo atkurtas.   Išvalyti redaktorių

×   Jūs negalite įkelti nuotraukas tiesiogiai.Įkelkite arba įdėkite nuotraukas iš URL.

  • Šiame puslapyje naršo:   0 nariai

    • Nėra registruotų narių peržiūrinčių šį forumą.

Skelbimai


×
×
  • Sukurti naują...