Dekodowanie treści

0

Witam, chciał bym zapytać o radę a mianowicie mam za zadanie napisać program który będzie wyszukiwał frazę w tekście (skrót) i zamieniał go na jego rozwinięcie na obecną chwile mam już funkcje która wyszukuje frazy ale nie mam pojęcia jak taki wyszukany skrót podmienić na jego rozwinięcie które znajduję się w pliku txt, dodam że nie jestem mistrzem c++ więc jak bym mógł prosić o takie dosyć proste wyjaśnienia .
Z góry dziękuje.
A tyle na obecna chwile naskrobałem :

#include <stdio.h>
#include <fstream>
#include <iostream>
#include <string>

using namespace std;


int main()
{
	char decyzja_1;
	do
	{
		cout << "Co chesz zrobic : \n 1.Sprawdz biblioteke skrotuw,\n 2.Wprowadz nowe zdanie.\n 3.Sprawdz zadania z rozwinietymi skrotami." << endl;
		int opcja;
		cin >> opcja;
			switch (opcja)
			{
				case 1:if (opcja == 1)
				{
					cout << "W pliku znajduja sie nastepujace zdania : \n" << endl;
					string zawartosc_pliku;
					ifstream Skroty;
					Skroty.open("C:\\Users\\telemarketer26\\Desktop\\Skroty.txt");
					while (Skroty.good())
					{
						getline(Skroty, zawartosc_pliku);
						cout << zawartosc_pliku << endl;
					}
				}
				case 2:if (opcja == 2)
				{
					cout << "Podaj zdanie uzywajac skrotu :\n" << endl;
					string zdanie;
					cin.ignore();
					getline(cin, zdanie);
					ofstream Zdania;
					Zdania.open("C:\\Users\\telemarketer26\\Desktop\\Zdania.txt", ios::app);
					Zdania << zdanie << endl;
				//	ofstream Zdania("C:\\Users\\telemarketer26\\Desktop\\Zdania.txt");
					string tekst;
					while(!Zdania.eof())
						{
	    					getline(Zdania, tekst);
	    					if(!(string::npos == tekst.find("bd")))
	    					cout<<"Fraze odnaleziono";
	    					else 
	    					cout<<"Frazy nie odnaleziono";
							break;
			
						}
				}
		cout << "Czy chcesz zakonczyc prace t/n ??" << endl;
		cin >> decyzja_1;
		cin.get();
	} 
	while (decyzja_1 != 't');
	cin.get();
	return 0;
}
0

Oddziel IO od reszty, zeby to jakiś wygladalo, logike Zamknij w funkcjach. Najlepiej byloby chyba utworzyc, hash z frazami(skrotami), jako klucze, a z rozwinieciami jako wartosci. Potem po prostu pytac strukture

0

Jak robisz swtiche to nie potrzeba Ci ifów(przynajmniej w tym przypadku). Switch i te casey mają zastępować ify. Jeżeli te if`y usuniesz i po każdym case dodasz:

break;

To bedziesz miał to samo, a nawet i lepiej.

Po drugie:

while( Skroty.good())
                    {
                        getline(Skroty, zawartosc_pliku);
                        cout << zawartosc_pliku << endl;
                    }

Co ten warunek oznacza? Jeżeli plik się dobrze otworzy, to nigdy nie wyjdziemy z while.
Wyjście z pętli powinno oznaczać koniec pliku, czyli "nic już wiecej tam nie ma, więc nie czytam"

while(!Skroty.eof())

Po trzecie:
Nigdzie nie zamykasz plików.

Co do samego rozwiązania:

Ja bym spróbował tak, że jeżeli wprowadzimy zdanie, to te wprowadzone zdanie rozłożyć na osobne wyrazy:
"mgr zapytał inż. o prace zal."
Rozbić na 6 stringów, potem niech funkcja sprawdza każdy z tych wyrazów czy jest taki skrót, czy nie. Jeżeli jest to dany string ze skrótem zmieniamy na string z rozwinięciem skrótu.
Potem te 6stringów łączymy w jeden.

0

Dałbyś wskazówkę jak rozbić zdanie na te pojedyncze stringi , i co robić ze znakami białymi ?
i jak pozamykać te otwieranie pliki ;(

0

Pliki zamyka się:

obiekt.close();

W Twoim przypadku obiektami są: Skroty i Zadania.

Wyrazy możesz oddzielić za pomocą:
http://www.cplusplus.com/reference/cstring/strtok/

Ale... bardziej podoba mi się zastosowanie haszy (klucz wartość)

0

Wytłumaczył byś mi jak zrobić to na tych kluczach ?

0

A jest możliwe zrobienie czegoś takiego że w momęcie gdy:

 if(zdanie.find("bd")!=string::npos)
                            cout<<"Fraze odnaleziono";
                            else 
                            cout<<"Frazy nie odnaleziono";

znajdzie mi frazę żeby ją zamieniło ?na inne w ostateczności zrobił bym każdy skrót po koleii ale jak mówiłem lepiej nie umiem ;/

0

Czy ten kod Ci kompiluje?

0

Tak i jak w pliku Zdania jest zdanie w którym jest to "bd" to wyświetla że znaleziono fraze

0

Dobra więc tak, ogólnie chodzi o to, żebyś zrobił sobie taki ala słownik, co ma tutaj sens taki, że patrz:
Jeżeli zrobisz sobie słownik(mape) to wtedy nie będziesz musiał przelatywać całego pliku tekstowego w poszukiwaniu rozwinięcia danego skrótu:
Tutaj masz jak wyglądają mapy: Mapy

Ja bym to widział tak:

  • Robisz mapę <skróty , rozwinięciaSkrótów>
  • robić tablice stringów, rozbijając zdanie na oddzielne wyrazy
  • Sprawdzać, czy któryś wyraz (element tablicy) jest równy "skrót" z mapy
  • Jeżeli jest to zmieniamy na rozwinięcieSkrótu
  • Jeżeli nie to nic nie robimy

Czyli pierwsze co musiałbyś zrobić to utworzenie właśnie takiej mapy

 if(zdanie.find("bd")!=string::npos)
                            cout<<"Fraze odnaleziono";
                            else 
                            cout<<"Frazy nie odnaleziono";

Możesz zmieniać w tej funkcji tylko będziesz musiał użyć string::replace , biorąc pod uwagę, że find zwraca Ci miejsce, gdzie rozpoczyna się dany string (w tym wypadku "bd")
No i oczywiście w pliku ze skrótami za każdym razem będziesz musiał przeglądać czy jest taki skrót , a potem jakie jest jego rozwinięcie.

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