Anonymní profil Michal – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Michal – Programujte.comAnonymní profil Michal – Programujte.com

 

Příspěvky odeslané z IP adresy 212.118.224.–

Pascal › Simulace pohybu molekul
28. 6. 2013   #178530

Takže kostru bych viděl nějak takhle:

připrav si pole částic, vyplň ho počátečními hodnotami
přepni se do grafického režimu (Initgraph)
 repeat
 pro každou částici:
   begin
   smaž částici (tj. vykresli ji v barvě pozadí)
   x:=x+vx;
   if (x<levá_hranice)or(x>pravá_hranice) then vx:=-vx;
   obdobně pro y
   vykresli částici viditelnou barvou
   end;
 chviličku počkej (Delay) until nějaká ukončovací podmínka, třeba Keypressed
ukonči grafický režim (Closegraph)

Odrážení jsem nenapsal úplně ideálně, odraz nastane až kousíček (0..v) za stěnou. Teoreticky by se dal najít přesný průsečík, ale asi je to zbytečná práce - nepřesnosti stejně nebudou pouhým okem viditelné. Jo, a předpokládám správně, že nechceš řešit srážky jednotlivých molekul navzájem?

Práce s grafikou závisí na tom, jaký překladač používáš. TP? FP? Delphi? Něco jiného? Výše uvedené příkazy platí pro TP a FP.

Zaokrouhlené souřadnice nemusíš ukládat, stačí zaokrouhlovat až v okamžiku kreslení: putpixel(round(x),...atd..

Částice bych uložil do pole (array). Buď jedno pole, kde každý prvek je typu record a obsahuje x, y a obě rychlosti, nebo čtyři samostatná pole pro x, y atd. (první varianta se učitelům bude líbit víc). Přístup v prvním případě např. castice[i].vx, ve druhem vx[i]. Nevím, jakým způsobem budou zadané počáteční podmínky (počet částic, jejich polohy a rychlosti) - jestli si je máš vygenerovat náhodně (funkce Random) nebo zadat ručně do zdrojáku jako konstanty nebo načíst ze souboru. Kdyžtak to nějak upřesni.

Pascal › Zaokrouhlení na stovky
19. 6. 2013   #178215

V tom případě ti asi chybí end; na konci té funkce. Jestli ne, ukaž celý zdroják, ať nemusíme hádat.

Ještě pár poznámek pro upřesnění:

Ad #12: Žádná knihovna Math v TP 7 standardně není. Základní matematické funkce (pro zaokrouhlování jenom Round, Trunc, Frac a Int) jsou definované přímo v jednotce System (která se do Uses nepíše), všechno ostatní je potřeba doprogramovat ručně. V Crt není matematického nic.

Ad #10: Operátory div a mod se dají použít jenom s celými čísly, ne s reálnými - proto ta chyba.

Pascal › sirka pasma matice
18. 6. 2013   #178158

Chápu dobře, že se vzdálenost od diagonály počítá takhle?

1 2 3 4 5
2 1 2 3 4
3 2 1 2 3
4 3 2 1 2
5 4 3 2 1

Tenhle čtverec jsem vygeneroval vzorcem vzdálenost(i,j)=abs(i-j)+1. Ten můžeš pustit na každý prvek zkoumané matice a při kombinaci nenulového prvku a největší dosud dosažené vzdálenosti si tu vzdálenost uložit. Jednoduché, ale z hlediska rychlosti ne zrovna optimální.

Rychlejší by bylo procházet matici od nejvzdálenějších prvků k nejbližším (ideálně stylem cikcak: 554444333333...) a při nalezení první nenulové hodnoty uložit aktuální vzdálenost a skončit.

Pascal › Zaokrouhlení na stovky
17. 6. 2013   #178120

Díky za upřesnění, předpokládal jsem celočíselný vstup. Pokud jde o reálná čísla, rád si to taky nechám vysvětlit :-).

Pascal › Zaokrouhlení na stovky
17. 6. 2013   #178105

Pro zaokrouhlování nahoru existuje jeden docela elegantní postup:

1) Přičti číslo o 1 menší než to, na které zaokrouhluješ (v případě desítek 9, v případě stovek 99, v případě šestnáctek 15 apod.).

2) Vynuluj ty spodní cifry, které chceš mít nulové (v případě stovek třeba odečtením zbytku po dělení stem, při zaokrouhlování na "binárně kulatá" čísla se dá s výhodou použít and).

3) A je to.

Jak to funguje? Dejme tomu, že máme číslo 2300. Přičteme 99, dostaneme 2399. Odečteme 2399 mod 100, dostaneme zpátky 2300 - nula zaokrouhlená nahoru zůstane nulou. A když tam nula nebude: 2302+99=2401, 2401-(2401 mod 100)=2400.

Pro zaokrouhlení dolů prostě vynech krok 1.

Pascal › Spojový zoznam
17. 6. 2013   #178094

akt:=prvy;
while akt<>nil do
begin
if je to ten, který hledám then vypiš ho;
akt:=akt^.dalsi;
end;

Pascal › Zaverecná práce, knihovna gr…
22. 5. 2013   #176484

Jakou chybu? Jestli "BGI error: graphics not initialized, use Initgraph", tak buď nemáš ve stejném adresáři soubor EGAVGA.BGI, nebo to autor programu zvoral a zadal v initgraphu absolutní cestu k tomu souboru, takže to jinde než na jeho počítači chodit nebude.

Pascal › Zaverecná práce, knihovna gr…
22. 5. 2013   #176479

Máš dvě nezávislé proměnné (T a L) a jednu funkční hodnotu (g). Takže si nejdřív ujasni, jak ten graf má vypadat - tedy co bude x a co y.

Vlastní kreslení grafů jsme tady probírali nedávno: http://programujte.com/…rovo-schema/ , příklad na spuštění grafiky tam najdeš. Podrobnější popis funkcí jednotky Graph je třeba tady: http://mircosoft.mzf.cz/…/ZAKLADY.TXT .

Pascal › Zaverecná práce, knihovna gr…
22. 5. 2013   #176449

#1 Proksa
Na první pohled to vypadá syntakticky správně a mělo by to i fungovat, ale otázka je, jestli to, co to dělá, je to, co chceš :-). Hodilo by se vidět zadání. Například nechápu, jak se ze dvou čísel a jednoho výsledku dá udělat graf.

Pár připomínek do začátku:

- Všechny ty úseky "if i=něco then..." dělají to samé, jenom načítají z jiných souborů. Jestli to tak zůstane, není důvod psát stejný kód pětkrát - stačilo by podle i nastavit jméno souboru a pak data jednou načíst. A mimochodem, znáš příkaz Case?
- #32 je mezera a dá se psát i přímo.
- Máš tam spoustu dost chaotického čekání na stisk libovolné klávesy (Readkey). Někdy se čeká víckrát po sobě, takže první stisk nic neudělá. Někdy píšeš "stiskni enter", ale čekáš na cokoli. Někdy říkáš, aby se stisklo 1 až 5, jenže Readln vyžaduje navíc enter.
- Uživatel, který program vidí poprvé a nemá před sebou zdroják, nepochopí, co se vlastně děje, co má zadávat a co znamenají ta čísla, která program zobrazuje.

Víc ti neporadím, protože nevím, co to přesně má dělat.

Pascal › prevod z string na ciselny typ
6. 5. 2013   #175860

Jestli myslíš jenom převod víceciferných čísel, tak na to je v TP standardní příkaz Val, v Deplhi tuším Strtoint nebo tak nějak. Dáš mu číslo zadané jako text a on ti vrátí převedené číslo a kód, podle kterého poznáš, jestli se mu převod povedl nebo tam někde našel chybu (třeba písmeno).

Jestli tou rovnicí myslíš něco jako '12+34*(3/15)', tak to už tak triviální není, ale taky to jde. Pro inspiraci třeba http://mircosoft.mzf.cz/…d/vyrazy.zip .

Pascal › Matice - sloupec s největším…
6. 5. 2013   #175841

#2 Sniper

Abychom Lukáše nemátli: po syntaktické stránce je ten jeho program v pořádku, v TP nebo FP půjde přeložit i spustit.
S tím ostatním máš samozřejmě pravdu.

Pascal › Hornerovo schéma
30. 4. 2013   #175606

Na mail se mi proklikáš přes podpis, ale lepší bude pokračovat tady, ať z toho něco mají i ostatní.

Pascal › Hornerovo schéma
30. 4. 2013   #175599

Program ti funguje? Tak ho sem hoď, ať nemusím hádat jen tak naslepo.

Pascal › Hornerovo schéma
30. 4. 2013   #175584

Říkala jsi, že program máš naprogramovaný a nejde ti akorát graf. Takže jsem předpokládal, že máš hotovou funkci, které dáš x a ona ti vyplivne y. Jestli ne, tak si tohle vlákno projdi od začátku, už jsme to tam jednou probírali a nechce se mi to samé psát ještě jednou ;-).

Array [0..něco] of real využiješ spíš pro uložení koeficientů toho polynomu, pro kreslení grafu žádné pole nepotřebuješ. Stačí ti jedna proměnná x a případně y. Protože x je reálné číslo, nedá se použít jako řídicí proměnná pro cyklus For, takže to budeš muset obejít jiným typem cyklu, třeba:

x:=LevaMez;
 repeat
 y:=horner(x);
 lineto(round(pocatekx+meritko*x),round(pocateky-meritko*y));
 x:=x+krok;
 until x>=PravaMez;

Ideální by bylo udělat For pro každé x na obrazovce (0..Getmaxy) a k němu zpětně spočítat reálné x pro funkci, ale to můžeme nechat na jindy.

Ten program na kreslení čar ti nebude fungovat, protože mu chybí hodnoty pro proměnné x1, x2, y1 a y2 a taky slovo Repeat, ke kterému je dole Until. Ale grafiku používáš správně, takže vyjít z toho určitě můžeš.

Pascal › Hornerovo schéma
29. 4. 2013   #175560

S čím přesně je problém? S grafikou jako takovou, nebo s přepočty souřadnic bodů na obrazovku?

Grafiku standardně řeší jednotka Graph: Initgraph ji spouští, Closegraph ukončuje, Cleardevice maže obrazovku, Setcolor nastavuje barvu pro kreslení, Putpixel kreslí bod, Moveto posunuje grafický kurzor, Lineto kreslí čáru od kurzoru do nového bodu a zároveň tam posouvá kurzor, Outtext a Outtextxy zobrazují texty (plus hafo dalších funkcí, které asi nevyužiješ). Tohle funguje v TP, BP a snad i FP, ale za ostatní překladače (Delphi apod.) neručím.

Takže dejme tomu, že ti grafika běží. Udělej si cyklus, který do x postupně přiřazuje hodnoty z nějakého vhodného intervalu, pro každé x spočítá y (to umíš, ne?), spočítej, na který pixel se vypočítaný bod promítne, a vybarvi ho. Pro xový směr stačí vynásobit hodnotu nějakým měřítkem (záleží na tom, jak široký interval chceš zobrazit) a přičíst souřadnice počátku (protože na obrazovce x začíná u levého okraje obrazovky a ne uprostřed). Pro yový směr je to podobné, ale navíc je potřeba otočit znaménko, protože y na obrazovce začíná u horního okraje a přibývá směrem dolů. Tedy xobr=počátekx+měřítko*x a yobr=počáteky-měřítko*y. Výsledky je potřeba zaokrouhlit na celé pixely (Round).

Pascal › Program v Pascalu
15. 3. 2013   #172837

V podstatě nic extrémně obtížného, s datumem by to bylo mnohem horší. Potřebuješ:

1) Rozdělit si zadané hodnoty (předpokládám, že budou zadané jako text, čili typ String) na tři dvojčíslí. Na to existuje funkce Copy.

2) Jednotlivá dvojčíslí převést z lidsky čitelného textu na počítačem pochopitelná čísla. Na to je procedura Val.

3) Tyhle cifry nemůžeš rovnou odčítat, to by vyšly blbosti (např. 01:00:00-00:59:00=01:-59:00 místo 00:01:00). Nejdřív z nich musíš udělat jedno číslo, třeba převodem hodin a minut na společný jmenovatel (sekundy) a sečtením.

4) Výsledná dvě čísla stačí navzájem odečíst a máš celkový rozdíl v sekundách.

5) Výsledek musíš převést zpátky do šedesátkové soustavy, to uděláš pomocí operátorů Div (celočíselné dělení) a Mod (zbytek po dělení).

6) Výsledná tři čísla vypíšeš buď rovnou (write nebo writeln), nebo je nejdřív upravíš na dvojciferný tvar s nulou na začátku (procedura Str pro převod čísla na text, funkce Length na zjištění délky a případně připojení znaku '0' zleva).

Potíže by mohly začít okolo půlnoci (přetečení z 23:59:59 na 0:00:00), ale pro začátek to nebudeme komplikovat.

Pascal › Databáze v Pascalu
11. 3. 2013   #172585

To bude asi tím, že ta druhá část není celý program :-).

#26 blekota:

Ještě jednou mi vyknou a začnu jim onikat :-D.

Před nastavení nové Volby podle stisknuté klávesy musíš dát vyber:=readkey, jinak ti program rovnou skočí podle minule nastavené hodnoty Vyberu. To by způsobilo zaseknutí programu v nekonečné smyčce mezi obrazovkami Zacatek a Menu.

Část Konec se ti vůbec neprovede. Příkaz case nechá proběhnout vždycky jenom jednu větev, v tomhle případě nějakou, která nastaví volba:=konec, a než ho ten cyklus spustí znovu, ukončí ho podmínka until volba=konec. Zatím to sice nevadí, protožeKonecProgramu v podstatě nic nedělá, ale jestli do ní později dopíšeš nějaký důležitý "závěrečný úklid", budeš to muset upravit. Napadají mě dvě řešení. První: konec si rozdělit na dvě fáze, třeba konec1 a konec2. Menu po stisknutí K nastaví volba:=konec1. Odstavec Konec v hlavním case se změní na Konec1 a po provedení úklidu nastaví volba:=konec2. A ukončovací podmínka hlavního cyklu se změní na until volba=konec2. Nebo druhé možné řešení: hlavní cyklus udělat nekonečný (until false) a v odstavci Konec použít Break, který z cyklu vyskočí.

Ve výpisu máš pořád ještě špatně ten úvodní reset, se souborem tabulka.txt musíš proměnnou S propojit assignem, stejně jako to děláš o pár řádků níž. Plus pár chybiček od minula, o kterých už jsem jednou psal. Upravený výpis je o fous lepší, ale ještě potřebuje pár dalších úprav: smaž reset tabulky, i:=0, while a close, nech jenom ten for. Výpis záznamů je OK.

Mimochodem, zatím je ten kód nezkompilovatelný. Kromě toho divokého resetu ti tam zůstalo ještě zapomenuté návěští volba_nwm. Není od věci číst chybové hlášky překladače a přemýšlet, co asi znamenají. Nevím jak v Delphi, ale v TP to docela pomáhá.

Pascal › Databáze v Pascalu
8. 3. 2013   #172480

Ohledně grafiky: jasně, Graph. Ale v ní jsou jenom funkce jako start a konec grafického režimu, vyplnění celé obrazovky nějakou barvou, kreslení bodů, čar, obdélníků, kruhů, elips a podobně a psaní textu libovolným fontem a velikostí. Není tam ovšem pár drobností jako třeba zadávání textu z klávesnice (nějaká obdoba Readln), blikající kurzor a tak. To by sis všechno musel dotvořit sám: čtení kláves přes Readkey, vypsání znaku na obrazovku, při zmáčknutí Backspacu přemáznutí posledního znaku obdélníkem v barvě pozadí a posun kurzoru zpátky, vykreslení kurzoru čárou nebo podtržítkem atd.. Kdybys chtěl, mám na tyhle věci hotovou sadu jednotek, ale je to v podstatě jenom emulace windowsí grafiky v TP - to v Delphi uděláš rovnou a prakticky bez práce.

A teď ke tvému zdrojáku.

Za goto tě neukamenuju, jenom naznačím, jak se dá pohodlně obejít bez něj:

var volba:(zacatek,konec,menu,napoveda,deklarace,pridavani,vypis);
...
volba:=zacatek;
 repeat
 case volba of
  zacatek:begin
          ...sem dej to, co mas za navestim volba_zacatek, zaver predelej na:
          case vyber of 'k','K':volba:=konec;
                        'n','N':volba:=napoveda;
                        else volba:=menu;
                        end;
          end;
  menu:begin
       ...to co mas v uvodu, nakonec tohle:
       case vyber of 'z','Z':volba:=deklarace;
                     'p','P':volba:=pridavani;
                     ...atd...
                     end;
       end;
  ...atd...
 until volba=konec;

