• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dlaczego dany program tak dziwnie mi zamienia liczby?

Cloud VPS
0 głosów
127 wizyt
pytanie zadane 3 czerwca 2016 w C i C++ przez k222 Nałogowiec (30,150 p.)

Napisałem program (który ma być częścią troszkę  większego) którego zadaniem jest zamiana liter na liczby coś w stylu tego co jest na telefonie komórkowym z klawiaturą a,b,c -> 2 d,e,f->3 g,h,i->4 ... Z góry uprzedzam że nie działa od s w górę bo na razie to wczesna wersja. Mam z nim problem dziwnie się zachowuje - mianowicie gdy daje mu 1,2,4,6,7 liter to zamienia normalnie, gdy daje mu 3,5,8 liter to ostatnia z nich jest o 1 mniejsza od oczekiwanej a gdy daje mu 9 liter to ostatnia jest o 2 mniejsza np.

a  -  aa  -  aaa  -  aaaa  -  aaaaa  -  aaaaaa  - aaaaaaa  -  aaaaaaaa  -  aaaaaaaaa  

oczywiście napisane jedno pod drugim zamiast - daje wynik:

2  -  22  - 221  - 2222  -  22221  -  222222  -  2222222  -  22222221  -  222222220

może mi ktoś wytłumaczyć dlaczego tak się dzieje?

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    int n;
    cin>>n;
    string word[n];
    int num[n];

    for(int i=0; i<n; i++)
    {
        cin>>word[i];

        num[i] = 0;
    }


    for(int i=0; i<n; i++)
    {
        for(int j=0; j<word[i].length(); j++)
            num[i] += ((word[i][j] - 91)/3) * pow(10,word[i].length() - 1 - j);
        cout<<num[i]<<endl;
    }

    return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 3 czerwca 2016 przez Zdegustowany Nowicjusz (140 p.)

Jeśli definiujesz rozmiar tablicy w trakcie wykonywania programy to musisz dynamicznie alokować pamięć. Bo w tak statycznie zaalokowanej pamięci są po prosu śmieci i stąd dziwny output.


#include <iostream>
#include <string>
#include <cmath>

using namespace std;

int main()
{
    int n;
    cin >> n;
    string* word = NULL;
    int* num = NULL;
    word = new string[n];
    num = new int[n];
    for (int i = 0; i<n; i++)
    {
        getline(cin, word[i]);
        num[i] = 0;
    }


    for (int i = 0; i<n; i++)
    {
        for (int j = 0; j<word[i].length(); j++)
            num[i] += ((word[i][j] - 91) / 3) * pow(10, word[i].length() - 1 - j);
        cout << num[i] << endl;
    }
    return 0;
}

komentarz 4 czerwca 2016 przez k222 Nałogowiec (30,150 p.)

Dzięki, spróbuję, ale jeszcze troszkę nie rozumiem - wiem że są tam śmieci ale myślałem że ta część:

 for(int i=0; i<n; i++)
    {
        cin>>word[i]; 
        num[i] = 0;
    }

załatwi sprawę - bo skąd jeszcze śmieci jak do stringów sam wpisuję, więc wszystko inne powinno zniknąć - powinna się tym zająć obsługa typu string w bibliotece, a wszystkie elementy tablicy int są ustawione na 0?

Podobne pytania

0 głosów
2 odpowiedzi 215 wizyt
0 głosów
1 odpowiedź 256 wizyt
0 głosów
0 odpowiedzi 210 wizyt
pytanie zadane 10 marca 2017 w JavaScript przez Miles Nowicjusz (170 p.)

93,466 zapytań

142,461 odpowiedzi

322,734 komentarzy

62,847 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...