logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak napisać program w C wypisujący kwotę słownie?

nelik1987 07 Mar 2008 00:57 11533 7
REKLAMA
  • #1 4881865
    nelik1987
    Poziom 31  
    Posty: 2190
    Pomógł: 43
    Ocena: 429
    Witam ma takie zadanie nie bardzo wiem jak je ugryźć, kombinuje już chyba ze 4 godziny i nie bardzo wiem w jaką stronę iść

    Chciałem zrobić to tak:

    do oddzielnych zmiennych wpisać każdą z cyfr tworzących kwotę

    czyli jak kwota to 4326 to podzieliłem to że
    a1=6
    a2=2
    a3=3.... itd

    potem chciałem napisać algorytm na zasadzie funkcji switch która będzie "rozpoznawać" cyfry i przypisywać im odpowiednie słowa gdy na przykład a3=3 to wypisze "trzysta" potem jak np a2=2 to wypisze "dwadzieścia" itd...

    wiem że są nieciekawe przypadki jak naście czyli od jeżeli mam jakieś naście bo ostatni cyfra nie mozę być pisana jako na przykład 5 tylko jak wcześniejsza będzie jeden to będzie pisane piętnascie.

    Znacie jakąś ciekawą metodę jak to zrobić tak zeby było jak najproscie

    Tyle narazie zrobiłem

    
    #include <stdio.h>
    #include <conio.h>
    int main()
    {
          float kwota;
          int a1,a2,a3,a4,a5,a6,a7,a8,x;
          printf("Podaj kwote\n");
          scanf("%f",&kwota);
          if(kwota==1000000)
             printf("milion zlotych");
          else
          { 
             a5=kwota/10000; 
             a4=(kwota-a5*10000)/1000;
             a3=(kwota-(a5*10000)-(a4*1000))/100 ;
             a2=(kwota-(a5*10000)-(a4*1000)-(a3*100))/10 ;
             a1=kwota-(a5*10000)-(a4*1000)-(a3*100)-(a2*10) ;
    
             printf("a5 %d\n",a5);
             printf("a4 %d\n",a4);
             printf("a3 %d\n",a3);
             printf("a2 %d\n",a2);
             printf("a1 %d\n",a1);
             
          }
          getch();
          return 0;
    }
    



    a oto treść zadania:

    
    Bazując na elementach programowanie poznanych na wykładzie i laboratorium, napisać w języku C program
    realizujący poniższe zadania:
    Zadanie 1: Drukowanie słowne kwoty waluty w złotych , do 1 000 000 zł
    Program musi definiować własne funkcje i używać ich w uzasadnionych przypadkach. Powinien realizować
    następujące zadania:
    1.1 Pobrać od użytkownika liczbę kwota typu float
    1.2 Wyświetlić na ekranie podaną kwotę w postaci liczbowej i słownej, wraz z groszami, na przykład
    265 182,01 -> dwiescie szescdziesiat piec tysiecy sto osiemdziesiat dwa zlote i jeden grosz
    17,10 -> siedemnascie zlotych i dziesiec groszy
    1.3 Opis słowny musi być poprawny gramatycznie, tzn. należy zapewnić odpowiednią odmianę wyrazów
    (złoty, złote, złotych, grosz, grosze, groszy)
  • REKLAMA
  • #2 4881949
    neo_dc
    Poziom 32  
    Posty: 2206
    Pomógł: 178
    Ocena: 211
    zadanie jest dosc proste, ale w C juz prawie nic nie pamietam, wiec napisze Ci jak ja to bym widzial...

    Najpierw moze na calosciach
    - robisz 3 tablice - setki, dziesiatki i jednosci np.

    setki[1] = sto
    setki[2] = dwieście
    ...
    setki[9] = dziewięćset

    druga tablica

    dziesiatki[1] = dziesięć
    ...

    trzecia

    jednosci[1] = jeden
    ...

    - pobierasz liczbe i rozbijasz ją na poszczególne cyfry
    i wczytujesz do tablicy
    - cyfry dzielisz na grupy po 3
    - teraz czytasz po kolei każdą cyfrę, porownujesz ją z tym co masz w tablicach wartosci slownych i wyswietlasz na ekranie, po pierwszych trzech dodajesz 'tysięcy' lub jeśli ostatnią cyfrą tysięcy jest 2,3 lub 4 dodajesz 'tysiace'
    - jeśli program napotka zero to nic nie pisze i jedzie dalej
    ( wtedy podasz np. 107 to tak odczyta )

    Mam nadzieje ze cos podsunalem
  • REKLAMA
  • #3 4882047
    nelik1987
    Poziom 31  
    Posty: 2190
    Pomógł: 43
    Ocena: 429
    problem będzie tylko z tymi dziesiątkami bo jak będzie
    dziesiatki[1] = dziesięć a jedności będzi 0 to OK ale jednosci będzie na przykład już jeden to będzie trzeba czytać odrazu jedenaście ale do teho chyba bym zrobił tablice wyjątków albo na ifach D
  • REKLAMA
  • #4 4918845
    owca607
    Poziom 15  
    Posty: 105
    Pomógł: 12
    Ocena: 2
    Napisałem Ci program, tylko nie doczytałem że ma być w C a nie C++. Łatwo sobie przeprawisz.

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
    char ponownie;
    do{
      string liczba;
      cout << "Podaj liczbę:" << endl;
      cin >> liczba;
      cout << endl;
    
      bool zmianaJednostek = false;
    
      switch (liczba.length())
       {
       case 4:
         if (liczba[liczba.length() - 4] == '9')
           cout << "dziewięć tysięcy ";
         else if (liczba[liczba.length() - 4] == '8')
           cout << "osiem tysięcy ";
         else if (liczba[liczba.length() - 4] == '7')
           cout << "siedem tysięcy ";
         else if (liczba[liczba.length() - 4] == '6')
           cout << "sześć tysięcy ";
         else if (liczba[liczba.length() - 4] == '5')
           cout << "pięć tysięcy ";
         else if (liczba[liczba.length() - 4] == '4')
           cout << "cztery tysiące ";
         else if (liczba[liczba.length() - 4] == '3')
           cout << "trzy tysiace ";
         else if (liczba[liczba.length() - 4] == '2')
           cout << "dwa tysiące ";
         else if (liczba[liczba.length() - 4] == '1')
           cout << "tysiąć ";
       case 3:
         if (liczba[liczba.length() - 3] == '9')
           cout << "dziewięćset ";
         else if (liczba[liczba.length() - 3] == '8')
           cout << "osiemset ";
         else if (liczba[liczba.length() - 3] == '7')
           cout << "siedemset ";
         else if (liczba[liczba.length() - 3] == '6')
           cout << "sześćset ";
         else if (liczba[liczba.length() - 3] == '5')
           cout << "pięćset ";
         else if (liczba[liczba.length() - 3] == '4')
           cout << "czterysta ";
         else if (liczba[liczba.length() - 3] == '3')
           cout << "trzysta ";
         else if (liczba[liczba.length() - 3] == '2')
           cout << "dwiescie ";
         else if (liczba[liczba.length() - 3] == '1')
           cout << "sto ";
       case 2:
         if (liczba[liczba.length() - 2] == '9')
           cout << "dziewięćdziesiąt ";
         else if (liczba[liczba.length() - 2] == '8')
           cout << "osiemdziesiąt ";
         else if (liczba[liczba.length() - 2] == '7')
           cout << "siedemdziesiąt ";
         else if (liczba[liczba.length() - 2] == '6')
           cout << "sześćdziesiąt ";
         else if (liczba[liczba.length() - 2] == '5')
           cout << "pięćdziesiąt ";
         else if (liczba[liczba.length() - 2] == '4')
           cout << "czterdzieści ";
         else if (liczba[liczba.length() - 2] == '3')
           cout << "trzydziesci ";
         else if (liczba[liczba.length() - 2] == '2')
           cout << "dwadzieścia ";
         else if (liczba[liczba.length() - 2] == '1')
           zmianaJednostek = true;
       case 1:
         if (zmianaJednostek)
         {
           if (liczba[liczba.length() - 1] == '9')
             cout << "dziewiętnascie";
           else if (liczba[liczba.length() - 1] == '8')
             cout << "osiemnascie";
           else if (liczba[liczba.length() - 1] == '7')
             cout << "siedemnaście";
           else if (liczba[liczba.length() - 1] == '6')
             cout << "szesnaście";
           else if (liczba[liczba.length() - 1] == '5')
             cout << "piętnaście";
           else if (liczba[liczba.length() - 1] == '4')
             cout << "czternascie";
           else if (liczba[liczba.length() - 1] == '3')
             cout << "trzynaście";
           else if (liczba[liczba.length() - 1] == '2')
             cout << "dwanaście";
           else if (liczba[liczba.length() - 1] == '1')
             cout << "jedenaście";
         }
         else
         {     
           if (liczba[liczba.length() - 1] == '9')
             cout << "dziewięć";
           else if (liczba[liczba.length() - 1] == '8')
             cout << "osiem";
           else if (liczba[liczba.length() - 1] == '7')
             cout << "siedem";
           else if (liczba[liczba.length() - 1] == '6')
             cout << "sześć";
           else if (liczba[liczba.length() - 1] == '5')
             cout << "pięć";
           else if (liczba[liczba.length() - 1] == '4')
             cout << "cztery";
           else if (liczba[liczba.length() - 1] == '3')
             cout << "trzy";
           else if (liczba[liczba.length() - 1] == '2')
             cout << "dwa";
           else if (liczba[liczba.length() - 1] == '1')
             cout << "jeden";
         }
       }
    
      cout << endl << "Przeczytac ponownie? [T/n]: ";
      cin >> ponownie;
    
     }
     while((ponownie != 'n') || (ponownie != 'N'));
    
    }
    
  • REKLAMA
  • #5 4919178
    nelik1987
    Poziom 31  
    Posty: 2190
    Pomógł: 43
    Ocena: 429
    Rozwiązałem to tak tylko problem jest z groszami bo czasami zdarza się że jak wpisze na przykład 0.45 to program zaokrągla tą liczbę i wstawia 0.449999 i w rezultacie po odrzuceniu części tysiącznych liczby otrzymuję 0.44 zamiast 0.45

    
    #include <stdio.h>
    #include <conio.h>
    
    void setki(int x)
    {
         switch(x) 
            {
                case 1: printf("sto ");
                break;
                case 2: printf("dwiescie "); 
                break;
                case 3: printf("trzysta ");
                break;
                case 4: printf("czterysta ");
                break;
                case 5: printf("piecset ");
                break;
                case 6: printf("szescset ");
                break;
                case 7: printf("siedemset ");
                break;
                case 8: printf("osiemset ");
                break;
                case 9: printf("dziewiecset ");
                case 0: break;
            }
    }
    void dziesatki(int x, int y)
    {
         switch(x) 
            {
                case 1: 
                     switch(y) 
                     {
                        case 1: printf("jedenascie ");
                        break;
                        case 2: printf("dwanascie "); 
                        break;
                        case 3: printf("trzynascie ");
                        break;
                        case 4: printf("czternascie ");
                        break;
                        case 5: printf("pietnascie ");
                        break;
                        case 6: printf("szesnascie ");
                        break;
                        case 7: printf("siedemnascie ");
                        break;
                        case 8: printf("osiemnascie ");
                        break;
                        case 9: printf("dziewietnascie ");
                        case 0: printf("dziesiec ");
                        break;
                     }
                break;
                case 2: printf("dwadziescia "); 
                break;
                case 3: printf("trzydziesci ");
                break;
                case 4: printf("czterdziesci ");
                break;
                case 5: printf("piecdziesiat ");
                break;
                case 6: printf("szescdziesiat ");
                break;
                case 7: printf("siedemdziesiat ");
                break;
                case 8: printf("osiemdziesiat ");
                break;
                case 9: printf("dziewiedziesiat ");
                case 0: break;
            }
    }
    
    void jednosci(int x,int y)
    {
         if(y==1);
         else
         {
         switch(x) 
            {
                case 1: printf("jeden ");
                break;
                case 2: printf("dwa "); 
                break;
                case 3: printf("trzy ");
                break;
                case 4: printf("cztery ");
                break;
                case 5: printf("piec ");
                break;
                case 6: printf("szesc ");
                break;
                case 7: printf("siedem ");
                break;
                case 8: printf("osiem ");
                break;
                case 9: printf("dziewiec ");
                case 0: break;
            }
         }
    }
    
    void tysiace(int x, int y)
    {    
         if(x==1 && y==0)
         printf("tysiac ");
         else
         { 
          switch(x)
          {
            case 2:
            case 3:
            case 4: 
               if(y==1)
               printf("tysiecy ");
               else
               printf("tysiace ");
               break;
            case 0:
            case 1:
            case 5:
            case 6:
            case 7:
            case 8:
            case 9:
               printf("tysiecy ");
               break;
          }
         }
    }
    
    void zlote(int x, int y)
    {    
         if(x==1 && y==0)
         printf("zloty ");
         else
         { 
          switch(x)
          {
            case 2:
            case 3:
            case 4: 
               if(y==1)
               printf("zlotych ");
               else
               printf("zlote ");
               break;
            case 0:
            case 1:
            case 5:
            case 6:
            case 7:
            case 8:
            case 9:
               printf("zlotych ");
               break;
          }
         }
    }
    
    void grosze(int x, int y)
    {    
         if(x==1 )
         printf("grosz ");
         else
         { 
          switch(x)
          {
            case 2:
            case 3:
            case 4: 
               if(y==1)
               printf("groszy ");
               else
               printf("grosze ");
               break;
            case 0:
            case 1:
            case 5:
            case 6:
            case 7:
            case 8:
            case 9:
               printf("groszy ");
               break;
          }
         }
    }
    int main()
    {
          float kwota;
          int a1,a2,a3,a4,a5,a6,g1,g2;
          printf("Podaj kwote\n");
          scanf("%f",&kwota);
          printf("Kwota = %f1\n",kwota);
          if(kwota==1000000)
             printf("milion zlotych");
          else
          { 
             a6=kwota/100000;
             a5=(kwota-(a6*100000))/10000; 
             a4=(kwota-(a6*100000)-(a5*10000))/1000;
             a3=(kwota-(a6*100000)-(a5*10000)-(a4*1000))/100;
             a2=(kwota-(a6*100000)-(a5*10000)-(a4*1000)-(a3*100))/10;
             a1=(kwota-(a6*100000)-(a5*10000)-(a4*1000)-(a3*100)-(a2*10));
             g1=(kwota-(a6*100000)-(a5*10000)-(a4*1000)-(a3*100)-(a2*10)-a1)*10;
             g2=(kwota-(a6*100000)-(a5*10000)-(a4*1000)-(a3*100)-(a2*10)-a1-(g1/10.0))*100;
             
             printf("a6 %d\n",a6); //setki tysiecy
             printf("a5 %d\n",a5); //dziesiatki tysiecy
             printf("a4 %d\n",a4); //tysiace
             printf("a3 %d\n",a3); //setki
             printf("a2 %d\n",a2); //dziesiatki
             printf("a1 %d\n",a1); //jednosci
             printf("g1 %d\n",g1); //dziesiatki groszy
             printf("g2 %d\n",g2); //grosze
             
             setki(a6);
             dziesatki(a5,a4);
             jednosci(a4,a5);
             if(a6!=0 || a5!=0 || a4!=0)
               tysiace(a4,a5);
             
             
             setki(a3);
             dziesatki(a2,a1);
             jednosci(a1,a2);
             if(a1!=0 || a2!=0 || a3!=0 || a4!=0 || a5!=0 || a6!=0)
                zlote(a1,a2);
               
             dziesatki(g1,g2);
             jednosci(g2,g1); 
             if(g1!=0 || g2!=0)
                grosze(g2,g1);     
          }
          getch();
          return 0;
    }
    
    
  • Pomocny post
    #6 4941851
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    Takie pisanie programu przy pomocy CASE`ów moim zdaniem woła o pomstę do nieba. Program jest napisany niechlujnie i nieczytelnie. Wiem że pewnie Tobie jest to obojętne, ale dzięki temu łatwo zrobić błąd.
    1. NIE baw się w takie pokręcone CASE, wystarczy przecież stablicować napisy a potem zrobić wywołanie printf("%s ",tablica[n]); Do tego np w jednej z linii masz taką nieścisłość:
                        case 9: printf("dziewietnascie ");
                        case 0: printf("dziesiec ");
                        break;
    Albo używasz break wszędzie albo nigdzie, w większości Twojego kodu zamiast break można użyć return.
    NIE mieszaj CASE i IF, np tutaj:
    if(x==1 )
         printf("grosz ");
         else
         {
          switch(x)
          {
            case 2: 
    Potem niżej masz znowu CASE 1, przypuszczam że chodziło o odróżnienie 01 groszy od 11,21,31, etc, wydaje mi się że ten kawałek jest źle, bo w pierwszym IF chyba powinno być (x==1)&(y==0). Teraz konstrukcja jest taka IF/CASE/IF, ja bym zrobił ją jako CASE/IF ew IF/CASE
    2. NIE kombinuj z mnożeniem i odejmowaniem liczb, aby wybrać "cyfrę" wystarczy zrobić dzielenie i operację modulo.
    3. NIE używaj zmiennych zmiennoprzecinkowych, to nie będziesz miał problemu z 44.9999 groszy. Używaj stałoprzecinkowych, ew możesz całą liczbę zapamiętać w groszach a nie w złotych
    4. w main() przydałby się komunikat jak ktoś wpisze cyfrę większą od miliona oraz przydałby się zrobić "ręczną" konwersję string -> liczba, uwzględnić przynajmniej kropkę i przecinek, chociaż wygodnie byłoby też zrobić "pomijanie" spacji. Nie pamiętam też co się stanie jak się wpisze "nie-liczbe" i być może to też trzeba by dopisać.
  • #7 4942485
    nelik1987
    Poziom 31  
    Posty: 2190
    Pomógł: 43
    Ocena: 429
    trafne sugestie, nie jestem wielkim programistą to jest tylko program jako zadanie domowe które muszę oddać w formie zaliczenia części przedmiotu. Dziękuję za pomoc zastosuję się do dobrych rad
  • #8 5097900
    Darom
    Specjalista elektryk
    Posty: 2779
    Pomógł: 231
    Ocena: 588
    Liczenie pieniędzy na liczbach typu float to wstęp do dużych kłopotów.

    pzdr

    -DAREK-

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy implementacji programu w języku C, który wypisuje kwotę słownie. Proponowane podejścia obejmują rozbicie liczby na cyfry i przypisanie im słownych odpowiedników za pomocą tablic lub instrukcji switch. Zwrócono uwagę na specyfikę języka polskiego, szczególnie na przypadki liczb "naście" (np. jedenaście, piętnaście), które wymagają specjalnej obsługi warunkowej lub tablic wyjątków. Sugerowano grupowanie cyfr po trzy (setki, dziesiątki, jedności) i stosowanie tablic z nazwami setek, dziesiątek i jedności, co ułatwia czytelność i zmniejsza ryzyko błędów. Podkreślono, że stosowanie wielu rozbudowanych instrukcji switch jest nieczytelne i podatne na błędy, a lepszym rozwiązaniem jest użycie tablic znakowych i funkcji printf. Wskazano również na problem reprezentacji kwot jako typ float, który może prowadzić do błędów zaokrągleń, szczególnie przy groszach, co sugeruje stosowanie typów całkowitych lub innych metod precyzyjnego przetwarzania wartości pieniężnych. Przykłady kodu w C i C++ ilustrują różne podejścia do rozwiązania zadania.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA