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.

0
if (zdanie.find("bd") != string::replace("bede"))
				{
					Zdania << zdanie << endl;
					break;

nie wiem czy dobrze Cię zrozumiałem
ale coś takiego wyrzuca mi błąd
o przeciążeniu funkcji

0

Z tego co wyczytałem muszę znać pozycje tego Bd w ciągu i zastąpić ja poprzez użycie tego ??

string& replace (size_t pos,  size_t len,  const string& str,
                 size_t subpos, size_t sublen);
0

Pozycje "bd" zwraca Ci find(w sensie zwraca gdzie się zaczyna), jak przeglądasz te strony z dokumentacją to na dole masz przykłady

0

Widzisz wczytując się w dokumentacje widzimy, że replace zastępuje nam nie tylko dane słowo, a w dane miejsce wpycha na siłę jakiegoś stringa, kasując to co jest dalej.

Trzeba by było, string::insert wepchnąć Twój rozwinięty skrót, a potem usunąć to "bd".

Widzisz ile to zabawy? A prawdopodobnie jeszcze coś przy tym wyjdzie. Dlatego rozwiązanie z mapami i dzielenie zdania na wyrazy jest dużo lepsze i szybsze.

0

Masz racje tylko nigdy nie działałem na tych mapach więc zrobić cokolwiek w tym to jest dla mnie spory problem;/

0

Zobacz, mapy to jak tablice:
Z Wikipedii:

   map<int, string> tydzien;
   tydzien[1] = "niedziela";
   tydzien[2] = "poniedzialek";
   tydzien[3] = "wtorek";
   tydzien[4] = "sroda";
   tydzien[5] = "czwartek";
   tydzien[6] = "piatek";
   tydzien[7] = "sobota";

Zawsze możesz poczekać aż ktoś inny coś zaproponuje :)

0

A wiec musze zrobić takie 2 mapy
jedna mapa(int , string )skroty ;
a druga mapa(int , string) rozszerzenia;
Tak ??,
i teraz tablice znaków string która będzie przechowywać to moje zdanie w którym będzie skrót ?

0

Jedną mapę: mapa<skrót , rozszerzenieSkrótu>.
Tablicę stringów, w któej będą oddzielne wyrazy z wpisanego zdania np:

ZDANIE: "Ala ma kota"

TABLICA:
sentence[0] = "Ala";
sentence[1] = "ma";
sentence[2] = "kota";

Potem, jeżeli zadeklarujesz i zdefiniujesz sobie tą mapę to robisz tak:

for(int i = 0; i < sentence.size(); i++){

if( mapa.count(sentence[i]){
sentence[i] = mapa[sentence[i]];
}

}

Chyba, że coś pokręciłem chodzi o to:

  • Przelatujesz wszystkie elementy tablicy stringów, czyli Twoje wyrazy
  • Jeżeli , badane słowo to skrót , czyli istnieje w naszej mapie: "mapa.count(sentence[i])" to:
    Element z tablicy stringów(czyli skrót) równa się , wartość z mapy spod klucza "sentence[i]"

Żeby to zrobić jeszcze jaśniej praktyczny przykład:

ZDANIE: "nie bd tam"

TABLICA:
sentence[0] = "nie";
sentence[1] = "bd";
sentence[2] = "tam";

Kod(załóżmy, że badamy trzeci element)

mapa["bd"] = "bede"; 

if( mapa.count("bd"){
sentence[1] = mapa["bd"];
}

i w tym momencie w tablicy "bd" zmieniło się na "bede"

Wydaje mi się, że z taką widzą powinieneś to napisać

0

Mógł byś mi jeszcze tylko pokazać jak miał by wyglądać początek takiej mapy dwóch stringów ?

0
map<string, string> myWords;
myWords["bd"] = "bede";
myWords["mgr"] = "magister";

Nie jestem pewien, bo na mapach też dużo nie robiłem ale z tego co widzę to w internecie tak jest.

0

Zrobilem cos takiego ale nie wiem w takim wypadku jak to sprawdzac ;/

#include "stdafx.h"
#include <stdio.h>
#include <fstream>
#include <iostream>
#include <string>
#include <map>
#include <conio.h>

using namespace std;


int main()
{
	map<string, string> Skrt;
	Skrt["zw"] = "zaraz wracam";
	Skrt["jkc"] = "jak cos to";
	Skrt["ocb"] = "o co biega";
	Skrt["omg"] = "O moj Boze";
	Skrt["nrx"] = "narka";
	Skrt["jj"] = "juz jestem";
	Skrt["sql"] = "szkola";
	Skrt["pp"] = "pa pa";
	Skrt["bdp"] = "bede potem";
	Skrt["bj"] = "bede jutro";
	Skrt["kc"] = "kocham Cie";
	Skrt["kcm"] = "kocham Cie mocno";
	Skrt["jww"] = "jak wyzej";
	Skrt["nmzc"] = "nie ma za co";
	Skrt["nsns"] = "nic sie nie stalo";
	Skrt["rwp"] = "rodzic w pokoju";
	Skrt["btw"] = "przy okazji ";
	Skrt["ur"] = "Uwaga rodzice";
	Skrt["nww"] = "Nie wiem";
	Skrt["kk"] = "ok ok";
	Skrt["jctk"] = "jak cos to kom";
	Skrt["mbp"] = "moze bede pozniej";
	Skrt["np"] = "na przyklad";
	Skrt["tj"] = "to jest";
	Skrt["pt"] = "pod tytulem";
	Skrt["dz"] = "dzieki";
	Skrt["bd"] = "bede";
	Skrt["cb"] = "ciebie";
	
	string Zdanie[2];
	for (int i = 0; i<1; i++)
	{
		cout << "Podaj zdanie :  ";
		cin.ignore();
		getline(cin, Zdanie[i]);
	}
		cout << "zapisane w tablicy" << endl;
		for (int i = 0; i<1; i++)
		cout << Zdanie[i] << endl;
		cin.get();

		for (int i = 0; i < Zdanie.size(); i++) {

			if (Skrt.count(Skrt[i]) {
				Skrt[i] = Skrt[Skrt[i]];
	

	cin.get();
	return 0;
}
0

Nie wiem co tutaj może być źle jeszcze ta tablica zjada mi pierwsza literkę nie wiem czemu ;/

#include "stdafx.h"
#include <stdio.h>
#include <fstream>
#include <iostream>
#include <string>
#include <map>
#include <conio.h>

using namespace std;


int main()
{
	map<string, string> Skrt;
	Skrt["zw"] = "zaraz wracam";
	Skrt["jkc"] = "jak cos to";
	Skrt["ocb"] = "o co biega";
	Skrt["omg"] = "O moj Boze";
	Skrt["nrx"] = "narka";
	Skrt["jj"] = "juz jestem";
	Skrt["sql"] = "szkola";
	Skrt["pp"] = "pa pa";
	Skrt["bdp"] = "bede potem";
	Skrt["bj"] = "bede jutro";
	Skrt["kc"] = "kocham Cie";
	Skrt["kcm"] = "kocham Cie mocno";
	Skrt["jww"] = "jak wyzej";
	Skrt["nmzc"] = "nie ma za co";
	Skrt["nsns"] = "nic sie nie stalo";
	Skrt["rwp"] = "rodzic w pokoju";
	Skrt["btw"] = "przy okazji ";
	Skrt["ur"] = "Uwaga rodzice";
	Skrt["nww"] = "Nie wiem";
	Skrt["kk"] = "ok ok";
	Skrt["jctk"] = "jak cos to kom";
	Skrt["mbp"] = "moze bede pozniej";
	Skrt["np"] = "na przyklad";
	Skrt["tj"] = "to jest";
	Skrt["pt"] = "pod tytulem";
	Skrt["dz"] = "dzieki";
	Skrt["bd"] = "bede";
	Skrt["cb"] = "ciebie";

	string zdanie[32];

		for (int i = 0; i < sizeof(zdanie); i++)
		{
			cout << "Napisz Zdanie ";
			cin.ignore();
			getline(cin, zdanie[i]);
		
			for (int i = 0; i < zdanie[i].size(); i++)
			{

				if (Skrt.count(zdanie[i]))
				{
					zdanie[i] = Skrt[zdanie[i]];
					
				}
				cout << zdanie[i] << endl;
			}
		}
	cin.get();
	return 0;
}
0

Wydaje mi się albo gdzieś znalazłeś kod.

cin.ignore();

Sprawdź sobie co to robi , ale Ci podpowiem to przez to zjada Ci pierwszą literke.

Co do rozwiązania:

  • Wpisujesz wszystkie zdania do tablicy, okey to jest spoko
  • Powinieneś te zdania rozdzielić na mniejsze części czyli na te wyrazy, najlepiej byłoby to zrobić w vectorze: Vector c++
 for (int i = 0; i < zdanie[i].size(); i++)
            {

                if (Skrt.count(zdanie[i]))
                {
                    zdanie[i] = Skrt[zdanie[i]];

                }

Tutaj sprawdzasz całe zdania. a przecież chodzi Ci o od dzielne wyrazy, jak rozdzielać zdania masz tutaj >click<

Jeszcze takie pytanie:
Czy na 100% wiesz, że tych zdań jest 32 i to się nie zmieni?

  • Bo jeśli liczba zdań może się zmienić to polecam skorzystać z wyżej wymienionego wektora
0

Hej zrobiłem coś takiego

	cout<< "Podaj zdanie : " <<endl;
 			string zdanie;
 			getline(cin, zdanie);
 			for(int i = 0; i < zdanie.length(); i++)
			 {
 				
			 }

Ale nie ma pojęcia odnosząc się do tego co podałeś w liku jak napisać to wpisywanie jeśli spacja ;/
Mógł byś mi to pokazać bo już kombinuje ładne 2 h i nie umiem ;/
jesli znak to nie spacja to dopisujesz znak do stringa
jeśli znak to spacja to utworzonego stringa wpisujesz do tablIcy

1

Deklarujesz sobie stringstream:

#include <sstream>
stringstream ss;

i vector

#include <vector>
vector<string> splitedSentence ;

Daje Ci praktycznie rozwiązanie na tacy

   cout<< "Podaj zdanie : " <<endl;
            string zdanie;
            getline(cin, zdanie);

           ss.str(zdanie);
           string word="";

    while(ss >> word)
          if (Skrt.count(word))
              splitedSentence.push_back( Skrt[word] )
         else
            splitedSentence.push_back(word);
0

Tak to powinno wyglądać ?:

#include <stdio.h>
#include <iostream>
#include <string>
#include <map>
#include <conio.h>
#include <sstream>
#include <vector>



using namespace std;

int main()
{
		
    map<string, string> Skrt;
    Skrt["zw"] = "zaraz wracam";
    Skrt["jkc"] = "jak cos to";
    Skrt["ocb"] = "o co biega";
    Skrt["omg"] = "O moj Boze";
    Skrt["nrx"] = "narka";
    Skrt["jj"] = "juz jestem";
    Skrt["sql"] = "szkola";
    Skrt["pp"] = "pa pa";
    Skrt["bdp"] = "bede potem";
    Skrt["bj"] = "bede jutro";
    Skrt["kc"] = "kocham Cie";
    Skrt["kcm"] = "kocham Cie mocno";
    Skrt["jww"] = "jak wyzej";
    Skrt["nmzc"] = "nie ma za co";
    Skrt["nsns"] = "nic sie nie stalo";
    Skrt["rwp"] = "rodzic w pokoju";
    Skrt["btw"] = "przy okazji ";
    Skrt["ur"] = "Uwaga rodzice";
    Skrt["nww"] = "Nie wiem";
    Skrt["kk"] = "ok ok";
    Skrt["jctk"] = "jak cos to kom";
    Skrt["mbp"] = "moze bede pozniej";
    Skrt["np"] = "na przyklad";
    Skrt["tj"] = "to jest";
    Skrt["pt"] = "pod tytulem";
    Skrt["dz"] = "dzieki";
    Skrt["bd"] = "bede";
    Skrt["cb"] = "ciebie";
    
    vector<string> splitedSentence ;
	stringstream ss;

	cout<< "Podaj zdanie : " <<endl;
	string zdanie;
	getline(cin, zdanie);
	ss.str(zdanie);
	string word=" ";
 
    while(ss >> word)
    {
    
        if (Skrt.count(word))
        {
        
              splitedSentence.push_back( Skrt[word] );
              break;
        }
        else
            splitedSentence.push_back(word);
            
           for(int i = 0; i < splitedSentence.size(); i++)
		   {
 
					if( Skrt.count(splitedSentence[i]))
					{
						splitedSentence[i] = Skrt[splitedSentence[i]];
					
	   	   			}
	   	   			
			}
					 	
	   	 
	}
	   
		
 		

return 0;
}
1

Przeczytaj sobie co robi

break;

i napisz mi jeszcze jaki jest zamysł tego fora?

0

Break przerywa nam działanie petli wiec go tam nie powinno być , a z tego co zrozumiałem ta pętla sprawdza czy w danym stringu jest skrót który znajduje się w mapie i zmienia go na jego odpowiednik z mapy

1
    while(ss >> word)
    {
        if (Skrt.count(word))
              splitedSentence.push_back( Skrt[word] );
        else
            splitedSentence.push_back(word);
    }

    for(int i = 0; i < splitedSentence.size(); i++)
        cout << splitedSentence[i] << " ";

Przeanalizuj i powiedz mi czy rozumiesz.

0

No to w monecie gdy napotka nam word który jest spacja ma utworzyć nowa zmiana i następnie sprawdzić czy w którejś z tych zmiennych jest nasz skrót z mapy else ma po prostu zostawić ten skrót i później ma nam po kolei wypisać ge zmienne oddzielając je spacja .
O to chodzi ?

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