Prośba o sprawdzenie kodu

2018-04-25 09:29
0

Cześć, dostałem za zadanie napisanie programu i nauczyciel twierdzi, ze jest w nim cos zle, jednak nie wiem co. Polecenie jest w zalaczniku.

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

using namespace std;

int main()
{
    string linia; //Tworzenie zmiennych dzięki którym nawiążę później połączenie z plikami
    fstream plik;
    fstream plik2;
    plik2.open("wyniki.txt", ios::out); //Połączenie z plikiem do zapisu wyników
    int aktualny = 0; //Utworzenie wszelkich potrzebnych liczników
    int licznik=0;
    int koncowka=0;
    int liczba_dopiskow=0;
    int tab[200]; //Utworzenie tablic które będą przechowywać informacje o długości wspólnej końcówki
    string tab2[200]; //Tablica która będzie przechowywać poszczególne wiersze z pliku
    string pierwszy_potrojny=""; //Zmienna w której później zapiszę znalezioną parę wyrazów
    bool pierwszy = true; //Zmienna dzięki której będę wiedzieć, że znaleziona para napisów jest pierwszą
        plik.open("napisy.txt", ios::in); //Nawiązanie połączenia z plikiem do odczytu
    if(plik.good() == true) //Jeśli udało nawiązać się połączenie
    {
        while(!plik.eof())
        {
            aktualny++; //Zlicza numer wiersza
            getline(plik, linia);//Czytam poszczególne linie z pliku
            cout << aktualny <<" Wyrazy: "+linia<<endl; //Wypisuję w konsoli numer wiersza oraz wyrazy
            bool dopisek = true; //Zmienna dzięki której w przyszłości będę sprawdzać możliwość tworzenia wyrazu przez dopisywanie
            int dl_pierwszego=-1; //Zmienna w której będę przechowywać długość pierwszego wyrazu
            int dl_drugiego=0;//Zmienna w której będę przechowywać długość drugiego wyrazu
            int j = 0;
            while(dl_pierwszego==-1)//Pętla która rozdziela jeden wiersz na dwa wyrazy dzięki odnalezieniu spacji
            {
               if(linia[j]==' ') //Kiedy znajduję spację oddzielającą wyrazy
                {
                    dl_pierwszego = j; //Długość pierwszego wyrazu to numer miejsca na którym znalazłam spację
                    dl_drugiego = linia.length()-1-j; //Obliczam długośc drugiego wyrazu na podstawie długości wiersza oraz długości pierwszego
                }
                j++; //Zwiększając zmienną sprawdzam kolejne litery wiersza szukając spacji
            }

                cout << dl_pierwszego << ": " << dl_drugiego << endl; //Wypisuję w konsoli obliczone długości
                if(dl_pierwszego!=0)
                {
                   if(dl_pierwszego>=3*dl_drugiego || dl_pierwszego*3<=dl_drugiego)//Sprawdzam czy któryś z wyrazów jest trzykrotnie większy od drugiego
                {
                    cout << "ktorys wyraz jest 3 razy wiekszy" << endl;//Wypisuję w konsoli wiadomość o znalezionym wyrazie trzykrotnie większym od drugiego
                    licznik++; //Zliczam wystąpienie wyrazów trzykrotnie większych
                    if(pierwszy) //Jeśli znalazłam dopiero pierwszy wyraz trzykrotnie większy
                    {
                        pierwszy_potrojny+=linia;//Zapisuję ten wiersz
                        pierwszy = false;//Nie szukam już wystąpienie pierwszego wyrazu trzykrotnie większego tylko kolejnych
                    }
                }
                for(int i = 0; i < dl_pierwszego; i++)//Pętla w której będę sprawdzać czy można utworzyć drugi wyraz dopisując coś do drugiego
                {
                    if(linia[i]!= linia[dl_pierwszego+1+i])//Sprawdzam kolejne litery obu wyrazów. Jeśli nie są takie same nie mogę utworzyć drugiego wyrazu
                    {
                        dopisek = false; //Zwracam fałsz
                    }
                }
                if(dopisek)//Jeśli program nie zwrócił fałszu - można utworzyć drugi wyraz dopisując coś do poprzedniego
                {
                    string pierw = linia.substr(0,dl_pierwszego); //Oddzielam pierwszy wyraz z całej linii
                    string dopis = linia.substr(dl_pierwszego*2+1,linia.length()); //Oddzielam dopisaną część
                    liczba_dopiskow++; //Zwiększam licznik dopisków
                    cout << pierw << " " << dopis << endl; //Wypisuję w konsoli przykład wyrazów z dopiskiem
                    plik2 << linia << " Utworzone przez dodanie koncowki -> "; //Zapisuję te wyrazy do pliku
                    plik2 << pierw << " + " << dopis << endl;
                }
                int c = linia.length(); //Podstawiam pod zmienną c długość wiersza
                while(linia[c-1] == linia[c-dl_drugiego-2]) //Sprawdzam czy ostatnie litery obu wyrazów są takie same. Gdy będą się różnić pętla się przerwie
                {
                    c--;//Zmniejszam zmienną od której zależy to którą literę sprawdzam
                }
                int koncowka2 = linia.length()-c;//Po przerwaniu pętli zapisuję długośc wspólnej końcówki
                tab[aktualny] = koncowka2; //Zapisuję długość do tabeli w której będę przechowywać wszystkie długości końcówek
                tab2[aktualny] = linia; //Zapisuję do tabeli dany wiersz
                if(koncowka2>koncowka)//Jeśli wspólna końcówka jest większa od poprzednio największej
                {
                    koncowka = koncowka2; //Ustanawiam nową największą końcówkę
                }
                }

            }
            //Zapisuję wszystkie dane do pliku oraz wypisuję je w konsoli
            cout << "Suma wierszy w ktorych jeden wyraz jest min. trzykrotnie wiekszy od drugiego: " << licznik << endl;
            cout << "Pierwsze wystapienie takich wyrazow: "<<pierwszy_potrojny << endl;
            plik2 << "Suma wierszy w ktorych jeden wyraz jest min. trzykrotnie wiekszy od drugiego: " << licznik<<endl;
            plik2 << "Pierwsze wystapienie takich wyrazow: "<<pierwszy_potrojny<<endl;
            cout << "Najdluzsza wspolna koncowka ma dlugosc: " << koncowka << endl;
            plik2 << "Najdluzsza wspolna koncowka ma dlugosc: " << koncowka<<endl;
            for(int x = 1; x < 200; x++)//Dzięki tej pętli wypiszę wszystkie wyrazy ze wspólną najdłuższą końcówką. Przechodzę przez wszystkie wyrazy tablicy
            {
                if(tab[x] == koncowka)//Jeśli w tablicy widnieje wartość która jest największą wspólną końcówką
                {
                    cout << tab[x] << " wspolnych koncowych liter dla "<<tab2[x] <<endl;//Wypisuję w konsoli
                    plik2 << tab[x] << " wspolnych koncowych liter dla "<<tab2[x]<<endl;//Zapisuję do pliku
                }
            }
        }
        plik.close();//Zamykam połączenia z plikami
        plik2.close();
    return 0;
}
edytowany 1x, ostatnio: kq, 2018-04-25 12:23
"Prośba" o poprawne sformatowanie treści: Formatowanie tekstu. Tutaj jest automatyczna formaterka jeśli sam nie umiesz: http://format.krzaq.cc/ - YooSy 2018-04-25 09:41

