Pobierz 4 cyfry na raz (np 2012). By oddzielić cyfry od siebie potrzebujesz dwóch działań, reszta z dzielenia (w pascalu mod) i zwykłe dzielenie bez reszty (w liczbie całkowitej /)
np
2012 mod 10
da co wynik 2 (dzielisz przez 10 i to co ci zostanie masz zwrócone), potem dzielisz przez 10 i zostanie ci 201 (bo / w int nie przekaże ci żadnej reszty) i znów dzielisz mod 10 i będziesz miał 1 itd
Działanie ‘modulo’ to działanie na liczbach całkowitych którego wynikiem jest reszta z dzielenia liczby a przez liczbę b. W szkole podstawowej gdy uczniowie jeszcze nie znają ułamków nazywa się to dzieleniem z resztą np. 5:2=2 reszta 1 sprawdzenie 2*2+1=5 10:4=2 reszta 2 sprawdzenie 2*4+2=10 8:4=2 reszta 0 itd.
W działaniu ‘modulo’ wynikiem są tylko te reszty powstałe w wyniku dzielenia dwóch liczb.
1234/10=123 reszta 4 czyli ostatnią cyfrą jest liczba 4 albo inaczej:
1234 mod 10 =4 czyli mamy osta4nią cyfrę naszej liczby. Następnie zmniejszamy naszą liczbę 10 czyli 1234/10 =123 (część ułamkowa się nie liczy i powtarzamy naszą czynność dzielenia ‘modulo’ w tym przypadku będzie to liczba 123, a 123 mod 10=3 czyli mamy kolejną cyfrę naszej liczby i tak dalej czyli cztery razy bo tyle cyfr ma nasza liczba. Najlepiej wykonać to w pętli for w której jednocześnie obliczana jest suma wyznaczonych cyfr.
W programie będzie to wyglądało mniej więcej tak:
readln (liczba);
for i:=1 to 4 do
begin
suma=suma+(liczba mod 10);
liczba=liczba/10;
end;
albo bez pętli liczymy po kolei:
a=liczba mod 10
liczba=liczba/10
b=liczba mod 10
liczba=liczba/10
c= liczba mod 10
liczba=liczba/10
d=liczba mod 10
suma=a+b+c+d
Uff, ale się rozpisałem, chyba wystarczy bo bym książkę napisał.
kilka tablic, od 1-19, potem dziesiątki, setki i tysiące Robisz analogicznie do 1 zadania (z tym że w drugą stronę z cyframi) (liczba/100) mod 1000 itd
Dziękuję za podpowiedzi, za kilka dni dam efekt pracy 2 zadania a tymczasem 1 zadanko wygląda tak.
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
VAR
L:INTEGER;
C1,C2,C3,C4:INTEGER;
S:INTEGER;
begin
writeln('Wprowadz lidzbe 4 cyfrowa');
readln(L); {1234}
IF L > 9999 THEN
writeln('niewprowadzono liczby 4 cyfrowej');
readln;
IF L > 9999 THEN halt;
C1:=L MOD 10; {1234 mod 10 = 4}
L:=L div 10; {1234=1234 / 10 = 123}
writeln(C1);
C2:=L MOD 10; {3}
L:=L div 10; {12}
writeln(C2);
C3:=L MOD 10; {2}
L:=L div 10; {1}
writeln(C3);
C4:=L MOD 10; {1}
L:=L div 10; {0}
writeln(C4);
S:=C1+C2+C3+C4;
writeln('otrzymujesz pawle liczbe taka oto: ',S);
IF S MOD 2 = 0 THEN
writeln('suma jest parzysta');
IF S MOD 2 <> 0 THEN
writeln('suma jest nieparzysta');
IF S MOD 5 = 0 THEN
writeln('suma jest podzielna przez 5');
IF S MOD 5 <> 0 THEN
writeln('suma nie jest podzielna przez 5');
IF S MOD 3 = 0 THEN
writeln('suma jest podzielna przez 3');
IF S MOD 3 <> 0 THEN
writeln('suma nie jest podzielna przez 3');
readln;
end.
Chciałem jeszcze się pobawić trochę tym i zrobić coś takiego, że np wpisując słowo program wyświetla komunikat by podać cyfry. Problem w tym, że wpisując jakąś literkę, program wyświetla błąd, bo jak wiadomo na zmiennej L mam Integer. Da się coś takiego zrobić?
Generalnie, zasada będzie taka, by wczytać to jako napis (ciąg znaków), a następnie sprawdzić czy spełnia on wymogi liczby (składa się wyłącznie z cyfr, przy czym jeśli długość jest większa niż 1, to pierwsza cyfra nie może być zero). Można to zrobić wyrażeniem regularnym albo zwyczajną pętlą.
PS
IF S MOD 2 = 0 THEN
writeln('suma jest parzysta');
IF S MOD 2 <> 0 THEN
writeln('suma jest nieparzysta');
Nie pisz tak, tylko używaj else. Prosty przypadek, ale:
Wykonujesz niepotrzebne działania
Możesz się kiedyś naciąć, nie pokrywając wszystkich stanów (albo pokrywając je dwa razy), w jakich może znaleźć się wynik.
Mimo, że żądamy wprowadzenia liczby, to deklarujemy ją jako tekst, a następnie funkcją val zamieniamy ją na liczbę. Jeżeli w zmiennej tekstowej będą inne znaki niż cyfry to funkcja val zwróci nam liczbę zero.
Widzę, że pętle też jakoś ci nie siedzą, a warto się nauczyć ich stosowania. W tym przypadku tylko czery razy pisałeś identyczne działania i tylko zmieniały się wartości cyfr i liczb, ale wyobraź sobie, że takich zapisów musiał byś zrealizować 1000, a może i 10000, to dopiero było by pisania.
Tak może wyglądać ten programik po poprawkach. Poszczególne cyfry są teraz w zmiennych cyfra[1],cyfra[2], cyfra[3], cyfra[4].
program Project1;
uses crt,SysUtils;
VAR
liczba, suma, i,j,k,code:INTEGER;
tekst:string;
var
cyfra: array[1..4] of INTEGER;
var
cyfraTekst: array[1..4] of string;
begin
clrscr;
writeln('Wprowadz liczbe 4 cyfrowa');
readln(tekst);
val(tekst,liczba,code);
IF (liczba > 9999) or (liczba<1000) THEN
begin
writeln('nie wprowadzono liczby 4 cyfrowej');
readln;
halt;
end;
for i:=1 to 4 do
begin
cyfra[i]:=(liczba mod 10);
suma:=suma+cyfra[i];
liczba:=liczba div 10;
case cyfra[i] of
0: cyfraTekst[i]:='zero';
1: cyfraTekst[i]:='jeden';
2: cyfraTekst[i]:='dwa';
3: cyfraTekst[i]:='trzy';
4: cyfraTekst[i]:='cztery';
5: cyfraTekst[i]:='piec';
6: cyfraTekst[i]:='szesc';
7: cyfraTekst[i]:='siedem';
8: cyfraTekst[i]:='osiem';
9: cyfraTekst[i]:='dziewiec';
end;
writeln(cyfra[i],' - ',cyfraTekst[i]);
end;
writeln('otrzymales Pawle taka sume cyfr: ',suma);
IF (suma MOD 2 = 0) THEN writeln('suma jest parzysta') else writeln('suma jest nieparzysta');
IF (suma MOD 5 = 0) THEN writeln('suma jest podzielna przez 5') else writeln('suma nie jest podzielna przez 5');
IF suma MOD 3 = 0 THEN writeln('suma jest podzielna przez 3') else writeln('suma nie jest podzielna przez 3');
writeln('kliknij Enter');
readln;
writeln('liczby dla kt˘rych suma szescianow ich cyfr jest rowna tym liczbom');
for i:=1 to 9 do
begin
for j:=0 to 9 do
begin
for k:=0 to 9 do
begin
suma:=i*i*i+j*j*j+k*k*k;
liczba:=100*i+10*j+k;
if (suma =liczba) then writeln(liczba)
end;
end;
end;
writeln('koniec');
readln();
end.