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
Dobrý den, potřebuji pomoct s těmito úlohami.Zejména se čtvrtým úkolem.
1) Vypište záporné číslo a zjistěte zda je liché nebo sudé.
2) Vygeneruj dvě náhodná čísla a vypiš je vzestupně.
3) Vytvořte program pro výpočet průměru z pěti náhodných čísel.
4) Ze tří náhodně vygenerovaných čísel vypiš vždy nejmenší.
Offline
1.)
PROGRAM cislo1;
USES crt;
VAR cislo : integer;
BEGIN
ClrScr;
write('Napis zaporne cislo: ');
readln(cislo);
{--- v pripade ak uzivatel nezadal
zaporne cislo sa program za 2 sekundy ukonci ---}
if(cislo >= 0) then
begin
write('Nezadal si zaporne cislo !!!');
delay(2000);
exit;
end;
write('Zadal si ');
if((cislo mod 2) = 0) then write('parne')
else write('neparne');
write(' cislo.');
readkey;
END.2.)
{ Nahodne cisla budu od 0÷100 }
PROGRAM cislo2;
USES crt;
CONST N = 100+1;
VAR cis1, cis2 : integer;
BEGIN
ClrScr;
Randomize;
cis1:= random(N);
cis2:= random(N);
if(cis1 < cis2) then
write(cis1, ' ', cis2)
else if(cis2 < cis1) then
write(cis2, ' ', cis1)
else
write(cis1, ' ', cis2); { v pripade ze sa rovnaju }
readkey;
END.3.)
{ Nahodne cisla budu od 0÷100 }
PROGRAM cislo3;
USES crt;
CONST N = 5;
VAR pole : array[1..N] of integer;
sucet : integer;
i : byte;
BEGIN
ClrScr;
Randomize;
sucet:= 0; { v premennej sucet mam zatial 0 }
write('Tvoje cisla su: ');
for i:= 1 to N do
begin
pole[i]:= random(100+1);
write(pole[i], ' ');
sucet:= sucet + pole[i]; { pripocitanie noveho prvku do sucet }
end;
writeln;
write('Priemer: ', (sucet/N):0:0); { bez 0:0 dostanes cislo v EXP tvare pr: xx.00000+E001 }
readkey;
END.4.)
PROGRAM cislo4;
USES crt;
CONST N = 3;
VAR pole : array[1..N] of integer;
min : integer;
i : byte;
BEGIN
ClrScr;
Randomize;
write('Tvoje cisla su: ');
for i:= 1 to N do
begin
pole[i]:= random(100+1);
write(pole[i], ' ');
end;
min:= 32767; { inicializacia minima na najvacsiu moznu hodnotu int }
for i:= 1 to N do
begin
if(pole[i] < min) then min:= pole[i];
end;
writeln;
write('Najmensie cislo: ', min);
readkey;
END.P.S - Ak niečomu nerozumieš kľudne sa pýtaj. Ale myslím, že si potreboval iba trochu nakopnúť :-P.
Offline
↑ hradecek: Raději bych takto jednoduché úkoly neřešil přes pole, protože to pak svádí k tomu to pole používat všude. Tady je to jedno, ale až budeme načítat 1000000 čísel a budeme chtít jen min/max nebo něco obdobně jednoduchého, tak je zbytečné plýtvat pamětí na takto rozsáhlé pole.
Offline
↑ Toni:
Samozrejeme že riešiť sa to dá rôznymi spôsobmi.
Napríklad 2.)
if(cis1 <> cis2) then if(cis1 < cis2) then write(cis1, ' ', cis2) else write(cis2, ' ', cis1) else write(cis1, ' ', cis2);
Neviem čo je pre teba lepšie, ale výsledok je ten istý.
↑ septolet:
No teda neviem ako si to myslel ty, ale ja si myslím že použitím poľa sme ušetrili pár riadkov zdrojového kódu naviac, zdroják sa zjednodušil, je ľahší na pochopenie a neobsahuje žiadne zdĺhavé cykly alebo podmienky.
Ale ak máš nejaké iné riešenie či nápad ja sa veľmi rád priučím ;-).
Offline
Nejde ani tak o délku kódu jako o jeho efektivnost, navíc kód který mám namysli je cca stejně rozsáhlý jako ten tvůj s využitím pole, navíc žádné zdlouhavé podmínky ani cykly v něm nevyužívám.
Představ si, že bys chtěl z nějaké velké vstupní množiny čísel vybrat nejmenší číslo (nebo třeba největší, druhé nejmenší, etc.). Řekněme, že máme na vstupu 10000000 celých čísel. Nadeklarovat si takto velké pole je zbytečné a to nemluvím o tom, že ty nejprve do pole načteš všechna čísla a poté pole znova celé procházíš abys našel nejmenší číslo, to je opět zbytečné, když už, tak hledej nejmenší číslo rovnou při načítání, ušetříš tím jeden průchod tím polem. Řešit to tedy lze i takto (omlouvám se, že kód uvádím v jazyce C, PASCAL syntaxi příliš neznám):
#include <stdio.h>
#include <stdlib.h>
#define POCET_CISEL 10000000
int main()
{
int nejmensi_cislo = 0, nactene_cislo;
for(int i = 0; i < POCET_CISEL; i++)
{
nactene_cislo = rand() % 10 + 1;
if(i == 0) nejmensi_cislo = nactene_cislo;
else
{
if(nactene_cislo < nejmensi_cislo) nejmensi_cislo = nactene_cislo;
}
//printf("Nactene cislo je: %d\n", nactene_cislo);
}
printf("\nNejmensi cislo je: %d\n", nejmensi_cislo);
return 0;
}Offline
s polem jsme zatím nedělali, takže srozumitelně vypadá zdrojový kód od Hradecka, lae bez toho, aby se program ukončil po 2 sekundách. Příkklad číslo 3 a 4 s polem je tudíž pro mě nesrozumitelný, potřebuji to napsat bez pole. A příklad č.2-co je to to CONSt? Předpokládám konstanta, ale to jsme taky nebrali
Offline
↑ septolet:
Tvoj zdroják je fajn. Riešiť to takto by ma nenapadlo. Ja nie som tiež v Pascale odborník a tiež mám radšej C.
Ale predsa len malá pripomienka k tvojmu programu. Tvoj program bude generovať náhodné čísla od 1-10 ale najmenšie číslo bude vždy 1. Ak dáš interval od 3-20 najmenšie číslo bude 3.
A ak by úlohou programu bolo zistiť minimum náhodných čísel z intervalu, ktorý zadal užívateľ program by bol bezcenný.
Teda aspoň si myslím.
Offline
↑ hradecek: jak to teda udělám bez pole?Stačí, abych zadal místo pole nějakou proměnnou ne?
Offline
↑ Toni: Úlohu číslo 2 ti už hradecek napsal i bez použití pole. Úlohu číslo 4 tu už také máš i bez pole. Třetí a první úloha je velmi obdobná té 4., akorát prostě počítáš průměr a v případě 1 zjišťuješ, zda-li je číslo záporné/kladné a liché/sudé. Jak se počítá průměr nebo jak se pozná liché/sudé/kladné/záporné číslo jste se ve škole už určitě učili. Co tedy není jasné?
Offline
↑ septolet:Dobře, takže:
{ Nahodne cisla budu od 0÷100 }
PROGRAM cislo3;
USES crt;
CONST N = 5;
VAR s : integer
sucet : integer;
i : byte;
BEGIN
ClrScr;
Randomize;
sucet:= 0; { v premennej sucet mam zatial 0 }
write('Tvoje cisla su: ');
for i:= 1 to N do
begin
s:= random(100+1);
write(s, ' ');
sucet:= sucet + s; { pripocitanie noveho prvku do sucet }
end;
writeln;
write('Priemer: ', (sucet/N):0:0); { bez 0:0 dostanes cislo v EXP tvare pr: xx.00000+E001 }
readln
END.¨
uloha 4
BEGIN
ClrScr;
var i : integer;
p : integer;
write('Tvoje cisla su: ');
for i:= 1 to N do
begin
p:= random(100+1);
write(p, ' ');
end;
min:= 32767; { inicializacia minima na najvacsiu moznu hodnotu int }
for i:= 1 to N do
begin
if(p < min) then min:= p;
end;
writeln;
write('Najmensie cislo: ', min);
readln
END.
Použil jsem sice zdrojáky, co tu byly, ale upravil sem to bez pole. otázka je, jestli to povalí...
Offline
↑ Toni: Průměr vypadá dobře. Ke 4 mám výhrady.
for i:= 1 to N do
begin
p:= random(100+1);
write(p, ' ');
end;
min:= 32767; { inicializacia minima na najvacsiu moznu hodnotu int }
for i:= 1 to N do
begin
if(p < min) then min:= p;
end;Čísla, která v prvním cyklu načítáš si nikde nepamatuješ (nikam si je neukládáš), tz. například v druhém průchodu toho prvního cyklu už nemáš možnost zjistit, jaké bylo první vygenerované číslo. Z toho plyne to, že nejmenší číslo musíš hledat už v tom prvním cyklu.
Zkus to tedy ještě přepsat, je to už jen malá změna.
Offline
↑ septolet:
uloha 4
BEGIN
ClrScr;
var i : integer;
p : integer;
write('Tvoje cisla su: ');
for i:= 1 to N do
begin
p:= random(100+1);
write(p, ' ');
if(p < min) then min:= p;(*podmínku jsem narval sem, protože si to jinak nepamatuje proměnnou*)
end;
min:= 32767; { inicializacia minima na najvacsiu moznu hodnotu int }
for i:= 1 to N do
begin
end;
writeln;
write('Najmensie cislo: ', min);
readln
END.
Offline
↑ Toni: Zkoušel jsi to spustit? V prvním cyklu používáš proměnnou min, ale nemáš jí před tím nadeklarovanou! Také inicializaci té proměnné min na 32767 bys měl mít před prvním cyklem. Jinak by bylo možné, že bys nenašel minimum. No a ten druhý cyklus umaž, je tam už k ničemu.
Offline
↑ septolet:
uloha 4
BEGIN
ClrScr;
var i : integer;
p : integer;
min:integer
write('Tvoje cisla su: ');
min:= 32767;
for i:= 1 to N do
begin
p:= random(100+1);
write(p, ' ');
if(p < min) then min:= p;(*podmínku jsem narval sem, protože si to jinak nepamatuje proměnnou*)
end;
writeln;
write('Najmensie cislo: ', min);
readln
END.
a je to!
Offline
↑ Toni:
Po prvé deklaračná časť musí byť pred začiatkom tela programu BEGIN.
Po druhé N je neznámy identifikátor. Koľko krát prebehne cyklus ?
Po tretie, príkaz ClrScr sa nachádza v knižnici crt.
Po štvrté premennú p si nepamatalo preto lebo si ju umiestnil pred jej inicializaciu. Teraz je to O.K.
Po piate ak chceš používať random() musíš niekde pred prvým použitím uviesť RANDOMIZE, inak ti bude generovať to isté číslo.
Po šieste niekde ti chýbajú dôležité bodkočiarky.
Ale inak celkom fajn :).
Bez použití polí by to mohlo vyzerať asi takto:
PROGRAM cislo4;
USES crt;
CONST N = 3;
VAR cislo, min : integer;
i : byte;
BEGIN
ClrScr;
Randomize;
min:= 32767;
write('Tvoje cisla su: ');
for i:= 1 to N do
begin
cislo:= random(100+1);
write(cislo, ' ');
if(cislo < min) then min:= cislo;
end;
writeln;
write('Najmensie cislo: ', min);
readln;
END.Offline