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,
mám pole 10 rostlin. Každá rostlina je záznam se 3 údaji - název, výška a údaj o tom jestli kvete. Mám udělat procedury pro přidání rostliny do pole (udělala jsem), vyhledání rostliny podle názvu (udělala jsem), vypsání všech zadaných rostlin (udělala jsem ) a odebrání rostliny.
Procedura pro odebrání rostliny má vyhledat rostlinu podle názvu (použitím procedury vyhledat), odstranit ji a všechny rostliny za ní posunout, aby zaplnily vzniklé místo. Jak na to?
Díky za pomoc.
Přikládám to co jsem zatím udělala
program pole_rostlin;
type T_zaznam=record
nazev:string[20];
vyska:integer;
kvetouci:boolean;
end;
T_pole=array[1..10]of T_zaznam;
procedure pridani(var vystup:T_pole;var i:integer);
var kvete:string[3];
zaznam:T_zaznam;
begin
if i=11 then writeln('Nelze pridat dalsi zaznam, seznam jiz ovsahuje 10 rostlin')
else begin
write('Zadej nazev rostliny ');
readln(zaznam.nazev);
write('Zadej vysku rostliny ');
readln(zaznam.vyska);
write('Kvete? (ano/ne) ');
readln(kvete);
if kvete='ano' then zaznam.kvetouci:=true
else zaznam.kvetouci:=false;
vystup[i]:=zaznam;
i:=i+1;
end;
end;
procedure vyhledani(i:integer;var vystup:T_pole;var i1:integer);
var rostlina:string[20];
begin
write('Napis nazev rostliny, kterou chces odebrat ');
readln(rostlina);
ano:=0;
repeat
i1:=i1+1;
if vystup[i1].nazev=rostlina then ano:=1;
until (i1=1) or (i=(i-1));
end;
procedure vypis_vsech(vstup:T_pole;i:integer);
var i1:integer;
begin
for i1:=1 to (i-1) do begin
write('Nazev: ',vstup[i1].nazev,' Vyska: ',vstup[i1].vyska);
write(' Kvete: ');
if vstup[i1].kvetouci=true then write('ano')
else write('ne');
end;
writeln;
end;
procedure odebrani;
end;
var zaznam:T_zaznam;
pole:T_pole;
volba,i:integer;
begin
i:=1;
i1:=0;
repeat
writeln('Prace s polem');
writeln('1-Pridani zaznamu');
writeln('2-Odebrani zaznamu');
writeln('3-Vyhledani zaznamu podle nazvu rostliny');
writeln('4-Vypis vsech zaznamu');
writeln('0-Ukonceni prace');
readln(volba);
case (volba) of
1:Pridani(pole,i);
2:begin
Vyhledani;
Odebrani;
end;
3:begin
Vyhledani(i,pole,i1);
writeln('Údaje o hledané rostlině:');
write('Nazev: ',pole[i1].nazev,' Vyska: ',pole[i1].vyska,' Kvete: ');
if pole[i].kvetouci=true then write('ano')
else write('ne');
end;
4:Vypis_vsech(pole,i);
end;
until (volba=0);
end.Offline
Ahoj,
pokud Ti jdou indexy postupně, tak je stačí posouvat (takže jí vlastně přemažeš). Najdeš si tu rostlinu a poté posuneš indexy (od té rostliny až na i-1).
Takže něco na tento způsob:
vstup[i].nazev = vstup[i+1].nazev;
vstup[i].vyska = vstup[i+1].vyska;
vstup[i].kvetouci = vstup[i+1].kvetouci;
a možná, že to půjde i jednoduše takto: vstup[i] = vstup[i+1]; uvidíme, musím vyzkoušet...
Ale ty asi víš princip (algoritmus) jak tak čtu, ty tu proceduru chceš pouze napsat? :-) Dej mi 1 den, max. 2 a máš to tu. ;-))
Offline
Ahoj,
tak dnes jsem si udělal čas a udělal to. Pár připomínek ke kódu:
- Mám rád angličtinu (proto jsem to předělal do AJ);
- Udělal jsem tři jednoduché funkce (procedury) pro ukázku [Add (přidat květinu), Delete (odebrat květinu), Show (zobrazit květiny)];
- Všechny tři funkce (procedury) nemají zbytečné parametry;
- V programu se vytvoří jedno globální pole květin a s ním se celou dobu pracuje;
- Pořád jsem nevěděl, jak mám inicializovat v Pascalu hodnotu - resp. to pole květin (už to vím, je to ten řádek s tím const - plno lidí si myslí, že je to jen pro konstanty, ale není tomu tak... btw: indexace v Pascalu začíná od 1);
- A snažil jsem se to napsat programátorsky správně (neříkám, že ty to máš špatně), ale pro ostatní neprogramátory co sem píšou, tak aby viděli, že existuje i něco jako úprava kódu a porozumění v něm);
program structure;
uses crt;
const count: integer = 1;
type flower = record
name : string[20];
height: integer;
growing: boolean;
end;
var myArray: array[1..10] of flower;
procedure add;
var growing: string[3];
var output : flower;
begin
write(' Name of flower: ');
readln(output.name);
write(' Height of flower: ');
readln(output.height);
write(' Is it growing? (yes/no) ');
readln(growing);
if (growing = 'yes') then
output.growing:=true
else
output.growing:=false;
myArray[count]:=output;
count:=count+1;
end;
procedure show;
var i: integer;
begin
for i:=1 to count-1 do
begin
writeln;
writeln(' Name: ', myArray[i].name);
writeln(' Height: ', myArray[i].height);
write(' Growing: ');
if (myArray[i].growing = true) then
write(' Yes ')
else
write(' No ');
end;
end;
procedure delete;
var name: string[20];
var i: integer;
var pom: integer;
begin
writeln;
writeln(' Name of flower you want to delete: ');
readln(name);
for i:=1 to count-1 do
begin
if (name = myArray[i].name) then
for pom:=i to count-1 do
begin
myArray[pom]:=myArray[pom+1];
end;
end;
count:=count-1;
end;
begin
add;
add;
add;
show;
delete;
show;
readln;
clrscr;
end.Offline

