Uloha v pascale – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Uloha v pascale – Pascal – Fórum – Programujte.comUloha v pascale – Pascal – Fórum – Programujte.com

 

Katherin0
Duch
8. 11. 2007   #1
-
0
-

Prosím o pomoc s touto úlohou. Ovocinár má k dispozícii sud . Obsah tohto suda chce bezozbytku rozliať do ďalších súdkov tak, aby súdok bol buď naplnený doplna, alebo aby nebol použitý vôbec. Ovocinár môže mať k dispozícii viac súdkov toho istého objemu.
Úloha 1: Vypočítajte programom a zobrazte na obrazovke všetky možné riešenia (kombinácie), ako je možné pôvodný objem sudu bezozbytku rozliať do ďalších súdkov.
Úloha 2: Vypočítajte programom a zobrazte na obrazovke optimálne riešenie (alebo riešenia), v ktorom (ktorých) je použitých najmenší počet súdkov.

Konkrétne zadanie
Počet litrov vína k dispozícií: 36
Počet rôznych druhov sudov: 6
Jednotlivé sudy k dispozícii: 2x 5-litrový sud , 3x 9-litrový sud , 1x 15-litrový sud , 1x 21-litrový sud , 1x 26-litrový sud , 2x 31-litrový sud
Dakujem

Nahlásit jako SPAM
IP: 62.168.112.–
don_Dominique0
Super člen
8. 11. 2007   #2
-
0
-

Nevim jestli ti to pomůže ale do školy sem dělal něco podobnýho ale v pythonu ! nechce se mi to přepisovat do pascalu . Snad ti to pomůže:


def plat(kc): # definuje fci plat

a=[5000,2000,1000,500,200,100,50,20,10,5,2,1] # pole moznych hodnot bankovek
for i in range(12): # cykl for pro pocet banovek
if(kc/a[i]>0):
print(str(kc/a[i])+'x'+str(a[i])+' korunových bankovek')
kc-=(kc/a[i])*a[i]
kolik=input('Zadej plat: ')
plat(kolik)
raw_input('')

Nahlásit jako SPAM
IP: 193.165.176.–
Jenicek0
Duch
8. 11. 2007   #3
-
0
-

ahoj,
Ja mam taky problém s ukolem v pacalu a nevim jak s nim,jestli by jste mohl někdo pomoci?

Uvažujme následující reprezentaci polynomu:



const MaxStupen = 20;

type Poly = array[0..MaxStupen] of real;

{v poli jsou uloženy koeficienty polynomu,

index = exponent příslušného členu}

var A: Poly;

StA: byte; {stupeň polynomu A}



Napište procedury pro následující operace s polynomy:

a) součet dvou polynomů

b) součin dvou polynomů

c) vstup polynomu (zadání stupně a koeficientů z klávesnice)

d) výstup polynomu (výpis na obrazovku v rozumně čitelném tvaru, např. 3x^2–5x+1 )

Procedury by mohly mít tyto hlavičky:



procedure Soucet(A, B: Poly; StA, StB: byte;

var C: Poly, var StC: byte);

procedure Soucin(A, B: Poly; StA, StB: byte;

var C: Poly, var StC: byte);

procedure Vstup(var A: Poly; var StA: byte);

procedure Vystup(A: Poly; StA: byte);

Nahlásit jako SPAM
IP: 213.180.53.–
Mircosoft+1
Věrný člen
9. 11. 2007   #4
-
0
-

To Jenicek :

Vstup: Readln ve for-cyklu. Prostě načítáš jednotlivé koeficienty (s příslušnou omáčkou pro uživatele ve stylu "zadejte koeficient pro [kolikátou] mocninu x" apod.); bude jich o 1 víc než jaký je zadaný stupeň polynomu. Neměl by být problém. Zbylé koeficienty až do konce pole vynuluj.

Výstup: Podobné, ale obráceně. Podle stupně polynomu vypisuješ jednotlivé nenulové koeficienty a za každým doplníš 'x^', aktuální index, u kterého jsi, a plus.

Součet: Sčítáš koeficienty na stejných indexech a součty ukládáš na tytéž pozice do výsledného polynomu. Jako hodnotu stupen ber větší ze stupňů obou sčítaných polynomů.

Součin: Musíš vynásobit každý s každým. Nejdřív výsledný polynom vynuluj. Potom do bude to práce pro dvojitý for-cyklus:

for i:=0 to stA do for j:=0 to stB do c[i+j]:=c[i+j]+a[i]*b[j];

Zkus si to roznásobit ručně na papíře a uvidíš, jak to funguje:
(2x^2+3x+5)*(4x+2) = (2x^2*4x)+(2x^2*2)+(3x*4x)+(3x*2)+(5*4x)+(5*2) = (8x^3)+(4x^2)+(12x^2)+(6x)+(20x)+(10) = 8x^3+16x^2+26x+10
Vidíš, jak se mocniny x (indexy pole) sčítají, koeficienty (prvky pole) násobí a jak se pak sečtou koeficienty se stejnými mocninami x (na stejných indexech).
Výsledný stupeň polynomu pak zjistíš tak, že si pole C projdeš prvek po prvku a zapamatuješ si index posledního políčka, na kterém se nacházelo nenulové číslo.

Nahlásit jako SPAM
IP: 89.176.249.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Mircosoft+1
Věrný člen
9. 11. 2007   #5
-
0
-

To Katherin :

Překlad do pascalštiny:

const a:array[1..12] of word = (5000,2000,1000,500,200,100,50,20,10,5,2,1);


procedure plat(kc);
var i:byte;
Begin
for i:=1 to 12 do
begin
if kc div a[i]>0 then writeln(kc div a[i],' ',a[i],'korunových bankovek')
kc:=kc mod a[i];
end;
End;

var kolik:longint;

BEGIN
write('Zadej plat: ');
readln(kolik);
plat(kolik);
readln;
END.


S těmi sudy to bude podobné. Protože ale nemáš jednolitrový sud, tak to nemusí pokaždé vyjít. Takže zkoušej jednotlivé kombinace sudů a vypisuj jenom ty, které vyjdou. Zároveň si pamatuj, kolik nejméně sudů jsi spotřeboval a všechny kombinace s tímto počtem prohlaš za optimální.

Zkoušení bych viděl asi takhle: nejdřív to zkusíš s jedním sudem. Vyzkoušíš všechny velikosti, které máš, a když ti v některém případě vyjde, že se to do něj vešlo všechno (což se nestane, ale to je jedno), zapamatuješ si počet sudů a použitou kombinaci.
Potom to zkusíš se dvěma sudy. Pro každý možný první sud vyzkoušíš každý možný druhý sud (tedy dvojitý cyklus) a zase si zapamatuješ, kdy se operace zdařila.
Potom tři sudy, čtyři atd., až ti nakonec sudy dojdou. Pak zobraz ty kombinace, které máš uložené, a vypiš, které se skládají z nejmenšího počtu sudů.

Ukládání nalezených kombinací bych řešil dostatečně dlouhým polem recordů, kde v každém bude zaznamenán počet sudů a kombinace třeba v dalším poli nebo řetězci.

P.S.: Nerad otvírám *.DOCy. Příště radši takovéhle textové informace přilož buď jako textový soubor (*.TXT) nebo je napiš přímo do fóra (když to není moc dlouhé).

Nahlásit jako SPAM
IP: 89.176.249.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Jenicek0
Duch
9. 11. 2007   #6
-
0
-

To Mircosoft :
mohl by jsi mi to taky prepsat do pascalstiny! ja se tady s tim tyram uz od rana a porad mi neco nejede!! :smile11:
DIK :smile1:

Nahlásit jako SPAM
IP: 213.180.53.–
Mircosoft+1
Věrný člen
9. 11. 2007   #7
-
0
-

To nejtěžší (součin polynomů) jsem ti napsal, zbytek snad zvládneš, ne? :-)

No dobře, tady je další nápověda (druhá nejsložitější věc):

procedure Vystup(A: Poly; StA: byte);

var i:byte;
Begin
for i:=sta downto 0 do {downto proto, ze vypisujeme od nejvyssich mocnin k nejnizsim}
if a[i]<>0 then {pokud je tenhle koeficient nenulovy}
begin
if (i<sta)and(a[i]>0) then write('+'); {pokud neni na zacatku a je kladny, napiseme pred nej plus (minus se u zapornych cisel vypisuje automaticky)}
write(a[i],'x^',i); {vypiseme ten koeficient, "x na" a na kolikatou, tj. index v poli}
end;
writeln; {konec radku, pro prehlednost}
End;


Ostatní nechám na tobě, teď už je to jednoduché. Ať z té školy taky něco máš... :-)

Nahlásit jako SPAM
IP: 89.176.249.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Jenicek0
Duch
9. 11. 2007   #8
-
0
-

To Mircosoft :
ahoj, HELE fakt nevim,porad mi to nejak nejede,pac se to tedka ucim poprve! mohl by jsi mi to napsat cely?
abych si to mohl dat i do hlavy dik moc!: :smile1:

Nahlásit jako SPAM
IP: 213.180.53.–
Mircosoft+1
Věrný člen
12. 11. 2007   #9
-
0
-

To Jenicek :
Hoď sem to, co už máš hotové, a já ti řeknu, proč ti to nejede a co máš opravit, aby to jelo. OK?

Nahlásit jako SPAM
IP: 147.32.160.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Jenicek0
Duch
15. 11. 2007   #10
-
0
-

To Mircosoft :
ahoj dobry tam to jsem dal do hromady po nekolika zkouseni ale mam dalsi problem mam udelat
Program ktery udela pocatecni naplnení pole daty a vypis vysledku a aby podle své volby naplnit pole bud daty ctenymi ze vstupu, nebo daty náhodne vygenerovanými. Počet čísel N si muze uzivatel zvolit.

nedal by jsi mi nejaky rady??

Nahlásit jako SPAM
IP: 213.180.53.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
15. 11. 2007   #11
-
0
-

To Jenicek :

takhle nějak to bude vypadat když si má uživatel vybrat kolik náhodných čísel má být vypsáno... když si je bude chtít zadávat sám tak to je podobný akorát upravíš vstup v tom cyklu....



uses crt;
var n=20;
type pole=array[1..n] of integer;

var cisla:pole;
i:integer;
barvy:word;

begin
write('Počet prvků: ');
readln (n);
clrscr;
randomize;

for i:=1 to n do begin
cisla[i]:=random(100);
write(cisla[i]:4);
end;

repeat until keypressed;
end.

Nahlásit jako SPAM
IP: 62.245.78.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
15. 11. 2007   #12
-
0
-

sorry byla tam drobná chybka....

takhle:



uses crt;
var n:integer;
type pole=array[1..n] of integer;

var cisla:pole;
i:integer;
barvy:word;

begin
write('Počet prvků: ');
readln (n);
clrscr;
randomize;

for i:=1 to n do begin
cisla[i]:=random(100);
write(cisla[i]:4);
end;

repeat until keypressed;
end.

Nahlásit jako SPAM
IP: 62.245.78.–
Mircosoft+1
Věrný člen
15. 11. 2007   #13
-
0
-
Nahlásit jako SPAM
IP: 89.176.249.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
15. 11. 2007   #14
-
0
-

moc se omlouvam za svou blbost :-S psal sem to z hlavy a když se to otestoval našel sem další chybu....



uses crt;
type pole=array[1..32000] of integer;

var cisla:pole;
i:integer;
n:integer;

