ďťż

Ładny brzuch

Witam Potrzebuje pomocy musze napisać program zliczający znaki,słowa i wiersze w pliku tekstowym.
Czyli przykładowy tekst wpisać do pliku tekstowego i żeby program wypisał ile jest znaków,słów i wiersze.
Poczyniłem już jakieś kroki i doszedłem do stanu że program liczy mi znaki czyli małe literki,duże,cyfry,spacje ale nie wiem jak napisać by liczył słowa i wiersze.
Potrzebuje ten program na niedziele i musze go do tego czasu pojąć bo będę go bronił na zajęciach Z góry dziękuje za pomoc.
Poniżej wkleiłem to co mi się udało zrobić.

program Statystyka_pliku;
var
ch :Char; {"odczytywane znaki"}
c, {"cyfry"}
D, {"DUZA LITERE"}
m, {"mala litere"}
spacja, {spacje}
F :Text; {"zmienna plikowa"}
BEGIN
Assign(F,'c:\dane.txt');
Reset(F);
While Not EoF(F) Do
begin
read(f,ch);
if( ch >='0') and (ch <= '9' ) then
Inc©
else
if(ch >= 'A') and ( ch <= 'Z') then
Inc(D)
else
if(ch >= 'a') and ( ch <= 'z') then
Inc(m)
else
if(ch = '') then
Inc(spacja);

end;
Close(F);
WriteLn;

WriteLn('W pliku jest:');
WriteLn('cyfr: ', c);
WriteLn('duzych liter: ', D);
WriteLn('malych liter: ', m);
WriteLn('spacje: ', spacja);
ReadLn;
END.



zamiast read(f,ch) daj
readln(f,string);
inc(linie);
for i:=1 to length(string) do begin
...

dzieki temu kazda linia bedzie odczytywana od razu do stringa. a wyrazy zeby liczyc wystarczy dodawac po jednym przy kazdej spacji / nowej linii


zamiast read(f,ch) daj
readln(f,string);
inc(linie);
for i:=1 to length(string) do begin
...

dzieki temu kazda linia bedzie odczytywana od razu do stringa. a wyrazy zeby liczyc wystarczy dodawac po jednym przy kazdej spacji / nowej linii


Dzięki :) tylko jak możesz napisz mi jak to by było z tym liczeniem słów w jezyku pascal.Doszedłem do tego że jak będzie spacja to może liczyć słowo ale przyładowo litera jedna np i będzie jako znak a on go będzie liczył jako słowo bo będzie spacja.

to sprawdzaj dlugosc tych wyrazow - jesli bedzia rowna 1 to znaczy ze to znak, a jak wiecej to wyraz..




to sprawdzaj dlugosc tych wyrazow - jesli bedzia rowna 1 to znaczy ze to znak, a jak wiecej to wyraz..

Hmm cieżka sprawa.Ja z pascala jestem laikiem i napisanie tego co powyżej wkleiłem zabrało mi dużo czasu.Nie umiem napisać w jezuku pascala tak by liczył słowa do spacja sprawdzająć odrazu czy to znak czy wyraz :( Jak ktoś może niech napisze.Bo sobie raczej nie poradze.Musiałbym bym posiedzieć przy tym dłużej.Na jutro musze zaprezentować ten program na zaliczeniu i musze go obronić wieć ważne bym go rozumiał oprócz tego że będzie działać.

nie rozumiem co masz za problem - przeciez pojedynczy znak tez jest wyrazem? "i", "a" itd. tez sa liczone jako osobne slowa.

Hej!Czy ktos moglby mi pomoc i powiedziec gdzie mam blad ???Prosze o szybka odp,najlepiej na gg 8743195,albo maila michal-nazarewicz@wp.pl

wyswietla mi sie blad begin expected. Pomozcie prosz!!!!!!!!!

Program KALKULATOR;

var wyrazenie : String[255];
var wynik : real;
var i: integer;
var historia: array [0..100] of string;
var q: integer;0 ;
var s: string;

type
liczenie = record
Argument1: real;
Argument2: real;
Znak: shortint;
Pozycja: integer;
end;

var
Liczydlo: liczenie;

function Licz(wyrazenie : String): Real;
begin
Liczydlo.Znak:=10;
for i:=0 to length(wyrazenie)-1 do
Case wyrazenie[i] of
'+': begin
Liczydlo.Znak:=0; Liczydlo.Pozycja:=i; break;
end;

'-': begin
Liczydlo.Znak:=1; Liczydlo.Pozycja:=i; break;
end;

'*': begin
Liczydlo.Znak:=2; Liczydlo.Pozycja:=i; break;
end;

'/': begin
Liczydlo.Znak:=3; Liczydlo.Pozycja:=i; break;
end;

end;
if Liczydlo.Znak = 10 then
begin
writeln('Nie podano znaku wyraÄźenia!');
exit;
end;
if ((Copy(wyrazenie,Liczydlo.Pozycja+1, Length(wyrazenie)-1))) = '0' then
if Liczydlo.Znak = 3 then
begin
writeln('Proba dzielenia przez 0');
exit;
end;
Val(Copy(wyrazenie,0, Liczydlo.Pozycja-1),Liczydlo.Argument1);
Val(Copy(wyrazenie,Liczydlo.Pozycja+1, Length(wyrazenie)-1),Liczydlo.Argument2);

Case Liczydlo.Znak of
0: wynik:=Liczydlo.Argument1+Liczydlo.Argument2;
1: wynik:=Liczydlo.Argument1-Liczydlo.Argument2;
2: wynik:=Liczydlo.Argument1*Liczydlo.Argument2;
3: wynik:=Liczydlo.Argument1/Liczydlo.Argument2;
end;
writeln(wynik:0:4);
str(wynik:0:4,s);
historia[q]:=wyrazenie+'='+s;
inc(q);
end;

BEGIN
Writeln('### KALKULATOR ###');
Writeln('Wpisz wyraÄźenie');
Writeln('Wpisz koniec aby zakoäczy†');
Writeln('lub pokaÄź aby pokaza† ostatnio dokonane dziaˆania');

REPEAT
begin
readln(wyrazenie);
if wyrazenie <> 'koniec' then
begin
if wyrazenie<> 'pokaÄź' then
licz(wyrazenie)
else
for i:=0 to q do writeln(historia[i]);
end;
end;
UNTIL wyrazenie='koniec'
END.


Hej!Czy ktos moglby mi pomoc i powiedziec gdzie mam blad ???Prosze o szybka odp,najlepiej na gg 8743195,albo maila michal-nazarewicz@wp.pl

wyswietla mi sie blad begin expected. Pomozcie prosz!!!!!!!!!

Program KALKULATOR;

var wyrazenie : String[255];
var wynik : real;
var i: integer;
var historia: array [0..100] of string;
var q: integer;0 ;
var s: string;

type
liczenie = record
Argument1: real;
Argument2: real;
Znak: shortint;
Pozycja: integer;
end;

var
Liczydlo: liczenie;

function Licz(wyrazenie : String): Real;
begin
Liczydlo.Znak:=10;
for i:=0 to length(wyrazenie)-1 do
Case wyrazenie[i] of
'+': begin
Liczydlo.Znak:=0; Liczydlo.Pozycja:=i; break;
end;

'-': begin
Liczydlo.Znak:=1; Liczydlo.Pozycja:=i; break;
end;

'*': begin
Liczydlo.Znak:=2; Liczydlo.Pozycja:=i; break;
end;

'/': begin
Liczydlo.Znak:=3; Liczydlo.Pozycja:=i; break;
end;

end;
if Liczydlo.Znak = 10 then
begin
writeln('Nie podano znaku wyraÄźenia!');
exit;
end;
if ((Copy(wyrazenie,Liczydlo.Pozycja+1, Length(wyrazenie)-1))) = '0' then
if Liczydlo.Znak = 3 then
begin
writeln('Proba dzielenia przez 0');
exit;
end;
Val(Copy(wyrazenie,0, Liczydlo.Pozycja-1),Liczydlo.Argument1);
Val(Copy(wyrazenie,Liczydlo.Pozycja+1, Length(wyrazenie)-1),Liczydlo.Argument2);

Case Liczydlo.Znak of
0: wynik:=Liczydlo.Argument1+Liczydlo.Argument2;
1: wynik:=Liczydlo.Argument1-Liczydlo.Argument2;
2: wynik:=Liczydlo.Argument1*Liczydlo.Argument2;
3: wynik:=Liczydlo.Argument1/Liczydlo.Argument2;
end;
writeln(wynik:0:4);
str(wynik:0:4,s);
historia[q]:=wyrazenie+'='+s;
inc(q);
end;

BEGIN
Writeln('### KALKULATOR ###');
Writeln('Wpisz wyraÄźenie');
Writeln('Wpisz koniec aby zakoäczy†');
Writeln('lub pokaÄź aby pokaza† ostatnio dokonane dzia�ania');

REPEAT
begin
readln(wyrazenie);
if wyrazenie <> 'koniec' then
begin
if wyrazenie<> 'pokaÄź' then
licz(wyrazenie)
else
for i:=0 to q do writeln(historia[i]);
end;
end;
UNTIL wyrazenie='koniec'
END.

Czy to jest pełny komunikat błędu? Nie została podana żadna określona linijka przy nim?
Tak przeleciałem wzrokiem ten kod, zobacz na to, co pogrubiłem. Tego pogrubionego end chyba nie powinno być, bo wg Pascala zamyka Ci ono ciało funkcji...


Czy to jest pełny komunikat błędu? Nie została podana żadna określona linijka przy nim?
Tak przeleciałem wzrokiem ten kod, zobacz na to, co pogrubiłem. Tego pogrubionego end chyba nie powinno być, bo wg Pascala zamyka Ci ono ciało funkcji...

nie, bo zamyka case'a

REPEAT begin readln(wyrazenie); if wyrazenie <> 'koniec' then begin if wyrazenie<> 'pokaľ' then licz(wyrazenie) else for i:=0 to q do writeln(historia[i]); end; end; UNTIL wyrazenie='koniec'

repeat ... until chyba nie wymaga dodatkowo wrzucania instrukcji w begin...end
a nawet jesli wymaga, to po end nie powinno byc srednika (za to po warunku until owszem)

A tak btw, to wcięć tam u was nie znaju? :|
Użytkownik bryn edytował ten post 11 czerwiec 2007, 18:00
hehe nikt z was nie trafil :) blad prosty: masz literowke o tutaj:
var q: integer;0;
(6 linijka od gory) a powinno byc tak:
var q: integer;

I teraz druga sprawa:
Korzystasz z procedury Val ktora wywolujesz z dwoma parametrami, a ona przeciez wymaga 3. Ta trzecia zmienna sluzy do tego aby zapamietac pozycje pierwszego blednego znaku wystepujacego w pierwszym parametrze przekazywanym do procedury Val. Ogolnie zeby wszystko dzialalo dopisz jedna zmienna o nazwie np. kod typu Integer; a te dwie linjki

Val(Copy(wyrazenie,0, Liczydlo.Pozycja-1),Liczydlo.Argument1); Val(Copy(wyrazenie,Liczydlo.Pozycja+1, Length(wyrazenie)-1),Liczydlo.Argument2);

Zamien na

Val(Copy(wyrazenie,0, Liczydlo.Pozycja-1),Liczydlo.Argument1,kod); Val(Copy(wyrazenie,Liczydlo.Pozycja+1, Length(wyrazenie)-1),Liczydlo.Argument2,kod);

Teraz bedzie dzialac bo sam sprawdzalem. A swoja droga fajny program :)

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •