Powtarzające się litery

0

Witam..

Moim zadaniem jest napisanie programu w Pascalu, który wypełni tablicę dwuwymiarową losowymi małymi literami od a do z, po czym policzy ile i jakich liter się w niej powtarza, a na koniec wypisze całą tabelę oraz litery powtarzające się.

Wypełniłem tabelę już literami (z wykorzystaniem ASCII), a teraz myślę jak by tu policzyć te litery, które się powtarzają. Prowizorycznie użyłem pętli Repeat, ale nie jestem pewny czy słusznie (fragment w kropkach) i nie mam pojęcia co dalej.

Proszę o pomoc i wskazówki jak to zapisać...

program Project1;

uses
  SysUtils;

const
  rozmiar=15;

type
  tablica=array[1..rozmiar,1..rozmiar] of Char;

var
  t:tablica;
  x,y,i,j,k:integer;

begin
  randomize;

  for x:=1 to rozmiar do
  for y:=1 to rozmiar do
    t[x,y]:=chr(random(25)+97);

...................................
  x:=0;
  y:=0;

  repeat
    if t[x,y]=t[x+1,y] then
        k:=k+1;
      x:=x+1;
  until x=rozmiar;
.....................................

  Writeln;
  Writeln('Tablica wyglada nastepujaco.');
  Writeln;
  for x:=1 to rozmiar do
  for y:=1 to rozmiar do
    Write(t[x,y]);

  Readln;
end. 
1

Tworzysz tablicę z wartościami od 'a' do 'z', w której zliczasz wystąpienia danych liter.

0

ale jak sie powtarzaja? w pionie, w poziomie czy np wskazac ktora litera powtarza sie najwiecej razy...?

0

Pewnie sprawdzanie, czy w ogóle się powtarzają (tj.jeżeli na pozycji [1,5] jest litera P oraz jest ona także na pozycji [3, 8], to 'Inc(LicznikLiteryP)'.
Oczywiście wiadomo, że lepiej jest użyć tablic, zamiast 'LicznikLiteryA', 'LicznikLiteryB', 'LicznikLiteryC' itp.

0

Chodzi o powtórzenia w całej tabeli - jak to zinterpretowałem. Oficjalna treść zadania brzmi:

Napisz program, który wypełni tablicę dwuwymiarową o zadanym rozmiarze
losowymi literami (tylko małe, łacińskie), a następnie policzy ile i jakich liter się
powtarza. Program ma wypisać utworzona tablicę i listę liter powtarzających się.

Nie chciałem przepisywać treści słowo w słowo, ale jak widać trochę zamieszałem...

1

o zadanym rozmiarze

Czyli nie ustalonym z góry, jak ty masz w programie ?

Z takim podejściem, byłoby:

program Project1;

{$APPTYPE CONSOLE}  //<-- tego brakowało
uses
  SysUtils;

var
  t: Array Of Array Of Char; //nie trzeba od razu deklarować własego typu
  x,y,i,j,k, Szer:integer;
  wyst:array['a'..'z'] of integer;
  c : char;
begin
  randomize;
  Write('Podaj szerokosc tablicy: ');
  ReadLn(Szer);
  SetLenGth(T, Szer+1, Szer+1);
  for x:=1 to Szer do
  for y:=1 to Szer do
    t[x,y]:=chr(random(25)+97);
  x:=0;
  y:=0;

  Repeat
    if t[x,y]=t[x+1,y] then
        k:=k+1;
   Inc(X);
  Until X = Szer;
  Writeln;
  Writeln('Tablica wyglada nastepujaco.');
  Writeln;
  for x:=1 to Szer do
  for y:=1 to Szer do
    Write(t[x,y]);

  for c:='a' to 'z' do
    wyst[c]:=0;
  for x:=1 to Szer do
    for y:=1 to Szer do
      wyst[t[x,y]]:=wyst[t[x,y]]+1;
  WriteLn('Wystapienia:');
  for c:='a' to 'z' do
    WriteLn(c+': '+inttostr(wyst[c])+' razy');
  Readln;
end.

Wykorzystałem tutaj kod cimaka, chyba nie masz nic przeciwko ? :)

1

nie wiem czy w pascalu taka konstrukcja jest dopuszczalna (w delphi jest):

procedure TForm1.Button3Click(Sender: TObject);
var x,y:integer;
    wyst:array['a'..'z'] of integer;
    c:char;
begin
{zerujemy tablice z liczba wystapien danego znaku}
  for c:='a' to 'z' do
    wyst[c]:=0;
{zliczmy}
  for x:=1 to rozmiar do
    for y:=1 to rozmiar do
      wyst[t[x,y]]:=wyst[t[x,y]]+1;
{wyswietlamy}
  memo1.lines.add('Wystapienia:');
  for c:='a' to 'z' do
    memo1.Lines.Add(c+': '+inttostr(wyst[c])+' razy');
end;

inttostr zamienia liczbe na stringa, w pascalu bedziesz pewnie musial uzyc val();

0

Dzięki Patryk27 i cimak. Program ma być w Pascalu, jak napisałem w pierwszym poście.

Próbuję nieskutecznie przekształcić ten fragment

  for x:=1 to Szer do
  for y:=1 to Szer do
      wyst[t[x,y]]:=wyst[t[x,y]]+1;
  WriteLn('Wystapienia:');
  for c:='a' to 'z' do
    WriteLn(c+': '+inttostr(wyst[c])+' razy');
  Readln;
 

za pomocą funkcji val.

 
for x:=1 to Szer do
  for y:=1 to Szer do
      wyst[t[x,y]]:=wyst[t[x,y]]+1;
  WriteLn('Wystapienia:');
  for c:='a' to 'z' do
    WriteLn(c,' :',val('c'));
  Readln;

Znalazłem coś takiego, ale niewiele mi to mówi.
http://bit.ly/eGJs1n

Niech jakaś dusza mi z tym pomoże i wytłumaczy jeszcze co program robi fragmencie kodu:

 
wyst[t[x,y]]:=wyst[t[x,y]]+1;
0
  wyst[t[x,y]]:=wyst[t[x,y]]+1;

wyst[] to tablica w ktorej trzymasz liczbe wystapien danej litery (znaku).
zwroc uwage, ze nie jest indeksowana liczbą (np wyst[10]) tylko znakiem (np wyst['a']).
t[x,y] pobiera z talibcy "t" znak z miejsca x,y.
i potem jak dasz:
wyst[znak]:=wyst[znak]+1; //gdzie znak to nasze t[x,y]
to dodajesz +1 do odpowiednziego elementu tablicy "wyst".

a co do tego val to znalazles ale to dla jakiegos innego jezyka jest. basica czy czegos. wpisz w googlach "pascal val", co za problem?
przeanalizuj jezcze ten kod i pomysl jak to dziala. a pozniej przerabiaj, bo juz widze ze cos dziwnego kombinujesz z tym val('c').. :|

1 użytkowników online, w tym zalogowanych: 0, gości: 1