Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.03.2010, 14:13
Аватар для Первокурсница
Первокурсница Первокурсница вне форума
Прохожий
 
Регистрация: 27.02.2010
Сообщения: 46
Репутация: 10
Смущение Delphi 7: маленькая ошибка, StringGrid и массив

Здравствуйте.
Ниже приведен текст программы поиска в массиве целых чисел. Перебор элементов массива осуществляет оператором repeat, в теле которой оператор if сравнивает текущий элемент массива с заданным и присваивает переменной found значение true, если текущий элемент и заданный равны. Цикл завершается, если в массиве обнаружен искомый элемент, (found=true), или если проверены все элементы массива. По завершении цикла, проверив значение переменной found, можно определить, успешен поиск или нет.
Проблема возникла в том, что кажется я неправильно заполняю массив значениями которые ввожу в StringGrid. Возникает окно с ошибкой:
with message '''is not a valid integer value'. Хотелось бы от этой ошибки избавиться.
Код:
unit Unit11Filin;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    StringGrid1: TStringGrid;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  I,J: integer;
implementation

{$R *.dfm}
{Function GetSubStr(st:string; n: integer) :string;
     var
p, i:integer;
begin
for i:=1 to n-1 do
begin
p:=pos(' ',st);
st:=copy(st,p+1,Length(st)-p);
//если в начале оставшейся части строки
//есть пробелы, то они удаляются
while (pos(' ',st)=1) and (length(st)>0) do
         delete(st,1,1);
end;
p:=pos(' ',st);
if p <> 0
        then result:=copy(st,1,p-1) else result:=st;
end;}
procedure TForm1.Edit1Change(Sender: TObject);
begin
StringGrid1.ColCount:=StrToInt(Edit1.Text);
end;
procedure TForm1.Button1Click(Sender: TObject);
const
SIZE=20;
var
a: array[1..SIZE] of integer;
n: integer;
found: boolean;
i,m: integer;
begin
{ввод числа элементов массива n<20}
n:=StrToInt(Edit1.text);
{ввод массива }
for i:=1 to n do
a[i]:=StrToInt(StringGrid1.Cells[J,1]);
{ввод искомого элемента массива}
m:=StrToInt(Edit2.text);
{процедура поиска в массиве}
found:=false;
i:=1;
repeat
if a[i]=m then found:=true
else i:=i+1;
            until (i>n)or(found = true);
if found=true
then ShowMessage('Совпадение с элементом номер '
+IntToStr(i)+#13+'Поиск успешно завершен')
else ShowMessage('Заданный элемент не найден!');
end;
end.
Ответить с цитированием
  #2  
Старый 04.03.2010, 14:43
Аватар для TOJluK
TOJluK TOJluK вне форума
Местный
 
Регистрация: 25.02.2009
Адрес: Минск
Сообщения: 551
Версия Delphi: 2007
Репутация: 110
По умолчанию

Ну так заполняйте stringgrid правильно! Какой вы вообще ответ ожидаете услышать? На какой строке хоть ошибка вылетает?
Ответить с цитированием
  #3  
Старый 04.03.2010, 14:59
Аватар для W1ndow
W1ndow W1ndow вне форума
Новичок
 
Регистрация: 15.09.2009
Адрес: Березники
Сообщения: 61
Репутация: 16
По умолчанию

Код:
procedure TForm1.GenMas(size: integer);
var i: integer;
begin
  Randomize;
  StringGrid1.ColCount:=size;
  For i:=0 to size-1 do
    StringGrid1.Cells[i,0]:=IntToStr(Random(50)+1);
end;

procedure TForm1.Button1Click(Sender: TObject);
var i: integer; b: boolean;
begin
  b:=false;
  GenMas(StrToInt(Edit1.Text));
  For i:=0 to StringGrid1.ColCount-1 do
    if StringGrid1.Cells[i,0]=Edit2.Text then begin
      b:=true; break;
    end;
  if b then ShowMessage('Искомый элемент найден под номером  '+IntToStr(i+1))
    else ShowMessage('Искомый элемент не найден');
end;

Вот это попробуй, делает то что тебе надо

Последний раз редактировалось W1ndow, 04.03.2010 в 15:01.
Ответить с цитированием
  #4  
Старый 04.03.2010, 15:05
Аватар для Первокурсница
Первокурсница Первокурсница вне форума
Прохожий
 
Регистрация: 27.02.2010
Сообщения: 46
Репутация: 10
По умолчанию

a[i]:=StrToIntDef(StringGrid1.Cells[J,1],i);

сделала так, ошибка исчезла. Но программа работает правильно только если вводить 1,2,3,4,5 и так далее сколько элементов в массиве. А если пишу 45,12,96,102 то выдаёт "заданный элемент не найден"
Ответить с цитированием
  #5  
Старый 04.03.2010, 15:32
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

Попробуй так)))
Цитата:
{ввод массива }
for i:=1 to n-1 do
a[i]:=StrToInt(StringGrid1.Cells[i,1]);
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
Ответить с цитированием
  #6  
Старый 04.03.2010, 15:38
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

Вот полный код...
Цитата:
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
StringGrid1: TStringGrid;
Edit1: TEdit;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
procedure Edit1Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
I,J: integer;
implementation

{$R *.dfm}
{Function GetSubStr(st:string; n: integer) :string;
var
p, i:integer;
begin
for i:=1 to n-1 do
begin
p:=pos(' ',st);
st:=copy(st,p+1,Length(st)-p);
//если в начале оставшейся части строки
//есть пробелы, то они удаляются
while (pos(' ',st)=1) and (length(st)>0) do
delete(st,1,1);
end;
p:=pos(' ',st);
if p <> 0 then
result:=copy(st,1,p-1) else result:=st;
end;}

procedure TForm1.Edit1Change(Sender: TObject);
begin
StringGrid1.ColCount:=StrToInt(Edit1.Text);
end;

procedure TForm1.Button1Click(Sender: TObject);
const
SIZE=20;
var
a: array[1..SIZE] of integer;
n: integer;
found: boolean;
i,m: integer;
begin
{ввод числа элементов массива n<20}
n:=StrToInt(Edit1.text);
{ввод массива }
for i:=1 to n-1 do
a[i]:=StrToInt(StringGrid1.Cells[i,1]);
{ввод искомого элемента массива}
m:=StrToInt(Edit2.text);
{процедура поиска в массиве}
found:=false;
i:=1;
repeat
if a[i]=m then
found:=true
else
i:=i+1;
until (i>n) or (found = true);
if found=true then
ShowMessage('Совпадение с элементом номер '+ IntToStr(i)+#13+
'Поиск успешно завершен')
else
ShowMessage('Заданный элемент не найден!');
end;

end.
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
Ответить с цитированием
  #7  
Старый 04.03.2010, 15:45
Аватар для Первокурсница
Первокурсница Первокурсница вне форума
Прохожий
 
Регистрация: 27.02.2010
Сообщения: 46
Репутация: 10
По умолчанию

Спасибо... но к сожалению это не помогло, всё та же ошибка.
Ответить с цитированием
  #8  
Старый 04.03.2010, 15:57
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

Не может быть...этот код прогнал у себя...все работает...
Что и куда ты вводишь???
Edit1 - это количество столбцов и размер массива
Edit2 - это искомое число
По коду так
Вводить надо во 2-ю строку StringGrid, начиная со 2-ой ячейки...
т.к. нумерация начинается с нуля, то адрес 2-ой ячейки 2-ой строки будет 1,1.
Еще проще, если ты дашь весь исхоник все исправлю))) Первокурсница )))
Вот мой вариант...
Вложения
Тип файла: rar 4.03.2010.rar (2.2 Кбайт, 17 просмотров)
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
Ответить с цитированием
  #9  
Старый 04.03.2010, 16:01
Аватар для Первокурсница
Первокурсница Первокурсница вне форума
Прохожий
 
Регистрация: 27.02.2010
Сообщения: 46
Репутация: 10
По умолчанию

Препод велел шапку из таблицы удалить, потому и не работало
Ответить с цитированием
  #10  
Старый 04.03.2010, 16:04
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

Теперь работает??? Ну и хорошо!!!
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
Ответить с цитированием
  #11  
Старый 04.03.2010, 16:05
Аватар для Первокурсница
Первокурсница Первокурсница вне форума
Прохожий
 
Регистрация: 27.02.2010
Сообщения: 46
Репутация: 10
По умолчанию

Как тебя отблагодарить? Кнопка Спасибо или смс обычно на форумах бывает...
Ответить с цитированием
  #12  
Старый 04.03.2010, 16:18
Аватар для NIch
NIch NIch вне форума
Продвинутый
 
Регистрация: 02.06.2008
Адрес: Бендеры ПМР
Сообщения: 754
Репутация: 2446
По умолчанию

Пожалуйста, обращайся)))
__________________
В начале был Бит, потом Байт и только потом появилось Слово...
Ответить с цитированием
  #13  
Старый 04.03.2010, 16:21
Аватар для Первокурсница
Первокурсница Первокурсница вне форума
Прохожий
 
Регистрация: 27.02.2010
Сообщения: 46
Репутация: 10
По умолчанию

Репутацию повысила на сколько смогла ещё раз ОГРОМНОЕ спасибо
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:40.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter