problem z programem w C

olczyk
Użytkownik
Użytkownik
Posty: 13
Rejestracja: 19 sty 2010, o 19:07
Płeć: Kobieta
Podziękował: 1 raz

problem z programem w C

Post autor: olczyk »

//2. Tłumaczenie liczb na słowa - Napisz program, który umożliwi zamianę liczb < 1 000 000, na słowa.


#include <stdafx.h>
#include <cstdlib>
#include <iostream>
#include <time.h>
#include <conio.h>

using namespace std;

static char * milion[4] = { "", "milion ", "miliony ", "milionow "};

static char * tysiace[4] = { "", "tysiac ", "tysiace ", "tysiecy "};

static char * setki[10] = { "", "sto ", "dwiescie ", "trzysta ", "czterysta ",
"piecset ", "szescset ", "siedemset ", "osiemset ", "dziewiecset " };

static char * nastki[10] = { "dziesiec", "jedenascie", "dwanascie", "trzynascie", "czternascie",
"pietnascie", "szesnascie", "siedemnascie", "osiemnascie", "dziewietnascie" };

static char * dziesiatki[10] = { "", "dziesiec ", "dwadziescia ", "trzydziesci ", "czterdziesci ",
"piecdziesiat ", "szescdziesiat ", "siedemdziesiat ", "osiemdziesiat ", "dziewiecdziesiat " };

static char * jednosci[10] = { "", "jeden ", "dwa ", "trzy ", "cztery ",
"piec ", "szesc ", "siedem ", "osiem ", "dziewiec " };

int main(int argc, char *argv[])
{
char tab[6];
int d, len;
char *p;
for(;;)
{
printf ("Podaj liczbe < 1 000 000 \n");
printf ("========================\n");
cin.getline(tab, 6);
len = strlen(tab);
d = strtoul(tab, &p, 10);
if(p != (tab + len))
printf ("bledna liczba\n");
else break;
}
if(d == 0) printf( "zero");
else
switch(len)
{
case 6:
printf ("%s", milion[tab[len - 6] - '0']);
case 5:
d = tab[len - 5] - '0';
if(d == 1)
{
printf ("%s", nastki[tab[len - 4] - '0']);
printf (" %s", tysiace[tab[len - 4] - '0']);
goto next;
}
else;
printf ("%s", dziesiatki[d]);
case 4:
printf ("%s", jednosci[tab[len - 1] - '0']);
printf ("%s", tysiace[tab[len - 4] - '0']);

next:
case 3:
printf ("%s", setki[tab[len - 3] - '0']);
case 2:
d = tab[len - 2] - '0';
if(d == 1)
{
printf ("%s", nastki[tab[len - 1] - '0']);
break;
}
printf ("%s", dziesiatki[d]);
case 1:
printf ( "%s", jednosci[tab[len - 1] - '0']);
}
printf("\n");
system("PAUSE");
return EXIT_SUCCESS;
}




mam problem, program kompiluje się bez błędów ale posiada ich wiele, nie wiem w czym problem, np gdy wpisuje liczbe 58900 to czyta od tyłu i jeszcze zamienia liczby np 9 na 2 ;/

może ktoś mi pomoc?
była bym wdzięczna
Awatar użytkownika
Sokół
Użytkownik
Użytkownik
Posty: 451
Rejestracja: 17 wrz 2006, o 19:22
Płeć: Mężczyzna
Lokalizacja: Zielona Góra
Podziękował: 15 razy
Pomógł: 55 razy

problem z programem w C

Post autor: Sokół »

Pierwsza uwaga - w jakim języku ma to być program? C++ czy c? Nazwa tematu wskazuje na c, a kod programu (przestrzen nazw etc.) miejscami na c++. I skoro Ci sie kompiluje, to kompilujesz to jako c++. Wywal nagłówki time.h i conio.h, nie używasz żadnej funkcji z tych bibliotek.

1. getline (char* s, streamsize n ) kompiuje pod wskazany adres n-1 znaków! Zobacz, że kiedy podajesz 6 cyfrową liczbę, to nie przyjmuje cyfry jedności;

2. W jednym czy dwoch miejsach nie wysylalas odpowiedniego rzedu wielkosci

dziwny algorytm... Ale po modyfikacji zdaje sie dzialac: Twoj kod z naprawionymi bledami:

Kod: Zaznacz cały

#include <cstdlib>
#include <iostream>

using namespace std;

static char * milion[4] = { "", "milion ", "miliony ", "milionow "};

static char * tysiace[10] = { "tysiecy", "tysiecy ", "tysiace ", "tysiace ", "tysiace ", "tysiecy ", "tysiecy ", "tysiecy ", "tysiecy ", "tysiecy "};

static char * setki[10] = { "", "sto ", "dwiescie ", "trzysta ", "czterysta ",
                            "piecset ", "szescset ", "siedemset ", "osiemset ", "dziewiecset "
                          };

static char * nastki[10] = { "dziesiec", "jedenascie", "dwanascie", "trzynascie", "czternascie",
                             "pietnascie", "szesnascie", "siedemnascie", "osiemnascie", "dziewietnascie"
                           };

static char * dziesiatki[10] = { "", "dziesiec ", "dwadziescia ", "trzydziesci ", "czterdziesci ",
                                 "piecdziesiat ", "szescdziesiat ", "siedemdziesiat ", "osiemdziesiat ", "dziewiecdziesiat "
                               };

static char * jednosci[10] = { "", "jeden ", "dwa ", "trzy ", "cztery ",
                               "piec ", "szesc ", "siedem ", "osiem ", "dziewiec "
                             };

int main(int argc, char *argv[])
{
    char tab[6];
    int d, len;
    char *p;
    for (;;)
    {
        printf ("Podaj liczbe < 1 000 000 \n");
        printf ("========================\n");
        cin.getline(tab, 7);


        len = strlen(tab);
        d = strtoul(tab, &p, 10);
        if (p != (tab + len))
            printf ("bledna liczba\n");
        else break;
    }
   // cout << len << endl << d << endl;
    if (d == 0) printf( "zero");
    else
        switch (len)
        {
        case 6:
            printf ("%s", setki[tab[len - 6] - '0']);
        case 5:
            d = tab[len - 5] - '0';
            if (d == 1)
            {
                printf ("%s", nastki[tab[len - 4] - '0']);

                printf (" %s", tysiace[tab[len - 4] - '0']);
                goto next;
            }
            else;
            printf ("%s", dziesiatki[d]);
        case 4:
            printf ("%s", jednosci[tab[len - 4] - '0']);


            printf ("%s", tysiace[tab[len - 4] - '0']);

next:
        case 3:
            printf ("%s", setki[tab[len - 3] - '0']);
        case 2:
            d = tab[len - 2] - '0';
            if (d == 1)
            {
                printf ("%s", nastki[tab[len - 1] - '0']);
                break;
            }
            printf ("%s", dziesiatki[d]);
        case 1:
            printf ( "%s", jednosci[tab[len - 1] - '0']);
        }
    printf("\n");
    system("PAUSE");
    return EXIT_SUCCESS;
}

olczyk
Użytkownik
Użytkownik
Posty: 13
Rejestracja: 19 sty 2010, o 19:07
Płeć: Kobieta
Podziękował: 1 raz

problem z programem w C

Post autor: olczyk »


dziękuje
a możesz mi powiedzieć co zmienić żeby w całości było w c ?:) chyba, że poprawiłeś już wszystko:)zależy mi na tym, żeby było wszystko ładnie bo to program na zaliczenie tym bardziej dziękuję
Awatar użytkownika
Sokół
Użytkownik
Użytkownik
Posty: 451
Rejestracja: 17 wrz 2006, o 19:22
Płeć: Mężczyzna
Lokalizacja: Zielona Góra
Podziękował: 15 razy
Pomógł: 55 razy

problem z programem w C

Post autor: Sokół »

Nie poprawiałem na C; od zawsze korzystam z dobrodziejstw c++. Do poprawienia tylko został zapis biblioteki na stary styl z c (ma być stdlib.h zamiast cstdlib), no i trzeba czymś zastąpić użycie strumieni (wywalić iostream) - lecz stamtąd pochodzi funkcja cin.getline(...), więc musisz znaleźć jej odpowiednik, albo inaczej zorganizować wczytywanie danych. Niech ktoś kompetentny się wypowie.

A i na Twoim miejscu upewniłbym się czy to ma być stuprocentowo czyste c; nie używaliście na laborkach strumieni (biblioteka iostream, cin, cout - mówi Ci to coś?), ...)

---
dla '1000' program wypisuje 'jeden tysiecy'.
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

problem z programem w C

Post autor: kadiii »

dodanie funkcji

Kod: Zaznacz cały

scanf("%s",tab)
zamiast

Kod: Zaznacz cały

cin.getline(tab, 7);
oraz zamiast tych bibliotek co są:
stdio.h, stdlib.h, string.h i usuniecie przestrzeni nazw
spowoduje że program będzie w klasycznym C
olczyk
Użytkownik
Użytkownik
Posty: 13
Rejestracja: 19 sty 2010, o 19:07
Płeć: Kobieta
Podziękował: 1 raz

problem z programem w C

Post autor: olczyk »

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>
#include <string.h>



static char * tysiace[10] = { "tysiecy", "tysiecy ", "tysiace ", "tysiace ", "tysiace ", "tysiecy ", "tysiecy ", "tysiecy ", "tysiecy ", "tysiecy "};

static char * setki[10] = { "", "sto ", "dwiescie ", "trzysta ", "czterysta ",
                            "piecset ", "szescset ", "siedemset ", "osiemset ", "dziewiecset "
                          };

static char * nastki[10] = { "dziesiec", "jedenascie", "dwanascie", "trzynascie", "czternascie",
                             "pietnascie", "szesnascie", "siedemnascie", "osiemnascie", "dziewietnascie"
                           };

static char * dziesiatki[10] = { "", "dziesiec ", "dwadziescia ", "trzydziesci ", "czterdziesci ",
                                 "piecdziesiat ", "szescdziesiat ", "siedemdziesiat ", "osiemdziesiat ", "dziewiecdziesiat "
                               };

static char * jednosci[10] = { "", "jeden ", "dwa ", "trzy ", "cztery ",
                               "piec ", "szesc ", "siedem ", "osiem ", "dziewiec "
                             };

int main(int argc, char *argv[])
{
    char tab[6];
    int d, len;
    char *p;
    for (;;)
    {
        printf ("Podaj liczbe < 1 000 000 \n");
        printf ("========================\n");
        scanf("%s",tab);


        len = strlen(tab);
        d = strtoul(tab, &p, 10);
        if (p != (tab + len))
            printf ("bledna liczba\n");
        else break;
    }
   // cout << len << endl << d << endl;
    if (d == 0) printf( "zero");
    else
        switch (len)
        {
        case 6:
            printf ("%s", setki[tab[len - 6] - '0']);
        case 5:
            d = tab[len - 5] - '0';
            if (d == 1)
            {
                printf ("%s", nastki[tab[len - 4] - '0']);

                printf (" %s", tysiace[tab[len - 4] - '0']);
                goto next;
            }
            else;
            printf ("%s", dziesiatki[d]);
        case 4:
            printf ("%s", jednosci[tab[len - 4] - '0']);


            printf ("%s", tysiace[tab[len - 4] - '0']);

next:
        case 3:
            printf ("%s", setki[tab[len - 3] - '0']);
        case 2:
            d = tab[len - 2] - '0';
            if (d == 1)
            {
                printf ("%s", nastki[tab[len - 1] - '0']);
                break;
            }
            printf ("%s", dziesiatki[d]);
        case 1:
            printf ( "%s", jednosci[tab[len - 1] - '0']);
        }
    printf("\n");
    system("PAUSE");
    return EXIT_SUCCESS;
}
czy teraz będzie wszystko dobrze czy coś jeszcze zmienić?? :)

dzięki :)

-- 26 sty 2010, o 10:21 --

chciałabym, żeby to było dobrze zrobione, a jeśli chodzi o język programowania to jestem pewna, że to musi być c :)
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

problem z programem w C

Post autor: kadiii »

Zamień jeszcze modyfikator static na const.
olczyk
Użytkownik
Użytkownik
Posty: 13
Rejestracja: 19 sty 2010, o 19:07
Płeć: Kobieta
Podziękował: 1 raz

problem z programem w C

Post autor: olczyk »

dziękuję za pomoc -- 26 sty 2010, o 22:02 --tylko, że wciaż wypisuje mi jeden tysiecy po wpisaniu 1000
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

problem z programem w C

Post autor: kadiii »

Pokombinuj sobie z tymi końcówkami żeby wszystkie pasowały - to nie jest trudne a ty sie wprawisz dzięki temu.
ODPOWIEDZ