Dynamicznie przydzielony fragment pamięci, przetwarzanie tablicy przy pomocy wskaźniów.
Ostatnio zmodyfikowano 2016-03-02 00:12
skibixd Temat założony przez niniejszego użytkownika |
Dynamicznie przydzielony fragment pamięci, przetwarzanie tablicy przy pomocy wskaźniów. » 2016-02-29 13:22:35 Witam, chciałbym prosić o pomoc w rozwiązaniu takiego zadania jak poniżej. Ktoś mógłby nakierować mnie w jaki sposób je zacząć, lub wskazać jakiś zarys jak ono ma byc rozwiazane?
ZADANIE Klawiatura telefonu komórkowego posiada ograniczoną liczbę klawiszy. Przykładowo w celu uzyskania litery a należy nasisnąć raz klawisz z numerem 2, natomiast w celu uzyskania litery z należy czterokrotnie nacisnąć klawisz z numerem 9.
Napisz program, który przeczyta ze standardowego wejścia treść wiadomości SMS składającej się z wielkich i małych liter alfabetu łacińskiego ('a'-'z', 'A'-'Z') oraz spacji (zakładamy, że a oraz A to ta sama litera) a jako wynik wyświetli liczbę naciśnięć każdego klawisza (pomijając te, które nie były naciśnięte przynajmniej raz). Możesz założyć, że rozmiar danych wejściowych nie przekroczy rozmiaru jednej wiadomości SMS (160 znaków).
Uwaga: Do wczytania danych wejściowych wykorzystaj dynamicznie przydzielony fragment pamięci. Do iteracji po przetwarzanej tablicy znaków użyj wskaźnika. Rozwiązania niespełniające powyższych wymagań będą usuwane z systemu.
Przykładowe dane Wejście:
Ala ma kota
Wyjście:
[2] - 4 [5] - 5 [6] - 4 [8] - 1 [0] - 2 |
|
darko202 |
» 2016-03-01 08:50:39 1. zacznij od zrozumienia tablic dynamicznych na: http://cpp0x.pl/kursy/Kurs-C++/Dynamiczne-zarzadzanie-pamiecia-new-i-delete/307masz przykład takiej tablicy i użycie jej z wykorzystaniem wskaźników no i są komentarze całego kodu 2. wczytaj dane wejściowe do takiej tablicy podobnie do ww. przykładu 3. analiza pobranych danych i zwrócenie odpowiednich wyników "wynik wyświetli liczbę naciśnięć każdego klawisza" np. a 4 razy klawisz [2] ale b to już by pewnie było 8 - bo naciskasz 2 razy dla jednej litery podsumowując prosty algorytm :) Powodzenia ! |
|
mateczek |
» 2016-03-01 21:01:36 gdyby nie to, że pod 7 są 4 litery a nie standardowo trzy można by tak :) oczywiście trzeba warunkiem obejść znaki które literami nie są ale to komplikuje kod #include <iostream> using namespace std;
int main() { char * smsorg = new char[ 160 ]; int * klawisze = new int[ 10 ]; cin.getline( smsorg, 160 ); char * sms = smsorg; while( * sms ) { int klaw =(( * sms ) - 'a' ) / 3 + 2; int ilerazy =(( * sms ) - 'a' ) % 3 + 1; klawisze[ klaw ] += ilerazy; sms++; } for( int i = 0; i < 10; i++ ) { if( klawisze[ i ] == 0 ) continue; cout << "[" << i << "] - " << klawisze[ i ] << endl; } delete[] smsorg; delete[] klawisze; } |
|
mokrowski |
» 2016-03-02 00:12:57 1. Znaki wczytaj do alokowanej przez new tablicy. 2. Z nagłówka <cctype> użyj isalpha() i tolower() aby sprawdzić czy znak dużej litery należy konwertować na małą. 3. Algorytm konwersji ze znaku na klawisz to:
unsigned* get_kbd(const char *sms) { unsigned *kbd = new unsigned[KBD_SIZE]; memset(kbd, 0, KBD_SIZE); char kbd_char;
while(*sms != '\0') { kbd_char = *sms; switch(kbd_char) { case 'a' ... 'o': kbd[(kbd_char - 'a') / 3 + 2] += ((kbd_char - 'a') % 3) + 1; break; case 'p' ... 's': kbd[7] += ((kbd_char - 'p') % 4) + 1; break; case 't' ... 'v': kbd[8] += ((kbd_char - 't') % 3) + 1; break; case 'w' ... 'z': kbd[9] += ((kbd_char - 'w') % 4) + 1; break; case ' ': ++kbd[0]; break; default: ; } ++sms; }
return kbd; } |
|
« 1 » |