Pomoc w napisaniu 3 programów (pascal)


(Boshi) #1

Witajcie!

Chciałbym prosić o pomoc w wyjaśnieniu jak napisać 3 małe programiki. Zaczynam w pascalu ale nie potrafię tego rozwiązać.

1 Wprowadź liczbę 4 cyfrową całkowitą, wyznacz sumę cyfr , sprawdź czy suma jest parzysta, oraz podzielna przez 3 i 5.

2 wprowadź liczbę 4 cyfrową całkowitą oraz wyświetl w postaci słownej poszczególne cyfry

3 wprowadź wszystkie liczny 4 cyfrowe dla których suma 3 potęg cyfr jest równa tej liczbie. ( np 153= 1^3 + 5^3+ 3^3= 153)

Domyślam się, że są to banały, ale...


#2

Napisz przynajmniej ile już zrobiłeś i na czym stanąłeś, bo jeżeli liczysz na to, że ktoś zrobi całość za Ciebie - to pomyliłeś fora.


(Boshi) #3

Nie chodzi o zrobienie tego, bo nie w tym rzecz. Zaczynam od 0 w pascalu i w ogóle programowaniu i nie mam pojęcie od czego zacząć..

w 1 to co doszedłem to :

program Project1;


{$APPTYPE CONSOLE}


uses

  SysUtils;

  var a,b,c,d:integer;


begin

writeln ('Wpisz liczbe calkowita 4 cyfrowa');

readln (a,b,c,d);


writeln('suma poszczegolnych cyfr to:' , a + b + c + d);


readln;

end.

ale tu jest problem, że trzeba wpisywac 4x liczbe i dopiero mamy sume, a powinien po podaniu 1 liczby 4 cyfrowej sumowac jej poszczególne cyfry.


(Drobok) #4

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 :))


(Boshi) #5

Eh, sorry, ale troche nie kumam tego.

mod- reszta

div- dzielenie

pobieramy liczbe 4 cyfrową, następnie dzielimy ją przez co ?

np liczba 1234 ?


(floyd) #6

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ł. :frowning:


(Boshi) #7

Dzięki wielkie obu dwu panom :slight_smile: Rozkminiłem już to. A co w z drugim zadaniem? jakieś wskazówki? Użycie tablicy? czy jakaś pętla da radę?


(Drobok) #8

kilka tablic, od 1-19, potem dziesiątki, setki i tysiące :slight_smile: Robisz analogicznie do 1 zadania (z tym że w drugą stronę z cyframi) (liczba/100) mod 1000 itd :))

Zrób przedziałami bo tak najprościej


(floyd) #9

Możesz użyć instrukcji wyboru. Wszystkich cyfr jest dziesięć i jeżeli oznaczymy cyfrę przez x to:

to przy pomocy funkcji warunkowej case możemy znaleźć jej nazwę:

case x of

0: cyfra:="zero";

1: cyfra:="jeden"

2:

3:

4:

5:

6:

7:

8:

9:cyfra:="dziewięć";

end;

Dla liczby czterocyfrowej trzeba tą czynność powtórzyć cztery razy albo użyć pętli od 1 do 4.


(Boshi) #10

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ć?


(kostek135) #11

@Boshi

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:

  1. Wykonujesz niepotrzebne działania

  2. Możesz się kiedyś naciąć, nie pokrywając wszystkich stanów (albo pokrywając je dwa razy), w jakich może znaleźć się wynik.


(floyd) #12

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. :frowning:

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.

(Boshi) #13

Floyd dopiero zaczynam więc jak dopadnę pętle to pewnie będę z nich korzystał zamiast z zwykłego zapisu. Dzięki jeszcze raz za pomoc i poprawki :wink: