Program losujący linie z pliku txt.

0

Witam. Uczę się dopiero programować i potrzebuję pomocy. Napisałem program losujący ćwiczenia z 6 plików tekstowych. Wszystko działa tak jak chciałem, ale chciałbym pisać kod od początku tak jak powinno się pisać. Jeśli moglibyście rzucić okiem na ten kod i wytknąć mi moje błędy to byłbym bardzo wdzięczny :)
P.S. Najlepiej uczę się wtedy kiedy ktoś wytyka mi błędy i nie owija w bawełnę. Z góry dzięki za poświęcony czas :)

UWAGA!!! - proszę nie poprawiać po mnie błędów, tylko powiedzieć co jest źle i nakierować na poprawne rozwiązania :P

 

// program losuje jedna linie z pliku tekstowego

#include <iostream>
#include <stdlib.h>
#include <ctime>
#include <fstream>

void losuj_linie();

using namespace std;

//-------------------------------------------------- Program główny -------------------------------------------------

int main()
{
    cout << "Witaj w programie!\n" << endl;

    cout << "1. Losuj plan treningowy. (FBW)\n" << endl;

    cout << "Wybierz: ";

    int wybor_menu;

    cin >> wybor_menu;

    switch(wybor_menu)
    {
        case 1:
            losuj_linie();
            break;
        default:
            cout << "Nie ma takiej pozycji w menu.";
            break;
    }

    system("pause");
    return 0;
}

//--------------------------------------------------- Nowa funkcja -------------------------------------------------

void losuj_linie()
{
    system("cls");
    cout << "Losowanie planu treningowego. (FBW)\n" << endl;

    fstream nogi, plecy, klatka, barki, triceps, biceps;
    nogi.open("nogi.txt", ios::in | ios::out);
    plecy.open("plecy.txt", ios::in | ios::out);
    klatka.open("klatka.txt", ios::in | ios::out);
    barki.open("barki.txt", ios::in | ios::out);
    triceps.open("triceps.txt", ios::in | ios::out);
    biceps.open("biceps.txt", ios::in | ios::out);

    int nr_linii, licznik, wylosowany_numer;
    string wiersz;
    srand (time(NULL));

//--------------------------------------------------- Losowanie 1 ---------------------------------------------------

    licznik = 0;

    wylosowany_numer = (rand() % 20) + 1;

    if(nogi.good() == true)
    {
        while(!nogi.eof())
        {
            getline(nogi, wiersz);
            licznik++;

            if(licznik == wylosowany_numer)
            {
                cout << "Wylosowales/as cwiczenie nr."<< wylosowany_numer << ".\nNogi: " << wiersz << endl;
            }
        }
    }

//--------------------------------------------------- Losowanie 2 ---------------------------------------------------

    licznik = 0;

    wylosowany_numer = (rand() % 20) + 1;

    if(plecy.good() == true)
    {
        while(!plecy.eof())
        {
            getline(plecy, wiersz);
            licznik++;

            if(licznik == wylosowany_numer)
            {
                cout << "\nWylosowales/as cwiczenie nr."<< wylosowany_numer << ".\nPlecy: " << wiersz << endl;
            }
        }
    }

//--------------------------------------------------- Losowanie 3 ---------------------------------------------------

    licznik = 0;

    wylosowany_numer = (rand() % 20) + 1;

    if(klatka.good() == true)
    {
        while(!klatka.eof())
        {
            getline(klatka, wiersz);
            licznik++;

            if(licznik == wylosowany_numer)
            {
                cout << "\nWylosowales/as cwiczenie nr."<< wylosowany_numer << ".\nKlatka piersiowa: " << wiersz << endl;
            }
        }
    }

//--------------------------------------------------- Losowanie 4 ---------------------------------------------------

    licznik = 0;

    wylosowany_numer = (rand() % 20) + 1;

    if(barki.good() == true)
    {
        while(!barki.eof())
        {
            getline(barki, wiersz);
            licznik++;

            if(licznik == wylosowany_numer)
            {
                cout << "\nWylosowales/as cwiczenie nr."<< wylosowany_numer << ".\nBarki: " << wiersz << endl;
            }
        }
    }

//--------------------------------------------------- Losowanie 5 ---------------------------------------------------

    licznik = 0;

    wylosowany_numer = (rand() % 20) + 1;

    if(triceps.good() == true)
    {
        while(!triceps.eof())
        {
            getline(triceps, wiersz);
            licznik++;

            if(licznik == wylosowany_numer)
            {
                cout << "\nWylosowales/as cwiczenie nr."<< wylosowany_numer << ".\nTriceps: " << wiersz << endl;
            }
        }
    }

//--------------------------------------------------- Losowanie 6 ---------------------------------------------------

    licznik = 0;

    wylosowany_numer = (rand() % 20) + 1;

    if(biceps.good() == true)
    {
        while(!biceps.eof())
        {
            getline(biceps, wiersz);
            licznik++;

            if(licznik == wylosowany_numer)
            {
                cout << "\nWylosowales/as cwiczenie nr."<< wylosowany_numer << ".\nBiceps: " << wiersz << endl;
                cout << "\n";
            }
        }
    }

//--------------------------------------------------- Zamykanie plikow ----------------------------------------------

    nogi.close();
    plecy.close();
    klatka.close();
    barki.close();
    triceps.close();
    biceps.close();

//--------------------------------------------------------- Koniec --------------------------------------------------

}

