Matematické Fórum

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

#1 16. 03. 2010 16:47 — Editoval Toni (16. 03. 2010 16:48)

Toni
Příspěvky: 130
Reputace:   
 

pascal-ran

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

  • (téma jako vyřešené označil(a) byk7)

#2 16. 03. 2010 22:09 — Editoval hradecek (17. 03. 2010 13:15)

hradecek
Příspěvky: 772
Pozice: Student
Reputace:   25 
Web
 

Re: pascal-ran

1.)

Code:

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

Code:

{ 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.)

Code:

{ 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.)

Code:

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.


Netrápte sa nad svojimi problémami s matematikou, môžem vás uistiť, že tie moje sú ešte väčšie. ~~Albert Einstein~~
Jak spozná člověk, že není pitomec ? - Moudrý člověk to nepozná nikdy a blbci je to jedno. ~~Jak přicházejí básnici o iluze~~
Někteří lidi se nikdy nezmění. Anebo se rychle změní a pak se zase rychle změní nazpátek. ~~Homer Simpson~~

Offline

 

#3 16. 03. 2010 23:12

septolet
Příspěvky: 334
Reputace:   
 

Re: pascal-ran

↑ 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

 

#4 17. 03. 2010 13:27 — Editoval hradecek (17. 03. 2010 13:37)

hradecek
Příspěvky: 772
Pozice: Student
Reputace:   25 
Web
 

Re: pascal-ran

↑ Toni:
Samozrejeme že riešiť sa to dá rôznymi spôsobmi.
Napríklad 2.)

Code:

 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 ;-).


Netrápte sa nad svojimi problémami s matematikou, môžem vás uistiť, že tie moje sú ešte väčšie. ~~Albert Einstein~~
Jak spozná člověk, že není pitomec ? - Moudrý člověk to nepozná nikdy a blbci je to jedno. ~~Jak přicházejí básnici o iluze~~
Někteří lidi se nikdy nezmění. Anebo se rychle změní a pak se zase rychle změní nazpátek. ~~Homer Simpson~~

Offline

 

#5 17. 03. 2010 18:22

septolet
Příspěvky: 334
Reputace:   
 

Re: pascal-ran

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

Code:

#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

 

#6 17. 03. 2010 18:59

Toni
Příspěvky: 130
Reputace:   
 

Re: pascal-ran

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

 

#7 17. 03. 2010 19:09

hradecek
Příspěvky: 772
Pozice: Student
Reputace:   25 
Web
 

Re: pascal-ran

↑ 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.


Netrápte sa nad svojimi problémami s matematikou, môžem vás uistiť, že tie moje sú ešte väčšie. ~~Albert Einstein~~
Jak spozná člověk, že není pitomec ? - Moudrý člověk to nepozná nikdy a blbci je to jedno. ~~Jak přicházejí básnici o iluze~~
Někteří lidi se nikdy nezmění. Anebo se rychle změní a pak se zase rychle změní nazpátek. ~~Homer Simpson~~

Offline

 

#8 17. 03. 2010 20:27 — Editoval septolet (17. 03. 2010 20:34)

septolet
Příspěvky: 334
Reputace:   
 

Re: pascal-ran

↑ hradecek: To není pravda, že nejmenší číslo bude vždy 1.

Offline

 

#9 17. 03. 2010 20:44

Toni
Příspěvky: 130
Reputace:   
 

Re: pascal-ran

↑ hradecek: jak to teda udělám bez pole?Stačí, abych zadal místo pole nějakou proměnnou ne?

Offline

 

#10 17. 03. 2010 20:50 — Editoval septolet (17. 03. 2010 20:52)

septolet
Příspěvky: 334
Reputace:   
 

Re: pascal-ran

↑ 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

 

#11 17. 03. 2010 21:08

Toni
Příspěvky: 130
Reputace:   
 

Re: pascal-ran

↑ 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

 

#12 17. 03. 2010 22:40 — Editoval septolet (17. 03. 2010 22:40)

septolet
Příspěvky: 334
Reputace:   
 

Re: pascal-ran

↑ Toni: Průměr vypadá dobře. Ke 4 mám výhrady.

Code:

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

 

#13 17. 03. 2010 22:56

Toni
Příspěvky: 130
Reputace:   
 

Re: pascal-ran

↑ 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

 

#14 17. 03. 2010 23:51

septolet
Příspěvky: 334
Reputace:   
 

Re: pascal-ran

↑ 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

 

#15 18. 03. 2010 15:42

Toni
Příspěvky: 130
Reputace:   
 

Re: pascal-ran

↑ 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

 

#16 18. 03. 2010 17:18 — Editoval hradecek (18. 03. 2010 17:24)

hradecek
Příspěvky: 772
Pozice: Student
Reputace:   25 
Web
 

Re: pascal-ran

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

Code:

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.

Netrápte sa nad svojimi problémami s matematikou, môžem vás uistiť, že tie moje sú ešte väčšie. ~~Albert Einstein~~
Jak spozná člověk, že není pitomec ? - Moudrý člověk to nepozná nikdy a blbci je to jedno. ~~Jak přicházejí básnici o iluze~~
Někteří lidi se nikdy nezmění. Anebo se rychle změní a pak se zase rychle změní nazpátek. ~~Homer Simpson~~

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson