Frekvenční tabulka znaků – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Frekvenční tabulka znaků – Pascal – Fórum – Programujte.comFrekvenční tabulka znaků – Pascal – Fórum – Programujte.com

 

Woody
~ Anonymní uživatel
3 příspěvky
28. 8. 2014   #1
-
0
-


program Pocet;

uses crt;

var s: text;
zn: char;
A: array [' '..'z'] of integer;

begin
clrscr;
assign(s,'pokus.txt');
reset(A);
read (s,zn);

while not eof(s) do;
begin;
A[zn]:= A[zn]+1;
end;
writeln(A,zn);
close(s);
end.

Dobrý den jsem žákem střední školy a můj učitel mně nechce pustit dále do dalšího ročníku zadal mi úkol vytvořit program který přečte soubor a vypíše frekvenční tabulku znaků zatím se mi povedlo vymyslet toto může mi někdo prosím poradit ?

Nahlásit jako SPAM
IP: 89.177.197.–
miHan0
Návštěvník
28. 8. 2014   #2
-
0
-

#1 Woody
No nějako jsi zapomněl upřesnit, s čím konkrétně by jsi potřeboval pomoct ... to co jsi tady publikoval mi spíše přijde jako nějaká část jakéhosi projektu ... jde ti to vůbec přeložit?

Rozděl si celý úkol na X dílčích kroků a ty potom realizuj, uvidíš, že se ti bude pracovat lépe.

Každopádně k tvému projektu. Přístup k nějakému souboru tam už zhruba máš, tak že teď by tě asi mělo nejvíce pálit procházení toho souboru, a inkrementování počtu výskytů jednotlivých znaků ...

Nahlásit jako SPAM
IP: 46.13.193.–
Woody
~ Anonymní uživatel
3 příspěvky
28. 8. 2014   #3
-
0
-

Jde o to že program má použít pole pro výpis znaků,  tj místo číselného indexu použít jako index znak abecedy a výsledek by měl vypadat cca tak že:

"V souboru se nacházejí tyto znaky:

A 2

B 10

C 3

atd s tím že čísloza písmenem značí kolikrát se daný znak v souboru nachází, skompilovat mi to nejde, s tím že hlásí chybu v deklaraci pole.

Nahlásit jako SPAM
IP: 89.177.199.–
miHan0
Návštěvník
28. 8. 2014   #4
-
0
-

#3 Woody
Mě je jasné co ten program má děla (respektive co má být jeho výstupem), já se ptal s čím konkrétně si nevíš rady. Rozuměj, nemám zájem to za tebe psát (IMHO si myslím, že student střední školy, která je nejspíše zaměřená na IT by tohle měl zvládnout i po base piv), ale mám zájem ti pomoct tak aby sis to napsal sám a věděl co a proč to jak dělá.

Pokud chceš k uchování počtu výskytů jednotlivých znaků používat pole, nejspíše budeš muset použít dvourozměrné pole. Kde v prvním řádku budeš mít znak a ve druhém počet výskytů (řádek/sloupec, o je na tobě).

Nebo jednorozměrné, s tím, že budeš vědět, že hodnota v buňce 0 bude představovat počet výskytů znaku a, hodnota v buňce 1 bude počet výskytů znaku b, ...

Volba je na tobě, každopádně obě tyhle varianty mají slabinu v tom, že pole bude statické a tedy předem budeš muset vědět jaké znaky budeš hledat, pokud by jsi chtěl udělat program na počítání výskytu jakéhokoli znaku, bylo by vhodnější použít dynamické pole, nebo nějakou jinou dynamickou kolekci ...

Nahlásit jako SPAM
IP: 46.13.193.–
KIIV
~ Moderátor
+43
God of flame
28. 8. 2014   #5
-
+1
-
Zajímavé

#3 Woody
pascal nebere znaky jako cislo, takze musis pouzit proste array [32..255] of integer;

pak pouzit ord(zn) na prevod na cislo

pak vypsat tu tabulku pomoci cyklu (a asi jen vypisovat hodnoty vetsi nez nula)

coz me privadi k tomu, ze budes muset pole taky vynulovat - jinak by tam mohlo byt nejaky smeti

a omezit pocitani na ty znaky od 32 (mezery) az po 255

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
JoDiK
~ Anonymní uživatel
987 příspěvků
28. 8. 2014   #6
-
0
-

#5 KIIV
Překvapuje mě, že i ty máš sem tam nějaké mezery (soudě podle tvých předchozích příspěvků).

pascal nebere znaky jako cislo, takze musis pouzit proste array [32..255] of integer;

Jeden z ordinálních typů je samozřejmě i znak (tzn. že ho opravdu bere vlastně jako číslo - jak taky jinak že) a indexem pole může být jakýkoliv ordinální typ, takže deklarace pole je v pořádku a nemusí nic převádět (s drobnou výhradou, že v textovém souboru mohou samozřejmě být i konce řádků, což jsou znaky #10 a #13 a ty jsou mimo rozsah deklarovaného pole).

Nahlásit jako SPAM
IP: 88.103.236.–
JoDiK
~ Anonymní uživatel
987 příspěvků
28. 8. 2014   #7
-
0
-

#3 Woody
Jakou chybu a kde přesně ti to hlásí?

skompilovat mi to nejde, s tím že hlásí chybu v deklaraci pole

deklarace pole je v pořádku.

Nahlásit jako SPAM
IP: 88.103.236.–
JoDiK
~ Anonymní uživatel
987 příspěvků
28. 8. 2014   #8
-
0
-

#7 JoDiK
Mně překladač hlásí první chybu až tady:

reset(A);

Což je snad jasné, proměnná souboru se jmenuje s a ne A - to je pole, kde se bude počítat...

Nahlásit jako SPAM
IP: 88.103.236.–
KIIV
~ Moderátor
+43
God of flame
28. 8. 2014   #9
-
0
-

#6 JoDiK
pokud to jde, tak sou ty mezery tim, ze pascal nepouzivam vic jak dekadu...

nicmene co pamatuju, tak aby se se znakem mohlo pracovat jako s cislem, tak se musel prevest pomoci ord.. ale nejakej free pascal to treba bere jinak..

schvalne si to otestuju

EDIT: tak jo, je to jen naprosto priserne zmrsenej kod... znak jako index funguje, to samy jako rozsah pole.. kdyz se opravily ty hromady chyb, tak uz to i pocita

(+ clovek se furt neco uci :))

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
JoDiK
~ Anonymní uživatel
987 příspěvků
28. 8. 2014   #10
-
0
-

#9 KIIV
FreePascal stejně, až u reset...


Free Pascal Compiler version 2.6.2 [2013/02/16] for x86_64 Copyright (c) 1993-2012 by Florian Klaempfl and others

Pocet.pas(12,8) Error: Call by var for arg no. 1 has to match exactly: Got "Array[32..122] Of SmallInt" expected "Text"

Pocet.pas(19,10) Error: Can't read or write variables of this type

Pocet.pas(22) Fatal: There were 2 errors compiling module, stopping Fatal: Compilation aborted
 

Nahlásit jako SPAM
IP: 88.103.236.–
KIIV
~ Moderátor
+43
God of flame
28. 8. 2014   #11
-
0
-

#10 JoDiK
jj vsechny chyby sem uz proletel.. neinicializovany A, reset nad A misto s, nekonecnej cyklus (nacte jedinou hodnotu pred cyklem, pak uz nic), nevypisuje vsechny polozky ale jen jednu, nema ochranu proti znakum mimo rozsah, ...

blbej writeln(A,zn) misto  writeln(zn, ' ', A[zn]);  ...

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Woody
~ Anonymní uživatel
3 příspěvky
28. 8. 2014   #12
-
0
-

program Pocet;

uses crt;

var s: text;
zn: char;
A: array [' '..'z'] of integer;

begin
clrscr;
assign(s,'pokus.txt');
reset(s);
read (s,zn);

while not eof(s) do;
begin;
A[zn]:= A[zn]+1;
end;
writeln(zn,' ',A[zn]);
close(s);
end.

tak jsem to dostal do tohohle stavu kdy to jde skompilovat ale prakticky okamzite se to vypne coz je asi dane tim ze tam je ten zmineny nekonecny cyklus, napadlo me jeste zkusit pouzit repeat until ale priznam se ze nevim presne kam s nim.

Nahlásit jako SPAM
IP: 89.177.199.–
KIIV
~ Moderátor
+43
God of flame
28. 8. 2014   #13
-
0
-

#12 Woody
ono totiz nejde ani tak o ten cyklus, jako ze v nem proste nic nenacitas... tim padem se nikdy nedostanes na eof... a mas pravdu, nekonecny cyklus neni az tak nekonecny v pascalu -- nejspis se dostanes na maximum integeru a pak to spadne?.. coz pravdepodobne netrva zase tak dlouho

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
JoDiK
~ Anonymní uživatel
987 příspěvků
28. 8. 2014   #14
-
0
-

#12 Woody
Máš tam tenhle cyklus:

while not eof(s) do;


Překladač ho samozřejmě přeloží, je mu fuk, že nevíš co píšeš a která bije.

Až to spustíš, cyklus dělá přesně to, co je v něm napsáno - dokud není konec souboru, dělej NIC!

Tak se prosímtě nejdřív zorientuj v tom, jak se zapisují příkazy a hlavně si uvědom, co v zápisu znamená středník - ten opravdu neukončuje řádek ale celý příkaz!

Jak se čte ze souboru až do konce je popsáno na mnoha místech, je na to ověřený standardní postup, který ošetřuje i tu variantu (naprosto legální), že v souboru nemusí být nic (má velikost 0 bajtů) a tedy hned po jeho otevření nastane eof a nemůžeš z něj tedy hned něco číst - nastane chyba čtení za koncem souboru...

Inspiruj se třeba zde: http://www.spsemoh.cz/vyuka/pascal/file.htm

Nahlásit jako SPAM
IP: 88.103.236.–
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, 2 hosté

Podobná vlákna

Tabulka — založil Jakub Vojáček

Tabulka — založil Karel

Tabulka — založil schokodidek

Tabulka — založil Karel

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ý