Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.06.2011, 23:47   #1
Serjik-ahaha
Пользователь
 
Регистрация: 12.06.2011
Сообщений: 13
По умолчанию найти ошибку в проге на Delphi

Задание: написать программу подсчета числа слов в произвольной строке. В качестве разделителя может быть любое число пробелов. Для ввода строк и работы с ними использовать компонент типа ТСоmbоВох. Ввод строки заканчивать нажатием Enter. Для выхода из программы использовать кнопку Close.

Ниже приведен код программы. Вроде как все верно написал, но все же результат в Label3.Caption не выводится. Помогите понять, что не так, пожааалуйста)

Код:
Unit LabRab_5;
Interface
Uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, 
  Dialogs, StdCtrls, Buttons;
type	
  TUnit_Lab5 = class(TForm)
    ComboBox1: TComboBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    BitBtn1: TBitBtn;
    Button1: TButton;
    Procedure FormActivate(Sender: TObject);
    Procedure ComboBox1KeyPress(Sender: TObject; var Key: Char);
    Procedure ComboBox1Click(Sender: TObject);
  Private
    { Private declarations }
  Public
    { Public declarations }
  end;
var
  Unit_Lab5: TUnit_Lab5;

Implementation
{$R *.dfm}

// Обработка события активизации формы
Procedure TUnit_Lab5.FormActivate(Sender: TObject);
begin
  ComboBox1.SetFocus; //Передача фокуса ComboBox1
end;

// Обработка события нажатия левой клавиши мыши
Procedure TUnit_Lab5.ComboBox1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key =#13 then //Если нажата клавиша Enter то...
  begin
//  Строка из окна редактирования заносится в список выборa
    ComboBox1.Items.Add(ComboBox1.Text);
    ComboBox1.Text := ''; //Очистка окна редактирования
  end;
end;

Procedure TUnit_Lab5.ComboBox1Click(Sender: TObject);
var
  St : string;
  n, i, nst, ind  : integer;
begin
  n   := 0; //Содержит число слов выбранной строки 
  ind := 0; //Содержит число слов
//Определение номера выбранной строки
  nSt := ComboBox1.ItemIndex;
//Занесение выбранной строки в переменную st
  St := ComboBox1.Items[nst];
//Просмотр всех символов строки st
  for i := 1 to Length(St) do
  begin
    Case ind of
      0: if St[i] <>'' then
         begin
             //Если встретился символ после пробела
             //число слов увеличивается на единицу
             ind := 1;
            inc(n);
         end;
// Если встретился пробел после символов
      1: if St[i] ='' then ind := 0;
     end; //Case
   Label3.Caption := IntToStr(n); //Вывод числа слов в Label3
  end;
end;

end.
ну вот еще картинку прилагаю, с уже правильно выполненной задачей.
Изображения
Тип файла: jpg Безымянный.jpg (30.7 Кб, 85 просмотров)
Serjik-ahaha вне форума Ответить с цитированием
Старый 17.06.2011, 01:02   #2
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

я бы проще сделал)
Код:
s:=cbb1.items[cbb1.itemindex];
while pos('  ',s)<>0 do
delete(s,pos('  ',s),1);
s:=trim(s);
if s='' then exit;
k:=0;
for i:=1 to length(s) do
if s[i]=' ' then inc(k);
k:=k+1;
Label3.Caption := IntToStr(k);
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 17.06.2011, 08:53   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,544
По умолчанию

Цитата:
я бы проще сделал)
Код:
for i:=1 to length(s) do
if s[i]=' ' then inc(k);
Два рядом стоящих пробела это что два слова?
Цитата:
В качестве разделителя может быть любое число пробелов.
Цитата:
Label3.Caption не выводится
попробуй так
Код:
Label3.Caption := IntToStr(n); //Вывод числа слов в Label3
Label3.update;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 17.06.2011, 09:12   #4
Sparkman
220400
Форумчанин
 
Аватар для Sparkman
 
Регистрация: 21.05.2010
Сообщений: 726
По умолчанию

Код:
procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);
begin
     if (Key=#13)and(Length(ComboBox1.Text)>0)then ComboBox1.Items.Add(ComboBox1.Text);
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
var n:integer;
    s:string;
begin
     s:=ComboBox1.Text;
     s:=Trim(s);
     if Length(s)>0 then
     begin
          while pos(#32#32,s)>0 do
          s:=StringReplace(s,#32#32,#32,[rfReplaceAll]);
          n:=0;
          while pos(#32,s)>0 do
          begin
               inc(n);
               Delete(s,1,pos(#32,s));
          end;
          Label1.Caption:=IntToStr(n+1);
     end else Label1.Caption:='0';
end;
Cерьёзной помощи не ждите - помогаю в перерывах на "перекур".
Не существует ничего невозможного для человека, который не собирается ничего делать сам.
Не учите человека, если вы не его учитель.
Sparkman вне форума Ответить с цитированием
Старый 17.06.2011, 11:54   #5
Serjik-ahaha
Пользователь
 
Регистрация: 12.06.2011
Сообщений: 13
По умолчанию

Цитата:
попробуй так

Код:
Label3.Caption := IntToStr(n); //Вывод числа слов в Label3
Label3.update;
не прокатило. проблема осталась. нажимаю Enter, а раздается звук об ошибке и ничего не происходит. очень нужно найти ошибку именно в том коде, который я предоставил... хелп...
Serjik-ahaha вне форума Ответить с цитированием
Старый 17.06.2011, 12:12   #6
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию

Цитата:
Сообщение от Serjik-ahaha Посмотреть сообщение
не прокатило. проблема осталась. нажимаю Enter, а раздается звук об ошибке и ничего не происходит. очень нужно найти ошибку именно в том коде, который я предоставил... хелп...
Скидывай сюда архив с проектом. Поковыряюсь в нём пока чай пью.
Сливочное масло Valio - компиляция как по маслу
Valio вне форума Ответить с цитированием
Старый 17.06.2011, 12:36   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,544
По умолчанию

Цитата:
нажимаю Enter, а раздается звук об ошибке и ничего не происходит.
Все происходит в полном соответствии с кодом
Код:
  if Key =#13 then //Если нажата клавиша Enter то...
  begin
//  Строка из окна редактирования заносится в список выборa
    ComboBox1.Items.Add(ComboBox1.Text);
    ComboBox1.Text := ''; //Очистка окна редактирования

    key:=#0; // отменяет дальнейшую (внутреннюю) обработку вводимого символа. 

 end;
Добавили в список и очистили поле ввода. ВСЕ!
если хотите ЗДЕСЬ (при нажатии Enter) делать еще что-то то надо это написать.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 17.06.2011 в 12:42.
evg_m вне форума Ответить с цитированием
Старый 17.06.2011, 12:43   #8
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Цитата:
Два рядом стоящих пробела это что два слова?
для глумливых

после вот этого
Код:
while pos('  ',s)<>0 do
delete(s,pos('  ',s),1);
не будет больше 1(одного) пробела между словами
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 17.06.2011, 12:50   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,544
По умолчанию

согласен просмотрел.
Цитата:
while pos(' ',s)<>0 do
снимает проблему "более одного пробела".
но осталась неточность.
число разделителей(пробелов) = число слов - 1
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 17.06.2011, 12:51   #10
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

Цитата:
число разделителей(пробелов) = число слов - 1
и снова разуваем глазки
Код:
for i:=1 to length(s) do
if s[i]=' ' then inc(k);
k:=k+1;
Label3.Caption := IntToStr(k);
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
есть листинг прогр. на паскале, найти ошибку в блок-схеме и в самой проге студент АГНИ Помощь студентам 2 25.05.2011 18:37
Найти ошибку в проге с массивами bingooo Паскаль, Turbo Pascal, PascalABC.NET 6 10.04.2010 09:30
Помогите пожалуйста найти ошибку в проге barbossa Общие вопросы C/C++ 6 01.06.2009 21:33
Не могу найти ошибку в проге!!!!! beeline Помощь студентам 4 18.05.2009 20:49