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

Pascal - razeni – Pascal – Fórum – Programujte.comPascal - razeni – Pascal – Fórum – Programujte.com

 

Petra
~ Anonymní uživatel
24 příspěvků
22. 5. 2016   #1
-
0
-

Ahoj,

mam tento priklad, moc nevim jak to resit: Definujte objekt (včetně těl metod) se třemi datovými složkami A, B, C – soubory typu text,
dáles metodami Spoj a Srovnej. V textových souborech se pracuje s celými řádky. Metoda
Spojpředpokládá, že řádky souborů A a B jsou seřazeny podle abecedy, a sloučí je do souboru C tak,
abyměl také seřazeny řádky podle abecedy. Pro porovnání řetězců slouží metoda s názvem
Srovnej.Objekt navrhněte tak, aby mohl být polymorfní s jiným objektem, který bude mít jinou
metodu Srovnej.

program pr18;
type
    prvni = object
        a,b,c: text;
        constructor init;
        procedure spoj;
        function srovnej(x,y:string):boolean; virtual;
    end;
    druhy = object(prvni)
        constructor init;
        function srovnej(x,y:string):boolean; virtual;
    end;
    pole = array[1..100] of string;
    
constructor prvni.init;
begin
    assign(a,'pr18_a.txt');
    assign(b,'pr18_b.txt');
    assign(c,'pr18_c.txt');
    reset(a);
    reset(b);
    rewrite(c);
    
end;

procedure prvni.spoj;
var ret,ret2,pom: string; i,j: byte; p:pole;
begin
    i:=0;
    while not eof(a) do begin
         readln(a,ret);
         inc(i);
         p[i]:=ret;
         //writeln(c,ret);
    end;
    
    while not eof(b) do begin
         readln(b,ret);
         inc(i);
         p[i]:=ret;
         //writeln(c,ret);
    end;
    
    for j:=i downto 2 do begin
         while srovnej(p[j],p[j-1]) do begin
             pom:=p[j];
             p[j]:=p[j-1];
             p[j-1]:=pom;
         end;
    end;
    
    for j:=1 to i do writeln(p[j]);
    
    close(a);
    close(b);
    close(c);
end;
function prvni.srovnej(x,y:string):boolean;
begin
      srovnej:=x>y;
end;


constructor druhy.init;
begin
end;

function druhy.srovnej(x,y:string):boolean;
begin
  srovnej:=x>y;
end;

var o: prvni;
begin
     o.init;
     o.spoj;
     
     readln;
     
end.

Dekuji za pomoc

Nahlásit jako SPAM
IP: 89.176.25.–
JoDiK
~ Anonymní uživatel
987 příspěvků
23. 5. 2016   #2
-
0
-

Řekl bych, žes nepochopil zadání a děláš něco, co se po tobě nechce. V zadání je výslovně řečeno, že máš poskládat třetí soubor ze dvou už seřazených souborů. Zřejmě se předpokládá, že oba soubory jsou tak velké, že se nevejdou do paměti. Ty ale načteš první i druhý soubor do paměti a pak je v paměti třídíš. Podle mě jsi měl přečíst z každého souboru jen jeden řetězec a podle výsledku porovnání uložit jeden z nich do třetího souboru a načíst další řetězec už jen z  toho správného souboru k dalšímu porovnání. Teď se mi už nechce promýšlet algoritmus toho dalšího čtení, kde se musí hlídat i konec souboru a dočtení případného zbytku druhého souboru už bez porovnávání...

Navíc místo if používáš while, takže pokud by se vyskytly dva stejné řetězce, vyrobils nekonečný cyklus...

Nahlásit jako SPAM
IP: 88.103.228.–
Mircosoft+1
Věrný člen
23. 5. 2016   #3
-
0
-

Doporučuji vygooglit termín mergesort, vykuchat si z něj slučovací algoritmus a upravit ho pro použití se soubory místo polí.

Nahlásit jako SPAM
IP: 212.79.106.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
peter
~ Anonymní uživatel
4016 příspěvků
24. 5. 2016   #4
-
0
-

Viz Jodik, principialne

Kdyz vis, ze je to serazene, tak ti staci na zacatku nacist prvni hodnotu. A z tech dvou zapsat tu, ktera je mensi a nacist dalsi, dokud nenarazis na konec souboru. Na konci pak bude treba zapsat vsechny hodnoty ze zbyvajici souboru.

Principialne (pascal kod ale nemusi byt spravne)

var 
  a, b, i, j, k, konec0, konec1 : integer;
  soubor0: array[0..2] of integer;
  soubor1: array[0..4] of integer;
  soubor2: array[0..10] of integer;

konec0:=3; soubor0[0]:=3; soubor0[1]:=4; soubor0[2]:=5;
konec1:=5; soubor1[0]:=1; soubor1[1]:=3; soubor1[2]:=5; soubor1[3]:=6; soubor1[4]:=7;

i := 0; j := 0; k := 0;
cyklus
{
a = soubor0[i]; b := soubor1[j];
if (a<b) {soubor2[k] := a; k++; i++;} else {soubor2[k] := b; k++; j++;}
if (i>konec0 || j>konec1) {break;}
}
if (i>konec0) {cyklus {soubor2[k] := soubor1[j]; j++; if (j>konec1) break;}}
else          {cyklus {soubor2[k] := soubor0[i]; i++; if (i>konec0) break;}}
Nahlásit jako SPAM
IP: 2001:718:2601:26c:2021:9a...–
24. 5. 2016   #5
-
0
-

Třetí soubor má být podle abecedy. Představte si první soubor obsahující třeba Bořivoj, David, Xaver a druhý soubor Alois, Jiří, Václav. Pokud to vezmu podle první položky, nevznikne abecedně seřazený soubor (výsledek by byl Alois, Jiří, Václav, Bořivoj, David, Xaver). Musí na to jít takto:

1. vezmu první položku z každého souboru a zjistím, která je blíž začátku abecedy, tu zapíšu do výstupního souboru. Tuto položku už v dalším porovnání nepoužiju. (Alois z druhého souboru)
2. místo zapsané položky si do dalšího porovnání vezmu další položku z téhož souboru (z druhého souboru Jiří)
3. provedu porovnání, opět zapíši do výstupu položku blíž k začátku abecedy (Bořivoj z prvního souboru) a tuto položku již do dalšího porovnávání nepoužiji.
4. místo zapsané položky si do dalšího porovnání vezmu další položku z téhož souboru (tentokrát z prvního souboru David)
5. opět porovnám .....
atd

Celé to naznačuje použití cyklu. Pokud dojde k vyčerpání slov v jednom ze souborů, slova z druhého zkopíruji do výstupu (nastalo by v případě, že by v prvním souboru byli ještě Zdeněk a Žaneta)

hu

Nahlásit jako SPAM
IP: 195.178.67.–
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, 7 hostů

Podobná vlákna

Pascal: kurz turbo pascal II — založil Systém

Řazení datagrid — založil JendaB

Zmena řazení — založil Row

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ý