Kopie textoveho souboru s omezenym poctem znaku na radku – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Kopie textoveho souboru s omezenym poctem znaku na radku – Pascal – Fórum – Programujte.comKopie textoveho souboru s omezenym poctem znaku na radku – Pascal – Fórum – Programujte.com

 

kejta0
Návštěvník
10. 12. 2013   #1
-
0
-

Dobrý den zadáním je: Ve vstupním textovém souboru je uložen text s řádky dlouhými až 100 znaků. Mezi každými dvěma slovy na řádku je jedna nebo více mezer, na začátku i na konci řádku být mezery mohou, ale nemusí. V souboru mohou být i prázdné řádky nebo řádky obsahující pouze mezery. Napište program, který vytvoří kopii tohoto souboru tak, aby řádky výstupního souboru byly dlouhé nejvýše N znaků (N je údaj zadaný na vstupu, menší než 100). Slova přitom nerozdělujte – pokud se na výsledný N-znakový řádek nevejde celé slovo, nechte řádek kratší a další slovo již přesuňte na začátek následujícího řádku. Na každý řádek výstupního souboru umístěte co nejvíce slov, kolik se do stanoveného limitu N znaků vejde, odstraňte při tom nadbytečné mezery na začátku řádku i mezi slovy (mezi každými dvěma slovy nechte vždy jenom jednu mezeru). Upravený text zapište do výstupního textového souboru.

Opět takový můj marný pokus něco vytvořit:  

program kopie;

var vstup,vystup:text;
    N,pocitadlo:integer;
    znak:char;


begin

assign (vstup,'vstup.txt');
reset (vstup);
assign (vystup,'vystup.txt');
rewrite (vystup);

writeln('Zadej maximalni pocet znaku na radku: ');
readln(N);

pocitadlo:=0;

while not eof(vstup) do
begin