Plus ještě doporučuji lépe využívat funkci Upcase, abys nemusel testovat velkou i malou variantu zadaného písmena.

Typ TRadky a proměnnou Radky poněkud nechápu. Co s polem třiceti čísel? Kdybys do toho chtěl ukládat obsah databáze, muselo by to být pole array[0..hodně] of string[přiměřeně]. K jednotlivým buňkám bys pak přistupoval přes jeden index, který by se vypočítal jako řádek*počet_sloupců+sloupec. To by předpokládalo počítat řádky a sloupce od nuly, jinak by se to muselo upravit na (řádek-1)*počet_sloupců+(sloupec-1). Ale dokud máš data jenom v souboru, tohle nebudeš potřebovat.

Procedura VymazatTabulku nebude fungovat, protože proměnnou typu text nemůžeš jen tak vypsat na obrazovku - je to blok informací o souboru určený pro operační systém, ne pro lidi, takže není čitelný. Správě by poslední příkaz měl být writeln('Soubor tabulka.txt byl smazan!');.

Zacatek: z praktického hlediska nevidím důvod, proč dělat takovéhle "předmenu", když by se odkaz na nápovědu, informace o verzi atd. daly zabudovat do hlavního menu o kousek dál. Ale chyba to není. Jenom to návěští volba_menu je tu dost nevhodné, protože když sem skočíš odjinud, nebudeš mít vypsanou nabídku kláves, které máš zmáčknout.

Uvod: tady už ses do těch skoků a cyklů pěkně zamotal. Když se zmáčkne Esc, program neskončí (jak každý uživatel očekává), ale počká na stisk Enteru (jedno zbloudilé readln;) a pak pokračuje odstavcem jump_deklarace. Až to všechno předěláš na cyklus s casem uvnitř, tyhle problémy zmizí.

Deklarace: já osobně bych si to rozdělil na dvě samostatné části: zadávání z klávesnice do proměnné Databaz a následné kompletní uložení této proměnné do souboru. Ale je to jenom věc vkusu, fungovat to bude i takhle. Zbytek víceméně v pořádku, jenom když už si necháš zadat název databáze, měl bys ho taky uložit, aby příště tabulka nebyla bezejmenná. Nebo ještě lépe: zadané jméno tabulky použít jako jméno souborů pro databázi. Tím bys mohl mít několik databází zároveň. Uživatel by třeba zadal jméno "houby" a ty bys definici tabulky uložil do souboru například "houby.tab" a data do "houby.dat" (koncovky samozřejmě libovolné, jenom je potřeba nějak odlišit definici od dat).

Pridavani: vyhoď příkaz rewrite(s);, jinak si obsah souboru pokaždé zase smažeš. Komentář "generuje dotaz pomoci konstant" nechápu, ale to nevadí, na program nemá vliv. Zbytek vypadá v pořádku.

Vypis: tady je to nějaké pomotané. Definici tabulky (proměnná Databaz) máš přece hotovou, tak proč ji znovu načítáš? Načtení bude potřeba oddělit a hodit pod samostatný příkaz menu "načtení definice tabulky" (takže budeš mít dvě možnosti: buď načíst existující definici nebo vytvořit novou). Potom je ve výpisu potenciální problém: zarovnáváš to na šířku 10, ale jména mají deklarovanou délku 50. Takže když někdo zadá jméno delší než 10 znaků, zarovnání ti rozhodí. Takže uprav obě čísla na stejnou hodnotu, třeba 25 (ty se vejdou na obrazovku tři vedle sebe; kdyby jich bylo víc, musel bys vyřešit scrollování do stran). Podobně pro délku dat. Potom zruš to zbloudilé readln; hned za výpisem sloupců. Čtení a zobrazování dat je v pořádku.

Pascal › Databáze v Pascalu
7. 3. 2013   #172424

Nevypíše se nic? V tom případě ukaž aktuální zdroják, jinak není šance na něco přijít.

Delphi? V tom případě odpadají starosti o paměť, omezení 64 KB na proměnnou a podobně, takže databázi teoreticky můžeš celou načíst do jednoho pole, zpracovávat v něm a na konci zase celou uložit do souboru.

V TP v textovém režimu můžeš individuálně měnit jenom barvy. Velikost písma jde změnit jedině pro celou obrazovku najednou, výběrem režimu s jiným počtem řádků a sloupců, ale určitě nemůžeš udělat třeba velký nadpis a pod ním menší text (leda ASCII artem). Font se dá změnit jenom vlastními prostředky (přímými povely grafické kartě). Pro plnohodnotnou grafiku bys musel do grafického režimu, se kterým je IMHO víc práce než užitku. V Delphi bys to měl jednodušší přes okénka a formuláře, jenom už by to potom nebyla konzolová aplikace. Upřímně řečeno, když vidím, na čem se teď zasekáváš, doporučoval bych zůstat v texťáku a nezdržovat se estetikou. Teprve až ti bude databáze fungovat, má cenu zkoušet nějaké hezčí rozhraní.

Proměnné v paměti se po vypnutí programu ztratí. Co je v souborech, to zůstane. Přidávání dalších záznamů do hotového souboru jde, prostě na otvírání nepoužiješ Rewrite, ale Append.

Pascal › Databáze v Pascalu
7. 3. 2013   #172400

Reset takhle nefunguje, přepiš to na assign(s,'zaznamy.txt'); reset(s);. Potom smaž ty dvě zbytečné readln(s); hned za tím a mělo by to být v pořádku.

Jediný způsob, jak něco uchovat po vypnutí programu, je uložit to do souboru a při příštím spuštění to zase načíst. Definici tabulky (jména a počet sloupců) už takhle uložené máš; jestli po tobě program chce nové zadání, je to jenom chyba logiky - uprav ho tak, aby nejdřív zkusil načíst minulou definici a až kdyby se to nepovedlo, řekl si o zadání nové.

Se záznamy v databázi už to tak jednoduše nepůjde, protože nevíš, kolik jich celkem bude a jestli se ti vůbec vejdou do paměti (mimochodem, jaký překladač vlastně používáš?). Zatím jsem si to představoval tak, že záznamy vůbec v paměti uchovávat nebudeš, necháš je na disku a načítat je budeš jenom dočasně po jednom v případě potřeby. Výhodou by byla univerzálnost (bezproblémová funkce bez ohledu na velikost paměti), nevýhodou relativní pomalost (hlavně s těmi textovými soubory, ve kterých se nedá rychle skákat příkazem Seek).

Pascal › Databáze v Pascalu
6. 3. 2013   #172358

Znovuvyužití proměnné S není problém, jenom ji musíš po zavření prvního souboru příkazem Assign přesměrovat na ten druhý.

První část (načtení definice) vypadá provozuschopně, jenom to readln; na konci je zbytečné (čeká na zmáčknutí Enteru).

Druhá část je poněkud mimo, samotné readln ti nic nevypíše. Potřebuješ tohle:

1) Vypsat hlavičku tabulky. Tedy for i:=1 to databaz.pocetSloupcu do write(databaz.jmena[i]:šířka);.

2) Potom potřebuješ dvojitý cyklus. Vnější smyčka bude určitě while not eof(s), to máš dobře. V ní ale musí být ještě vnitřní smyčka for i:=1 to databaz.pocetSloupcu, protože po načtení x řádků souboru, které tvoří jeden řádek tabulky, musíš na obrazovce zalomit řádek. Tuhle vnitřní smyčku bys ještě mohl pojistit příkazem if eof(s) then break;, aby se nevypisovaly nesmysly, kdyby náhodou soubor skončil předčasně. Ale pro začátek to nebude nezbytně nutné.

3) Ve vnitřním cyklu načteš řádek ze souboru (readln(s,zadani);) a vypíšeš ho na obrazovku (write(zadani:šířka);). Po postupném načtení a vypsání celého řádku, tj. za koncem vnitřní smyčky, ale ještě uvnitř té vnější, na obrazovce odřádkuješ (writeln;).

Pascal › Databáze v Pascalu
4. 3. 2013   #172299

Soubor se vytvořil, ale zůstal prázdný, i když do něj v programu zapisuješ? To bude možná tím, že jsi ten soubor nezavřel, takže data zůstala někde v mezipaměti a nedostala se na disk. Zkus za tu ukládací část připsat Close, snad to pomůže.
Jestli ne, tak jsi do něj zkrátka nic nezapsal. Zkus si všechno, co píšeš do souboru, pro kontrolu vypisovat i na obrazovku, ať vidíš, kolikrát jsi kudy šel a co se dělo. Nebo vyzkoušej krokování.

Druhou otázku jsem nějak nepochopil. Na prolezení x položek pole, jejichž počet zjistíš až za běhu programu, jiná možnost než cyklus (nejlépe for) neexistuje. A v tom cyklu stačí vypsat jednotlivé položky.

Pascal › Databáze v Pascalu
28. 2. 2013   #172180

Jenom abych se zorientoval: jména sloupců tabulky chceš uložit tak, že v tom souboru bude na každém řádku jedno a nic dalšího k tomu, takže celkový počet zjistíš až podle konce souboru? Jestli jo, tak:

assign(t, 'tabulka.txt'); - OK
rewrite(t); - OK, tím se soubor otevře pro zápis od začátku.
append(t); - nesmysl, smaž.
write('Zadejte nazev tabulky: '); - OK
  readln(databaz.nazev); - OK
  write('Zadej pocet sloupcu: '); - OK
  readln(databaz.pocetSloupcu); - OK
  for i:=1 to databaz.PocetSloupcu do - OK
  begin - OK
    Write('Zadej jmeno ',i,'. sloupce: '); - OK
    readln(databaz.jmena[i]); - OK za předpokladu, že to pole je dostatečně velké.
  readln(zadani); - tohle smaž,
  writeln(t,zadani); - tohle taky
 a sem dej: writeln(t,databaz.jmena[i]); - tím se zadané jméno uloží do souboru.
  end; - OK

   write('(Z)pet');
   vyber:=upcase(readkey);
   case vyber of
   'z','Z' : goto jump_uvod; - aargh! Nešlo by to bez goto? A mimochodem: malé z nemusíš testovat, protože už jsi ho stejně zvětšil Upcasem.
   end;


A ten druhý kousek:


clrscr;
begin - tohle je asi zbytečné, smaž to.
  reset(s, zadani); - smaž parametr zadani, to je nesmysl (doufám, že s je textový soubor).
   - sem dej i:=0; - budeš to postupně zvětšovat, jak budeš načítat jednotlivé řádky.
  while not eof(s) do - OK
    begin
      for i:=1 to databaz.pocetSloupcu do; - celý tenhle řádek smaž.
      readln(s, zadani); - OK, tedy jestli Zadani je string. Tím se načetlo jedno jméno.
   - sem dopiš následující dva řádky:
    inc(i); - posuň se o sloupec dál (taky by šlo napsat i:=i+1).
    databaz.jmena[i]:=zadani; - ulož načtené jméno.
    end; - OK
 - a sem připiš: databaz.pocetSloupcu:=i; - uložení zjištěného počtu sloupců.
close(s) - OK, ale doplň za to středník.

Tím máš jména sloupců načtená v poli, stačí je vypsat.

Pascal › Databáze v Pascalu
7. 2. 2013   #171243

Začátek vypadá docela slibně, jenom poněkud nechápu to "(Z)pet" a goto. Radši to napiš bez skákání, ať v tom později není guláš.

Vkládání hodnot máš skoro v pořádku, až na horní mez cyklu - musí jet do PocetSloupcu, ne do deseti.

Ukládat budeš muset rovnou do souboru (tedy jestli se nechceš patlat s dynamickými datovými strukturami v paměti). Protože ukládáš texty s obecnou (předem neznámou) délkou, nemůžeš jednoduše sesypat celý řádek tabulky do jednoho řádku souboru (leda že bys zavedl nějaké speciální znaky na oddělení jednotlivých sloupců a vyřešil čtení řádků delších než 255 znaků). Asi bych příkaz write(vloz:10) přepsal na writeln(soubor,vloz). Plus možná ještě před začátek cyklu zápis nějaké jednořádkové kontrolní hlavičky. A samozřejmě před tím otevření souboru Appendem a potom zavření Closem. Tím ti vznikne soubor, kde každý řádek tabulky zabere PocetSloupcu řádků, každý pro jeden sloupec.

No, a čtení databáze potom bude jednoduché Readln ve dvojitém cyklu - vnější while not eof, vnitřní for i:=1 to pocetsloupcu. Samozřejmě to znamená, že si musíš do nějakého dalšího souboru uložit tu definici tabulky, abys ji nemusel pokaždé znovu zadávat z klávesnice - třeba na první řádek počet sloupců a na další řádky jednotlivá jména. Načtení bude podobné jako zadání od uživatele, jenom se nebudeš na nic ptát a budeš to číst rovnou ze souboru.

Pascal › Nevýhody procedury break
21. 1. 2013   #170440

Jo jo. Hlavně se Break hodí v případě, že potřebuješ cyklus ukončit z několika různých míst.

Na co si dát pozor:

1) Na for. Samotný výskok sice funguje bez problémů, ale nedá se spolehnout na to, že řídící proměnná bude mít tu hodnotu, kterou měla v okamžiku zavolání breaku.

2) Na vnořené cykly. Break vyskočí vždycky jenom z toho, ve kterém je zavolaný, takže jestli třeba procházíme dvojrozměrné pole a breakneme ve vnitřní smyčce, skočíme akorát do další iterace vnější smyčky, což asi nechceme. Na přerušování vnořených cyklů jsou lepší buď podmínky nebo Exit (pokud jsme v proceduře nebo funkci).

Pascal › Časová složitost podmínky a…
21. 1. 2013   #170439

"if a=b then něco" se přeloží takhle:

cmp a,b
jne NejsouStejné
něco
NejsouStejné:

"while a=b do něco":

začátek:
cmp a,b
jne konec
něco
jmp začátek
konec:

"repeat něco until a<>b":

začátek:
něco
cmp a,b
je začátek

If testuje jednou, ale necyklí. While cyklí, ale testuje dvakrát. Repeat cyklí a testuje jednou, ale napoprvé to vždycky nechá projít. Tak si vyber...

Pascal › Zjednodušení algoritmu pro m…
21. 1. 2013   #170438

Na test prázdnosti stačí zkontrolovat začátek. Kon vlastně ani není potřeba, konec seznamu poznáš podle nulového ukazatele Dalsi.

V tom tvém mazacím algoritmu chybí vynulování ukazatele Kon v případě, kdy mažeš jediný prvek z jednoprvkového seznamu. Potom bych v tom cyklu prohodil pořadí podmínek - napřed test Zarážky, až potom dat za Poz - protože jestli už mazání proběhlo, není už v Poz žádná smysluplná adresa. Na PC ti to projde (čtení nealokované paměti nevadí), ale třeba takový mainframe by ti program okamžitě shodil. Jinak se zdá, že je všechno v pořádku.

Zjednodušovat by se dalo. Zarážku můžeme vyhodit, stejně tak i úvodní test prázdnosti zásobníku a vyjít nám může třeba tohle:

procedure Odeber(var Z: Zasobnik; D: byte);
var Poz, Pom: UkPrvek;
Begin
with Z do
 begin
 Poz:=Zac;
 while (poz<>nil)and(poz^.data<>D) do begin
                                      pom:=poz;
                                      poz:=poz^.dalsi;
                                      end;
 if poz<>nil then begin
                  if poz=zac then begin
                                  if kon=zac then kon:=nil;
                                  Zac:=Zac^.Dalsi;
                                  end
                             else begin
                                  pom^.dalsi:=poz^.dalsi;
                                  if kon=poz then kon:=pom;
                                  end;
                  dispose(poz);
                  end;
 end;
End;

Ale asi by to šlo i jinak.

Pascal › čtení vstupu v UTF-8
18. 1. 2013   #170312

Přetypováním charu na byte (nebo funkcí Ord) získáš číselnou hodnotu znaku (tedy ASCII kód). Převod čísla do dvojkové soustavy vypadá nějak takhle:

číslo:=jeden byte ze vstupu
výsledek:=prázdný řetězec
cyklus pro všechny bity čísla (pro 1 B tedy osmkrát):
- jestli je číslo liché, připiš k výsledku zleva znak '1', jinak '0'
- číslo vyděl dvěma (nebo posuň o 1 bit doprava, to vyjde nastejno)

Nevím, jakým způsobem máš načítat ty unicodové texty. Z klávesnice to snad ani nejde (v TP určitě ne, u jiných překladačů nevím), takže bych čekal spíš vstup ze souboru. Každopádně to znamená čtení byte po bytu, rozbor každého bytu podle pravidel kódování Unicode a vždycky když získáš všechny byty jednoho písmena, jeden po druhém je převedeš do dvojkové soustavy a vypíšeš. O to, co je to ve skutečnosti za písmeno, se vůbec starat nemusíš. Pravidla UTF-8 máš tady: http://en.wikipedia.org/wiki/Utf-8#… .

Ty jednotlivé byty si můžeš ukládat do pole nebo po přetypování na char třeba do stringu. Převod na dvojkový tvar potom ještě zabalíš do cyklu "pro každý byte".

Pascal › Databáze v Pascalu
4. 1. 2013   #169757

Jestli je to školní úkol, tak bys ty dovednosti touhle dobou už mít měl, ne? ;-)

S jednorozměrnými poli si vystačíš a pokud není výslovně zadáno, že tabulky mají mít dynamický počet sloupců, můžeš si prozatím zvolit nějaké rozumné maximum a přebytečné sloupce nechat nevyužité - tím se vyhneš dynamické alokaci paměti a podobným věcem.

Ty kódy typů jsem myslel nějak jako array of char, kde 'C' = číslo, 'T' = text a podobně. Prostě jenom něco, v čem by sis uložil informace o tom, jaké datové typy ve kterém sloupci máš. Ale pro začátek se na typy můžeme vykašlat a všechno brát jednotně jako text. Jediná nevýhoda by potom byla, kdyby zadávající chtěl, aby databáze uměla i aritmetické operace, ale i to by se dalo zvládnout (viz Val).

Zkusím příklad:

const MaxPocetSloupcu=10; {nebo jiná hodnota podle potřeby}

type tabulka=record
             PocetSloupcu:integer; {skutečný počet sloupců, menší nebo rovný maximu}
             jmena:array[1..maxpocetsloupcu] of string[20]; {seznam jmen sloupců, délka může být samozřejmě i jiná než 20}
             end;

A další příklad, jak by to asi mohlo fungovat. Dejme tomu, že takhle:

Vyber funkci (Definice tabulky, Zadávání dat, Tisk, Konec): D

Zadej požadovaný počet sloupců: 2
Zadej jméno 1. sloupce: jmeno
Zadej jméno 2. sloupce: adresa
Tabulka vytvořena.

Vyber funkci (Definice tabulky, Zadávání dat, Tisk, Konec): Z

Zadej hodnotu sloupce jmeno: Pepa Novák
Zadej hodnotu sloupce adresa: Pod mostem 10, Lhota
Řádek vložen. Vložit další? A/N: A
Zadej hodnotu sloupce jmeno: Jarda Carda
Zadej hodnotu sloupce adresa: Chaloupka u lesa
Řádek vložen. Vložit další? A/N: N
Zadávání ukončeno.

Vyber funkci (Definice tabulky, Zadávání dat, Tisk, Konec): T

Výpis tabulky:
jmeno           adresa
------------------------------------
Pepa Novák      Pod mostem 10, Lhota
Jarda Carda     Chaloupka u lesa

Vyber funkci (Definice tabulky, Zadávání dat, Tisk, Konec): K
Program končí.

Z toho už bys mohl dát dohromady aspoň prázdnou kostru programu, tj. hlavní cyklus s výběrem funkce. Definice tabulky snad taky nebude nijak extrémně těžká. Až to nepůjde dál, předveď aktuální zdroják a ptej se dál ;-).

Java › Zápis do souboru a výpis ze…
14. 12. 2012   #168846

Není zač, označ prosím vlákno jako vyřešené...

Pascal › Databáze v Pascalu
14. 12. 2012   #168843

Konzolovou aplikací se myslí příkazový řádek? V tom případě mě napadají dvě možnosti. Buď udělat uživatelské rozhraní ve formě menu (něco jako "zmáčkni T pro vytvoření tabulky, V pro vložení dat atd."), to by bylo jednodušší, ale těžkopádnější na obsluhu. Nebo napsat interpret nějakého jazyka (třeba SQL nebo nějakého vlastního), to by bylo praktičtější, daly by se třeba spouštět předem připravené sady příkazů a líp by se to testovalo.

V pozadí by asi bylo několik souborů: jeden s definicemi tabulek a potom pro každou tabulku jeden datový soubor. Konkrétní implementace těch definic závisí na tom, jaké datové typy chceš používat (jestli nejsi masochista, radši pro začátek používej jenom typy s pevnou délkou).

Něco navrhni a pak přijď s konkrétnějšími otázkami, nějak to snad vyřešíme.

Java › Zápis do souboru a výpis ze…
14. 12. 2012   #168824

Jojo, otázka zněla na pátý řádek a ne na každý patý řádek... Jinak ještě je samozřejmě třeba definovat File a použít ho v Scanneru..

Java › Zápis do souboru a výpis ze…
13. 12. 2012   #168747

No tak já by jsem to udělal tak, že ve čtecí smyčce budu sledovat číslo přečteného řádku a pokud bude pátej tak ho vytisknu. 

	while (sca.hasNext()) {
		iterace++;
		vypis = sca.nextLine();
		if (iterace == 5) {
			System.out.println(vypis);
		}
	}
Java › Scanner a vyjimka
12. 12. 2012   #168706

Teda v tom kodu je spousta nesmyslnejch věcí.. Ale tento problém vyřešíš třeba tak že místo sca.hasNextLine() použiješ sca.hasNext()

Pascal › Syntax Pascalu
23. 11. 2012   #167409

Tipuju to na paznak způsobený chybným převodem znakových sad, původně to mohla být třeba nedělitelná mezera (logicky do těch míst mezery patří). Vývojová prostředí sice takové znaky nepoužívají, ale tohle vypadá spíš jako něčí poznámky než funkční zdroják, takže to mohlo být napsané klidně třeba ve Wordu.

V klasickém Pascalu se ~ vůbec nepoužívá. Neguje se operátorem NOT, který funguje jak logicky, tak bitově.

Pascal › Seminárka z programování
20. 9. 2012   #163494

Když už si můžeš vybrat, vyber si něco, co tě baví, ne? 

Já bych asi napsal nějakou jednoduchou hru. Nebo nějaký fyzikální simulátor, teď mě napadá třeba pohyb těles v gravitačním poli (z toho by mohlo vyjít docela hezké planetárium) nebo nějaký pohyblivý mechanismus. Ale co se líbí mně, to se nemusí líbit tobě, že jo...

Učitelům asi půjde především o ukázku algoritmického myšlení a efektivního kódu, ne o předvedení podrobné znalosti hardwaru, formátů souborů a podobně, takže se nemusíš zatěžovat super grafikou a tak - spíš půjde o zvládnutí vnitřní logiky a prezentaci výsledků v nějakém dostatečně srozumitelném uživatelském rozhraní.

Michal
Java › Vytvoření desktopové aplikace
29. 8. 2012   #162373

#7 Rado
To je presne to, jak by to melo vypadat

Toto je muj email: pavel.kucera88@gmail.com

Po emailu se muzeme o tom vice pobavit.

Michal
Java › Vytvoření desktopové aplikace
29. 8. 2012   #162371

#5 Rado
Dekuji za zajem ... je treba k tomu projektu dodat, ze musi byt v architekture MVC a nesmi v nem byt zadny generovany kod, ani pro GUI. Trva zajem i nadale?

Michal
Java › Vytvoření desktopové aplikace
29. 8. 2012   #162369

#3 Michal
zhruba 1/3 aplikace jiz mam, tudis by to mohlo ulehcit implementaci

Michal
Java › Vytvoření desktopové aplikace
29. 8. 2012   #162368

#2 sakal91
Dekuju za odpoved

Zde je zadani:

Navrhněte a implementujte aplikaci pro úpravu titulků. Aplikace bude mít grafické uživatelské
rozhraní a bude implementována pomocí programovacího jazyka Java. Základní funkce aplikace
budou následující:
 Možnost přehrávat video a zároveň zobrazovat titulky.
 Možnost posunout, zrychlit nebo zpomalit titulky.
 Možnost změnit ručně text nebo časování konkrétního titulku.
 Načítání a ukládání základních formátů titulků.
 Vizuální úprava časování titulků. Uživatel bude mít možnost pro několik určitých titulků
zvolit během přehrávání filmu okamžik, kdy se mají zobrazit. Aplikace poté na základě
těchto údajů provede změnu časování.

Michal
Java › Vytvoření desktopové aplikace
29. 8. 2012   #162364

Zdravim vsechny ... hledam schopneho java programatora, ktery by mi pomohl vytvorit desktopovou aplikaci v jave - nabizim 10 000

Pascal › Problém s fcí arctan
15. 8. 2012   #161607

Poctvar=4 je konstanta, v té chyba nebude. Nenulovost x-A.x kontroluješ, takže v pořádku. Na arctan ani cos není co zkazit. Potom by mohlo být nulové power(3,i-1). Nebo může být problém přímo s tou mocninou: nevím, jaké má ta funkce pořadí parametrů - jestli 3 na i-1 nebo i-1 na třetí. Ve druhém případě by bylo potřeba, aby i-1>0, protože obecná mocnina x na y se interně počítá jako exp(y*ln(x)) a logaritmus existuje jenom pro kladná čísla.

Další možnost je, že dělíš něčím sice nenulovým, ale dostatečně malým na to, aby to způsobilo přetečení výsledku. Takže bych místo testu nulovosti zkoušel spíš nějakou toleranci: if abs(hodnota)<=1E-10 then je to prakticky nula.

Pascal › hadani
14. 6. 2012   #159174

Nejjednodušší možnost: když napíšeš "víc", program k číslu přičte 1. Když "míň", odečte 1. Je to na dlouho, ale funguje to spolehlivě :-).

Pro praktické použití bych doporučil metodu půlení intervalu: tipneš číslo uprostřed možného rozsahu, při "víc" zahodíš celou levou půlku (tj. levou mez posuneš na to prostřední číslo), při "míň" zahodíš pravou (pravou mez posuneš na prostředek). Tím se ti možný rozsah zužuje tak dlouho, až se levá a pravá mez sejdou na jednom čísle a to je ten výsledek (případně se do něj náhodou trefíš dřív).

Pascal › Keypressed - had
4. 6. 2012   #158805

#9 ronin: Na tohle se mi nejlíp osvědčilo psát hry - nemusí být moc komplikované, ale i tak tě donutí naučit se spoustu různých věcí. A zároveň se u nich pobavíš. Textový editor je dost složitá věc, tím bych radši nezačínal.

Kdybys chtěl nějaké materiály pro inspiraci, zkus třeba http://mircosoft.mzf.cz (no jo no, musím se pochlubit :-]).

Tak ať ti to nadšení vydrží ;-).

Pascal › Keypressed - had
31. 5. 2012   #158624

Než řešit klouby, spíš bych doporučil ukládat si do kruhové fronty souřadnice všech článků hada. Jedním koncem by se do ní sypaly nové polohy hlavy, z druhého by se odmazával odplazivší se ocas. Prakticky se to dá řešit buď polem nebo spojovým seznamem, ten seznam mi přijde jednodušší. Ale kecat ti do toho nebudu :-).

Pascal › Keypressed - had
30. 5. 2012   #158569

Pozor na prioritu operátorů. Logické operátory (and, or a xor) se vyhodnocují před porovnávacími (=, <> atd.), takže je potřeba závorkovat:

klavesa:=ord(readkey);
if (klavesa=87)or(klavesa=119) then ...
if (klavesa=83)or(klavesa=115) then ...

Mimochodem, znaky se dají psát přímo, stačí použít místo čísla typ char:

klavesa:=readkey;
if (klavesa='W')or(klavesa='w') then ...
if (klavesa='S')or(klavesa='s') then ...

Držím palce ;-).

Pascal › Pascal
28. 5. 2012   #158471

Zrovna jsem ti to málem poslal mailem :-).
Vezmu to popořadě:

1) Nechápu, proč se všichni pokoušíte cpát to do objektu. Zaprvé se tím program zbytečně komplikuje a zadruhé stejně používáte tolik globálních proměnných, že objektovost ztrácí smysl. Ale vyloženě chyba to není, fungovalo by to i tak.

2) Už jsi někdy něco naprogramoval? A máš o programování zájem, nebo se jenom snažíš získat zápočet a pak všechno zapomeneš? Já jenom jestli má cenu snažit se o vysvětlování, nebo jestli prostě sháníš někoho, kdo to za tebe napíše ;-).

3) Dobrá, teď k původní otázce. Zadání říká, že hvězdička je panáček, dolar je cíl, mezera je prázdno a všechno ostatní jsou zdi. Autor si tedy uložil souřadnice panáčka do proměnných a,b. Udělal to proto, aby mohl o kousek dál po vyhodnocení stisknutých kláves vypočítat jeho novou polohu.

4) V tomhle kódu je tolik chyb, že by stejně nefungoval. Radši ho zahoď, ať tě neplete, a začni od začátku.

Assembler › Disassembling?
21. 5. 2012   #158218

#7 x.kodi: zkus googlit Sourcer 7.

Pascal › Vložení obrázku
27. 4. 2012   #157105

Autor se hlásí :-).

Přesně tak, díky. Martine, LoadImageFromFile2 jenom načte obrázek ze souboru do paměti, nezobrazuje. Jediné, co potřebuješ, je jedna proměnná typu pointer, pod kterou ti to automaticky alokuje paměť a uloží do ní ten obrázak, a dva wordy, ve kterých dostaneš jeho rozměry. Zobrazíš ho potom některou z těch uvedených procedur z Vesy nebo z Vga, ale na to samozřejmě musíš být v grafickém režimu - nic z toho ti jednotka Images nezajistí, to je právě záležitost Vesy (procedura _Setmode).

Jestli máš grafiku nastavenou správně, tak dva možné problémy, které mě napadají, jsou, že buď máš obrázek ve formátu, který neumím načíst (umím jenom BMP, PCX, CUT a ORF, navíc BMP nesmí mít víc než 256 barev), nebo je ten obrázek moc velký, takže na něj nestačí paměť (maximum je 64K pixelů). Obojí zjistíš kontrolou návratového kódu z LoadImage* - nula je v pořádku, 4 je varování ohledně palety a od 8 výš jsou závažné chyby, podrobné vysvětlivky máš ve zdrojáku jednotky. Mimochodem, paletu si taky musíš nastavit ručně - na to je jednotka Paleta2.

Jinak asi můžeme zbytek dořešit mailem, takovéhle rozbory nějakých specifických jednotek asi nejsou pro veřejnost moc velkým přínosem (pozn.: od soboty do středy asi budu bez přístupu k síti, takže neručím za včasné odpovědi).

Ještě k tomu vložení obrázku do EXE - i to by šlo. Soubor s obrázkem by se převedl na binární objekt utilitou BINOBJ.EXE a pomocí direktivy {$L ...} by se ve zdrojáku přilinkoval a pak by se k němu přistupovalo přes jakoby ukazatel na proceduru. Popsané je to v helpu, z hlavy si víc nepamatuju. Samozřejmě by pak nefungovaly ty moje načítací funkce, protože jsou stavěné jenom na soubory.

Pascal › Zaverečná práca
3. 4. 2012   #155943

Přijde mi, že ty indexy jsou úplně zmatené. Když točíš for s řídicí proměnnou i, proč jako index používáš a a ne to i? Proč ty áčka nuluješ odečtením trojky a ne přiřazením nuly? Kde se proměnné inicializují? Jak říká Zlz, a1 je zbytečná, ale zdá se mi, že se aktualizuje správně, takže by to (teoreticky) mohlo fungovat i s ní.

Nevím, v jakých cyklech máš ten svůj kód zabalený a co všechno tam ještě máš. V tomhle úryvku vidím zrušení střely, co přesáhla souřadnici 810, ale nic, co by život střely testovalo nebo ji znovu oživovalo. Kdyžtak sem hoď celý hlavní cyklus se vším všudy, ať se můžeme podívat.

Náhodnost chování je nejspíš způsobená použitím funkce Random. Jestli chceš opakovatelné výsledky, nastav si Randseed na nějakou pevnou hodnotu, tím dostaneš pokaždé stejnou posloupnost čísel. Nejlepší bude, když nám ukážeš víc - deklarace proměnných, inicializace před hlavním cyklem a tak. Třeba tam někde něco chybí nebo přetéká.

Mimochodem, co máš za překladač? Výška obrazovky přes 810 pixelů už je docela megarozlišení, v jednotce Graph jsem něco takového ještě neviděl. Ten styl komentářů je taky dost neobvyklý.

Pascal › Začiatky
28. 3. 2012   #155555

Zjednodušovat celkem není co, ale drobnost k vylepšení by se našla: kdyby někdo zadal nulové b, program spadne na dělení nulou (division by zero). Proto je dobré zvyknout si před každým podílem zkontrolovat dělitele a pokud není nulová hodnota bezpečně vyloučená (třeba kdyby to byla nenulová konstanta), zkontrolovat a případně dělení neprovádět:

if b=0 then writeln('PODIEL zadanych cisel neexistuje, nelze delit nulou.')
       else begin
            f := a/b;
            writeln('PODIEL zadanych cisel je: ',f);
            end;

(jde o logickou podmínku "jestli tohle platí, udělej tohle, jinak udělej tamto"; jestli to ještě neznáš, ber to jenom jako ilustrační příklad)

Jinak na vymazání textové obrazovky je příkaz Clrscr (TP ho má v jednotce Crt, jinde se to možná může lišit). Ukončení programu je jednoduché - prostě se dojde na konec. Kdyby bylo potřeba skončit dřív, použije se podmínka (if nechceme_skončit then pracuj_dál else nic). Potom existuje ještě příkaz Halt, který program ukončí okamžitě a odkudkoli, ale pro začátek bude lepší se mu vyhnout a snažit se všechno vyřešit vhodně strukturovanými příkazy a podmínkami.

Pascal › Začiatky
26. 3. 2012   #155485

Trošku si zaspamuju . http://mircosoft.mzf.cz - ukázkové programy, návody atd., možná by se něco z toho mohlo hodit.

Pascal › Jednoducha hra neco jako alp…
28. 2. 2012   #154169

Ono jde o to, kdy se ta hvězdička má objevovat. Jestli to má být po nějakém časovém intervalu, tak je víc možností. Já bych to napsal asi takhle:

var casovac:longint absolute 0:$046C;

...

repeat
CasNaZacatku:=casovac;
 repeat
 if keypressed then begin
                    klavesa:=readkey;
                    ...zpracuj klavesu a pohni panackem...
                    end;
 until casovac>casnazacatku+18*PozadovanyPocetSekund
       or poloha panacka = poloha hvezdicky;...pregeneruj pozici hvezdicky...
until poloha panacka = poloha hvezdicky;

...

Na té kouzelné adrese 0:$046C je uložen počet 55milisekundových tiků uběhlých od zapnutí počítače. 55 ms znamená cca 18 tiků za sekundu, proto počet sekund mezi přesunem hvězdičky násobím osmnácti.

S Delayem by to šlo taky:

...
PocetCyklu:=0;
 repeat
 if keypressed then begin
                    klavesa:=readkey;
                    ...zpracuj klavesu a pohni panackem...
                    end;
 inc(pocetcyklu);
 if pocetcyklu>NejakaHodnota then begin
                                  ...pregeneruj pozici hvezdicky...
                                  pocetcyklu:=0;
                                  end;
 delay(chvilicka);
 until poloha panacka = poloha hvezdicky;
...

Jenom ta chvilicka čekání musí být kratší než doba mezi automatickým zopakováním stisknuté klávesy, jinak by se stisky v paměti klávesnice hromadily.

Jestli se hvězdička má posouvat po určitém počtu kroků panáčka, bude to o něco jednodušší, protože se nemusíme starat o čas:

...
pocetkroku:=0;
 repeat
 klavesa:=readkey;
 ...zpracuj klavesu a posun panacka...
 inc(pocetkroku);
 if pocetkroku>NejakaHodnota then ...jako predtim, pak pocetkroku:=0...
 until panacek snedl hvezdicku;
...

Ještě poznámka: náhodné číslo z intervalu 1..80 ti dá výraz random(80)+1. Potom už samozřejmě nemusíš rozsah kontrolovat.

Pascal › pole
13. 2. 2012   #153500

Malá ukázka, jak na to v TP:

...
type sablona=array[1..cokoli] of TypPrvku;
var DynPole:^sablona;
...
BEGIN
...
getmem(dynpole,PozadovanyPocetPrvku*sizeof(TypPrvku));
dynpole^[10]:=NejakaHodnota;
blabla:=dynpole^[2];
fillchar(dynpole^[3],3*sizeof(TypPrvku),NejakaHodnota);
...
freemem(dynpole,PozadovanyPocetPrvku*sizeof(TypPrvku));
...
END.

Na horní mezi šablony nezáleží, protože pole bude reálně tak velké, jak si zvolíš. Když vypneš automatickou kontrolu rozsahu ({$R-}), překladač nebude protestovat, ani kdyby byly reálné indexy mimo rozsah šablony. Ale musíš si je hlídat sám, protože zápis mimo pole = katastrofa.

Novější překladače jako FP nebo Delphi to s největší pravděpodobností umí lépe (pohodlněji a bez oklik přes ukazatele), ale ještě jsem to v nich nezkoušel.

Pascal › Algoritmus spočítání všech u…
8. 2. 2012   #153306

To bitové pole vypadá rozumně. Obrázek se klidně může odswapovat na disk, protože se stejně bude číst lineárně (po nějakých rozumných blocích, aby to moc nezpomalovalo) a do paměti se dá to pole. 2 MB není nic strašného.

Pascal › Najvacšia nulova submatica
3. 2. 2012   #153143

Díky za brouka v hlavě :-).

Trochu jsem o tom přemýšlel a došlo mi, že v zadání vůbec není řečeno, co přesně znamená pojem "největší submatice". Má to být submatice s největším počtem prvků? Nebo s největší šířkou nebo největší výškou? Čili: je větší 2x2, 4x1, nebo jsou obě stejné? To by chtělo zjistit u zadavatele.

Pro řešení mě napadla taková celkem primitivní metoda hrubé síly. Nejdřív by se napsala funkce, která zjistí, jestli daná submatice je nebo není nulová (fungovala by tak, že by tu submatici prošla prvek po prvku a kdyby narazila na cokoli nenulového, nahlásila by false). Potom by se ta velká matice procházela prvek po prvku. Vždycky když by se narazilo na nulu, zkusila by se postupně testovat nulovost submatic od té nuly až do pravého a dolního okraje matice, pak o 1 řádek menší, pak o 1 sloupec atd. (rozměry by se kombinovaly stylem "každý s každým", aby to nebyly jenom čtverce: 4x4, 4x3, 4x2, 4x1, 3x4, 3x3 atd.), a ta dosud největší nalezená by se někde pamatovala.

Elegantnější a míň náročné na procesor by bylo, kdyby se od té nuly šlo doprava a dolů, hledaly by se souvislé nulové řádky a sloupce a nějak by se zjišťovalo, jak velkou submatici tvoří. Ale to je o dost složitější.

Assembler › HEX kód pre Win registry
31. 1. 2012   #153067

Spouštění Wordu je natolik zdlouhavá záležitost, že plus mínus vteřina v rychlosti toho prográmku nehraje vůbec žádnou roli. Asm v tomhle případě není nutný, tedy jestli ti nejde víc o zkoumání jak věci fungují než o výslednou funkci. Doporučoval bych nejdřív to napsat v něčem jednodušším (tj. vysokoúrovňovém) a až když to bude fungovat, pokusit se o přepis do Asm.

Jestli se má ten program volat z Mozilly, asi bych ho řešil přímo jako plugin pro Mozillu. Jestli má být univerzální pro všechny prohlížeče na daném počítači, tak bych ho viděl jako něco, co běží na pozadí, kontroluje to klávesnici a když detekuje příslušnou kombinaci, nasimuluje to v aktivním okně Ctrl+C, otevře Word a v něm Ctrl+V. Nejdůležitější samozřejmě je vyzkoumat, jak se kterému programu tyhle povely předávají.

Ale to jenom tak nahlas přemýšlím, v praktických záležitostech Windows se moc nevyznám.

Assembler › Asm 8086: OUT DX,AX
27. 1. 2012   #152921

Ahoj assembleristi,

asi je to hodně blbý dotaz, ale hledám už docela dlouho a nikde jsem přesné vysvětlení nenašel. Dá se sekvence OUT DX,AL; SHR AX,8; OUT DX,AL, nahradit jedním OUT DX,AX, nebo by to bylo něco úplně jiného?

Nevím, jestli ten AX chodí na port "podélně" byte po bytu nebo "příčně" na dva sousední porty a nenapadá mě žádný bezpečný způsob, jak to zjistit experimentálně.

