PDA

Просмотр полной версии : Помогите с задачей, никак не могу разобраться



Gekata
10.12.2006, 20:09
итак, все по порядку..задача на Паскале, я на 2 курсе, так что там ничего сложного наверное нет, просто я не мог найти свою ошибку(
Условие: в заданной строке символов, где между группами символов стоят пробелы, найти количество групп.
Вот мой текст:
program ira;
var a:string;
n,i,k:integer;
c:char;
begin
writeln('vvedi stroku');
readln(a);
k:=0;
n:=length(a);
for i:=1 to n do
begin
c:=copy(a,i,1);
if c:=' ' then k:=k+1;
end;
writeln(k);
readln;
end.

подскажите пожалуйста, что не так...наверняка ошибка ерундовая, только сильно не ругайте за мою бестолковость))) я все решила, кроме этой...

Duncon
10.12.2006, 23:08
Дело в том что ты непонятно что считываешь переменной а не имеет значения.. И если честно не помню как работает readln, я бы сделал так:


program ira;

var
a: string;
n, i, k: integer;
c: char;
begin
a := 'vvedi stroku';
writeln(a);
// readln(a);
k := 0;
n := length(a);
for i := 1 to n do
begin
c := copy(a, i, 1); // если честно не очень хорошее решение, но и так покатит..
if c := ' ' then k := k+1;
end;
writeln(k);
// readln;
end.

Gekata
11.12.2006, 10:16
насколько я помню readln -это ввод с клавиатуры, а пустым readln мы всегда программу заканчиваем(не знаю зачем)
у меня по прежнему не работает...теперь ставит ошибку после строчки c := copy(a, i, 1); и пишет : Error 26 Type mismatch Что это и как исправить?

Oleg_Rus
11.12.2006, 10:17
а почему бы и не так:

Program
Ira;
Var
S: string;
i, c: Integer;
Begin
C:=0;
Readln(s);
For i:=1 To Length(s) Do
If S[i]=' ' Then Inc(c);
End.

Gekata
11.12.2006, 11:52
Oleg_Rus, спасибо большое! такой вариант работает. Только вот
Inc(c);
это что за функция? что то я не нашла чтобы мы такое изучали...а то меня спросят, а я не знаю что это....

somewhere
11.12.2006, 12:02
Inc(c) --> C := C + 1;

Gekata
11.12.2006, 12:33
О, да, точно! это было по другому предмету...команды инкремента, декремента...кажется так, теперь я вспомнила)

Хыиуду
12.12.2006, 10:32
У меня такое чувство, что в таком разрезе программа считает количество пробелов в строке. А нам вроде бы как надо количество групп

Oleg_Rus
12.12.2006, 11:27
не-не-не Хыиуду, программа читает строку и если увидит где-то пробел(т.е. конец группы), то уселичивает счетчик и в итоге, в счетчике получается кол-во групп.

somewhere
12.12.2006, 11:37
Ага, а если два пробела подряд - Хыиуду здесь абсолютно прав, там все по-русски написано - считает кол-во пробелов. Надо тогда все идущие подряд пробелы удалять, например заменой 2 пробелов на один или проверять, если до этого был пробел, тогда счетчик групп будет неизменен

Oleg_Rus
12.12.2006, 11:48
в таком случае ща кину код на Delphi, где на эту мелочь мона не смотреть

Oleg_Rus
12.12.2006, 11:49
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure
TForm1.Button1Click(Sender: TObject);
Var
s: String;
Letter: Char;
Flag: Boolean;
i, Number: Integer;
begin
Number:=0; // Обнуление Данных
Flag:=True;
Text:=Edit1.Text; //Чтение Текста
For i:=1 to Length(Text) Do //Цикл По-Буквенно
Begin
Letter:=Text[i]; //Раcсматриваем i-тый символ текста
If (Letter<>' ') and Flag Then Number:=Number+1;
//Если текущий символ не равен <пробелу> и Flag=1
//то увеличивай количество Слов
Flag:=(Letter=' ');
End;
Label2.Caption:=FloatToStr(Number);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Close;
end;

end.

Oleg_Rus
12.12.2006, 11:50
т.е. в этой проге см. процедуру TForm1.Button1Click(Sender: TObject);
Должна работать...

Хыиуду
12.12.2006, 13:34
А можно реализовать прямо даже конечный автомат, если кто-то еще помнит, что это такое.
count:=0;
state:=0;
for i:=1 to length(s) do
case state of:
0: if s[i]<>' ' then begin
state:=1; inc(count); end;
1: if s[i]=' ' then state:=0
end;

Oleg_Rus
20.12.2006, 03:38
Хыиуду, в прынцыпе наши программы совпадают:
у вас переменная State принимает 2 значения 1 и 0, с тем же успехом мона ведь использовать boolean, с его значениями true или false...

...или я ошибаюсь...

Хыиуду
21.12.2006, 10:44
Oleg_Rus, в принципе да. Просто обычно у конечного автомата большее число состояний, чем 2. Так что я уже просто по привычке ввожу state как числовое, а не как булевское

CVER4OK
07.07.2008, 16:38
Геката? Кать из ЕБурга,ты что ля? А мине кто поможет?:-)

C_O_D_E
07.07.2008, 20:07
CVER4OK,
а тебе что помочь?
тоже самое?