1

2 podstawowe błędy. Po 1 polskie zmienne. Jest ogólnie przyjęte aby używać zmiennych, nazw funkcji i ogólnie wszystkiego w języku angielskim.
Po 2 6 razy powtarzasz ten sam fragment kodu, z małą różnicą. Wrzuć to do jakiejś pętli lub lepiej, do funkcji. Skróci to kod :) Zrób tablicę z plikami, potem po niej przeleć jakąś pętlą. Do zmiennie fileContent otwórz plik i na tej zmiennej wykonuj wszystko a potem go zamknij. Dzięki temu program będzie miał `30 linijek.

1

Przede wszystkim rzuciło mi się w oczy, że wielokrotnie powtarzasz prawie taki sam kawałek kodu. Wyobraź sobie, że teraz musisz coś w tym zmienić. Prawie na pewno popełnisz błąd zmieniając to samo w 6-iu miejscach. Warto by to skrócić do jednej funkcji.

Dodatkowo wyrzucił bym srand(time(NULL)); do main(), lub jakiejś funkcji inicjalizującej wszystko. time() zwraca czas wyrażony w sekundach, więc jeśli losuj_linie() zostanie wywołana 2 razy w ciągu 1 sekundy, to wylosuje dokładnie to samo.

0

Chciałem to skrócić ale nie wiedziałem jak :) Faktycznie macie rację z tymi polskimi zmiennymi (poprawię).
Spodobał mi się ten pomysł:

Wrzuć to do jakiejś pętli lub lepiej, do funkcji. Skróci to kod :) Zrób tablicę z plikami, potem po niej przeleć jakąś pętlą. Do zmiennie fileContent otwórz plik i na tej zmiennej wykonuj wszystko a potem go zamknij.

hit02 Przeniosę funkcję srand do main.

Dziękuję :)

1

ja jeszcze dodam wielgaśna funkcja void losuj_linie().
Sam wstawiłeś do jej wnętrza "odcięcia" z nazwami. No to podziel to na mniejsze funkcje i nazwij tak by było wiadomo co się tam dzieje (prawdopodobnie tak jak nazwałeś to w komentarzach). Zapewne okaże się, że pewne funkcje można użyć wiele razy i kod się skróci i uprości.
Tak jak w wypracowaniu z Polskiego nauczycielka uczy cię by nie robić zdań wielokrotnie złożonych, tak samo lepiej pisać proste małe funkcje wywołujące inne funkcje, bo wtedy łatwiej jest wszystko zrozumieć i ogarnąć o co chodzi (na dodatek jest parę innych zalet).

1 użytkowników online, w tym zalogowanych: 0, gości: 1