Jump to content

Archived

This topic is now archived and is closed to further replies.

Recommended Posts

Cześć jest w stanie ktoś zrobic mi program ktory liczy litery w tekscie , i np . liczy ile razy wystebuje litera b , ja nie jestem w stanie z tym sobie poradzić , program ma byc napisany w pascalu oczywiście , jeżeli bedzie ktos w stanie mi pomoc bede bardzo wdzieczny 

Link to comment
Share on other sites

mam program ktory wczytuje tekst , wypisuje caly alfabet i i liczy ile dana litera razy wystapila  a to tak nie moze być , 

program zlicz_znaki;

var
   Liczniki : array ['a'..'z'] of integer;
   tekst : string;

procedure zlicz(s : string);
var
   c : char;
   i : integer;
begin
   { Wyzeruj tablicę Liczniki }
   for c := 'a' to 'z' do Liczniki[c] := 0;
   { zlicz znaki }
   for i := 1 to Length(s) do
   begin
      c := s;
      if c in ['a'..'z'] then Inc(Liczniki[c]);
   end
end;

procedure wypisz;
var
   c : char;
begin
   for c := 'a' to 'z' do
      WriteLn('Znak ', c, ' występuje ', Liczniki[c], 'razy.');
end;

begin
   WriteLn('Podaj jakiś napis');
   ReadLn(tekst);
   zlicz(tekst);
   wypisz;
readln;
end.

mam taki program , to sa moje początki z programowaniem , a ziomek nam dał takie ktorego nigdy nie roblilismy a nie ma przykladow w podreczniku :/ i nie jestem w stanie sobie poradzic 

// Kod można umieścić wewnątrz sekcji kod ;) [webtom]

przerobilem ten program zeby zliczal tylko wybrana litere B , ale jak zrobic zeby zliszczyl  wszystkie znaki ? 

Link to comment
Share on other sites

17 minut temu, adicon123 napisał:

przerobilem ten program zeby zliczal tylko wybrana litere B , ale jak zrobic zeby zliszczyl  wszystkie znaki ? 

Mógłbyś pokazać?
Zasadniczo wystarczy dodać kolejną zmienną i drugiego ifa w pętli.

Link to comment
Share on other sites

Bez sensu (i to nawet abstrahując od absurdalności 'b' to 'b') - przecież ta pętla zeruje jedynie liczbę wystąpień poszczególnych znaków, więc po prostu reszta może być źle zliczana.

To co byś musiał zrobić, to zastąpić tablicę Liczniki dwoma zmiennymi typu integer - pierwsza zliczająca wszystkie litery i druga zliczająca wystąpienia 'b'. Mam nadzieję że wiesz, jak to zrobić?

Link to comment
Share on other sites

program abc;
uses crt;
var
z:string;
i,litery:byte;
begin
clrscr;
writeln('Wpisz dowolne zdanie:');
readln(z);
for i := 1 to length(z) do
if z <> ' ' then litery := litery+1;
Writeln('Liter w zdaniu jest: ',litery);
readln;
end.

 

 

ten program liczy litery jak dolozyc ten ktory liczy tylko jedna wybrana litere "b" ? pomocy ja juz nie mam glowy 

Link to comment
Share on other sites

10 minut temu, adicon123 napisał:

i,litery:byte;

Co prawda readln pozwala na wczytanie tekstu ograniczonego do jedynie 255 znaków, no ale tak czy siak nie zaszkodziłoby użycie jakiegoś pojemniejszego typu, np. wcześniej użyty integer (więcej o typach np. tutaj).
No i powinna się tutaj pojawić definicja kolejnej zmiennej zliczającej wystąpienia 'b'.

16 minut temu, adicon123 napisał:

for i := 1 to length(z) do

Najlepiej by było w tej pętli wykonywać dwie rzeczy naraz: zliczać litery i wystąpienia 'b'.
Żeby wykonać wewnątrz pętli większą liczbę instrukcji, trzeba je zamknąć między begin i end:

for i := 1 to length(z) do
begin
  if ...
  if ...
end;
24 minuty temu, adicon123 napisał:

if z <> ' ' then litery := litery+1;

Ten warunek mógłby wyglądać nieco inaczej - obecnie pod litery łapią się również np. znaki przestankowe. Być może zainteresuje Cię funkcja upCase.

I w sumie jak już się dorwałem do kompilatora Pascala, to zauważyłem jeden błąd we wcześniejszym kodzie, który tutaj powielasz:

for i := 1 to Length(s) do
begin
   c := s;
   if c in ['a'..'z'] then Inc(Liczniki[c]);
end

W zmiennej c powinien być jeden znak, więc przypisanie powinno wyglądać następująco: c := s; Czyli powinieneś porównywać nie całą zmienną z, a jedynie konkretną literę (z).

No i ten początkowy kod był przyzwoicie rozbity na kilka funkcji/procedur i z lepiej nazwanymi zmiennymi, czemu z tego zrezygnowałeś?

Link to comment
Share on other sites

dobra dałem radę , zrobiłem to co trzeba program  wygląda tak :

 

program abc;
uses crt;
var
o,licznik:byte;
znak:char;
zdanie:string;
i,litery:byte;
begin
clrscr;
writeln('Wpisz dowolne zdanie: ');
readln(zdanie);
for i := 1 to length(zdanie) do 
if zdanie <> ' ' then litery := litery+1;
Writeln('Liter w zdaniu jest: ',litery);
writeln('wpisz szukany znak: ');
readln(znak);
for o:=1 to length(zdanie) do if
zdanie[o]= znak then licznik := licznik+1;
writeln('znak ',znak,' w podanym zdaniu wystapil ',licznik,' razy');
readln;
end.  

 

 

 

wszystko dziala tak jak trzeba :D

 

Link to comment
Share on other sites

2 minuty temu, adicon123 napisał:

if zdanie <> ' ' then litery := litery+1;

Jak już wcześniej wspomniałem, ten warunek należałoby zmienić - chyba najlepiej by było, gdyby dla tekstu 'a b c 0' program wyświetlał informację o 3, a nie 7 literach...

Link to comment
Share on other sites

5 minut temu, webtom napisał:

Jak już wcześniej wspomniałem, ten warunek należałoby zmienić - chyba najlepiej by było, gdyby dla tekstu 'a b c 0' program wyświetlał informację o 3, a nie 7 literach...

jak o 7 ? liczy same litery bez spacji , jest dobrze sprawdz 

Link to comment
Share on other sites

Nie jest dobrze. Porównujesz znak z łańcuchem znaków, a nie z pojedynczym elementem łańcucha (czyli znakiem). Jest tylko jeden bardzo specyficzny przypadek, gdy w Pascalu jakiś znak jest równy jakiemuś łańcuchowi znaków.

Link to comment
Share on other sites



  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...