adrian.paz Temat założony przez niniejszego użytkownika |
łańcuchy, pętla for » 2017-12-29 18:25:56 Witam moje zadanie to po wpisaniu łańcucha wyliczyć i wyświetlić ile razy wystąpiła dana litera. Znalazłem cuś takiego: Załóżmy, że nie rozróżniamy wielkich/małych liter. Więc tak: 0. Wczytaj stringa, np do zmiennej: zdanie 1. Zamień wszystkie litery w stringu na małe litery. 2. Utwórz tablicę 26 elementową. Np. char tablica[26] 3. Wypełnij ją zerami. 4. Pobierz długość zmiennej zdanie, zapisz np. do zmiennej X. 5. dla i = 0,1,2..,x-1 rób 6 6. tablica[zdanie-'a']++;
7. Wypisz ładnie tą tablicę.
Jeśli chodzi o tablicę: pod indeksem 0 siedzi liczba wystąpień a, pod 1 liczba wystąpień b, itd
krok 6 działa tak: indeksem tablicy w tym kroku jest wyrażenie: zdanie-'a'. zdanie - i-ta litera/symbol w stringu zdanie-'a' zwraca 0 jeśli tam siedzi a, 1 jeśli jest tam b itd |
i mam coś takiego(tylko że jest do dupy :( ) #include <iostream> #include <cstdlib> #include <algorithm> using namespace std; string napis; void licznik() { transform( napis.begin(), napis.end(), napis.begin(),::tolower ); char tablica[ 26 ]; for( int i = 0; i <= 26; i++ ) { tablica[ i ] = 0; } int d = napis.length(); for( int i = 0; i < d; i++ ) { tablica[ napis[ i ] - 'a' ] ++; } cout << tablica; }
int main() { cout << "Wczytaj lancuch, a wyswietle Ci ile razy wystapila w nim dana litera!" << endl; getline( cin, napis ); licznik(); system( "PAUSE" ); return 0; }
|
|
mateczek |
» 2017-12-29 20:44:03 #include <iostream> #include <algorithm> using namespace std; void licznik( string & napis ) { transform( napis.begin(), napis.end(), napis.begin(),::tolower ); int tablica[ 26 ]; for( int i = 0; i < 26; i++ ) { tablica[ i ] = 0; } int d = napis.length(); for( int i = 0; i < d; i++ ) { tablica[ napis[ i ] - 'a' ] ++; } for( int i = 0; i < 26; i++ ) { if( tablica[ i ] ) cout << "litera " <<( char )( 'a' + i ) << " wystapila razy " << tablica[ i ] << endl; } }
int main() { string napis; cout << "Wczytaj lancuch, a wyswietle Ci ile razy wystapila w nim dana litera!" << endl; getline( cin, napis ); licznik( napis ); return 0; } |
|
pekfos |
» 2017-12-29 23:47:22 A gdzie warunek, czy znak jest poprawny? Napisanie spacji sypnie ten program. |
|
adrian.paz Temat założony przez niniejszego użytkownika |
» 2017-12-30 13:58:49 Dziękuję bardzo za pomoc ale proszę jeszcze o chwile cierpliwości i wytłumaczenie co robią dwie rzeczy, bo w ogóle nie wiem co tu jest napisane... Chodzi mi o : for( int i = 0; i < d; i++ )
{ tablica[ napis[ i ] - 'a' ] ++; }
if( tablica[ i ] ) cout << "litera " <<( char )( 'a' + i ) << " wystapila razy " << tablica[ i ] << endl;
Zwłaszcza w tym drugim bo tu za dużo rzeczy się dzieje :D |
|
mateczek |
» 2017-12-30 14:39:39 for( int i = 0; i < d; i++ )
{ tablica[ napis[ i ] - 'a' ] ++; }
if( tablica[ i ] ) { cout << "litera " <<( char )( 'a' + i ) << " wystapila razy " << tablica[ i ] << endl;
|
|
adrian.paz Temat założony przez niniejszego użytkownika |
» 2017-12-31 14:39:50 Powiedz mi jeszcze coś bo ja coś oporny jestem :D tablica[ napis[ i ] - 'a' ] ++; //zwiększa o jeden wartość w elemencie tablicy której indexem jest literka. |
Po co jest to zwiększenie? Po to żeby dla np litery 'a' nie było 0 bo wtedy w if wyjdzie że nie ma litery? Ale jak zwiększy o 1 to potem w ifie skąd wie ile jest literek? jak to się dzieje? Mam przykładowo wyraz "rama". Kolejne literki mają wartości [17,1,13,1] podaj mi prosze na przykladzie tym jak komputer to liczy i wstawia do tablicy. |
|
mateczek |
» 2017-12-31 17:20:40 literę traktuje jako Index tablica[0] to inaczej tablica['a'-'a'] tablica[1] to inaczej tablica['b'-'a'] tablica[2] to inaczej tablica['c'-'a'] mamay napis "aaca" litera 'a' czyli tablica[0]++ czyli równa 1 litera 'a' czyli tablica[0]++ czyli równa 2 litera 'c' czyli tablica[2]++ czyli równa 1 litera 'a' czyli tablica[0]++ czyli równa 3 w tablica[0] masz ilość wystąpień litery 'a' w tablica[25] masz ilość wystąpień litery 'z' ifa se pomiń jak cię wk...wia :P i sam zobacz co wypluje program wtedy zobaczysz jaki ma cel ten if void licznik( string & napis ) { transform( napis.begin(), napis.end(), napis.begin(),::tolower ); int tablica[ 26 ]; for( int i = 0; i < 26; i++ ) { tablica[ i ] = 0; } int d = napis.length(); for( int i = 0; i < d; i++ ) { tablica[ napis[ i ] - 'a' ] ++; } for( int i = 0; i < 26; i++ ) { cout << "litera " <<( char )( 'a' + i ) << " wystapila razy " << tablica[ i ] << endl; } } |
|
adrian.paz Temat założony przez niniejszego użytkownika |
» 2017-12-31 17:57:58 Bardzo dziekuje za pomoc :D Wszystko juz (w końcu) ogarnąłem :D Powiedz mi jeszcze skąd się bierze zapis 'char' w nawiasie? Skąd taki pomysł/metoda? Kiedy takie coś się robi? Pierwszy raz widzę taki zapis |
|
« 1 » 2 |