Wątek przeniesiony 2016-10-23 23:24 z Delphi i Pascal przez furious programming.

Obliczanie liczby wystąpień ciągu "ch" w zadanym zdaniu

0

Witam, dopiero zaczynam programować i dostałem zadanie do zrobienia tylko nie wiem jak je rozwiązać. Mam takie zadanie:

Dane jest zadanie (ciąg znaków zakończony znakiem .). Napisać program wyznaczający liczbę wystąpień liter ch.

Zrobiłem tak żeby pokazywało liczbę wystąpień jednej litery ale nie mogę ogarnąć tak żeby
liczyło te ch. Zadanie zrobiłem w programie Free Pascal IDE. Wiem że pewnie dla większości to zadanie wydaje się banalne a ja nie moge tego ogarnąć. Pomoże ktoś?

program Znaki;
uses
  Crt;
var
  Z: Char;
  K: Word;
begin
  K := 0;
  WriteLn('Wprowadzaj znaki. Kropka-koniec.');
  Z := ReadKey;
  Write(Z);
  
  while Z <> '.' do
  begin
    if Z = 'a' then
      K := K + 1;
      
    Z := ReadKey;
    Write(Z);
  end;
  
  WriteLn;
  WriteLn('Liczba wystapien litery a= ', K);
  ReadLn;
end.
0

Dodaj zmienną typu boolean, w której przechowuj czy w poprzednim przebiegu pętli było c.
Jeżeli było c a teraz jest h no to masz ch.

0

Nie potrzeba dodatkowych zmiennych - wystarczy odpowiednie indeksowanie pętli sprawdzającej:

program Project1;

{$MODE OBJFPC}{$LONGSTRINGS ON}

uses
  Crt;

  function GetSentense(): String;
  var
    LChar: Char;
  begin
    Result := '';

    repeat
      LChar := ReadKey();

      if LChar <> '.' then
      begin
        Result += LChar;
        Write(LChar);
      end;
    until LChar = '.';

    WriteLn();
  end;

  function GetChCount(const ASentense: String): Integer;
  var
    LCharIdx: Integer;
  begin
    Result := 0;

    for LCharIdx := 1 to Length(ASentense) - 1 do
      if (ASentense[LCharIdx] = 'c') and (ASentense[LCharIdx + 1] = 'h') then
        Result += 1;
  end;

var
  LSentense: String;
  LChCount: Integer;
begin
  LSentense := GetSentense();
  LChCount := GetChCount(LSentense);

  Write('Count: ', LChCount);
  ReadLn();
end.
gosc123456789 napisał(a)

Zadanie zrobiłem w programie Free Pascal IDE.

Pobierz Lazarusa.

0

Ten sposób który przedstawił ten drugi kolega jest jak dla mnie zbyt skomplikowany a co do pierwszego nie mogę ogarnąć wprowadzania tej drugiej części znaku 'ch' .

1

No dobra, jeszcze raz :]

program Project1;

{$MODE OBJFPC}{$LONGSTRINGS ON}

uses
  Crt;
var
  LSentense: String = '';
  LChCount: Integer = 0;
  LChar: Char;
  LCharIdx: Integer;
begin
  repeat
    LChar := ReadKey();

    if LChar <> '.' then
    begin
      LSentense := LSentense + LChar;
      Write(LChar);
    end;
  until LChar = '.';

  WriteLn();

  for LCharIdx := 1 to Length(LSentense) - 1 do
    if (LSentense[LCharIdx] = 'c') and (LSentense[LCharIdx + 1] = 'h') then
      LChCount := LChCount + 1;

  Write('Count: ', LChCount);
  ReadLn();
end.

Opis zmiennych:

+ LSentense - ciąg znaków ze zdaniem
+ LChCount  - ilość wystąpień podciągu ch
+ LChar     - znak podawany z klawiatury
+ LCharIdx  - iterator pętli przeszukującej zdanie

oraz działania kodu:

+ w pętli (co najmniej raz):
  - oczekiwanie i pobranie znaku z klawiatury, wpisanie go do zmiennej LChar
  + jeśli podany znak nie jest kropką:
    - dopisanie podanego znaku do łańcucha LSentense
    - wyświetlenie podanego znaku na ekranie
- przejście do nowej linii
+ w pętli (od indeksu pierwszego znaku do indeksu przedostatniego):
  + jeśli znak pod indeksem w zmiennej LSentense to c i kolejny to h:
    - inkrementacja zmiennej LChCount, czyli licznika wystąpień szukanego podciągu
- wyświetlenie wyniku
- oczekiwanie na klawisz Enter

Myślę, że teraz wszystko powinno być jasne.

0

Teraz już ogarniam dzięki wielkie za pomoc.

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