Dík.

Pascal › Runtime error 64736
24. 1. 2012   #152807

To, že někdo nevidí žádnou chybu, nemusí nutně znamenat, že tam žádná není :-) (kdyby nebyla, asi by to nepadalo, že jo).

Jestli ti tohle:

write('Jmeno: ');
readln(nick);
write('Heslo: ');
readln(pass);

ignoruje to první readln(nick) a na obrazovce vidíš rovnou "Jmeno: Heslo: _", je někde něco špatně. Napadá mě možnost, že v bufferu klávesnice zůstal od někdy zmáčknutý enter a readln ho vzalo a vyhodnotilo jako konec zadávání jména. To by se mohlo stát snad jedině v případě, že bys někde předtím používal nějaké čekání (Delay) a během něj omylem ten enter zmáčknul. Ale těžko říct, když nevidím celý program. Řešil bych to resetem klávesnice před prvním readln: while keypressed do readkey (případně něco:=readkey, kdyby náhodou Lazarus nebral rozšířenou syntaxi).

Zkus se kouknout do manuálu, co to číslo chyby znamená - to může docela dost napovědět.

Nejjistější věc asi bude použít krokování programu a projet ho příkaz po příkazu, pak přesně uvidíš, kde k té chybě došlo. Ale nevím, jak se to v Lazaru dělá a jestli to vůbec jde. V nejhorším si prostě hoď za každý příkaz writeln, které ti řekne, kde zrovna jsi.

Pascal › Runtime error 64736
23. 1. 2012   #152732

Chybu s takovýmhle číslem jsem ještě neviděl, ale otázka je, co používáš za překladač. V TP jsou čísla chyb snad maximálně trojciferná.

Tady máš seznam na první pohled viditelných chyb, víc z toho nepoznám:

- V proceduře ss není definován soubor f. Ale jestli je globální, mělo by to fungovat.

- Cyklus while (c=b) do readln(c); je úplně mimo. Zaprvé readln s jedním parametrem čte z klávesnice a ne ze souboru, zadruhé ta podmínka je přesně obráceně a zatřetí ti tam chybí kontrola konce souboru, takže by ti program po opravě prvních dvou chyb nejspíš skončil buď pádem (při {$I+}) nebo nekonečnou smyčkou (při {$I-}).

- V proceduře log voláš nedefinovanou proceduru aa.

- while not eof(F) do ss(full); je nesmysl, protože se to cyklí už v ss.

- Close(f) je tam navíc, protože už proběhne v ss. A nejsou definované proměnné f a rep.

- V proceduře reg: read; je nesmysl, smaž to (nevím, možná je to zdroj té chyby).

- Než ze zadaného jména sestavíš jméno souboru, zkontroluj si, jestli to vůbec půjde (nepovolené znaky, mezery, délka atd.). Ale jestli je uživatel opatrný, program pojede.

- Nedefinované věci f, aa, car a rep.

Pascal › Hra život s načtením ze soub…
22. 12. 2011   #151552

Asi už jdu pozdě, ale třeba se ještě pár tipů bude hodit...

Data bych načítal po řádcích (Readln) do nk-znakového řetězce (třeba var radek:string[nk]). Ten se pak dá projít znak po znaku a podle nich nastavit prvky matice. Ale s načítáním znak po znaku to samozřejmě půjde taky, když se ošetří ty konce řádků.

S maticí by se nejlépe pracovalo ve tvaru array[1..nk,1..nk] of boolean, nastavení jednoho prvku by pak mohlo vypadat třeba takhle: matice[i,j]:=radek[j]='1' (radek[j]='1' je logický výraz, který dá hodnotu true, pokud se to rovná, a false, pokud ne). Ale zase by se to nedalo vypisovat přímo na obrazovku, musel bys ifem vybrat znak '0' nebo '1'. Z hlediska snadnosti výpisu by tedy bylo nejlepší, kdyby matice byla pole nk stringů (i s tím by se dalo pracovat).

Potom při počítání přírůstků a úbytků nezapomeň, že je potřeba mít dvě matice: jednu s aktuálním stavem, ze které čteš kde co je, a druhou s novým stavem, do které zapisuješ. Až všechno přepočítáš, zkopíruj novou matici do aktuální.

Nevím, jak je myšlena ta "podmatice, která zajistí, aby okrajové prvky byly neživé". Kdybych chtěl zabít okraje, prošel bych je dvěma cykly a nastavil na "neživý" (false nebo '0'): jeden cyklus by šel vodorovně a měnil by první a poslední řádek, druhý svisle a měnil by první a poslední sloupec. Jestli jsem to dobře pochopil, tak ti jde asi jenom o to, jak si zjednodušit počítání živých prvků poblíž okrajů matice: když přidáš okraje plné mrtvol, zbavíš se práce s kontrolou, jestli zkoumaný prvek náhodou neleží mimo matici. Pak to ale chce rozsah matice zvětšit na [0..nk+1] ("provozní" data budou jenom na pozicích 1..nk, pomocné pozice 0 a nk+1 budou pořád mrtvé).

Radši bych to ale nekomplikoval a ve výpočtech bych prostě přidal podmínku, že pokud se souřadnice nějakého zkoumaného prvku nacházejí mimo oblast matice, má se považovat za neživý. Na to by bylo ideální napsat funkci: function zije(var A:mat; n:integer; i,j:integer):boolean. Ta by nejdřív zkontrolovala souřadnice. Kdyby byly mimo, vrátí false a konec. Jinak by se podívala do matice a vrátila by true nebo false podle toho, co by tam našla.

Další možnost je, že by funkce nevracela booleany (i když by to bylo logické), ale číslo 0 nebo 1. Případně že by přímo ta matice byla složená z čísel a ne z booleanů ani z charů. Bylo by to výhodnější - protože hlavním účelem je spočítat, kolik je okolo zkoumaného prvku živých, stačilo by prostě sečíst hodnoty všech osmi okolních políček.

A jéje, zase jsem místo jednoduché rady skončil chaotickým brainstormingem :-]. No nic, snad to k něčemu bude.

Pascal › ako použiť case v pascale ak…
25. 11. 2011   #150467

No, jediná trochu elegantnější možnost, co mě napadá, je vytvořit si jako konstantu pole dvanácti čísel s počty dnů v jednotlivých měsících a v nějakém dalším poli je pak nějakým cyklem vhodně posčítat.

Pascal › ako použiť case v pascale ak…
25. 11. 2011   #150463

Základní myšlenka je dobře, ale máš tam pár chybiček. Řádek x:=2.31+28 je špatně - násobí se hvězdičkou (*), tečka funguje jako desetinná čárka. Potom pozor, že to máš o měsíc posunuté - počet dní v lednu musíš přičítat až k únoru, x pro leden je 0. Tu okliku přes x bych asi zrušil (tj. např. pocet:=31+28+den), ale chyba to není.

Pak už to bude jednoduché: case pocet of 100..129:znameni:='rak'; atd. (tohle jsem jen tak plácnul, intervaly si musíš spočítat).

Pascal › ako použiť case v pascale ak…
25. 11. 2011   #150460

Když se jedno znamení táhne přes dva měsíce, nedá se číslo měsíce použít jako první rozlišovací podmínka. Resp. dá, ale musela bys potom v každé větvi toho case ještě přes if/else rozvětvit do dvou znamení podle dne a tím by se to celé zkomplikovalo.

Asi nejelegantnější by bylo převést si datum do juliánského formátu. To znamená, že se dny počítají na celý rok lineárně od 1 do 365 (přestupné roky se u znamení neřeší) a o měsíce se nestaráme. Pak by ti pro každé znamení stačil jednoduchý interval.

Nebo úplně nejpřímočařejší řešení by byla tabulka, do které by se kouklo na řádek odpovídající číslu měsíce a sloupec odpovídající dni a tam by se rovnou našlo znamení. To je sice rychlé a jednoduché, ale relativně náročné na paměť (372 B) a ruční datlování konstant a asi to není úplně přesně podle zadání :-).

Pascal › ako použiť case v pascale ak…
24. 11. 2011   #150427

Taky se dá použít technika "fixed point". To znamená, že si čísla interně vynásobíš třeba deseti a zaokrouhlíš. Takže třeba někdo zadá 18.31, ty si to přepočítáš na 183 a bereš to jako ordinální číslo. Když chceš přesnost na 2 desetinná místa, násobíš 100, na tři tisícem atd.

 

 

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