Pozostało 580 znaków

2018-04-25 10:39
0

1.: Za dużo zmiennych:

string linia; //Tworzenie zmiennych dzięki którym nawiążę później połączenie z plikami
fstream plik;
fstream plik2;
plik2.open("wyniki.txt", ios::out); //Połączenie z plikiem do zapisu wyników
... // I tak dalej, i tak dalej...

Po co tyle? Po co tworzysz je już teraz, skoro wykorzystujesz je dużo później? Po co tworzysz tablicę w ten sposób: int tab[200]; - możliwe, że marnujesz pamięć nie tworząc jej dynamicznie. Jesteś pewien, że będziesz potrzebował tyle elementów lub co gorsza tylko tyle elementów?

2.: Dlaczego tutaj: int dl_pierwszego=-1; początkowa wartość prowadzi to magiczne -1? To może prowadzić do błędów.

3.: To: using namespace std; jest bardzo złą i brzydką praktyką.


Ogólnie:
Kosmetyka i totalny brak czytelności kodu! Jeśli prowadzący mówi, że coś jest z tym kodem źle, to pewnie ma rację i najpewniej przy obecnym braku formatowania, zamieszczenia kodu w znacznikach kodu, braku czytelności i ogólnego spaghetti ciężko będzie znaleźć co rzeczywiście jest nie tak.
Popraw formatowanie i zamieść kod w znacznikach.

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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