read(vstup,znak);
inc(pocitadlo);
if pocitadlo <= N then write(vystup,znak)
else write(vystup,#13);

end;

close(vstup);
close(vystup);


end.
  

Při takovém to zápisu, mi to vyvolává RunTimeError(103) na příkazu  

writeln('Zadej maximalni pocet znaku na radku: ');

A dál si myslim že tam bude spousta dalších blbostí.. Děkuji za rady.

Nahlásit jako SPAM
IP: 85.70.175.–
kejta0
Návštěvník
10. 12. 2013   #2
-
0
-

Takto se mi ale zkopiruje pouze prvnich N(kdyz N zadam natvrdo jako konstantu, protoze stale nevim jak vyresit to ze ji ma uzivatel zadat na vstupu) znaku a dal program nepokracuje.

Nahlásit jako SPAM
IP: 85.70.175.–
10. 12. 2013   #3
-
0
-

V uvedeném řádku asi chyba nebude. Spíš si myslím, že je problém s otevíráním souborů, které mu předchází. Vůbec si neověřuješ otevření souboru - to může skončit neúspěchem.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
kejta0
Návštěvník
10. 12. 2013   #4
-
0
-

Jenže když to zadám právě bez tohoto  

writeln('Zadej maximalni pocet znaku na radku: ');
readln(N);

a místo toho zadám do zdrojáku to N natvrdo

N:=10;

Tak se program normálně provede. Takze otevreni asi uspesne je, nebo ne?

Nahlásit jako SPAM
IP: 85.70.175.–
kejta0
Návštěvník
10. 12. 2013   #5
-
0
-

btw. vytvoril jsem novy soubor a zdrojak jenom zkopiroval a najednou to funguje, tak nevim co bylo predtim za problem. 

K programu, kdyz to udelam tak jak je napsano ve zdrojaku, tak se mi to provede pouze do skonceni toho pocitadla, dal uz to nepokracuje, mam pouzit nejaky jiny cyklus? 

Nahlásit jako SPAM
IP: 85.70.175.–
10. 12. 2013   #6
-
0
-

http://www.freepascal.org/docs-html/rtl/system/rewrite.html

http://www.freepascal.org/docs-html/rtl/system/reset.html

tohle jsem myslel. V tom writeln a readln chyba není, díval jsem se na příklady, jak se používají

hu

Nahlásit jako SPAM
IP: 195.178.67.–
kejta0
Návštěvník
10. 12. 2013   #7
-
0
-

Jo, uz chapu. A s tim zbytkem bys mi dokazal nejak poradit?

Nahlásit jako SPAM
IP: 85.70.175.–
JoDiK
~ Anonymní uživatel
987 příspěvků
11. 12. 2013   #8
-
0
-

#7 kejta
Zkus v případě, že počet znaků dosáhl požadované hodnoty nevypisovat #13, ale použij writeln, kterým vypíšeš ten poslední N-tý znak na předchozím řádku a ukončíš regulerně řádek (mělo by tam být #13#10 ale o to se postará writeln). A nezapomeň taky v této větvi vynulovat počítadlo! Pak ti to aspoň rozdělí na ty N-znakové řádky. S těmi dalšími problémy (mezery, dělení na hranici slov) budeš mít podle dosud předvedených schopností zřejmě velké potíže...

Nahlásit jako SPAM
IP: 88.103.236.–
kejta0
Návštěvník
11. 12. 2013   #9
-
0
-

   

while not eof(vstup) do
begin
read(vstup,znak);
inc(pocitadlo);
if (pocitadlo <= N) then write(vystup,znak)
else writeln;

end;    

..a jak do toho zakomponovat to vynulovani pocitadla?

else if (pocitadlo >= N) then begin writeln; pocitadlo:=0; end;

Nahlásit jako SPAM
IP: 85.70.175.–
JoDiK
~ Anonymní uživatel
987 příspěvků
11. 12. 2013   #10
-
0
-

#9 kejta
Není třeba další podmínka, piš to rovnou...

Zapomněl jsi, že vypisuješ do výstupního souboru a zapomněl jsi vypsat ten poslední znak - vizk příklad.

while not eof(vstup) do
begin
read(vstup,znak);
inc(pocitadlo);
if (pocitadlo <= N) then write(vystup,znak)
else begin writeln(vystup,znak); pocitadlo:=0; end;

end;   
Nahlásit jako SPAM
IP: 88.103.236.–
kejta0
Návštěvník
11. 12. 2013   #11
-
0
-

Dobře, díky. To odstranění těch mezer bych měl provádět asi ještě před těmito příkazy, že? 

Ale vubec nevim ,pomoci jakych prikazu toho docilit.. Mam nacist ty radky, jako string?

Nahlásit jako SPAM
IP: 85.70.175.–
kejta0
Návštěvník
11. 12. 2013   #12
-
0
-

   

Function mezery(s:String):string;
    var P:byte;
    begin
      P:=Pos('  ',s);
      while P > 0 do
    	begin
    	  Delete(s,P,1);
    	  P:=Pos('  ',s);
    	end;
      mezery:=s;
    end;   

Takhle bych je odstranil pomoci toho ze je budu nacitat ze Stringu. Ale nevim jestli tohle udelat, po a nebo uz predtim nez srovnam tu sirku.

Nahlásit jako SPAM
IP: 85.70.175.–
kejta0
Návštěvník
11. 12. 2013   #13
-
0
-

   

while not eof(vstup) do
begin
readln(vstup,radek);
P:=Pos('  ',radek);
while P > 0 do
begin
Delete(radek,P,1);
P:=Pos('  ',radek);
end;
mezery:=radek;
end;

begin
read(vstup,znak);
inc(pocitadlo);
if (pocitadlo <= N) then write(vystup,znak)
else begin writeln(vystup,znak);pocitadlo:=0; end;

end;   

potrebuji ale najit zpusob, jak to ulozit opet do toho vstupniho a nebo vystupniho.. 

Nahlásit jako SPAM
IP: 85.70.175.–
JoDiK
~ Anonymní uživatel
987 příspěvků
11. 12. 2013   #14
-
0
-

#13 kejta
Hlavně si musíš znovu přečíst zadání a jestli z něj něčemu nerozumíš, konzultovat to se zadavatelem.

Protože když se takhle ptáš, evidentně jsi nepochopil, co máš dělat.

Protože jak jsem to zadání pochopil já, nemáš "srovnávat šířku", máš zařídit, aby řádky textu po odstranění přebytečných mezer nebyly delší než zadaná hodnota, přičemž máš přerovnávat celá slova a ne uřezávat uprostřed!

Jak už jsem psal, asi to pro tebe bude těžké sousto...

Nahlásit jako SPAM
IP: 88.103.236.–
kejta0
Návštěvník
11. 12. 2013   #15
-
0
-

Myslim si ze zadani chapu dobre, akorat nevim jakym vhodnym postupem ho zpracovat do zdrojaku. Proto se obracim na vas, ze mi pomuzete. 

Nahlásit jako SPAM
IP: 85.70.175.–
11. 12. 2013   #16
-
0
-

Asi bych vstupní soubor četl po slovech. Zjistil bych si délku přečteného slova. Očekával bych, že za znaky . (tečka) a , (čárka) je mezera, tyto znaky bych považoval pro tento program za součást slova. Evidoval bych, kolik znaků jsem zapsal do řádku výstupního souboru. Z délky slova (před slovem je mezera pokud to není slovo na začátku řádku) a počtů znaků v řádku výst. souboru bych spočítal délku řádku po přidání slova, pokud nebude větší než max. délka řádku, zapíšu slovo do výstupního souboru a aktualizoval délku řádku ve výst. souboru, jinak ukončit řádek, slovo zapsat na nový řádek a aktualizovat počet znaků v řádku ve výst. souboru (v podstatě je to délka zapsaného slova).

Tento (zjednodušeně popsaný) algoritmus podle mého názoru odpovídá přesně zadání

hu

Nahlásit jako SPAM
IP: 195.178.67.–
JoDiK
~ Anonymní uživatel
987 příspěvků
11. 12. 2013   #17
-
0
-

#16 hlucheucho
To bych docela rád viděl, jak budeš z toho souboru číst "po slovech".

Nahlásit jako SPAM
IP: 88.103.236.–
11. 12. 2013   #18
-
0
-

si ten krok rozeber "na atomy". Soubor mohu číst po jednotlivých znacích. Slovo končí mezerou, sekvencí mezer nebo koncem řádku. Dalšímu slovu předchází mezera, sekvence mezer, konec řádku a nebo nepředchází nic. 

Akorát jsem v zadání narazil na jednu drobnost: asi se nemají vypouštět prázdné řádky. Takže je třeba evidovat co je konec plného řádku a co je prázdný nebo "mezerový" řádek.

Nahlásit jako SPAM
IP: 195.178.67.–
kejta0
Návštěvník
12. 12. 2013   #19
-
0
-

Ale jak prave definovat pomoci nejakyho prikazu co je slovo, abych to mohl cist jak ty rikas po slovech.

Nahlásit jako SPAM
IP: 85.70.175.–
JoDiK
~ Anonymní uživatel
987 příspěvků
12. 12. 2013   #20
-
0
-

#19 kejta
"definovat pomoci nejakyho prikazu co je slovo" :-O

No nic, já to vzdávám, nechávám tě hluchému uchu...

Nahlásit jako SPAM
IP: 88.103.233.–
kejta0
Návštěvník
12. 12. 2013   #21
-
0
-

Dobře, tak se pokus mi to vysvětlit. Zatím tu píšeš, jen jakej jsem blbec, ale žádná konstruktivní rada. Promiň, že se programovat teprve učím.

Nahlásit jako SPAM
IP: 85.70.175.–
JoDiK
~ Anonymní uživatel
987 příspěvků
12. 12. 2013   #22
-
0
-

#21 kejta
Heleď, jestli umíš číst, tak nevím, kam na takový blbostě chodíš...

Co si myslím jsem ti už napsal dvakrát (a o tom jakej jsi nebo nejsi to nebylo ani jednou) a jestli ti třeba  tento nebo tento můj příspěvek nepřišel konstruktivní, tak bylo mé rozhodnutí správné.

Poslední rada - uč se na jednodušších příkladech, tohle je pro začátečníka moc těžký...

Howgh.

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

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ý