Ahojte , hladam niekoho kto by mi vedel pomoct s programovanim derivacie funkcie a monotonnost funkcie, v klasickom, nie grafickom programe okna pascal. Dakujem
Offline

↑ RePRO:
Ahoj, mockrát děkuji.
btw: indexace v Pascalu začíná od 1
Jo? Nezávisí to spíše na tom jaký zadám typ pro indexování? Klidně můžu mít i [0..9] (bude začínat 0) nebo [21..31] (v tomhle příkladě se nehodí, začínat bude 21), ne?
Jinak nerozumím tomuto:
const count: integer = 1;
vím, že si o tom něco v úvodu psal, ale moc tomu nerozumím :(
Offline
Ad 1) Jak jsem psal, indexace v Pascalu začíná od 1. Tím je myšleno přesně to, že pokud v ostatních programovacích jazycích (C, C++ atd.) zkusíš například toto: pole[0] = 4;, tak to bez problémů projde. Pokud by si stejnou věc zkusila v prog. jazyce Pascal, to znamená: pole[0] := 4;, tak Ti překladač vyplyvne chybu. Domnívám se, že nějakou chybu s rozsahem (range).
To znamená, že [0..9] použít nemůžeš, ale [21..30] (pro deset květin) ano. Ale jak píšeš, je to trošku zavádějící a nehodí se to takto použít. :-)
Ad 2)
Vezmu malý pochopitelný příklad:
const count: integer = 1; const count = 1;
Jaký je rozdíl? Přesně takový: První není konstanta, druhý řádek je konstanta (nemůžeš měnit její hodnotu!). V prvním případě se tedy jedná o proměnnou (můžeš jí měnit), do které nastavíš po spuštění programu jedničku. A ty si můžeš být stoprocentně jistá, že tam ta jednička je (protože si jí inicializovala).
Další hezký příklad by byl s číslem 0. Když uděláš v Pascalu:
const count: integer = 0; var count;
V prvním řádku máš stoprocentně zajištěno, že hodnota proměnné count bude na začátku 0. Ovšem u druhé proměnné nikdy nevíš, jaká hodnota v ní na začátku bude. Dokonce Ti konzole vypíše 0. Ale na to veliký pozor... my nevíme, jaká hodnota tam bude.
Na konec příkládám ještě jeden možný způsob inicializace. Je to prasečí řešení, ale určitě si o něm přemýšlela i ty. To znamená, že si uděláš něco takového:
var count; begin count := 0; end.
To znamená, že pod begin (začátek hlavního programu) jsme nastavili proměnnou. Možné řešení (to nepopírám), ale z pohledu programování je to prasečina. :-)
Offline

Omlovam se, ze do toho vstupuju, ale podle me ma janca pravdu v tom, ze jde zadat [0..9]. Zkousel jsem to, a funguje to (mozna zalezi na konkretnim prekladaci). Jde i zaporne - treba [-5..10].
Offline

↑ Lumikodlak:
Já to vím pouze teoreticky. Nikdy jsem to nepoužila, protože se to nikam nehodilo.
Offline

↑ janca361:
Akorat mi nesedelo, co psal RePRO v jeho poslednim prispevku k te 1), tak jsem to vyzkousel a slo to.
Offline

↑ janca361:
Jestli uz to mas, akorat ze to skoncilo nekonecnym cyklem, tak muzes tu proceduru ukazat, a treba by nekdo nasel v cem je problem.
Offline

Tak zdá se, že jsem úspěšně dokončila. Děkuji všem za pomoc.
Offline