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
Potřeboval bych lehce pomoct s touto úlohou:
Na vstupu jsou reálná čísla udávající teploty ve skladu za týden. Údaje jsou zaznamenávány každé 4 hodiny.
a musím určit
a) průměrnou teplotu za celý týden
b)dny, kdy průměrná denní teplota převyšovala průměrnou týdení teplotu
c)nefvyšší a nejnižší teplotu a den a hodinu, kdy byly naměřeny
jsem začátečník v pascalu tak si to moc nedávám :) ale to c) je nejhorší nevím jak to kombinovat s tím časem
předem dík za pomoc
Offline
↑ sivaki:
1. V sekci type
Natypuješ pole např.type Tdny= array[1..7] of Integer; (pole pro záznam dní kdy průměrná denní teplota je větší
než průměrná týdenní - bude obsahovat pouze hodnoty 0 a 1)
V sekci var
Nadefinuješ pole např. teplota: array[1..42] of Real; (pole teplot)
počet položek v poli je 42=7x6 (7 dní 6 měření za den)
Nadefinuješ pole např.pdt: array[1..7] of Real; (pole průměrných denních teplot)
Nadefinuješ pole např. tmax,tmin: array[1..2] of Extended; //(pole prumernych max. a min. teplot)
Nadefinuješ pole např. dny: Tdny;
Nadefinuješ ptt: Real; (průměrná týdenní teplota)
dt: Real;
i: Integer;
s: String;
Nadefinuješ funkce např.
function Vdny(den: Tdny): String;
var j: Integer;
begin
Result := '';
for j := 1 to 7 do
if den[j]=1 then
case j of
1: Result := Result+'pondeli ';
2: Result := Result+'utery ';
3: Result := Result+'streda ';
4: Result := Result+'cvrtek ';
5: Result := Result+'patek ';
6: Result := Result+'sobota ';
7: Result := Result+'nedele ';
end;
end;
function Maxt(x,y: Real): String;
begin
Result := 'tmax= '+FloatToStr(y)+' st.C, namereno: ';
case Trunc(x) of
1..6: Result := Result+'pondeli ';
7..12: Result := Result+'utery ';
13..18: Result := Result+'streda ';
19..24: Result := Result+'cvrtek ';
25..30: Result := Result+'patek ';
31..36: Result := Result+'sobota ';
37..42: Result := Result+'nedele ';
end;
case Trunc(x) mod 6 of
1: Result := Result+'v 1.00 hod.';
2: Result := Result+'v 5.00 hod.';
3: Result := Result+'v 9.00 hod.';
4: Result := Result+'v 13.00 hod.';
5: Result := Result+'v 17.00 hod.';
0: Result := Result+'v 21.00 hod.';
end;
end;
function Mint(x,y: Real): String;
begin
Result := 'tmin= '+FloatToStr(y)+' st.C, namereno: ';
case Trunc(x) of
1..6: Result := Result+'pondeli ';
7..12: Result := Result+'utery ';
13..18: Result := Result+'streda ';
19..24: Result := Result+'cvrtek ';
25..30: Result := Result+'patek ';
31..36: Result := Result+'sobota ';
37..42: Result := Result+'nedele ';
end;
case Trunc(x) mod 6 of
1: Result := Result+'v 1.00 hod.';
2: Result := Result+'v 5.00 hod.';
3: Result := Result+'v 9.00 hod.';
4: Result := Result+'v 13.00 hod.';
5: Result := Result+'v 17.00 hod.';
0: Result := Result+'v 21.00 hod.';
end;
end;
2. ze vstupu načteš do pole postupně jednotlivé teploty.
3. ať je to jednoduché, tak v 7-mi cyklech spočítáš průměrné denní teploty v jednotlivých dnech
dt := 0;
pro pondělí: for i := 1 to 6 do
dt := dt+teplota[i];
pdt[1] := dt/6;
dt := 0;
pro úterý: for i := 7 to 12 do
dt := dt+teplota[i];
pdt[2] := dt/6;
atd. až do neděle
4. Spočítáš průměrnou týdenní teplotu (ad a))
ptt := 0;
for i := 1 to 7 do
ptt := ptt+pdt[i];
ptt := ptt/7;
WriteLn('Prumerna tydenni teplota je ',ptt);
5. Vyselektuješ dny, kdy průměrná denní teplota je větší než průměrná týdenní (ad b))
for i := 1 to 7 do
if pdt[i]>ptt then
dny[i] := 1
else
dny[i] := 0;
WriteLn('Vypis dnu, ve kterych je prumerna teplota vyssi nez prumerna tydenni teplota:');
s := Vdny(dny);
WriteLn(s);
6. Urcis den a hodinu kdy je teplota maximalni a potom minimalni (ad b))
WriteLn(' c) Nejvyssi a nejnizsi teploty (den, hodina)');
tmax[1] := 1; tmax[2] := teplota[1];
tmin[1] := 1; tmin[2] := teplota[1];
for i := 2 to 42 do
begin
if teplota[i]>tmax[2] then
begin
tmax[1] := i;
tmax[2] := teplota[i];
end;
if teplota[i]<tmin[2] then
begin
tmin[1] := i;
tmin[2] := teplota[i];
end;
end;
s := Maxt(tmax[1],tmax[2]);
WriteLn(' ',s);
s := Mint(tmin[1],tmin[2]);
WriteLn(' ',s);
ReadLn;
Offline
Zdravím,
funkce se nauč používat. Je to dobrá věc. Představ si to jako černou krabičku, do které nevidíš. Něco do ní dáš (vstup) a něco jiného Ti z ní vyleze (výstup). Vstup pro funkci se řeší v programování pomocí parametru funkce. Výstup se pak řeší pomocí klíčového slova return. V pascalu return není, návratová hodnota se tam řeší pomocí jména funkce. :-)
Offline
↑ sivaki:
Tak ty funkce předělej třeba na procedury
Např. funkci Vdny přepiš na proceduru
procedure Vdny(den: Tdny; var s1: String);
var j: Integer;
begin
s1 := '';
for j := 1 to 7 do
if den[j]=1 then
case j of
1: s1 := s1+'pondeli ';
2: s1 := s1+'utery ';
3: s1 := s1+'streda ';
4: s1 := s1+'cvrtek ';
5: s1 := s1+'patek ';
6: s1 := s1+'sobota ';
7: s1 := s1+'nedele ';
end;
end;
a pak řádek
s := Vdny(dny);
přepiš na
Vdny(dny,s);
Offline
↑ sivaki:
Tak třeba takto:
procedure Maxt(x,y: Real; var s2:String);
begin
s2 := 'tmax= '+FloatToStr(y)+' st.C, namereno: ';
case Trunc(x) of
1..6: s2 := s2+'pondeli ';
7..12: s2 := s2+'utery ';
13..18: s2 := s2+'streda ';
19..24: s2 := s2+'cvrtek ';
25..30: s2 := s2+'patek ';
31..36: s2 := s2+'sobota ';
37..42: s2 := s2+'nedele ';
end;
case Trunc(x) mod 6 of
1: s2 := s2+'v 1.00 hod.';
2: s2 := s2+'v 5.00 hod.';
3: s2 := s2+'v 9.00 hod.';
4: s2 := s2+'v 13.00 hod.';
5: s2 := s2+'v 17.00 hod.';
0: s2 := s2+'v 21.00 hod.';
end;
end;
A pak místo s := Maxt(tmax[1],tmax[2]);
dát Maxt(tmax[1],tmax[2],s);
Offline
↑ sivaki:
Ne tak to není.
Jak jsou ty hodnoty teplot zadány.
Přeci každý den je naměřeno 6 hodnot.
Ty jsou v poli uspořádány za sebou, takže 1..6 -tý prvek pole odpovídá pondělí, 7..12-tý prvek je úterý atd.
Tohle
case Trunc(x) of
1..6: s2 := s2+'pondeli '; říká
jestliže je x rovno 1 až 6 potom víme, že je to teplota naměřená v pondělí pro 7 až 12 v úterý atd.
My do té procedury za to x dosadíme proměnnou tmax[1], která obsahuje pořadí v poli teplot (tedy obsahuje pořadové číslo)
Potom to
case Trunc(x) mod 6 of
1: s2 := s2+'v 1.00 hod.';
znamená, že jestliže zbytek po dělení čísla x číslem 6 je 1, byla naměřená hodnota naměřena jako první v nějakém dni (ovšemže ten den už jsme zjistili před tím) jestli je to dvojka (2) pak to bylo druhé měření atd.
To, že se pořád píše s2+'v 1.00 hod.'; je jenom proto, aby v té proměnné s2 byla uložena celá věta.
Po editaci
Já jsem tvůj dotaz špatně pochopil. Ano je to tak jak píšeš. To co jsem napsal před tím ber pouze jako vysvětlení.
Offline
tak jsem program přepsal ve verzi s těma funkcema a skusil spustit ale pise mi to chybu s tím result a to ve vsech tech funkcich a ještě byh se rad zeptal na tuhle cast... Result := 'tmin= '+FloatToStr(y)+' st.C, namereno: '; ... tomuhle řadku nejak nerozumim nebo nevim co dělá
Offline
↑ sivaki:
Jestli ti to Result nebere, tak to přepiš na procedury.
Poslední (ostatní jsem ti už přepsal) třeba takto:
procedure Mint(x,y: Real; var s3:String);
begin
s3 := 'tmin= '+FloatToStr(y)+' st.C, namereno: ';
case Trunc(x) of
1..6: s3 := s3+'pondeli ';
7..12: s3 := s3+'utery ';
13..18: s3 := s3+'streda ';
19..24: s3 := s3+'cvrtek ';
25..30: s3 := s3+'patek ';
31..36: s3 := s3+'sobota ';
37..42: s3 := s3+'nedele ';
end;
case Trunc(x) mod 6 of
1: s3 := s3+'v 1.00 hod.';
2: s3 := s3+'v 5.00 hod.';
3: s3 := s3+'v 9.00 hod.';
4: s3 := s3+'v 13.00 hod.';
5: s3 := s3+'v 17.00 hod.';
0: s3 := s3+'v 21.00 hod.';
end;
end;
A pak místo s := Mint(tmin[1],tmin[2]);
dát Mint(tmin[1],tmin[2],s);
Řádek Result := 'tmin= '+FloatToStr(y)+' st.C, namereno: '; (ve funkci), který v proceduře
bude: s3 := 'tmin= '+FloatToStr(y)+' st.C, namereno: ';
přiřazuje proměnné (ve funkci výsledku), v proceduře s3 (potažmo v konkrétním použití procedury proměnné s)
text, který se potom vypíše na obrazovku.
Ten text je: tmin=(hodnota té minimální teploty, uložené v proměnné tmin[2]) st.C, namereno:
No a zatím se pak vypíše, který den a ve kterou hodinu jsem to naměřili.
(proto vždy k té proměnné "přičítáme" ten další text.
Tedy "nový text"="starý text"+"nově přidaný text"
s3 := s3 + 'pondeli ';
Offline
ted jsem spoučtěl tu verzi s procedurama a chybu to pise v těchto dvou příkazech s3 := 'tmin= '+FloatToStr(y)+' st.C, namereno: ';
a pak ještě jednu uplne nesmyslnout ve for cyklu ve kterým vyplňuju tu proměnou teplot [1..42]
for i:=1 to 42 do begin
write(‘Zadej teplotu: ‘);
readln(teplota[i]);
end;
Offline
tak jsem nad tim este celkově přemejšlel a říkám si že by nemuselo být špatný řešení udělat to pomocí matice jako že třeba řádky budou dny a slopce hodyny, z toho pole si najdu ten největší a nejmenší a pak to musim nějak přiřadit ten řaden a sloupec
Offline
↑ sivaki:
1. Použít matici by samozřejmě šlo. (ale bylo by to pro tebe trochu složitější)
2. s3 := 'tmin= '+FloatToStr(y)+' st.C, namereno: '; - tenhle řádek je naprosto korektní, zde by chyba být neměla.
Možná, že to hází chybu tady: 31..36: s3 := s3t+'sobota ';, protože tam to t za s3 nemá být, (zůstalo z Result při
přepisování)
3. ....vyplňuju tu proměnou teplot [1..42] . Nemáš třeba jednou pole pro teploty označené teplot[1..42] a podruhé
teplota[i] - viz. readln(teplota[i]);
Jestli vyplňuješ pole tak, že ho vypisuješ tak možná zkus použít automatické vyplnění viz. níže.
Randomize;
WriteLn;
for i := 1 to 42 do
case i of
1,7,13,19,25,31,37:
teplota[i] := RandomRange(0,30)/10+9;
2,8,14,20,26,32,38:
teplota[i] := RandomRange(0,30)/10+9;
3,9,15,21,27,33,39:
teplota[i] := RandomRange(0,40)/10+13;
4,10,16,22,28,34,40:
teplota[i] := RandomRange(0,40)/10+23;
5,11,17,23,29,35,41:
teplota[i] := RandomRange(0,40)/10+19;
6,12,18,24,30,36,42:
teplota[i] := RandomRange(0,40)/10+15;
end;
Nezapomenout přidat do sekce uses Math //(jednotku)
Po editaci
Ještě k tomu bodu 1. Máš proceduru
procedure Mint(x,y: Real; var s3:String);
nebo takto
procedure Mint(x,y: Real; s3:String);
Správně má být to první (s var s3)
Offline
tak jsem to ukazoval učitelovi a ten mi říkal ať to udělám pomocí té matice že to bude prej přehlednější
myslim že ru matici zvladnu napsat ale tak nějak nevim jak z te matice vytahnout tu informaci o času a dnu to budu dělat asi nějakým case
Offline
↑ sivaki:
Žádný vlastní návrh?
Jestli to bude přehlednější je jenom otázka vkusu.
Zkus se zamyslet nad následujícím.
Co kdybychom nadefinovali dvourozměrné pole (třeba přirozených čísel), kde první index by nějak odpovídal dnům, a druhý hodinám v jednotlivém dni.
Offline
takhle nejak mam v planu řešit tu posledni otazku mam to ale zkraceny nechtelo se mi vypisovat vsechny dny
ale zrovna tady mi to nejak nepocita minimalni teplotu nvm ale moc jsem to este nekontroloval
tak se podivej co ty na to :)
program nic;
var m:array [1..6,1..7] of real;
i,j: integer;
tmax:array [1..10,1..10] of real;
tmin: array [1..10,1..10] of real;
tmaxi,tmini: real;
s1,s2,s3,s4: string[40];
begin
for i:=1 to 3 do
for j:=1 to 3 do
begin
write('zadej teplotu v ',i,'. dni a ', j ,'. zadavanou teplotu ');
readln (m[i,j]);
end;
for i:=1 to 3 do
for j:=1 to 3 do
begin
if m[i,j]>tmaxi then
begin
tmaxi:= m[i,j];
case i of
1: s1:= 'pondeli';
2: s1:= 'utery';
3: s1:= 'streda';
end;
case j of
1: s2:= '1.cas';
2: s2:= '2.cas';
3: s2:= '3.cas';
end;
end;
end;
for i:=1 to 3 do
for j:=1 to 3 do
begin
if m[i,j]<tmini then
begin
tmini := m[i,j];
case i of
1: s3:= 'pondeli';
2: s3:= 'utery';
3: s3:= 'streda';
end;
case j of
1: s4:= '1.cas';
2: s4:= '2.cas';
3: s4:= '3.cas';
end;
end;
end;
writeln('tak tohle by mela byt nej teplota tydne ',tmaxi:6:2,' a tohle den namereni ',s1,' a tohle cas namereni ',s2);
writeln('tohle je nejmensi teplota tydne ',tmini:6:2,' a den namereni ',s3,' a tady je cas ',s4) ;
readln;
end.
Offline
tak takhle ted vypada ten muj kod pořád mi nejde pocitani nejmensi teploty pritom je to stejny jako pocitani te nejvetsi nevim v cem je chyba
prosim skus se na to este mrknout
program teploty;
var m:array [1..6,1..7] of real;
i,j: integer;
pdt: array[1..7] of real;
dt: real;
ptt: real;
tmaxi,tmini: real;
s1,s2,s3,s4,s5: string[40];
begin
tmaxi:=0;
tmini:=0;
for i:=1 to 3 do
begin
dt:=0;
for j:=1 to 2 do
begin
write('zadej teplotu v ',i,'. dni a ', j ,'. zadavanou teplotu ');
readln (m[i,j]);
dt:=dt+m[i,j];
pdt[i]:=dt/2;
end;
end;
for i := 1 to 3 do
ptt := ptt+pdt[i];
ptt := ptt/3;
WriteLn('Prumerna tydenni teplota je ',ptt:6:2);
writeln('Zde jsou vyps ny dny kdy prumerna deni teplota prevysila prumernou tydeni teplotu');
for i:= 1 to 3 do begin
if pdt[i]>ptt then begin
case i of
1: s5:= 'pondeli';
2: s5:= 'utery';
3: s5:= 'streda';
4: s5:= 'ctvrtek';
5: s5:= 'patek';
6: s5:= 'sobota';
7: s5:= 'nedele';
end;
end;
Writeln(s5);
end;
for i:=1 to 3 do
for j:=1 to 2 do
begin
if m[i,j]>tmaxi then
begin
tmaxi:= m[i,j];
case i of
1: s1:= 'pondeli';
2: s1:= 'utery';
3: s1:= 'streda';
4: s1:= 'ctvrtek';
5: s1:= 'patek';
6: s1:= 'sobota';
7: s1:= 'nedele';
end;
case j of
1: s2:= '4:00';
2: s2:= '8:00';
3: s2:= '12:00';
4: s2:= '16:00';
5: s2:= '20:00';
6: s2:= '24:00';
end;
end;
end;
for i:=1 to 3 do
for j:=1 to 3 do
begin
if m[i,j]<tmini then
begin
tmini := m[i,j];
case i of
1: s3:= 'pondeli';
2: s3:= 'utery';
3: s3:= 'streda';
4: s3:= 'ctvrtek';
5: s3:= 'patek';
6: s3:= 'sobota';
7: s3:= 'nedele';
end;
case j of
1: s4:= '4:00';
2: s4:= '8:00';
3: s4:= '12:00';
4: s4:= '16:00';
5: s4:= '20:00';
6: s4:= '24:00';
end;
end;
end;
writeln('nejvetsi namerena teplota tydne: ',tmaxi:6:2,'. Den, kdy byla namerena: ',s1,'. Cas namereni: ',s2);
writeln('nejmensi namerena teplota tydne: ',tmini:6:2,'. Den, kdy byla namerena: ',s3,'. Cas namereni: ',s4) ;
readln;
end.Offline
↑ sivaki:
Tak tedy:
1. Pole m máš špatně nadefinované (dní je 7, počet měření 6)
má být m:array [1..7,1..6] of real;
2. Možná, že jenom z úporných důvodů měříš pouze pondělí - středa (3 dny) a jenom 2x (4.00,800)
Kdybys totiž měřil tak jak máš, tak bys na to přehozené pole přišel, protože by ti to házelo chybu.
3. ptt je potřeba na začátku nastavit na 0.
4. V tomhle cyklu
for i := 1 to 3 do begin
if pdt[i]>ptt then begin
case i of
1:s5 := 'pondeli';
2:s5 := 'utery';
3:s5 := 'streda';
4:s5 := 'ctvrtek';
5:s5 := 'patek';
6:s5 := 'sobota';
7:s5 := 'nedele';
end;
end;
Writeln(s5);
end;
je nesprávně vypisováno s5.
Totiž, když bude např. průměrná teplota vyšší v pondělí a ve středu než je týdenní průměrná teplota, tak ti to
vypíše
pondeli
pondeli
středa
prostě s5 je vypisováno pokaždé. Protože na začátku je s5 prázdný string (text) tak se ti mohlo zdát, že
ti to pracuje dobře.
Náprava:
for i := 1 to 3 do begin
if pdt[i]>ptt then
begin
case i of
1:s5 := 'pondeli';
2:s5 := 'utery';
3:s5 := 'streda';
4:s5 := 'ctvrtek';
5:s5 := 'patek';
6:s5 := 'sobota';
7:s5 := 'nedele';
end;
end
else
s5 := '';
if s5<>'' then
Writeln(s5);
end;
5. Ke špatnému výpisu tmini.
Jednak máš v cyklu
for i := 1 to 3 do
for j := 1 to 3 do
begin
if m[i,j]<tmini then
begin
tmini := m[i,j];
atd.
místo 2 číslo 3
a navíc protože tmini je na začátku nastaveno na 0, tak pokud nebude někdy teplota záporná, tak nikdy nenastane
podmínka m[i,j]<tmini a tudíž tmini bude pořád 0. (Jenom tak na okraj. I kdybys to měl ošetřené dobře, tak
vzhledem k té chybě v cyklu (for j := 1 to 3 do místo for j := 1 to 2 do), a protože si vyplnil jen 2 hodnoty
měření každý den, tak v každém dni je třetí hodnota také 0 a tudíž by ti to stejně vypsalo tmini=0)
Náprava:
Před cyklem je potřeba nastavit tmini na nejvyšší hodnotu a tou je samozřejmě tmaxi.
Tedy přidáš řádek tmini := tmaxi;
A samozřejmě změnit tu trojku na dvojku.
6. Ještě jedna poznámka:
Pokud bys zadal všechny teploty pod nulou (tedy se znaménkem -, např. by se měřilo v zimě), tak ti to zase špatně
vybere i tmaxi (opět by to byla 0)
Takže by bylo dobré na začátku tmaxi nastavit na nějakou hodně mínusovou hodnotu. (třeba -300, což je hodnota
menší než absolutní 0)
Po editaci
Ještě jsem přišel na jednu věc
V cyklu
for i:=1 to 3 do
begin
dt:=0;
for j:=1 to 2 do
begin
write('zadej teplotu v ',i,'. dni a ', j ,'. zadavanou teplotu ');
readln (m[i,j]);
dt:=dt+m[i,j];
pdt[i]:=dt/2;
end;
end;
to chce pdt[i]:=dt/2; vyhodit za to první end;
for i:=1 to 3 do
begin
dt:=0;
for j:=1 to 2 do
begin
write('zadej teplotu v ',i,'. dni a ', j ,'. zadavanou teplotu ');
readln (m[i,j]);
dt:=dt+m[i,j];
end;
pdt[i]:=dt/2;
end;
Offline