Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Dynamicznie przydzielony fragment pamięci, przetwarzanie tablicy przy pomocy wskaźniów.

Ostatnio zmodyfikowano 2016-03-02 00:12
Autor Wiadomość
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
P-145415
darko202
» 2016-03-01 08:50:39
1.
zacznij od zrozumienia tablic dynamicznych na:
http://cpp0x.pl/kursy/Kurs-C++​/Dynamiczne-zarzadzanie-pamieci​a-new-i-delete​/307
masz 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 !
P-145442
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

C/C++
#include <iostream>
using namespace std;

int main()
{
    char * smsorg = new char[ 160 ];
   
    int * klawisze = new int[ 10 ];
    cin.getline( smsorg, 160 );
    char * sms = smsorg; //wskaźnikiem będziem ruszać ale zawsze trzeba mieć oryginalny
    //jak musi być dynamicznie :P
    //tylko dla małych liter bez spacji żeby było prosciej
    while( * sms ) {
        int klaw =(( * sms ) - 'a' ) / 3 + 2; //wzór na klawisz skoro na każdym są trzy litery d -a=3/3=1+2=3
        int ilerazy =(( * sms ) - 'a' ) % 3 + 1; //wzór na liczbę kliknięć przykład: d-a=3%3=0+1=1;
        klawisze[ klaw ] += ilerazy;
        sms++;
    }
    //teraz wyswietlenie
    for( int i = 0; i < 10; i++ ) {
        if( klawisze[ i ] == 0 ) continue;
       
        cout << "[" << i << "] - " << klawisze[ i ] << endl;
    }
    delete[] smsorg;
    delete[] klawisze;
   
}
P-145466
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;
}
P-145476
« 1 »
  Strona 1 z 1