begin
write('Pocet prvku: ');
readln (n);
clrscr;
randomize;

for i:=1 to n do
begin
cisla[i]:=random(100);
write(cisla[i]:4);
end;
repeat until keypressed;
end.

Nahlásit jako SPAM
IP: 62.245.78.–
0-ndr-40
Duch
17. 11. 2007   #15
-
0
-

Potřeboval bych poradit :smile11: , su uplnej začátečník (pomáhá mi tato stránka – kurz pascalu) :smile2: .
Zdroják, kterej je přiloženej mi háže při kompilaci chybu : (50,9)...";" expected but "ELSE" found :smile20:
Budou tam nejspíš i další chyby, ale protože nejsem schopnej tuto odstranit, dál jsem se nedostal. :smile10:
Všem moc dík za odpověď. :smile1:

Nahlásit jako SPAM
IP: 83.240.1.–
Mircosoft+1
Věrný člen
17. 11. 2007   #16
-
0
-

Chybí ti end za příkazem case.

Nahlásit jako SPAM
IP: 85.132.158.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Katherin0
Duch
17. 11. 2007   #17
-
0
-

Katherin napsal:
Prosím o pomoc s touto úlohou. Ovocinár má k dispozícii sud . Obsah tohto suda chce bezozbytku rozliať do ďalších súdkov tak, aby súdok bol buď naplnený doplna, alebo aby nebol použitý vôbec. Ovocinár môže mať k dispozícii viac súdkov toho istého objemu.
Úloha 1: Vypočítajte programom a zobrazte na obrazovke všetky možné riešenia (kombinácie), ako je možné pôvodný objem sudu bezozbytku rozliať do ďalších súdkov.
Úloha 2: Vypočítajte programom a zobrazte na obrazovke optimálne riešenie (alebo riešenia), v ktorom (ktorých) je použitých najmenší počet súdkov.

Konkrétne zadanie
Počet litrov vína k dispozícií: 36
Počet rôznych druhov sudov: 6
Jednotlivé sudy k dispozícii: 2x 5-litrový sud , 3x 9-litrový sud , 1x 15-litrový sud , 1x 21-litrový sud , 1x 26-litrový sud , 2x 31-litrový sud
Dakujem



Ako dostanem z tohto vystup na obrazovku pascala. aby vzniklo toto: Celkovy objem vina: 36 litrov
1. typ sudku - objem: 5 L, pocet sudkov: 2
2. typ sudku - objem: 9 L, pocet sudkov: 3
3. typ sudku - objem: 15 L, pocet sudkov: 1
4. typ sudku - objem: 21 L, pocet sudkov: 1
5. typ sudku - objem: 26 L, pocet sudkov: 1
6. typ sudku - objem: 31 L, pocet sudkov: 2

Riesenie c. 1: (0, 0, 1, 1, 0, 0)
Riesenie c. 2: (1, 0, 0, 0, 0, 1)
Riesenie c. 3: (2, 0, 0, 0, 1, 0)

Celkovy pocet rieseni: 3
Optimalny pocet sudkov: 2
Optimalne riesenia: 1., 2.
za pomoc dakujem

Nahlásit jako SPAM
IP: 62.168.112.–
0-ndr-40
Duch
19. 11. 2007   #18
-
0
-

Nechci bejt hnidopich, ale jen tím end to asi nebude.... Ne že by tam nechybělo, ale i po přidání mi to háže stejnou chybu (51;9 ";" expected..."else" found) :-(
Připojuji opravený zdroj.

Ps.: Nic proti Microsoft, fakt ti moc děkuju za námahu, ale když to stále nefunguje.....

Nahlásit jako SPAM
IP: 83.240.1.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
19. 11. 2007   #19
-
0
-

To 0-ndr-4 : mrknu se ti na to ale máš (podle mě) fakt hroznou upravu... temeř se v tom nevyznam... pokus se vyvyrovat použití label a goto.... misto toho třeba repeat cyklus... nejlepší by bylo to celý překopat ale to se ti asi chtít nebude... mno jak řikam mrknu se ti na to a pak napišu ;)

Nahlásit jako SPAM
IP: 62.245.78.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
19. 11. 2007   #20
-
0
-

tak tady to máš... chybělo ti tam eště jedno end a když píšeš:



if podminka then
begin
prikazy;
end //tak tady neni středník!
else
begin
prikazy;
end; // je totiž až tady :)

//jinak když je to takhle

if podminka then
begin
prikazy;
end; //tak je už tady ale pak už nenásleduje else....





takže tady máš opravenej zdroják toho tvího výzvoru, ale zkus to předělat s cyklama :-)



Program zabava;
uses crt;
label skok,hadanka;
var a,b:real;
funkce,odpoved,matika,konec:char;

