JamesVoo Posted March 2, 2011 Report Share Posted March 2, 2011 Mam stworzyć do szkoły program który liczy ilość małych i dużych liter w pliku. Oto kod który napisałem program licznie; USES CRT; VAR t:file of char; a:char; b, i:longint; m, d:longint; BEGIN clrscr; i:=0; m:=0; d:=0; assign(t, 'plik.txt'); reset(t); b:=filesize(t); while b>=i do begin; read(t,a); if a >=('a') and a<=('z') then m:=m+1; if a >=('A') and a<=('Z') then d:=m+1; end; writeln('W pliku jest ' ,m, 'malych liter i ' ,d,' duzych liter'); close(t); readkey; END. Podczas kompilacji wyskakuje mi błąd Error: Operator is not overloaded wskazujący na linie " if a >=('a') and a<=('z') then m:=m+1;" i "if a >=('A') and a<=('Z') then d:=m+1;". Pomoże ktoś? Link to comment Share on other sites More sharing options...
[Ekspert] Hakken Posted March 2, 2011 Report Share Posted March 2, 2011 nie znam sie na pascalu, ale takie rady: rozbij if-a na linijka, czyli w oddzielnej linijce warunek, w oddzielnej zwiekszenie zmiennej rozbij if-a z koniunkcją na if zagnieżdżony w if-ie Link to comment Share on other sites More sharing options...
JamesVoo Posted March 2, 2011 Author Report Share Posted March 2, 2011 @Hakken - Nie do końca rozumiem o co Ci chodzi? coś takiego if a >=('a') and a<=('z') then begin m:=m+1; end; Link to comment Share on other sites More sharing options...
[Ekspert] Hakken Posted March 2, 2011 Report Share Posted March 2, 2011 właśnie coś takiego. ktora linijka jest "wybłędowiona" ? Link to comment Share on other sites More sharing options...
JamesVoo Posted March 2, 2011 Author Report Share Posted March 2, 2011 Nie działa. Podświetliło się to if a >=('a') and a<=('z') then Bez tego obie z ifami są z błędem Link to comment Share on other sites More sharing options...
[Ekspert] Hakken Posted March 2, 2011 Report Share Posted March 2, 2011 a sproboj tak zbudowac if-a: if (a >='a' and a<='z') thn (...) _______________ EDIT: już widzę błąd. pascal, w przeciwieństwie do niektórych języków, nie ogarnie takiego warunku. Musisz przezutować rozpatrywny znak na ASCII za pomocą funkcji Ord. (np. Ord('A')=65) więc poprawny warunek będzie taki: if (Ord(a)>=Ord('a') and Ord(a)<=Ord('z') then (...) jako uzupełnienie dodam, że funkcją odwrotną do Ord jest Chr, więc np. Chr(65)='A' Powinno takie coś działać, jak nie rozpozna tej funkcji to inaczej zamienimy znak na ASCII Link to comment Share on other sites More sharing options...
JamesVoo Posted March 2, 2011 Author Report Share Posted March 2, 2011 Zmieniłem na if (Ord(a)>=Ord('a') and Ord(a)<=Ord('z')) then m:=m+1;(zapomniałeś o jednym nawiasie ) i teraz wyskakuję błąd Error: Incompatible types: got "BOOLEAN" expected "LONGINT" Dodam że ani typ tych zmiennych Longint ani boolean nie działa Link to comment Share on other sites More sharing options...
[Ekspert] Hakken Posted March 2, 2011 Report Share Posted March 2, 2011 no to znowu dwie sprawy. pierwsza: przypisz te wartosci ascii jakims zmiennym poza ifami, zobaczymy czy ta funkcja dobrze dziala. po drugie: dane jakie dostaje ten program, czyli zmienna a jest jednym znakiem czy ciagiem znakow? Link to comment Share on other sites More sharing options...
JamesVoo Posted March 2, 2011 Author Report Share Posted March 2, 2011 Przerobiłem te linijki na if (a>=chr(97)) and (a<=chr(122)) then m:=m+1; if (a>=chr(65)) and (a<=chr(90)) then d:=m+1; i program się kompiluje. Lecz po uruchomieniu pliku *.exe okno na chwilę się pojawia i znika. To jest pojedynczy znak Link to comment Share on other sites More sharing options...
[Ekspert] Hakken Posted March 2, 2011 Report Share Posted March 2, 2011 kaz mu na koniec wczytac jakas zmienna, okienko nie powinno zniknac. swoja droga zdziwilbym sie gdyby ten program zwracal poprawna odpowiedz ^^ Link to comment Share on other sites More sharing options...
Guest eldragon93 Posted March 3, 2011 Report Share Posted March 3, 2011 Na końcu (przed "endem") daj repeat until keypressed; Wtedy okienko będzie widoczne dopóki nie wciśniesz jakiegoś klawisza. Link to comment Share on other sites More sharing options...
JamesVoo Posted March 3, 2011 Author Report Share Posted March 3, 2011 @eldragon - od tego jest readkey @Hakken, zamiast pętli while, powinienem zrobić while not Poprawnie program wygląda tak program licznie; USES CRT; VAR t:file of char; a:char; m, d:longint; BEGIN clrscr; m:=0; d:=0; assign(t, 'plik.txt'); reset(t); while not eof(t) do begin; read(t,a); if (a>=chr(97)) and (a<=chr(122)) then m:=m+1; if (a>=chr(65)) and (a<=chr(90)) then d:=d+1; end; writeln('W pliku jest ' ,m, 'malych liter i ' ,d,' duzych liter'); close(t); readkey; END. Dziękuję za pomoc, temat można zamknąć Link to comment Share on other sites More sharing options...
Sevard Posted March 3, 2011 Report Share Posted March 3, 2011 Problem rozwiązany, więc temat zamykam.W razie potrzeby otwarcia tematu, proszę o kontakt przez PW. Link to comment Share on other sites More sharing options...