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
Zdravím,
nedávno jsem začali probírat programovací jazyk Pascal a moc jsem se s ním zatím nezkamarádil.
Rád bych uvítal nějaké rady k základní syntaxi a také bych potřeboval pomoci s pár úlohama, které bych chtěl zkusit.
Nechci po vás, aby jste mi vše udělaly, ale aby jste mi pomohli a poradili, abych mohl zkoušet něco sám.
Díky
1)Vytvořte program v Pascalu, který provede vybranou početní operaci:
- uživatel zadá dvě čísla
- uživatel zadá pomocí písmene početní operaci
- program vypíše výsledky vybrané početní operace
2)
Vytvořte program v pascalu, který provede aritmetický průměr ze zadávaných čísel.
- uživatel zadá libovolný počet čísel
- zadávání ukončí zadáním čísla 0
- program vypočítá aritmetický průměr zadaných čísel
3)Vytvořte program v pascalu, který spočítá N faktoriál ze zadaného čísla.
- uživatel zadá číslo
- program vypíše faktoriál zadaného čísla
4)Vytvořte program v Pascalu, který spočítá mocninu čísla x na n-tou.
- uživatel zadá číslo x
- uživatel zadá mocninu n
- program vypíše výsledek výpočtu xn
Offline
1)
Ty dvě čísla si uložíš do proměnných a pomocí switch (třeba) budeš testovat co za operaci se má provést.
Např. máš 1 a 2 a +,
tedy x=1, y=2
a ve switchi budeš mít větev +, která bude vracet vysledek=x+y
2)
Ve for cyklu budeš načítat čísla a rovnou je sčítat, zároveň si budeš ukládat počet čísel (k nějaké proměnné se bude při každém průchodu cyklem přičítat jednička), když uživatel zadá nulu, tak se cyklus ukončí a součet čísel se vydělí počtem (když není započítána 0,jinak počet-1).
3)
tady je faktorial v c-čku, tak se inspiruj je to podobné
4)
buťto budeš n-krát násobit to číslo samo sebou (a^3 = a*a*a) (zase v nějakém cyklu) nebo použiješ knihovní funkci (jestli existuje, něco jako pow nebo podobně)
Kód ti žádný psát nebudu poněvadž v pascalu nedělám, tak třeba někdo jiný.
Offline
1.)
Vytvoríš si tri premenné, napríklad x a y a budú typu integer, a premennú volba typu char.
Pomocou príkazu pre vstup (z klávesnice) readln resp. read získaš hodnoty premenných x a y.
Za pomoci príkazu CASE ... OF zistíš akú operáciu si užívateľ vybral, a vykoná sa konkrétna operácia...
Napríklad:
CASE volba OF 'A', 'a' : writeln(x, ' + ', y, ' = ', x + y); 'B', 'b' : writeln(x, ' - ', y, ' = ', x - y); .... .... END;
2.)
Vytvoríš si premenné x, sucet a pocet... !!! nezabudni inicializovať sucet a pocet na 0 !!! ...
Pomocou cyklu while stanovíš podmienku, a pri telo cyklu bude obsahovať vstup pre hodnotu x, zvýšenie premennej sucet o x, a zvýšenie premennej počet o 1...
Priemer vypočítaš a vypíšeš...
Príklad:
sucet:= 0; pocet:= 0; while(x <> 0) do begin readln(x); sucet:= sucet + x; pocet:= pocet + 1; end; write('Priemer je ', sucet div pocet);
3.)
4.) O niečom ako pow (teda power) v pascale neviem, ale to by sme si moc uľachčili :)))
Zase použiješ cyklus...
Offline
Při druhé mocnině se dá v Pascalu využít funkce SQR, která vrací umocněné číslo. Pokud napíšeš: a:= sqr(5);, tak v proměnné a budeš mít hodnotu 25. Při vyších mocninách se dá použít ten FOR cyklus, jak píše gladiator01.
Offline
Nebo to mocnění můžeš udělat takto:
We want z = x^y
Take natural logs of both sides to get
ln z = y * ln x
Now if we use Exp on both sides we get the desired result z because
z = Exp(Ln z) = Exp(y* Ln x)
So the pascal function to get x^y is this:
function PowerFn (number, exponent: float): float;
begin
PowerFn := Exp(Exponent*Ln(Number));
end;
where Exponent = y and Number = x
Offline
↑ hradecek:
K př.2:
Z čeho budeš to x číst, když ho nikde nezadáváš?
Tedy já bych použil funkci repeat asi takto:
sucet:= 0;
pocet:= 0;
repeat
WriteLn('Zadej číslo: ');
Readln(x);
sucet:= sucet + x;
pocet:= pocet + 1;
until x=0;
WriteLn('Priemer je ', sucet/(pocet-1));
Offline
↑ Honzc:
Neprogramuji v pascalu, ale neslouží pro načtení do proměnné to Readln(x); to tam hradecek má.
A když už rýpeš, tak to WriteLn('Zadej číslo: '); nechceš přece opakovat s každým průchodem, tak proč je uvnitř cyklu?
A ohledně to typu cyklu, to je asi jedno, který použiješ.
Offline
↑ Honzc:
Zrejme si prehliadol ale to readln(x) tam je, a urobil si úplne to isté čo ja, ibaže s cyklom s podmienkou na konci...v tomto prípade je jedno kde podmienku testuješ či na konci alebo na začiatku...
Okrem readln tam chýba ešte strašne veľa vecí (deklarácia premenných, začiatok tela, koniec tela hlavnej funkcie...).
Offline
hradecek napsal(a):
↑ Honzc:
A predsa si povedal že nechceš celé programy ;-), okrem readln tam chýba ešte strašne veľa vecí (deklarácia premenných, začiatok tela, koniec tela hlavnej funkcie...), ale myslel som že máš dostatok IQ aby si to pochopil :-P.
Myslím že pláčeš na špatném hrobě autorem dotazu neni Honzc , ale Templarius.
Offline
↑ gladiator01:
Aha to som si nevšimol :)))...díky za pripomienku...
Takže sa ↑ Honzc: ospravedlnujem za menšie podpichnutie :))
Offline
↑ gladiator01:
Píšeš:
"Neprogramuji v pascalu, ale neslouží pro načtení do proměnné to Readln(x); to tam hradecek má.
A když už rýpeš, tak to WriteLn('Zadej číslo: '); nechceš přece opakovat s každým průchodem, tak proč je uvnitř cyklu? "
Tak si to rozebereme:
1.ReadLn opravdu slouží pro čtení hodnoty proměnné. To mu ji ale musíš nejdřív zadat.
2.V zadání stojí, že průměr se má dělat ze zadávaných čísel. Tak tedy opravdu při
každém průchodu se bude jedno číslo zadávat. A zadávání a tím i cyklus se ukončí, až se
ti uráčí zadat 0 (v souladu se zadáním)
Pozn.: Jinak, když WriteLn nebude v cyklu, tak jak ta čísla budeš tedy zadávat?
Cyklus while se dá použít, ale program bude složitější (delší)
Takhle kratký je s repeat
program Prumer;
{$APPTYPE CONSOLE}
uses
SysUtils;
var p: Integer;
s,x: Extended;
begin
s:= 0;
p:= 0;
repeat
WriteLn('Zadej cislo: ');
Readln(x);
s:= s + x;
p:= p + 1;
until x=0;
WriteLn('Prumer je: ', Format('%.2f',[s/(p-1)]));
ReadLn;
end.
Offline
1.ReadLn opravdu slouží pro čtení hodnoty proměnné. To mu ji ale musíš nejdřív zadat.
2.V zadání stojí, že průměr se má dělat ze zadávaných čísel. Tak tedy opravdu při
každém průchodu se bude jedno číslo zadávat. A zadávání a tím i cyklus se ukončí, až se
ti uráčí zadat 0 (v souladu se zadáním)
Pozn.: Jinak, když WriteLn nebude v cyklu, tak jak ta čísla budeš tedy zadávat?
ad Pozn) WriteLn('zadej číslo'); snad vypíše jenom popisek "zadej číslo", ne? Takže tam je jen kvůli estetice a nemá žádný význam.
ad2) edit
A takhle kratký je s while, když si spočítáš řádky tak tam je jen o jeden víc :).
program Prumer; {$APPTYPE CONSOLE} uses SysUtils; var p: Integer; s,x: Extended; begin s:= 0; p:= 0; x:=1; WriteLn('Zadej cisla oddelena entrem, pro konec zadej 0: '); while(x <> 0) do begin Readln(x); s:= s + x; p:= p + 1; end; WriteLn('Prumer je: ', Format('%.2f',[s/(p-1)])); ReadLn; end.
Offline
↑ gladiator01:
1.Já jsem si na rozdíl od tebe ten můj program odzkoušel (i když jsem si vědom, že píšeš v C)
Protože, to co jsi napsal skončí tak, že se vypíše:
Zadej cisla, pro konec zadej 0:
Prumer je: 0.00
a nic tě to nenechá napsat, nebo lépe řečeno nechá, ale pak už nic nespočítá.
Oprava: vložit řádek: x := 1;
2."Já teda napíšu pět čísel a nulu a potom teprve stisknu enter."
Tomu zase nerozumím já, jak je tedy budeš bez Enteru zadávat. Co budeš psát mezi
jednotlivými zadávanými čísly? Při zadávání musíš mezi jednotlivými čísly dávat Enter
(to je psát čísla na samostatný řádek) - alespoň si myslím.
3.Tvůj program s mojí opravou bude mít o jeden řádek víc než ten můj.
Offline
Honzc napsal(a):
↑ gladiator01:
Tomu zase nerozumím já, jak je tedy budeš bez Enteru zadávat. Co budeš psát mezi
jednotlivými zadávanými čísly? Při zadávání musíš mezi jednotlivými čísly dávat Enter
(to je psát čísla na samostatný řádek) - alespoň si myslím.
A to pascal nezná mezery( př. vstupu: 1 2 0 enter)? A všechny proměnné musíš na začátku inicializovat, že to hned skončí?
Offline
↑ gladiator01:
"Náš" (není to můj) skvělý Pascal opravdu neumí číst mezery mezi čísly na jednom řádku.
Pokud to napíšeš s mezerami, tak vezme jenom první číslo.
Samozřejmě, že by se to dalo napsat na jeden řádek a pomocnou funkci z toho vytahat jednotlivá čísla (jako oddělovač by mohla být ta mezera), ale to by bylo složitější a pro začátečníka těžko proveditelné.
Proměnné se všechny na vstupu nemusí inicializovat, ale pak jsou automaticky nastaveny na 0 (pokud jsou to čísla)-to zde ovšem při tvém řešení je právě na závadu.
Offline
Zdravím. Nevím, ale myslím že o tohle tu Templarius tak úplně nestojí. Já to vidím asi takhle:
↑ gladiator01:
Nadávat na Pascal protože ho neznáš není úplně ideální. Náš (čí vlastně?) Pascal funguje tak jak funguje, a mezery tam takhle použít nejde, pokud já vím. Proměnné se v Pascalu inicializují ze slušnosti, jinak mají výchozí hodnoty nula. Mám nejistý pocit, že inicializovat proměnné v Cčku je také víc než vhodné, jak doufám potvrdí nějaký místní znalec.
↑ Honzc:
I když máš pravdu, nepřeháněl bych to se sebejistotou. Repeat například není funkce (jak píšeš v příspěvku #6) a bod 1 v příspěvku #11 mi osobně nedává smysl. V tom původním hradeckove kódu bylo readln použito naprosto stejně jako v tom tvém a správně. Naopak na to, že hradecek používá celočíselné dělení (které se sem nehodí), a že musí snížit hodnotu proměnné počet, aby nezapočítal i tu ukončovací nulu (ačkoli, podle zadání vlastně není jasné jestli se započítávat nemá) nikdo neupozornil. (Edit: abych nekřivdil gladiátorce, teď vidím že tenhle problém zmínila už ve druhém příspěvku).
A hádat se o počet řádků, to doufám nemyslíte vážně.
Offline
↑ LukasM:
Omlouvám se, přehnala jsem to. To to zkouškové :).
Samozřejmě, že je vhodné inicializovat proměnné, ale tady v tom případě se nic nestane v x by bylo prostě nějaké náhodné číslo.
Honzc ze sebe nemá dělat odborníka - když si myslí, že bez popisku (že mam zadat číslo) se mu nic nenačte, tak to s ním bude asi špatné.
↑ Honzc:
Možná bychom tuto diskuzy mohly od tvého #6 přispěvku smazat.
Offline
2. př.: příspěvěk #11 nebo #12
3.př.: příspěvek #5
1. a 4. zkus sám (pro 4. máš inspiraci zde (scanf-načtení proměnné, printf - výpis, do-while je snad jasné,
for nahradis for i:=1 to n do begin factorial=i*factorial; end;)
Offline
Bohužel, když jsem zadal příklad do Pascala, nefunguje to. Někdo tu něco říkal o mezerách, že se nedělají mezerníkem atd. Možná too píši blbě.
Poraďte mi nějak, jak to přepsat do Pascala. Možná mám špatné závorky, nevím.
Byl bych moc rád, kdybyjste mi udělaly první dva příklady. Budu moc vděčný. A kdybyjste to napsali, abych to pochopil. V pascallu jsem obyčejný laik. díky
Offline
↑ Templarius: Zdravím. Taková dobrá zásada: pokud na tebe Pascal něco při překladu křičí, tak to opiš na fórum. Jinak v klasickém TurboPascalu / BorlandPascalu vynech
{$APPTYPE CONSOLE} uses SysUtils;
a to Format('%.2f',[s/(p-1)]) možná taky nepoběží, zkus místo toho jen (s/(p-1)).
Offline
Takže 2.)
PROGRAM aritmeticky_priemer; USES crt; VAR sucet, pocet, x : integer; BEGIN ClrScr; sucet:= 0; pocet:= 0; while(x <> 0) do begin readln(x); sucet:= sucet + x; pocet:= pocet + 1; end; write('Priemer je ', sucet div pocet); readln; END.
USES crt; - je to tam kvôli príkazu ClrScr, ktorý pri každom spustení, vymaže všetko čo sa nachádza na obrazovke -> nezostane tam nič z predošlého spustenia...
Dátový typ záleží na tebe, myslím že pre naše potreby postačí integer.
Na veľkosti písmen v jazyku ako Pascal nezáleží, teda príkaz while môžeš zapísať aj While, wHIle, whIle, whiLE...
Nezáleží ani na medzerách, tabulátoroch, enteroch a pod...prekladaču to môžeš napísať aj do jedného riadku...je dobré si uvedomiť, že zdroják píšeš pre ľuďí a nie pre počítač.
Na čom ale záleži je syntax...teda begin \neq bgin, readln \neq rdln bodkočiarky, čiarky, apostropfy atď...
Offline
1.)
PROGRAM mat_operacie; USES crt; VAR cislo1, cislo2 : integer; volba : char; BEGIN ClrScr; write('Zadaj prve cislo: '); readln(cislo1); ClrScr; write('Zadaj druhe cislo: '); readln(cislo2); ClrScr; writeln('Vyber si operaciu'); writeln('S - sucet'); writeln('R - rozdiel'); ... volba:= readkey; CASE volba OF 'S', 's' : writeln('Sucet: ', cislo1, ' + ', cislo2, ' = ', cislo1 + cislo2); 'R', 'R' : writeln('Rozdiel: ', cislo1, ' - ', cislo2, ' = ', cislo1 - cislo2); ... END; readln; END.
Tam kde som dal tri bodky, si doplň vlastné mat. operácie, a ten výber môžeš urobiť nejaký krajší...
Namiesto toho volba:= readkey; môžeš použiť aj klasicky readln(volba)...ak ale budeš chcieť použiť readkey musíš pripojiť aj crt...Uses crt;
Načo si dávaj POZOR je že delenie pri celočíselných typoch je div a pri reálnych je /
Offline
↑ Templarius:
No myslím, že stlačiť CTRL+C a CTRL+V a F9 zvládne každý :-P
P.S.- Dúfam že tie programy fungujú, neskúšal som ich...
Offline