TurboDelphi-Pascal

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

lukke87
nováček
Příspěvky: 5
Registrován: duben 11
Bydliště: Hradec Králové
Pohlaví: Muž
Stav:
Offline
Kontakt:

TurboDelphi-Pascal

Příspěvekod lukke87 » 29 dub 2011 19:28

Ahoj,

mohl by mi s tím někdo pomoct prosím? Tady nebo skype. Nemám na to moc času, relativně jen víkend. Když se pokusím něco napsat, nefunguje mi to :(

Řazení. Vytvořte program pro seřazení řady čísel podle velikosti dvěma způsoby (bubble sort a podle největšího). Každý algoritmus bude realizován samostatnou procedurou s dvěma parametry (počet hodnot a pole čísel) umístěnou v hlavním programu. Obě procedury setřídí čísla podle velikosti v poli dodaném jako parametr. V hlavním programu se vytvoří dva stejné vektory náhodných celých čísel (z intervalu ±1000) o volitelné velikosti (max 20000) a pomocí obou procedur se setřídí. Na obrazovku a do souboru se zapíše velikost a doba (v sec) trvání třídění jedním a druhým způsobem. Na základě volby uživatele bude možné oba setříděné vektory zapsat do souboru volitelného názvu a také celý program opakovat.


Díky za jakoukoliv radu

Reklama
Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: TurboDelphi-Pascal

Příspěvekod faraon » 29 dub 2011 23:18

Trochu tápu v tvém názvosloví, co se myslí tím řazením podle největšího? Napadá mě akorát řazení výběrem největšího prvku... Bubblesort je jasný, a ten vektor má být pole?
Já bych na to šel asi takhle:

1. určit počet řazených čísel 2 až 20000 (zadat z klávesnice?)
2. vygenerovat zadaný počet čísel a uložit je do obou polí p1 i p2 zároveň (takže obě budou identická)
3. zaznamenat aktuální čas do t1
4. setřídit první pole první procedurou, třeba tím bubblesortem
5. zaznamenat rodíl mezi t1 a aktuálním časem opět do t1 (není třeba dělat další proměnnou)
6. zaznamenat aktuální čas do t2
7. setřídit druhé pole druhou procedurou
8. zaznamenat rozdíl mezi t2 a aktuálním časem do t2
9. vypsat na obrazovku oba časy t1 i t2, a zapsat je do souboru
** teď si můžeš pro kontrolu obě pole cyklem porovnat, jestli se budou někde lišit, je chyba v řazení (tahle část se po dokončení programu odstraní)
10. zeptat se uživatele jestli chce seřazené pole zapsat do souboru, pokud ano tak:
11. zeptat se na název souboru, otevřít ho pro zápis, zapsat pole a zase uzavřít
12. zeptat se uživatele jestli chce program opakovat (což znamená že před bodem 1 bude příkaz do a tady zase until a tahle smyčka se bude opakovat dokud nezadá "ne")

Ukaž co máš, a nějak to dáme dohromady.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

lukke87
nováček
Příspěvky: 5
Registrován: duben 11
Bydliště: Hradec Králové
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: TurboDelphi-Pascal

Příspěvekod lukke87 » 30 dub 2011 00:43

nu mám to takhle rozhozený pom. unity.. pascal jsou prej základy, máme to prvním rokem, ale nenajde se moc lidí co to chápe. max ti co opakují :?

Kód: Vybrat vše

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  DateUtils,
  Unit1 in 'Unit1.pas';

var p,pv,pb:Vektor;
      i,poc,x1,x2,x3:Integer;
      c1,c2,c3,dt1,dt2:TDateTime;              {strukturovany system casu?}
      Ro,Me,De,Ho,Mi,Se,ms:Word;

begin
  poc:=MaxVek;
  randomize;                                   {nahodna cisla}
  for I := 1 to poc do p[i]:=random(+-1000);   {tim by se to melo naplnit +-1000}
  pv:=p; pb:=p;                                {kopie vektoru}

  Now(c1);
  DecodeDateTime(c1,Ro,Me,De,Ho,Mi,Se,ms);
  writeln(Ro,' ',De,'.',Me,'.',Ho,':',Mi,':',Se,'.',ms);
  VybNej(poc,pv);
  Now(c2);                                     {ziskej aktualni cas}
  Bubl(poc,pb);
  Now(c3);                                     {ziskej aktualni cas}
  dt1:=c2-c1; dt2:=c3-c2;
  DecodeDateTime(dt1,Ro,Me,De,Ho,Mi,Se,ms);
  writeln('Doba provadeni Bubl je: ',ms,'msec.');
  DecodeDateTime(dt2,Ro,Me,De,Ho,Mi,Se,ms);
  writeln('Doba provadeni VybNej je: ',ms,'msec.');
  readln;

end.


Kód: Vybrat vše

unit Unit1;

interface
  const MaxVek = 20000;                         {max velikost vektoru}
  type Vektor = array[1..MaxVek] of Real;       {typ}
  procedure VybNej (N:Integer; var V:Vektor);
  procedure Bubl (N:Integer; var V:Vektor);

implementation
  procedure VybNej (N:Integer; var V:Vektor);   {trideni V velikosti N<=MaxVek od nejmensiho}
  var i,j:Integer;
      x:Real;
    begin
      for I := N downto 2 do
      begin
        x:=V[i];
        for j:=1 to i-1 do
        if V[j]>x then
        begin
          x:=V[j];
          V[j]:=V[i];
          V[i]:=x;
        end;
      end;
    end;

  procedure Bubl (N:Integer; var V:Vektor);
  var i,nk:Integer;
      x:Real;
      f:Boolean;
  begin
    nk:=N-1;                                      {aktualni delka vektoru?}
    repeat
      f:=False;                                   {příznak přehození}
      for i:=1 to nk do
       if V[i]>V[i+1] then
        begin f:=True;
          x:=V[i];
          V[i]:=V[i+1];
          V[i+1]:=x;
        end;

      nk:=nk-1;
    until NOT f;

  end;



end.


--- Doplnění předchozího příspěvku (30 Dub 2011 00:46) ---

a když tohle spustím, sekne se mi to hned u Now(c1); což by mělo dle návodu získat aktuální čas :(

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: TurboDelphi-Pascal

Příspěvekod faraon » 30 dub 2011 09:20

No, unity jsem se nenaučil a Pascal už skoro zapomněl, ale to je jednoduchý jazyk, dá se zvládnout za čtrnáct dní ;-)

Když máš problém se získáním času, tak ho řeš zvlášť, a až ti to bude chodit, tak to použij do programu... Takže si vyzkoušej program stopky:

Kód: Vybrat vše

;
var  Present: TDateTime;
          Hour, Min, Sec, MSec: Word;
 begin
   Present:= Now;
   DecodeTime(Present, Hour, Min, Sec, MSec);
   ...
 end;


Našel jsem to na netu, tak to otestuj a zkus převést všechno dohromady na milisekundy, ale asi použij jiný typ než Word, ten bych odhadl jen na šestnáctibitový a ty budeš potřebovat dvakrát tolik! Stačit bude přesnost na hodiny, déle to snad počítat nebude :-D



EDIT: Jak se to sekne? Napíše to nějaké chybové hlášení?
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

lukke87
nováček
Příspěvky: 5
Registrován: duben 11
Bydliště: Hradec Králové
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: TurboDelphi-Pascal

Příspěvekod lukke87 » 30 dub 2011 16:05

nenapíše.. jen v editovacím okně označí červeně celej řádek s Now(c1);

kouknu na to, je to hnus. sice je prej pascal základem, ale není možný aby na tom každej začínal.. vždyť takových lidí co umí programovat ať už php, c++ atd atd. hlavně je to k něčemu, kdežto tady samý algoritmy a přepsaný vývojový diagramy, řekl bych že nic moc užitečnýho

lukke87
nováček
Příspěvky: 5
Registrován: duben 11
Bydliště: Hradec Králové
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: TurboDelphi-Pascal

Příspěvekod lukke87 » 01 kvě 2011 13:20

Každý algoritmus bude realizován samostatnou procedurou s dvěma parametry (počet hodnot a pole čísel) umístěnou v hlavním programu
takže ten můj návrh je blbost, překoukl jsem v zadání že to musí bejt bez unity :/ pouze v hlavnim programu. asi jsi nezkoušl to napsat co? jinak ten čas funguje

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: TurboDelphi-Pascal

Příspěvekod faraon » 01 kvě 2011 13:46

asi jsi nezkoušl to napsat


Já jsem od pátku nebyl doma, takže ani ten starý TurboPascal jsem neměl po ruce, nebo aspoň knížku :-( Za ty roky co s ním nedělám jsem to dost pozapomněl.
Čím byl ten čas, tím obalením v unitu? Říkal jsem si jestli ti tam nechybí nějaká knihovna, ve které je ta funkce.

Z toho tvého návrhu můžeš použít dost věcí, prostě to slož do jednoho bloku bez všech těch objektových zbytečností navíc a přidej k tomu ty dvě procedury, takhle nějak by to asi vypadalo v tom Pascalu:

Kód: Vybrat vše

program razeni
- proměnné...

procedure bubblesort(var pole, velikost)
begin
...
end

procedure nejvetsi(var pole, velikost)
begin
...
end

hlavní program:

do
  ...
  - vyplnění polí
  - setřídění1
  - setřídění2
  - výpis a zaznamenání časů
  - dotaz na uložení do souboru
  ...
until odpoved="NE"

end.


Ještě mě napadlo že ty podprogramy řazení by mohly být funkce a vracet samy dobu svého běhu, ale není to úplně podle pravidel - každá funkce by měla dělat jen jednu věc!
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)


Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host