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;
}