Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
↑↑ Tom959:
Máš docela guláš v tom, co chceš dělat...
V tebou zadané úloze nic nenačítáš (nebude tam writeln+readln), ale bude tam tvůj FOR cyklus. V něm bude "rozložení" čísla na cifry a u každé cifry uděláš třetí mocninu.
Nevěš hlavu, jsi na dobré cestě!
Offline
↑↑ Tom959:
Zapomeň na chvíli na hlavní úkol a zkus udělat po jednom příklady, které jsou ↑↑ tady: (jedná se o dílčí úkoly, které budou v tvém FOR cyklu.) Zatím je nemotej dohromady, udělej každou zvlášť...
Offline
↑↑ Tom959:
Na konkrétním případu n=159 to vypadá takto:
n=159;
součet=0;
n není nula - budeme procházet cyklus
a=159 mod 10 = 9
součet=součet+a=0+9
n=n div 10=159 div 10 = 15
n není nula - znova jdeme do cyklu
a=15 mod 10 = 5
součet=součet+a=9+5
n=n div 10=15 div 10 = 1
n není nula - znova jdeme do cyklu
a=1 mod 10 = 1
součet=součet+a=14+1
n=n div 10=1 div 10 = 0
n je nula, cyklus skončil, součet=15
=> ciferný součet čísla 159 je 15
Offline
↑ Tom959:Funguje, jedná se o příspěvek v tomto vláknu.
TomDlask napsal(a):
↑↑ Tom959: Dokážeš tudíž napsat program, co ti bude po jedné cifře vypisovat číslo... Teď následuje souhrn otázek:
Dokážeš napsat program, který vypočítá ciferný součet?
Dokážeš napsat program, který vypočítá součet třetích mocnin cifer?
Offline
↑ janca361:řekl bych to takhle. Nedokážu nic z toho, aji když tu mám vzorový příklad.
Offline
↑ Tom959:
Napsal jsem pseudokód
TomDlask napsal(a):
1) Máme číslo v proměnné n a v proměnné součet je 0
2) Dokud bude n rozdílné od nuly, tak budeme dělat:
2a) a=n mod 10;
2b) součet=součet+a;
2b) n=n div 10;
3) Po ukončení cyklu máme v proměnné součet ciferný součet čísla n.
Čemu (kterému kroku) v tomto algoritmu nerozumíš?
Offline
↑ TomDlask:Už se přestávám soustředit a momentálně nerozumím vůbec ničemu. Takže vám děkuju moc za rady. A jen jsem se utvrdil, že jsem naprosté pako. Pokud seberu sílu odpoledne mě tu bude zase mít.
Tak přeju dobrou noc.
Offline
↑ Tom959:
Není to tak strašné! Začátky bývají těžké. To co napsal↑ TomDlask zde: bych udělala trochu jinak (nic proti). Dopíšu jeden program a vrhnu se na to...
Offline
Na konkrétním případu n=159 to vypadá takto:
n:=159;
součet:=0;
a-proměnná do niž se uloží cifra
Teď se v cyklu bude "rozebírat" číslo na cifry dokud nebude n=0
První průchod cyklem
a:=n mod 10 (a=159 mod 10, a=9)
součet:=součet+a (součet=0+9, součet=9)
n:=n div 10 (n:=159 div 10, n=15)
Druhý průchod cyklem
a:=n mod 10 (a=15 mod 10, a=5)
součet:=součet+a (součet=9+5, součet=14)
n:=n div 10 (n=15 div 10, n=1)
Třetí průchod cyklem
a:=n mod 10 (a=1 mod 10, a=1)
součet:=součet+a (součet=14+1, součet=15)
n:=n div 10 (n=1 div 10, n=0)
n=0 => cyklus se ukončí
součet:=15 => ciferný součet čísla 159 je 15
A teď v Pascalu
program ciferny_soucet; var a,n, soucet:integer; begin writeln('Zadej n'); readln(n); soucet:=0; repeat a:=n mod 10; soucet:=soucet+a; n:=n div 10; until n=0; writeln('Ciferny soucet cisla ',n,' je ',soucet); end.
Offline
↑ janca361: Dovolím si tě poopravit. Na konci mezi writeln a end. musí být readln; :)
Offline
↑ Tom959:
Teoreticky nemusí, jenom si to nestihneš přečíst, když se program nepozastaví. :)
Offline
↑ Tom959:
Nemusí. Potřebuju načítat nějakou hodnotu? Nepotřebuju. Takže nepotřebuju ani readln.
Dvojce writeln-readln se používá v případě, že máš něco zadat z klávesnice (např. číslo), kde za writeln napíšeš, co se má zadat (nemusí se to psát, ale pak nebudeš vědět co máš zadat) a pak to pomocí readln přečteš a zapíšeš do proměnné.
Offline
↑↑ Tom959:
Jenom tak mezi námi, to co se po tobě požaduje je speciální případ tzv. Armstrongových čísel.
Zkus se podívat na tohle
Offline
program armstrong;
var a,b,c,x:integer;
begin
writeln('Zadej cislo');
for x := 1 to N;
a := x;
b := 0;
while (a > 0)
c := a mod 10;
b := b + (c * c * c);
a := a \ 10;
end while
If (x = b) then
writeln('')
end if
readln;
end.
Prosím o opravení, zítra to musím odevzdat.
Offline
↑ Tom959:
1) Vypíše to sice Zadej cislo, ale nic se nezadává.
2) Chce to tam ještě dopsat (asi jako konstantu) hodnotu N.
3) writeln('') nic nevypíše - pravděpodobně tam mělo být writeln(x)
Zkus si ten program spustit a určitě to dokážeš upravit :)
Offline
↑ Tom959:
Pokud se jedná o tvůj zadaný příklad v prvním postu...
writeln('Zadej cislo'); - zbytečné, vynechej
Máš vyhledat všechny čísla do 410 => N bude 410
a := a \ 10; - nelze, protože dělení není u typu integer definováno (definováno je použe div a mod), "\" nahraď div
If (x = b) then writeln('') - co chceš vypsat? "b" - writeln(b)
Offline
↑ TomDlask:
Dala jsem tam zadání (v hide) mám ho prozatím smazat? Nebo se dá nějak "zamčít", aby bylo nepřístupné?
Offline
↑ janca361: Proč? Já bych to tam nechal, ale je to tvoje (vaše)...
Ten kód, co jsi (jste) sem dala jsem vyzkoušel a je tam třeba malá úprava - na 5. řádku napsat do begin, resp. takto mi to vnutil můj Turbo Pascal.
Offline
↑ TomDlask:
Všichni se tu snažili o to, aby program dokázal napsat sám, tak bych nechtěla tuhle snahu zkazit.
A máš pravdu - do tam chybí. Opraveno :)
PS: Doufám, že nevadí, že ti tykám ;)
Offline
↑ janca361: Spíš je hlavní, aby tazatel porozuměl řešení, kdyby se nad tím nemusel zamyslet a dostal by kód v prvním příspěvku, tak to moc nesplní účel... Tady se o řešení pokusil, načež tu bylo uděleno několik rad, jak jeho program upravit tak, aby fungoval.
(Též ti tedy budu tykat)
Offline