Wyrazy jednolite
Ostatnio zmodyfikowano 2017-05-22 20:15
Avaris Temat założony przez niniejszego użytkownika |
Wyrazy jednolite » 2017-05-22 19:48:27 Hej, mam mały problem z pierwszym podpunktem pewnego zadania maturalnego. Mam sprawdzić czy napisy pobrane z pliku są napisami jednolitymi. Treść podpunktu: Napis nazywamy jednolitym, jeżeli wszystkie jego litery są takie same. Przykładem takiego napisu jest AAAA. Podaj liczbę wierszy zawierających parę napisów jednolitych, które są wzajemnie swoimi anagramami. Przykład Dla pliku zawierającego następujące dane: AAAA AAAA AHHAH AHHAH AAAA AAAAAAA BBBBBBB BABBAB CCCCC CCCCC wynikiem jest liczba 2 (pierwszy i ostatni wiersz). Zwróć uwagę, że napisy w trzecim wierszu są napisami jednolitymi, ale nie są wzajemnie swoimi anagramami.. Uporałem się już z drugim podpunktem gdzie miałem sprawdzić czy napisy wzajemnie są anagramami, mam ideę by sprawdzić najpierw długość ciągu znaków a potem sprawdzać po znaku, czy sobie odpowiadają lecz nie mam pomysłu jak to zrobić. Myślę także, że działa to na zasadzie szukania palindromów. Proszę powiedzieć czy dobrze myślę, oraz o ewentualne instrukcje :) Pozdrawiam! #include <iostream> #include<fstream> #include<string> #include<cstring> #include<cstdlib> #include<algorithm> using namespace std;
void zad1jednolite() { fstream plik; plik.open( "Dane/68/dane_napisy.txt", ios::in | ios::out ); if( plik.good() == true ) { cout << "Uzyskano dostep do pliku" << endl; } else cout << "Brak dostepu do pliku" << endl; ifstream fin( "Dane/68/dane_napisy.txt" ); ofstream fout( "wyniki_anagramy.txt" ); string anagramy[ 2000 ]; int ilosc_wierszy = 0; int k = 0; while( k < 2000 && fin >> anagramy[ k++ ] ) { fin >> anagramy[ k ]; k++; } for( int i = 0; i < 2000; i = i + 2 ) { if( anagramy[ i ].size() != anagramy[ i + 1 ].size() ) cout << "To nie sa wyrazy jednolite"; else } void zad2anagramy() { fstream plik; plik.open( "Dane/68/dane_napisy.txt", ios::in | ios::out ); if( plik.good() == true ) { cout << "Uzyskano dostep do pliku" << endl; } else cout << "Brak dostepu do pliku" << endl; ifstream fin( "Dane/68/dane_napisy.txt" ); ofstream fout( "wyniki_anagramy.txt" ); string anagramy[ 2000 ]; int ilosc_wierszy = 0; int k = 0; while( k < 2000 && fin >> anagramy[ k++ ] ) { fin >> anagramy[ k ]; k++; } int licz = 0; for( int i = 0; i < 2000; i = i + 2 ) { if( anagramy[ i ].size() != anagramy[ i + 1 ].size() ) continue; else { sort( anagramy[ i ].begin(), anagramy[ i ].end() ); sort( anagramy[ i + 1 ].begin(), anagramy[ i + 1 ].end() ); if( anagramy[ i ] == anagramy[ i + 1 ] ) ilosc_wierszy = ilosc_wierszy + 1; } } fout << "Zad68.2\n"; fout << "Anagramow jest: " << ilosc_wierszy; fin.close(); fout.close(); } int main() { zad1jednolite(); zad2anagramy(); return 0; }
|
|
michal11 |
» 2017-05-22 20:15:12 Ja bym policzył ile razy w wyrazie występuje pierwsza litera, wtedy wystarczy sprawdzić czy pierwsze litery obu wyrazów są takie same i czy występują tyle samo razy. Coś takiego napisałem żeby to sprawdzić bool AreWordsUniform( const std::string & FirstWord, const std::string & SecondWord ) { if( FirstWord.length() != SecondWord.length() ) { return false; } if( FirstWord[ 0 ] != SecondWord[ 0 ] ) { return false; } int FirstWordFirstLetterCount = std::count( FirstWord.cbegin(), FirstWord.cend(), FirstWord[ 0 ] ); int SecondWordFirstLetterCount = std::count( SecondWord.cbegin(), SecondWord.cend(), SecondWord[ 0 ] ); if( FirstWordFirstLetterCount != FirstWord.length() || SecondWordFirstLetterCount != SecondWord.length() ) { return false; } return true; }
|
|
« 1 » |