begin
clrscr;
writeln;
writeln('Vitej u pouzivani tohoto zabavneho programu!');
writeln('Na zacatek si vyber:');
skok:
writeln(' a) hadanka');
writeln(' b) pocitani');
writeln;
readln(funkce);
if (funkce='A') or (funkce='a') or (funkce='H') or (funkce='h')
then begin
hadanka:
clrscr;
writeln;
writeln('Jisty clovek si nedavno koupil 2 letadla, ale pozdeji');
writeln('zjistil, ze mu nevyhovuji. Prodal je kazde za 600 000 korun,');
writeln('pricemz na jednom prodelal 20% a na druhem 20% ziskal.');
writeln('Tento clovek na tomto obchodu:');
writeln(' a) vydelal');
writeln(' b) prodelal');
writeln(' c) ani jedno');
writeln;
readln(odpoved);
writeln;
case odpoved of
'A','a','+','v','V': begin
write('Ne, toto neni spravna odpoved');
readln;
goto hadanka;
end;
'B','b','-','p','P' : write('Ano, vyborne, respect!');
'C','c','0','n','N' : begin
write('No, kdys se to tak veme....20+20...NEE :/)');
readln;
goto hadanka;
end;
else begin
write('Nespravne zadani, musis zadat a,b nebo c');
readln;
goto hadanka;
end;
end;
end
else begin
clrscr;
writeln('Nejdrive zadej dve cisla a potom vyber akci.');
writeln;
writeln('Zadej prvni cislo a potvrd entrem.');
readln(a);
writeln('Zadej druhe cislo a potvrd entrem.');
readln(b);
writeln('Chces:');
writeln(' a) scitat (+)');
writeln(' b) odcitat (-)');
writeln(' c) nasobit (?)');
writeln(' d) delit (ö)');
writeln;
readln(matika);
clrscr;
case odpoved of
'A','a','+':writeln(a,' + ',b,' = ',a+b);
'B','b','-':writeln(a,' - ',b,' = ',a-b);
'C','c','x','?':writeln(a,' ? ',b,' = ',a*b);
'D','d','/','ö':writeln(a,' ö ',b,' = ',a/b);
else writeln('! SPATNE ZADANI !');
end;
delay(2000);
writeln('Chces se vratit na zacatek? (A/N)');
readln(konec);
if (konec='A') OR (konec='a') OR (konec='Y') OR (konec='y')
then begin
writeln('Muzete si tedy znovu vybrat');
goto skok;
end
else write('Dekuji za pouziti');

readkey;
end;
end.

Nahlásit jako SPAM
IP: 62.245.78.–
Mircosoft+1
Věrný člen
19. 11. 2007   #21
-
0
-

To Katherin (ovocnarovy sudy):

Zkusim to trochu jinak a podrobneji.

Deklarace a definice:

1) Definuj si sudy. Nejjednodussi asi bude pripravit si pole cisel - objemu (v litrech), tedy treba array[0..11] of word. Objemy soudku do nej nahazej jeden za druhym (1 polozka pole = 1 sud). Toto pole si vypln jako konstantu. Dale ho budu nazyvat PoleSudu.

2) Definuj si mnozstvi vina, ktere se ma rozlit - bud ho zapis jako konstantu nebo si ho deklaruj jako promennou (potom ho nechas zadat od uzivatele). Dale LitruCelkem.

3) Definuj si datovou strukturu, do ktere budes ukladat nalezena reseni. Nejlepe pole array[1..hodne] of word, protoze kombinace sudu pujdou elegantne zapsat ve forme cisla (cislo je uvnitr pocitace binarni a jednotlive bity muzeme chapat jako 1 = plny sud, 0 = prazdny sud). Nazveme si to NalezenaReseni. K nemu pak pomocny index, abys vedela, kam zapisovat: IndexReseni - cislo typu treba word.
Take by se to dalo vyridit mnozinami, ale kdyz tech sudu je takhle malo, jsou wordy vyhodnejsi, protoze zaberou mene pameti.

4) Deklaruj si vsechny dalsi pomocne promenne, ktere budes potrebovat: Kombinace, Litru, Bit a dalsi, ktere uvidis v nasledujicim textu. Vsechno cela cisla, treba word.

Program:

1) Inicializuj promenne (vynuluj IndexReseni, pripadne si nech zadat LitruCelkem, pokud ho nemas jako konstantu).

1.5) Vypis objemy soudku. Vzhledem k tomu, ze jsou pevne dane, muzes to osulit:
writeln('1. typ sudku - objem: 5 L, pocet sudkov: 2'); atd.
Jinak by se to delalo cyklem pro kazdy mozny objem, ktery by projel PoleSudu a spocital vsechny sudy s timto objemem a v pripade nenuloveho vysledku by ten objem a pocet vypsal na obrazovku.

2) Nyni prichazi na radu algoritmus hrube sily: vyzkousime veskere mozne kombinace soudku a ty, ktere vyhovuji, si zapamatujeme. Vyuzijeme toho, ze postupnym zvysovanim cisla o 1 se v nem jednotlive bity samy prestavuji tak, ze postupne dostaneme jejich veskere mozne kombinace.

Misto abychom rozlevali vino z velkeho sudu mezi male, udelame to obracene: ruznym zpusobem naplnime soudky, pak je slijeme dohromady a koukame, jestli to dalo presne objem toho velkeho sudu. Pokud ano, je tato kombinace jedno mozne reseni.

for Kombinace:=1 to $0FFF do {obecne takove cislo, ktere se v binarnim tvaru sklada z tolika jednicek, kolik mas ruznych soudku, nyni 12}

begin {jednotlive bity cisla Kombinace predstavuji jednotlive sudy (plny/prazdny)}
Litru:=0; {na zacatku ho vynulujeme}
for Bit:=0 to 11 do {pro kazdy z 12 bitu (cili pro kazdy sud v aktualni kombinaci):}
if ((Kombinace shr Bit) and 1)=1 {prislusny bit si posuneme (shr) doprava (na nejnizsi pozici) a vsechny ostatni vynulujeme (and 1). Kdyz ten bit je 1, znamena to plny sud, takze: ...}
then inc(Litru,PoleSudu[bit]); {...k promenne Litru pricteme (inc) objem prislusneho soudku (tento objem si najdeme v poli PoleSudu)}
if Litru=CelkemLitru {kdyz jsme se touhle kombinaci trefili:}
then begin
inc(IndexReseni); {posuneme se na volnou pozici v seznamu reseni...}
NalezenaReseni[IndexReseni]:=Kombinace; {...a aktualni kombinaci na toto misto ulozime}
end;
end;


3) Ted mame v promenne IndexReseni ulozen pocet nalezenych reseni, tak ho vypis na obrazovku. Pokud je IndexReseni nulovy, koncime, protoze nema smysl se dal hrabat v neexistujicich resenich.
Take vypis jednotliva reseni:
for i:=1 to IndexReseni do {pro kazde z nalezenych reseni:}

begin
write('reseni c. ',i,': (');
for bit:=0 to 11 do
begin
write ((NalezenaReseni[i] shr bit) and 1); {muzeme vypsat rovnou ten bit (0 nebo 1)}
if bit<11 then write(', '); {za kazdym krome posledniho napiseme carku}
end;
writeln(')');
end;


4) Najdeme, ktera reseni jsou optimalni, tj. ktera se skladaji z nejmensiho poctu plnych soudku (cili bitu s hodnotou 1 v poli NalezenaReseni):
Nejmensi:=NalezenaReseni[1]; {prvni cislo z tabulky reseni; slo by misto toho dat nejake hodne velke cislo, hlavne kdyz bude vetsi nez celkovy pocet soudku}

for i:=1 to IndexReseni do {pro kazde z nalezenych reseni:}
begin
Pocet:=0;
for bit:=0 to 11 do {pro kazdy bit}
inc(pocet,(NalezenaReseni[i] shr bit) and 1); {slo by to i ifem - kdyz je bit 1, zvys pocet o 1. Ale jednodussi je to takhle - pricist primo hodnotu toho bitu (0 nebo 1).}
if pocet<Nejmensi then Nejmensi:=pocet;
end;


5) Ted mas v promenne Nejmensi ulozen nejmensi nalezeny optimalni pocet plnych soudku. Tak ho vypis na monitor.

6) Zbyva najit, ktera reseni obsahuji presne tento pocet plnych soudku:
write('Optimalni reseni jsou: ');

for i:=1 to IndexReseni do
begin
Pocet:=0;
for bit:=0 to 11 do inc(pocet,(NalezenaReseni[i] shr bit) and 1);
if pocet=Nejmensi then {pokud toto reseni je optimalni...}
begin
write(i,'.'); {...vypiseme jeho index...}
if pocet<IndexReseni then write(', '); {...a za kazdym krome posledniho napiseme carku}
end;
end;



Hotovo.

Mozna vylepseni:
a) Nahradit pevne dany pocet soudku konstantou - treba PocetSoudku. Pak muzes vsechna cisla 11 nahradit PocetSoudku-1 a budou se ti lip provadet pripadne upravy.
b) Upravit vypis vysledku, aby se zobrazoval pocet sudu prislusneho objemu a ne jenom 1/0.

Nedostatky teto metody:
a) Jestli dostanes vic nez 16 soudku, budes muset brat reseni jako longinty a ne wordy. Jestli dostanes vic nez 32 (pocet bitu longintu), tak je tato metoda nepouzitelna a musis to zaridit nejak jinak (treba pres mnoziny, pak bys mohla mit az 256 sudu).
b) Vypocet muze trvat pomerne dlouho, vzhledem k tomu, ze ten hlavni cyklus jede od 1 do $FFF, cili 4095krat.

Staci to takhle?

Nahlásit jako SPAM
IP: 89.176.249.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
20. 11. 2007   #22
-
0
-

To Anonymní uživatel : Díky hrozně moc, to s těma středníkama sem netušil
a to s tím label..(podívej se na lekci 6 http://programujte.com/index.php?akce=clanek&cl=2005111604-turbo-pascal-6-lekce)
Jinak s tou úpravou sem se to snažil oddělit úrovněmi, nevím, jak jinak to udělat přehlednější,
ale pro příště se určitě vynasnažím. Určitě pokud víš jak to udělat lépe a přehledně tak se rád poučím, jelikož toho zatím moc neznám.

Nahlásit jako SPAM
IP: 83.240.1.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
20. 11. 2007   #23
-
0
-

To Anonymní uživatel : jj.. uprava zaleži na tobě - pokud se ve svich programech chceš vyznat jenom ty... když chceš aby to chápali i jiní tak existuje pár obecně dodržovaných pravidel... o tom bude určitě nekde psáno (google.com) ale vůbec se neboj používat odsazení... a já třeba místo



if podminka
then
begin
blok prikazu;
end
else
begin
blok prikazu;
end;


udělam něco jako



if podminka then
begin
blok prikazu;
end
else
begin
blok prikazu;
end;


ale tech pravidel je vic... obecne platí že čim víc to hustíš k sobě tim je přehlednost horší (aspon já si to myslim). časem si najdeš nějaký svuj, získáš návyky a bude to v pohode... pak jednou otevřeš zdroják svího 2 roky starýho programu a zjistíš že se v tom vyznáš ;)

podíval sem se na ten tvuj odkaz ale to je članek o podminkacha ne o goto a labelech... nevim co jsi tim chtěl řict... faktem je že goto a labely se v profesionální praxy nepoužívá - jistě tedka si říkáš že nejsi porfík a asi ním ani být nechceš ale veř mi, oni mají důvod proč to nepoužívat :-)

P.S. programujte.com neni jediná stránka na světě podle které se můžeš učit programovat - koukni taky třeba na http://pascal.webz.cz

Nahlásit jako SPAM
IP: 62.245.78.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
20. 11. 2007   #24
-
0
-

jo eště k tem středníkum... středníkem se v pascalu oddělují (ukončují) jednotlivé příkazy... tzn jestliže máš příkaz IF tak ho nemužeš ukončit za then protože to else pak k ničemu nepatří a samotný else mít nemužeš tzn nastane chyba... nevim jestli sem to napsal dost srozumitelně... kdyžtak eště zagoogli...

Nahlásit jako SPAM
IP: 62.245.78.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
21. 11. 2007   #25
-
0
-

To Anonymní uživatel : Díky, tím odkazem sem ti chtěl ukázat, že to tam je řešený s goto a label a jelikož jsem přibližně na té úrovni(podle toho), tak sem to udělal víceméně podle toho. To že nepředpokládám že budu profesionálně programovat v Pascalu neznamená že nechci umět dělat dobrý kódy. Ty středníky už chápu, dík. To že není programujte.com jediná stránka vím, nejsem aš taková lama, ale ňák sem se tu zabydlel – tzn. učím se tady, pak jdu jinam – zopakuju si a doučím se. Jinak nevím jak to chceš udělat bez label a goto. Možná cykly....
0-ndr-4

Nahlásit jako SPAM
IP: 83.240.1.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
21. 11. 2007   #26
-
0
-

To Anonymní uživatel : ne možná cykly ale určitě cykly... přesněji cykly se zjištováním podmínky na konci - repeat cyklus... použití label a GoTo je podle mě prasárna a mělo by se to zakázat.... je to pozustatek z doby basicu....
D3V1L

Nahlásit jako SPAM
IP: 62.245.78.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
22. 11. 2007   #27
-
0
-

kdyby ti to nešlo s těma cyklama tak napiš na mha.phone@centrum.cz ;-)

Nahlásit jako SPAM
IP: 62.245.78.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
27. 11. 2007   #28
-
0
-

Ahoj mam napsat takovy program :
Textový soubor obsahuje text s dlouhými řádky. Napište program, který vytvoří kopii tohoto souboru tak, že řádky delší než N znaků rozdělí podle potřeby vždy na dva nebo více řádků po nejvýše N znacích (N je konstanta uvedená v programu, např. N=80).
Prosim porad te nejak?

Nahlásit jako SPAM
IP: 213.180.53.–
Mircosoft+1
Věrný člen
28. 11. 2007   #29
-
0
-

program:

priprav a otevri soubory;

repeat
nacti radek;
...zpracovani radku...
until eof(vstupni soubor);
zavri soubory;



zpracovani radku:

while length(Radek)>zadana delka do {dokud je radek delsi nez ma byt}

begin
kus:=usek ze zacatku radku (od 1. znaku) o pozadovane delce; {funkce Copy}
ten usek ze zacatku radku vymaz; {funkce Delete}
zapis kus do vystupniho souboru; {procedura Writeln}
end;
zapis Radek do vystupniho souboru; {touhle dobou uz je urcite kratsi nez pozadovane maximum}



Pokud maximalni delka tech "dlouhych" radku nepresahuje 255 znaku, je to v pohode. Pokud presahuje, mas dve moznosti:
1) Misto readln(soubor,radek) napsat readln(soubor,radek1,radek2,radek3) atd., pocet podle potreby. Radek se automaticky rozdeli do tech zadanych stringu, ale potom bude trochu tezsi z nich krajet kousky o zadane delce.
2) Misto stringu pouzit pchar (retezec ukonceny znakem #0), ktery muze mit az 65527 znaku. Na to budes potrebovat standardni jednotku Strings.

Nahlásit jako SPAM
IP: 147.32.164.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
29. 11. 2007   #30
-
0
-

prosim te muzes mi ten radek jeste vic rozepsat?? dik
vim ze to bude do 255 znaku takze pohoda

Nahlásit jako SPAM
IP: 213.180.53.–
Mircosoft+1
Věrný člen
29. 11. 2007   #31
-
0
-

Co takhle mrknout do helpu? (najeď kurzorem nad jméno dané standardní funkce a zmáčkni Ctrl+F1)

copy(Řetězec,Index,Počet) - funkce, která vrací úsek z daného Řetězce dlouhý Počet znaků a začínající na Index-tém znaku (první znak má index 1).
length(Řetězec) - funkce, která vrací délku daného Řetězce (ve znacích).
delete(Řetězec,Index,Počet) - procedura, která vymaže z daného Řetězce úsek dlouhý Počet znaků a začínající na Index-tém znaku (v minulém příspěvku jsem chybně napsal, že to je funkce).
writeln(Soubor,Něco) - procedura, která zapíše do textového souboru Soubor (otevřeného pro zápis) řetězec (nebo jinou proměnnou, hodnotu nebo výraz) Něco.
Budeš potrebovat dvě proměnné typu string. Jednu na načtení celého řádku, do druhé budeš ukládat kousky, které z toho řádku nařežeš (i když by to šlo zapsat tak, že bys tuhle druhou proměnnou nepotřeboval - do souboru se dá zapsat rovnou výsledek funkce Copy).

P.S.: Stejně si to radši překontroluj podle helpu, protože si nejsem úplně jistý, jestli jsem parametry u Copy a Delete napsal ve správném pořadí.

Nahlásit jako SPAM
IP: 147.32.160.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
tymes
~ Anonymní uživatel
4 příspěvky
5. 12. 2007   #32
-
0
-

ahojky lidicky potreboval bych nejaky navod na vyreseni ulohy
V textovém souboru jsou uložena celá čísla.Počet všech čísel není předem znám a může být velmi velký (nelze tedy uložit si všechna čísla do pole!). Soubor není nijak uspořádán, hodnoty čísel se v něm mohou jakkoliv opakovat. Napište program, který určí počet různých hodnot obsažených v tomto souboru.


DIk

Nahlásit jako SPAM
IP: 213.180.53.–
Mircosoft+1
Věrný člen
5. 12. 2007   #33
-
0
-

Prohledej to tady, uz jsem na to jednou odpovidal. :smile10: :smile20:

Nahlásit jako SPAM
IP: 147.32.164.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
mirek
~ Anonymní uživatel
62 příspěvků
6. 12. 2007   #34
-
0
-

ahoj,pls potreboval bych pomoct z ukolem. Mam napsat proceduru ktera vypise kolik kladnych a kolik zapornych cisel je v poli a indexy kladnych a zapornych cisel, zatim mam hotove jen procedury na nacteni a tisk pole ale nevim jak mam vypsat ty indexy. např index kladného čísla v poli A[1,3]

Nahlásit jako SPAM
IP: 90.176.43.–
Mircosoft+1
Věrný člen
7. 12. 2007   #35
-
0
-

Indexy prvku A[1,3] jsou 1 a 3 (a je to dvojrozměrné pole; jednorozměrné by bylo třeba A[3]). Předpokládám, že ses k tomuhle prvku pole dostal cyklem pomocí nějakých indexů (proměnných - čísel): A[i,j], kde i=1 a j=3. Tak prostě vypiš ta čísla i a j.

Nahlásit jako SPAM
IP: 89.176.249.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
mirek
~ Anonymní uživatel
62 příspěvků
7. 12. 2007   #36
-
0
-

ja neznam presne index toho prvku mam do pole nacist cisla z klavesnice a pak pomoci procedury vypsat indexy kladnych a zapornych cisel. Zkousel jsem ty prvky kopirovat do druheho pole ale nejak mi to porad nejede.

procedure nacti(var p:Tpole;r,s:integer);

var i,j:integer;
begin
for i:=1 to r do
for j:=1 to s do
readln(p[i,j]);
end;

procedure tisk(var p:Tpole;r,s:integer);
var i,j,kladne,zaporne:integer;
begin
kladne:=0;
zaporne:=0;
for i:=1 to r do
begin
for j:=1 to s do
begin
write(p[i,j]:3);
if p[i,j]>0 then
kladne:=kladne+1;
if p[i,j]<0 then
zaporne:=zaporne+1;
end;
writeln;
end;
writeln('Pocet kladnych cisel je: ',kladne);
writeln('Pocet zapornych cisel je: ',zaporne);
end;

Nahlásit jako SPAM
IP: 90.176.43.–
Mircosoft+1
Věrný člen
7. 12. 2007   #37
-
0
-

Stačí připsat pár drobných úprav do procedury tisk (vyznačeny tučně):

procedure tisk(var p:Tpole;r,s:integer);

type PoleIndexu=array[1..KolikBudePotreba] of record
i,j:integer;
end;

var i,j,kladne,zaporne:integer;
IndexyKladnych,IndexyZapornych:poleindexu;
posledniK,posledniZ:integer;
procedure UlozKladneIndexy(radek,sloupec:integer);
Begin
poslednik:=poslednik+1;
with indexykladnych[poslednik] do begin
i:=radek;
j:=sloupec;
end;
End;
procedure UlozZaporneIndexy(radek,sloupec:integer);
...podobně, jenom použij pole IndexyZapornych a proměnnou posledniZ...
Begin {tisk}
kladne:=0;
zaporne:=0;
posledniK:=0;
posledniZ:=0;

for i:=1 to r do
begin
for j:=1 to s do
begin
write(p[i,j]:3);
if p[i,j]>0 then begin
kladne:=kladne+1;
UlozKladneIndexy(i,j);
end
else
if p[i,j]<0 then begin
zaporne:=zaporne+1;
UlozZaporneIndexy(i,j);
end;

writeln;
end;
writeln('Pocet kladnych cisel je: ',kladne);
writeln('Pocet zapornych cisel je: ',zaporne);
writeln('Kladna cisla jsou na pozicich: ');
for i:=1 to posledniK do write(indexykladnych[i].i,',',indexykladnych[i].j,'; ');
writeln;
writeln('Zaporna cisla jsou na pozicich: ');
for i:=1 to posledniZ do write(indexyzapornych[i].i,',',indexyzapornych[i].j,'; ');
writeln;

End;

Hodnotu KolikBudePotreba dej rovnou maximálnímu možnému počtu čísel v poli tPole.
Ukládání indexů samozřejmě není nutné (a v tomhle případě ani výhodné) dávat do samostatných procedur. Napsal jsem to tak proto, že mi to připadalo přehlednější.

Nahlásit jako SPAM
IP: 89.176.249.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
mirek
~ Anonymní uživatel
62 příspěvků
7. 12. 2007   #38
-
0
-

diky moc

Nahlásit jako SPAM
IP: 90.176.43.–
tymes
~ Anonymní uživatel
4 příspěvky
7. 12. 2007   #39
-
0
-

tak jsem nacetl cisla do souboru ale porad mi nejde vymyslet jak je mam spocitat?

Nahlásit jako SPAM
IP: 213.180.53.–
Mircosoft+1
Věrný člen
7. 12. 2007   #40
-
0
-
Nahlásit jako SPAM
IP: 88.102.102.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
tymes
~ Anonymní uživatel
4 příspěvky
7. 12. 2007   #41
-
0
-

no jo ale ten ucitel to nechce prave do toho pole tak proto nevim jak nato!

Nahlásit jako SPAM
IP: 213.180.53.–
Mircosoft+1
Věrný člen
8. 12. 2007   #42
-
0
-

Prostě vynech ten krok načtení do pole. Místo toho, abys čísla načetl všechna a pak je jedno po druhém tahal z pole a zpracovával, je zpracovávej rovnou v tom momentě, kdy je načítáš. Na napsání to bude ještě jednodušší než s tím polem.

Nahlásit jako SPAM
IP: 85.132.158.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
tymes
~ Anonymní uživatel
4 příspěvky
8. 12. 2007   #43
-
0
-

ok tak ja to zkusim nejak udelat! dik

Nahlásit jako SPAM
IP: 213.180.53.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
10. 12. 2007   #44
-
0
-

Mircosoft napsal:b) Upravit vypis vysledku, aby se zobrazoval pocet sudu prislusneho objemu a ne jenom 1/0.


a ako sa to da spravit?

Nahlásit jako SPAM
IP: 85.216.222.–
Pavel
~ Anonymní uživatel
383 příspěvků
10. 12. 2007   #45
-
0
-

