Ahoj,
.
Děkuji
Fórum › Pascal
Seminární práce
Takže jestli to dobře chápu, máš několik řetězců (string), které potřebuješ složit do jednoho. Hmm... zkusme to třeba takhle:
1) Deklaruj si pomocný řetězec, do kterého budeš ukládat výsledky, na začátku do něj vlož jeden ze zadaných fragmentů (tento fragment vyřaď ze seznamu, který budeš ještě zpracovávat).
2) Pro n od 6 do 10:
- Vezmi n znaků ze začátku toho pomocného řetězce (funkce Copy).
- Projdi postupně všechny zbývající fragmenty, vezmi z nich stejným způsobem konce a porovnej s tím začátkem.
- Pokud je některý konec stejný jako ten začátek, tak:
a) Ten konec z příslušného fragmentu ukroj (procedura Delete),
b) zbylou část fragmentu připoj zleva k pomocnému řetězci,
c) tento fragment vyřaď ze seznamu (abys ho nezačal zpracovávat podruhé),
d) ukonči tento cyklus (třeba příkazem Break nebo nějakou podmínkou) a začni znovu od bodu 2.
- Pokud jsme ještě tady, zleva se nic připojit nedá. Tak to celé proveď ještě jednou pro druhý konec řetězce (porovnávej konec pomocného řetězce se začátky fragmentů, v případě shody je připojuj zprava).
3) To celé opakuj tak dlouho, dokud nezpracuješ a nepřipojíš všechny fragmenty.
4) Výsledek je v tom pomocném řetězci.
Pozice fragmentů ve výsledném textu bych hledal až potom, co by byl celý text složený - na takovéhle věci je ideální funkce Pos.
Moje stránka.
Dobrá, tady máš malý polopatický náznak:
const max=... {kolik fragmentu maximalne dostanes?}
var fragmenty:array[1..max] of record
obsah:string;
zpracovan:boolean;
end;
vysledek:string;
i,n:word;
pom:string;
...
{inicializace:}
for i:=1 to max do
with fragmenty[i] do begin
obsah:=... {nejak ho nacist}
zpracovan:=false;
end;
{ted zkontroluj, jestli jsou vsechny fragmenty aspon 6 znaku dlouhe, a jestli ne, tak nahlas chybu}
{algoritmus:}
vysledek:=fragmenty[1].obsah; fragmenty[1].zpracovan:=true;
for n:=6 to 10 do
begin
for i:=1 to max do with fragmenty[i] do {pro kazdy fragment}
if not zpracovan then begin
if copy(obsah,length(obsah)-n+1,n)=copy(vysledek,1,n); {kdyz jeho konec pasuje na zacatek vysledku}
then begin
vysledek:=copy(obsah,1,length(obsah)-n)+vysledek; {pripojime k vysledku}
zpracovan:=true; {tenhle fragment je vyrizeny}
break; {konec vnitrniho foru}
end;
if copy(obsah,1,n)=copy(vysledek,length(vysledek)-n+1,n)
then begin
...
{podobnym zpusobem over, jestli zacatek pasuje na konec vysledku}
...
end;
end;
end;
Šlo by to samozřejmě i obráceně - vnější cyklus točit pro všechny fragmenty a vnitřní pro 6..10 znaků. Ale celková ukončovací podmínka bude stejná: když byly všechny fragmenty zpracovány.
Neručím za správnost - důkladně to po mně zkontroluj. Taky tam neřeším chybové stavy, tj. kdyby mělo několik fragmentů stejný začátek nebo konec (proto by bylo lepší brát to naopak od 10 do 6 (downto), aby se nejdřív zpracovaly ty fragmenty, které se shodují delším úsekem) nebo kdyby některý fragment vůbec nepasoval (v takovém případě by se program zasekl v nekonečné smyčce).
Úsek pro kontrolu opačného konce řetězců a funkci, která zjistí, jestli mají všechny fragmenty nastavenou položku zpracovan na true, už si dopiš sám, to už není nic těžkého (doufám :-) ).
Moje stránka.
Mám dojem, že tento příklad byl v soutěži z programování v krajském kole v moravskoslezském kraji. Možná se ti ho podaří někde na internetu vyhrabat.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Seminární práce do školy — založil Peter
Seminární práce Assembler — založil Martin
Seminární práce - prosím pomožte: — založil bunjee
Seminární Práce Gray na Gray +3 — založil gr123
Pomoc se seminarni praci — založil Killer stc
Moderátoři diskuze