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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.10.2012, 17:00   #1
Оль4ик
Пользователь
 
Аватар для Оль4ик
 
Регистрация: 26.06.2012
Сообщений: 39
По умолчанию Работа с массивами в Delphi

Здравствуйте. Пишу программу по экспертным системам. Никак не получается, в одном месте застопорилось и никак не сдвинусь с места. Как найти максимальное значение в одномерном массиве под именем «v1» (состоящем из получившихся трех элементов: 4, -4. -4) и вывести его в Edit20 ? Ошибку выдает в 148-й строке.
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Label3: TLabel;
    Button1: TButton;
    Button2: TButton;
    Label4: TLabel;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    CheckBox4: TCheckBox;
    CheckBox5: TCheckBox;
    CheckBox6: TCheckBox;
    Button3: TButton;
    Button4: TButton;
    Label5: TLabel;
    Label6: TLabel;
    Edit8: TEdit;
    Edit9: TEdit;
    Edit10: TEdit;
    CheckBox7: TCheckBox;
    CheckBox8: TCheckBox;
    CheckBox9: TCheckBox;
    Edit11: TEdit;
    Edit12: TEdit;
    Edit13: TEdit;
    Edit14: TEdit;
    Edit15: TEdit;
    Edit16: TEdit;
    Label7: TLabel;
    Edit17: TEdit;
    Edit18: TEdit;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Edit19: TEdit;
    Edit20: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  m0: array [1..3,1..6] of integer; // Нулевая матрица
  m1: array [1..3,1..6] of integer; // Матрица признаков и объектов для птицы
  m2: array [1..3,1..6] of integer; //
  m3: array [1..3,1..6] of integer; //
  m4: array [1..3,1..6] of integer; //
  v:  array [1..6] of integer;      // Вектор признаков
  v1: array [1..3] of integer;
  v2: array [1..3] of integer;
  i,j:integer;//счетчики

implementation
{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject); //Обучаем объект
var
 st:string;
begin
 if (CheckBox1.Checked and CheckBox2.Checked and CheckBox3.Checked
  and CheckBox5.Checked) =true then //Если отмечены соответствующие признаки
 //То массив vektor принимает новые значения:
 v[1]:=1;
 v[2]:=1;
 v[3]:=1;
 v[4]:=0;
 v[5]:=1;
 v[6]:=0;
 st := '';
  for i := 1 to 6 do
    st := st + IntTostr(v[i]);
  label6.Caption := st;

  //Заполняем матрицу признаков и объектов для птицы новыми значениями:
 m1[1,1]:= m0[1,1]+v[1];
 m1[1,2]:= m0[1,2]+v[2];
 m1[1,3]:= m0[1,3]+v[3];
 m1[1,4]:= m0[1,4]+v[4];
 m1[1,5]:= m0[1,5]+v[5];
 m1[1,6]:= m0[1,6]+v[6];
 m1[2,1]:= m0[2,1]-v[1];
 m1[2,2]:= m0[2,2]-v[2];
 m1[2,3]:= m0[2,3]-v[3];
 m1[2,4]:= m0[2,4]-v[4];
 m1[2,5]:= m0[2,5]-v[5];
 m1[2,6]:= m0[2,6]-v[6];
 m1[3,1]:= m0[3,1]-v[1];
 m1[3,2]:= m0[3,2]-v[2];
 m1[3,3]:= m0[3,3]-v[3];
 m1[3,4]:= m0[3,4]-v[4];
 m1[3,5]:= m0[3,5]-v[5];
 m1[3,6]:= m0[3,6]-v[6];
Edit19.Text:=inttostr(m1[3,6]);
 // for i := 1 to 6 do
//Label6.Caption:=Label6.Caption+' '+inttostr(vektor[i]);

end;

procedure TForm1.Button4Click(Sender: TObject); //Проводим экспертизу
var
v1:array[1..3] of integer;
k:integer;
max:integer;
buf:integer; // буфер для обмена
begin
//Умножаем vektor на матрицу
v1[1]:= v[1]*m1[1,1]+v[2]*m1[1,2]+v[3]*m1[1,3]+v[4]*m1[1,4]+v[5]*m1[1,5]+v[6]*m1[1,6];
v1[2]:= v[1]*m1[2,1]+v[2]*m1[2,2]+v[3]*m1[2,3]+v[4]*m1[2,4]+v[5]*m1[2,5]+v[6]*m1[2,6];
v1[3]:= v[1]*m1[3,1]+v[2]*m1[3,2]+v[3]*m1[3,3]+v[4]*m1[3,4]+v[5]*m1[3,5]+v[6]*m1[3,6];
//Выводим получившиеся значения нового вектора:
Edit19.Text:=inttostr(v1[1])+ '  '+ inttostr(v1[2])+'  '+ inttostr(v1[3]);

//ищем максимальный элемент в массиве v1:

  for k:=1 to 3 do
  begin
   if v1[k] < max then
   max:=v1[k]
  end;

Edit20.Text:='Максимум =' + IntToStr(max(v1[i]));

(*Выводим максимальный элемент и делаем экспертизу:
Edit20.Text:= inttostr(max(v1));
inttostr(high(v1)):='Птица';
максимальный элемент массива v1- это'Птица'
if максимальный элемент массива v1- 'Птица' then
Edit20.Text:='Птица';*)

end;


procedure TForm1.FormCreate(Sender: TObject);
var
i,j:integer;
st:string;
begin
  // Заполним массив m0 нулями:
 for i := 1 to 3 do
 for j := 1 to 6 do
 m0[i,j]:= 0;
 // Заполним вектор v нулями:
 for i := 1 to 6 do
 v[i]:=0;
 //выведем на экран вектор v:
  st := '';
  for i := 1 to 6 do
    st := st + IntTostr(v[i]);
  label6.Caption := st;

end;

end.
Вложения
Тип файла: rar Проект-5.rar (243.4 Кб, 6 просмотров)

Последний раз редактировалось Stilet; 15.10.2012 в 23:05.
Оль4ик вне форума Ответить с цитированием
Старый 14.10.2012, 17:04   #2
GetMax
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 588
По умолчанию

Код:
max:=v1[1];
for k:=2 to 3 do
begin
if v1[k] > max then
max:=v1[k]
end;
Edit20.Text:='Максимум =' + IntToStr(max);
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Для благодарностей WMR R145235935681
GetMax вне форума Ответить с цитированием
Старый 14.10.2012, 17:47   #3
Оль4ик
Пользователь
 
Аватар для Оль4ик
 
Регистрация: 26.06.2012
Сообщений: 39
По умолчанию

Очень большое спасибо!!! Помогло!

Есть только у меня один вопрос - когда мы прописываем в код
max:=v1[1];
получается, что мы заранее знаем, что в массиве v1 после вышеописанных вычислений именно первый элемент будет максимальным !?
Хитро.

Последний раз редактировалось Stilet; 15.10.2012 в 23:06.
Оль4ик вне форума Ответить с цитированием
Старый 14.10.2012, 18:17   #4
GetMax
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 588
По умолчанию

Цитата:
получается, что мы заранее знаем, что в массиве v1 после вышеописанных вычислений именно первый элемент будет максимальным !?
Знаем - это не совсем верно сказано. Скорее предполагаем, что первый элемент максимальный, а потом в цикле сравниваем все остальные с ним.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Для благодарностей WMR R145235935681
GetMax вне форума Ответить с цитированием
Старый 14.10.2012, 18:31   #5
Оль4ик
Пользователь
 
Аватар для Оль4ик
 
Регистрация: 26.06.2012
Сообщений: 39
По умолчанию

Понятно! Класс!
А вот здесь
Код:
for k:=2 to 3 do
у вас случайно не опечатка?
Вроде от 1 до 3-х ?
Оль4ик вне форума Ответить с цитированием
Старый 14.10.2012, 19:00   #6
GetMax
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 588
По умолчанию

Цитата:
у вас случайно не опечатка?
Вроде от 1 до 3-х ?
Нет, не опечатка. Мы же изначально считаем, что 1-ый элемент - максимальный. Поэтому цикл сразу начинаем со 2-го элемента. Какой смысл сравнивать первый элемент с первым элементом
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Для благодарностей WMR R145235935681
GetMax вне форума Ответить с цитированием
Старый 14.10.2012, 19:39   #7
Оль4ик
Пользователь
 
Аватар для Оль4ик
 
Регистрация: 26.06.2012
Сообщений: 39
По умолчанию

Ну тогда пока вопросов больше нет. Пока, потому что у меня еще много работы по этой программе, поэтому не исключаю что придется вновь зайти на форум.
Еще раз Спасибо!!!

Подскажите кто-нибудь, как правильно прописать код, чтобы в случае неправильного заполнения Edit-ов (с 13-го по 18-й) программа выдавала в Edit21 результат: 'объект не опознан!'
У меня почему-то выдает ошибку в строке: Edit18.text := inttostr(0)) then


Код:
procedure TForm1.Button4Click(Sender: TObject); //Проводим экспертизу
var
k:integer;
max:integer;
begin
//Умножаем vektor на матрицу
v1[1]:= v[1]*m1[1,1]+v[2]*m1[1,2]+v[3]*m1[1,3]+v[4]*m1[1,4]+v[5]*m1[1,5]+v[6]*m1[1,6];
v1[2]:= v[1]*m1[2,1]+v[2]*m1[2,2]+v[3]*m1[2,3]+v[4]*m1[2,4]+v[5]*m1[2,5]+v[6]*m1[2,6];
v1[3]:= v[1]*m1[3,1]+v[2]*m1[3,2]+v[3]*m1[3,3]+v[4]*m1[3,4]+v[5]*m1[3,5]+v[6]*m1[3,6];
//Выводим получившиеся значения нового вектора:
Edit19.Text:=inttostr(v1[1])+ '  '+ inttostr(v1[2])+'  '+ inttostr(v1[3]);

//ищем максимальный элемент в массиве v1:
  max:=v1[1];
  for k:=1 to 3 do
  begin
   if v1[k] > max then
   max:=v1[k]
  end;
  Edit20.Text:= IntToStr(max); //Выводим максимальное значение нового вектора

 // Проверка указания признаков (Посмотреть куда вставить этот кусок!!!):
 if Edit13.text = inttostr(1 or 0) then
 if Edit14.text = inttostr(1) then
 if Edit15.text = inttostr(1) then
 if Edit16.text = inttostr(0) then
 if Edit17.text = inttostr(1) then
 if Edit18.text = inttostr(0) then
 Edit21.text:= 'Птица'

 else
 if (Edit13.text = inttostr(1) and
     Edit14.text := inttostr(1) and
     Edit15.text := inttostr(1) and
     Edit16.text := inttostr(0) and
     Edit17.text := inttostr(0) and
     Edit18.text := inttostr(0)) then
     Edit21.text:= 'объект не опознан!'

end;

Последний раз редактировалось Stilet; 15.10.2012 в 23:11.
Оль4ик вне форума Ответить с цитированием
Старый 15.10.2012, 22:02   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Во-первых: Edit14.text := inttostr(1) проще заменить на Edit14.text := '1' и так же с нулем.
Во-вторых: Стесняюсь спросить, если в Эдитах планируется ввод всего лишь двух вариантов значений, то почему бы не использовать CheckBox или CheckListBox для предоставления множественного выбора?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.10.2012, 22:36   #9
Оль4ик
Пользователь
 
Аватар для Оль4ик
 
Регистрация: 26.06.2012
Сообщений: 39
По умолчанию

Цитата:
Edit14.text := inttostr(1) проще заменить на Edit14.text := '1' и так же с нулем
- только в Эдит 14 или во всех с 13-го по 18-й? Заменила все на = '1' и как ни странно все-равно выдает ошибку в том же месте.
Цитата:
использовать CheckBox или CheckListBox для предоставления множественного выбора?
- боюсь что с этим сиюминутно мне не справиться, т.к множества мы почему-то не проходили...
Оль4ик вне форума Ответить с цитированием
Старый 15.10.2012, 22:41   #10
JIeIIIa
Пользователь
 
Регистрация: 21.12.2011
Сообщений: 54
По умолчанию

Цитата:
Сообщение от Оль4ик Посмотреть сообщение
Код:
 if (Edit13.text = inttostr(1) and
     Edit14.text := inttostr(1) and
     Edit15.text := inttostr(1) and
     Edit16.text := inttostr(0) and
     Edit17.text := inttostr(0) and
     Edit18.text := inttostr(0)) then
     Edit21.text:= 'объект не опознан!'
А как условие с оператором присваивания работает? Компилятор не выдает ошибку?

Наверное, должно быть так
Код:
 if (Edit13.text = inttostr(1) and
     Edit14.text = inttostr(1) and
     Edit15.text = inttostr(1) and
     Edit16.text = inttostr(0) and
     Edit17.text = inttostr(0) and
     Edit18.text = inttostr(0)) then
     Edit21.text = 'объект не опознан!'
JIeIIIa вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с массивами (Delphi) OstapS Помощь студентам 1 02.05.2012 14:44
работа с массивами в Delphi вася радугов Помощь студентам 14 05.02.2012 23:25
delphi. Работа с массивами Buka18 Помощь студентам 1 25.11.2009 16:34
Delphi,Работа с массивами iSpoke Помощь студентам 5 18.10.2009 23:41
Работа с массивами в Delphi mifodiy Помощь студентам 1 03.06.2008 05:48