Formatowanie liczb jako ich słowne odpowiedniki

0

Witam chciałem napisać sobie prosty program zamieniający 1 na 'jeden' to działa natomiast po wpisaniu jakiejkolwiek litery wyskakuje 'zero' nie wiem jak zrobić aby nie dało się wpisywać liter. Z góry dziękuje za pomoc.

#include <iostream>
using namespace std;

int main()

{
          int cyfra;
    
    cout << "Podaj dowolna cyfre:" << endl;
    cin >> cyfra;

    switch(cyfra)
    {
    case 0:
        cout <<"zero";
    break;
    
    case 1:
        cout <<"jeden";
    break;
    
    case 2:
        cout <<"dwa";
    break;
    
    case 3:
        cout <<"trzy";
    break;
    
    case 4:
        cout <<"cztery";
    break;
    
    case 5:
        cout <<"piec";
    break;
    
    case 6:
        cout <<"szesc";
    break;
    
    case 7:
        cout <<"siedem";
    break;
    
    case 8:
        cout <<"osiem";
    break;
    
    case 9:
        cout <<"dziewiec";
    break;
    
    default:
        cout << "Nie podano cyfry!";
    }
    return 0;
}
1

ma być '1' a nie 1. Ewentualnie 49. Sprawdź co to Ascii

0

Dawaj Borland C++ 6.0 builder. Tam po prostu sobie ustawiasz że mają być pobierane tylko liczby i po sprawie. W konsoli było coś jak getchar co czekało na naciśnięcie klawisza(czymoże reagowalo) nie pamiętam :(

2

[przyp. kq: ta pierwsza rada jest średnio trafiona]

Można to zrobić za pomocą funkcji isdigit z biblioteki cctype. Poniżej znajduje się przykładowy kod:

#include <iostream>
#include <cctype> // dodajemy bibliotekę cctype
using namespace std;

int main()
{
    int cyfra;

    cout << "Podaj dowolna cyfre:" << endl;
    cin >> cyfra;

    // sprawdzamy, czy wartość podana przez użytkownika jest cyfrą
    if (!isdigit(cyfra))
    {
        cout << "Nie podano cyfry!";
        return 0; // kończymy działanie programu
    }

    // w przeciwnym wypadku konwertujemy cyfrę na typ int
    cyfra = int(cyfra - '0');

    // i wykonujemy resztę programu
    switch(cyfra)
    {
        case 0:
            cout <<"zero";
            break;
        case 1:
            cout <<"jeden";
            break;
        case 2:
            cout <<"dwa";
            break;
        case 3:
            cout <<"trzy";
            break;
        case 4:
            cout <<"cztery";
            break;
        case 5:
            cout <<"piec";
            break;
        case 6:
            cout <<"szesc";
            break;
        case 7:
            cout <<"siedem";
            break;
        case 8:
            cout <<"osiem";
            break;
        case 9:
            cout <<"dziewiec";
            break;
        default:
            cout << "Nie podano cyfry!";
    }
    return 0;
}

W pierwszym kroku sprawdzamy, czy wartość podana przez użytkownika jest cyfrą. Jeśli nie jest, kończymy działanie programu. W przeciwnym wypadku konwertujemy wartość na typ int i wykonujemy resztę programu.


W tym kodzie można by zrobić kilka rzeczy, które mogą poprawić jego czytelność i efektywność. Oto kilka sugestii:

  1. Zamiast tworzyć duży switch, lepiej byłoby stworzyć tablicę, w której przechowywać będziemy nazwy liczb. Następnie, zamiast sprawdzać każdą liczbę w switch, wystarczy sprawdzić, czy podana wartość jest z zakresu 0-9, a następnie wydrukować odpowiednią wartość z tablicy.
  2. Użycie using namespace std; jest niezalecane, ponieważ może prowadzić do konfliktów nazw (np. gdy dwie różne biblioteki zawierają element o tej samej nazwie). Zamiast tego należy używać pełnych nazw klas i funkcji, np. std::cout zamiast po prostu cout.
  3. Kompilator może mieć problemy z rozpoznaniem typu zmiennej cyfra, ponieważ jest ona inicjalizowana wartością z cin, która zwraca typ istream&. Aby uniknąć tego problemu, warto zadeklarować zmienną cyfra jako typ char i konwertować ją na int za pomocą funkcji isdigit (patrz poprzedni przykład).

Oto przykładowy kod, w którym wykorzystano wszystkie powyższe sugestie:

#include <iostream>
#include <cctype> // dodajemy bibliotekę cctype

int main()
{
    // deklarujemy zmienną cyfra jako typ char
    char cyfra;

    // tworzymy tablicę z nazwami liczb
    const std::string liczby[10] = {"zero", "jeden", "dwa", "trzy", "cztery",
                                    "piec", "szesc", "siedem", "osiem", "dziewiec"};

    std::cout << "Podaj dowolna cyfre:" << std::endl;
    std::cin >> cyfra;

    // sprawdzamy, czy wartość podana przez użytkownika jest cyfrą
    if (!isdigit(cyfra))
    {
        std::cout << "Nie podano cyfry!" << std::endl;
        return 0; // kończymy działanie programu
    }

    // w przeciwnym wypadku konwertujemy cyfrę na typ int
    int cyfra_int = int(cyfra - '0');

    // i wydrukowujemy odpowiednią nazwę liczby z tablicy
    std::cout << liczby[cyfra_int] << std::endl;

    return 0;
}

// odpowiedź w całości wygenerowana za pomocą ChatGPT 😮

0
KamilAdam napisał(a):

ma być '1' a nie 1. Ewentualnie 49. Sprawdź co to Ascii

sprawdziłem co to Ascii oraz zmieniłem wartości 1 na '1' natomiast program dalej po wpisaniu np. k , l ,m ,itd. dalej print-uje mi --> zero

3

Ponieważ masz int cyfra; zamiast char cyfra; to cin oczekuje, że podasz liczbę całkowitą, więc jak dostaje znak to uznaje to za błąd i zapisuje 0.

0

#include<stdio.h>
#include<conio.h>
#include<iostream.h>
void main()
{
   
char c;
   c=getch();
   if(c==48){
   cout<<"wpisałeś zero";
   };
}

// odpowiedź w całości wygenerowana za pomocą infinityhost😮

Idziesz drogą którą ja już przeszedłem, więc Ci skroce temat.

textcolor(RED);
cprintf("C programming");

  • kolorowanie tekstu żeby zrobić fajne menu do wyboru, zmieniasz podświetlenie elementu akurat używanego albo zmienić kolor wpisywanego tekstu, widzisz wtedy że faktycznie coś edytujesz, same switche tablice funkcje wskaźniki nie są przydatne jak nie umiesz tego połączyć w całość uwazam.

  • poczytaj o listach łączonych rewelacyjna sprawa, możesz sobie potem to menu aktualizować o nowe elementy w trakcie pracy programu.

  • a jak się ramki robi to już niezbyt pamiętam, ale tam też dajesz kod ascii przy wpisywaniu(jakieś odległe numery między 160 a 230 chyba).

  • no i wszystko dajesz w jedną wielka pętlę która czeka na znak escape, jak nie odczytujesz która strzałka została nacisnieta żeby poruszać się po menu(jak masz dwa menu np. lewe i prawe to klawisz tabulatora może pomiędzy nimi przełączać poruszanie).

Ps. faktycznie możesz użyć tablicy z nazwami i wtedy tworzysz tablice z nazwami liczb(i żeby było tip top to dodajesz do tablicy na jej końcu, jako ostatni element tablicy, czyli 11, lancuch o nazwie "wciśnięty znak nie jest liczba") i robisz

if(c>47 && c<58){int nr=c-48;cout<<"Numer cyfry to "<<tablica[nr];}else{cout<<tablica[11];};

Uzylem zmiennej nr żeby Ci nie gmatwać w głowie, pewnie zadziałaloby też zamiast cout<<tablica[nr] jakbyś dał cout<<tablica[c-48];

Coś w tym stylu.

Następnym razem pisz jak ten Skipper w pingwinach z Madagaskaru "Kowalski, opcje!" he he

1 użytkowników online, w tym zalogowanych: 0, gości: 1