Cześć, zaczęłam programować niedawno. Mam problem z takim jednym zadaniem - ,,Cyfra Jedności''. Zadanie polega na:
*wypisaniu słownie cyfrę jedności liczby n.
ma wypisać:
"zero" jeżeli cyfra jedności n to 0
"jeden" jeżeli cyfra jedności n to 1
"dwa" jeżeli cyfra jedności n to 2
"trzy" jeżeli cyfra jedności n to 3
"cztery" jeżeli cyfra jedności n to 4
"piec" jeżeli cyfra jedności n to 5
"inna" jeżeli cyfra jedności n jest większa niż 5
*
Mój problem konkretnie polega na komendzie, która właśnie wypisuje tą ,,cyfrę jedności". W internecie nie mogę nic znaleźć, a nawet jak znajdę to jest to dla mnie niezrozumiałe.
Czekam na odp.
Cyfrę wyznaczysz robiąc % 10
("modulo 10"), a wyświetlisz za pomocą switch
- czyli coś w stylu: switch (n % 10) { case 0: /* ... */ case 1: /* ... */ ... }
.
czy zamiast switch mogę użyć po prostu cout<< ? Czy mówiąc ,,wyświetlisz'' miałeś coś innego na myśli?
Prawie, prawie!
switch (...) {
case 0:
cout << "zero";
break;
case 1:
/* ... */
/* ... */
}
Zacznijmy od początku: czy rozumiesz, co to jest cyfra jedności? Jest to najmniej znacząca cyfra w liczbe, liczona „razy jeden” — stąd nazwa. Np. jak masz liczbę 123
(sto dwadzieścia trzy), to cyfrą jedności jest 3
, a sama liczba to 100 · 1 + 10 · 2 + 1 · 3
. Cyfra jedności to 3
, cyfra dziesiątek to 2
, a cyfra setek — 1
. Podobnie, w liczbie 5612871245
cyfra jedności to 5
, w liczbie 8
— 8
, w liczbie 0
— 0, w liczbie -751
— 1
, w liczbie -5
— 5
, itd.
Jak ją wyznaczyć? Na początkek musisz przekonwertować liczbę na nieujemną — wartością bezwzględną, z std::abs
, a potem wyznaczyć resztę z dzielenia przez dziesięć — operatorem %
. Potem potrzebujesz jakiejś instrukcji warunkowej — switch
jest naturalnym wyborem, żeby uniknąć drabinki if
ów. Samo wypisanie zrealizujesz na przykład std::cout
.
Okej. Dziękuję wam bardzo! Spróbuję wykorzystać wasze rady, i zobaczymy co z tego wyjdzie. :)
jeszcze pytanko, do @Patryk27 . Co właściwie oznacza polecenie case
?
Przeczytaj sobie — na przykład w zamieszczonym przeze mnie linku wyżej — o instrukcji switch
, to będziesz wiedział. tl;dr; wygląda ona tak:
switch (wyrażenie) {
case wartość_1:
// co się dzieje, gdy wyrażenie == wartość_1
break;
case wartość_2:
// co się dzieje, gdy wyrażenie == wartość_2
break;
default:
// co się dzieje, gdy żadne z powyższych
aha, okej. Spróbuję
a no tak... Pomieszało mi się z tym jak się pisze int main()
Poprawiłam teraz to, tyle że zamiast błędu kodu wypisuje mi nie to co trzeba. Bierze pod uwagę ,,całą liczbę'' a nie tak jak miało być ,,cyfrę jedności''
#include <iostream>
using namespace std;
int main()
{
int n;
cin>>n;
switch (n) {
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;
default:
cout<<"inna";
break;
}
return 0;
}
Gdzie masz operację modulo?
Patryk27 napisał(a):
Gdzie masz operację modulo?
nie wiedziałam gdzie go dać. Może po case
?
Przecież już w pierwszym poście podałem konkretny kod
no tak... sorry... Jestem jakaś zagubiona dzisiaj...
Dziękuję bardzo! Uważam, że zadanie jest wykonane poprawnie. Zobaczę we wtorek co na to mój wykładowca/nauczyciel.
To ja dorzucę od siebie swoje dwa grosze - polecam nie używać switch
nigdy :D Moim zdaniem albo lepiej zostawić 10 if
ów i zmienną, a jeśli już chcemy próbować to robić jakoś "lepiej" to wtedy zamienić na mapę lub jakieś inne odpowiednie rozwiązanie.
#include <iostream>
#include <iterator>
using namespace std;
int main()
{
static const char *digits[]={"zero","jeden","dwa","trzy","cztery","pięć","sześć","siedem","osiem","dziewięć"};
cout<<"Podaj liczbę: ";
istream_iterator<unsigned> uin(cin);
unsigned value=(*uin)%10;
cout<<(value<=5?digits[value]:"inna")<<endl;
return 0;
}