Zdravim,mam na vas velkou prosbu :) ,do stredy mam odevzdat projekt tohoto prikladu a zatim to nemuzu zprovoznit tak,aby to splňovalo pozadavky,tak pls moc by mi pomohlo kdyby mi nekdo poradil,predem diky moc.

Sestavte proceduru pro vytvoření matice řádu k, rovnající se submatici z dané matice - submatice je vymezena indexy i1, j1, k (i1 - počáteční řádkový index, j1 - počáteční sloupcový index v dané matici, k - řád submatice). Proceduru použijte v programu, který načte čtvercovou matici celých čísel, vypíše ji a potom vytvoří a vypíše dvě zadané submatice z načtené matice. Při práci s procedurami nepoužívejte globální proměnné.

Nahlásit jako SPAM
IP: 85.71.209.–
Mircosoft+1
Věrný člen
10. 12. 2007   #46
-
0
-

To Pavel : Obě matice udělej jako 2D pole čísel (array[1..něco,1..něco] of ...). Submatici vytáhneš pomocí dvojitého for-cyklu:

pro každý prvek vytvářené submatice (indexy i pro řádek a j pro sloupec) dělej:

vytáhni ze zdrojové matice hodnotu na indexech [lhy+i-1, lhx+j-1]
ulož ji do submatice na indexy [i,j]
konec;

lhx, lhy je poloha levého horního rohu submatice nad původní maticí (počítáno od 1).


To Anonymní uživatel : Udělej si ještě jedno pole, ve kterém budeš mít počty sudů (indexy odpovídají objemům). Pak projdi výsledek a koukej, jakému sudu odpovídá který bit a když je 1, zvyš o 1 počet příslušného sudu.

Nahlásit jako SPAM
IP: 89.176.249.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
11. 12. 2007   #47
-
0
-

To Mircosoft :
no ja s tym este neviem moc dobre robit a nechapem niektore veci. mohol by si sem hodit zdrojak toho? (ak to nestoji prilis vela casu :P) dik

Nahlásit jako SPAM
IP: 85.216.222.–
Pavel
~ Anonymní uživatel
383 příspěvků
11. 12. 2007   #48
-
0
-

diky moc,ja to predtim delal jinak

Nahlásit jako SPAM
IP: 85.71.209.–
Mircosoft+1
Věrný člen
11. 12. 2007   #49
-
0
-

To Anonymní uživatel : nejdřív sem hoď ten svůj :smile3:

Nahlásit jako SPAM
IP: 89.176.249.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
11. 12. 2007   #50
-
0
-

To Mircosoft :
no to je cast zdrojaku co si uverejnoval ty sam, ono to funguje dobre, len potrebujem vedet ako upravit toto

for i:=1 to IndexReseni do {pro kazde z nalezenych reseni:}
begin
write('reseni c. ',i,': (');
for bit:=0 to 11 do
begin
write ((NalezenaReseni[i] shr bit) and 1); {muzeme vypsat rovnou ten bit (0 nebo 1)}
if bit<11 then write(', '); {za kazdym krome posledniho napiseme carku}
end;
writeln(')');
end;

takze mam napriklad sudky 4l, 6l, 8l, 12l, 13l, 18l (z niektoreho objemu mam k dispozicii viac sudkov)
a potrebujem zmenit vypis na nieco co bude vypisovat riesenie v tvare :
Riesenie c. 3: (2, 3, 1, 0, 0, 0) /namiesto napriklad ( 1,1,0,0,1,1,1,0,1,0,0,0) /
kde cisla znamenaju pocet sudkov prislusneho objemu, pricom objem sudkov je uvedeny v zadani
tzn tento vypis znamena 2x 4l sud, 3x 6l sud, 1x 8l sud, a ostatne su nevyuzite.

Nahlásit jako SPAM
IP: 85.216.222.–
Mircosoft+1
Věrný člen
13. 12. 2007   #51
-
0
-

:smile15:
Deklaruj si tohle:

const PocetVelikostiSudu=4; {kolik mas ruznych objemu soudku, zadej podle skutecnosti}


var soudky:array[1..pocetvelikostisudu] of record
objem:word;
pocet:word;
end;

Jde o pole, ve kterém máš uloženy soudky po skupinách. Každý prvek pole (record) je jeden typ soudků. Položka objem říká, jaký objem soudky v této skupině mají a do položky pocet se uloží počet soudků, které byly v daném řešení využity. Objemy na začátku vyplň podle zadání.

V programu to pak můžeš udělat třeba takhle:
for i:=1 to IndexReseni do {pro kazde z nalezenych reseni:}

begin
{tady vynuluj polozku pocet ve vsech prvcich pole Soudky}
for bit:=0 to 11 do
if ((NalezenaReseni[i] shr bit) and 1)=1 {soudek je plny}
then begin
for x:=1 to PocetVelikostiSudu do {projdi pole Soudky}
if soudky[x].objem=polesudu[bit] {kdyz zjistis, ze tenhle je ten pravy...}
then begin
inc(soudky[x].pocet); {...zapamatuj si to...}
break; {...a vyskoc z tohohle cyklu}
end;
end;
{Teď máš v poli Soudky uloženo, jaký objem je tam kolikrát,
tak to v nějakém vhodném tvaru vypiš na obrazovku.}
end;

Zbytek už zvládneš, držím palce.

Nahlásit jako SPAM
IP: 89.176.249.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
16. 12. 2007   #52
-
0
-

To Mircosoft : dik moc ;) pomohol si mi

Nahlásit jako SPAM
IP: 85.216.222.–
17. 12. 2007   #53
-
0
-
Nahlásit jako SPAM
IP: 195.28.90.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 4 hosté

Podobná vlákna

Program v pascale. — založil lopotka

Ako to napisem v pascale? — založil Martin Mucha

Program s procedurami v Pascale — založil martinko18

Pomoc s príkladmi v pascale — založil Panther1svk

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý