![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Пытался создать программу, которая создаёт два одномерных массива, в каждом из которых находит минимальное значение и эти значения сравнивает, выводя в отдельный Эдит результат (t). Точную формулировку задания, к сожалению, не помню. Как я понял, у меня как-то неправильно создаются массивы, но что нужно сделать не пойму.
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
Edit1: TEdit;
Edit2: TEdit;
Memo1: TMemo;
Panel2: TPanel;
Panel3: TPanel;
Label1: TLabel;
BitBtn1: TBitBtn;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
A=array[0..100] of integer;
B=array[0..100] of integer;
var
Form1: TForm1;
N1,N2:String;
N11,N22,a1,b1,minA,minB:integer;
implementation
{$R *.dfm}
//label restart;
procedure TForm1.FormCreate(Sender: TObject);
begin
Button2.Enabled:=False;
Button3.Enabled:=False;
Button4.Enabled:=False;
end;
procedure TForm1.Button1Click(Sender: TObject); //кнопка создания массивов
begin
N1:=Edit1.Text;
N2:=Edit2.Text;
N11:=StrToInt(N1);
N22:=StrToInt(N2);
if N11<0 then
N11:=1
Else if N11>99 then
N11:=99
else
ShowMessage('Длина массива X: Введите число');
if N22<0 then
N22:=1
Else if N22>99 then
N22:=99
else
ShowMessage('Длина массива Y: Введите число');
randomize;
for a1:=0 to N11-1 do
A(a1):=(-99+random(198));;
for b1:=0 to N22-1 do
B(b1):=-99+random(198);
Button2.Enabled:=True;
end;
procedure TForm1.Button2Click(Sender: TObject); //кнопка нахождения минимумов
begin
minA:=A(a1);
minB:=B(b1);
for a1:=1 to N11-1 do
if A(a1)<minA then
minA:=A(a1);
for b1:=1 to N22-1 do
if B(b1)<minB then
minB:=B(b1);
Button3.Enabled:=True;
end;
procedure TForm1.Button3Click(Sender: TObject); //кнопка сравнения минимумов матриц и вывода t
begin
end;
procedure TForm1.Button4Click(Sender: TObject); //кнопка для сброса полей (возврат к начальным условиям)
var m:Integer;
begin
Edit1.Text:='Длина массива X';
Edit2.Text:='Длина массива Y';
for m:=1 to 15 do
Memo1.Lines.Delete(m);
Memo1.Lines.Add:='Здесь будет результат программы (значение t) и';
Memo1.Lines.Add:='минимальные значения матриц X и Y.';
end;
//goto restart;
end.Код:
[Warning] Unit1.pas(72): For loop control variable must be simple local variable [Error] Unit1.pas(73): Invalid typecast [Warning] Unit1.pas(74): For loop control variable must be simple local variable [Error] Unit1.pas(75): Invalid typecast [Error] Unit1.pas(81): Invalid typecast [Error] Unit1.pas(82): Invalid typecast [Warning] Unit1.pas(83): For loop control variable must be simple local variable [Error] Unit1.pas(84): Invalid typecast [Error] Unit1.pas(85): Invalid typecast [Warning] Unit1.pas(86): For loop control variable must be simple local variable [Error] Unit1.pas(87): Invalid typecast [Error] Unit1.pas(88): Invalid typecast [Error] Unit1.pas(99): Not enough actual parameters [Error] Unit1.pas(99): Incompatible types: 'Integer' and 'String' [Error] Unit1.pas(100): Not enough actual parameters [Error] Unit1.pas(100): Incompatible types: 'Integer' and 'String' |
|
#2
|
||||
|
||||
|
Цитата:
Код:
var A: array[0..100] of integer; B: array[0..100] of integer; Код:
A[a1] := (-99+random(198)); |
| Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
Guerron (28.04.2014)
| ||
|
#3
|
|||
|
|||
|
72,74,83,86 For loop control variable must be simple local variable
Дословный перевод переменная цикла должна быть локальной переменной процедуры или функции внутри функций Button1Click и Button2Click, перед Begin вставить строчку Код:
var a1,b1:integer; 73,75,81,82,84,85,87,88 вот это A(a1) - вызов функции, а поскольку A это не функция, а массив, то и ругается. Надо A[a1]. 99,100 не так Код:
Memo1.Lines.Add:='Здесь будет результат программы (значение t) и'; Memo1.Lines.Add:='минимальные значения матриц X и Y.'; Код:
Memo1.Lines.Add ('Здесь будет результат программы (значение t) и');
Memo1.Lines.Add( 'минимальные значения матриц X и Y.'); |
| Этот пользователь сказал Спасибо icWasya за это полезное сообщение: | ||
Guerron (28.04.2014)
| ||
|
#4
|
||||
|
||||
|
Настоятельно рекомендуется прочитать про массивы:
http://rucodes.com/delphi-arr.html http://rucodes.com/array-pas.html Касательно вашего кода Код:
type A=array[0..100] of integer; B=array[0..100] of integer; Код:
var A=array[0..100] of integer; B=array[0..100] of integer; Здесь, Вы, видимо, пытаетесь инициализовать элементы массива. Код:
for a1:=0 to N11-1 do
A(a1):=(-99+random(198));;При этом a1 - это переменная типа integer. Команда A(a1) пытается привести целочисленную переменную a1 к выше объявленному типу А. Понятное дело у нее это не получается, поэтому выдается ошибка Код:
[Error] Unit1.pas(73): Invalid typecast Что бы выполнить обращение к элементу массива вам нужно: 1) Объявить переменную соответствующего типа(выше написал как) 2) Обратится к элементу массива по индексу: A[a1] Относительно остальных ошибок. Код: Код:
for m:=1 to 15 do
Memo1.Lines.Delete(m);Код Код:
Memo1.Lines.Add:='Здесь будет результат программы (значение t) и'; Memo1.Lines.Add:='минимальные значения матриц X и Y.'; Неправильно использует функцию Add, правильно так Код:
Memo1.Lines.Add('Здесь будет результат программы (значение t) и');
Memo1.Lines.Add('минимальные значения матриц X и Y.'); |
| Этот пользователь сказал Спасибо madMonia за это полезное сообщение: | ||
Guerron (28.04.2014)
| ||
|
#5
|
|||
|
|||
|
Цитата:
|
|
#6
|
||||
|
||||
|
Цитата:
Тут есть два момента: 1) Индексация в TStrings (а именно такой тип имеет свойство Lines у компонента Memo) начинается с 0 а не с 1. 2) При таком удалении Вы рискуете получить ошибку, если строк в Lines меньше 29ти. Дело в том, что при каждой команде Memo1.Lines.Delete(m); Вы удаляете строку с номером m. Последней Вы удаляете 15ю строку, а до нее удалили уже 14ть. Таким образом, до начала удаления у вас должно быть минимум 29ть строк, чтобы после удаления 14ти из них, 15я строка все же существовала и ее можно было удалить. Надеюсь я вас не запутал. Другими словами, удаление чего бы то ни было с помощью - плохая идея Код:
for m:=1 to 15 do удалять следует, хотя бы так Код:
for m:=15 downto 1 do А лучше вообще с помощью while. Получается нужно удалить первые 15ть строк, а остальные, если такие есть, сохранить? Тогда как-то так Код:
var
StringsToDeleteCount: integer;
begin
if Memo1.Lines.Count > 15
then StringsToDeleteCount = 15
else StringsToDeleteCount = Memo1.Lines.Count;
for m:=StringsToDeleteCount -1 downto 0 do
Memo1.Lines.Delete(m);Если же цель - просто очистить мемо, то лучше использовать Код:
Memo1.Lines.Clear; |
| Этот пользователь сказал Спасибо madMonia за это полезное сообщение: | ||
Guerron (05.05.2014)
| ||
|
#7
|
|||
|
|||
|
Вот исправленный код:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
Edit1: TEdit;
Edit2: TEdit;
Memo1: TMemo;
Panel2: TPanel;
Panel3: TPanel;
Label1: TLabel;
BitBtn1: TBitBtn;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
//type
// A=array[0..100] of integer;
// B=array[0..100] of integer;
var
A:array[0..100] of integer;
B:array[0..100] of integer;
Form1: TForm1;
N1,N2:String;
N11,N22,minA,minB:integer;
implementation
{$R *.dfm}
//label restart;
procedure TForm1.FormCreate(Sender: TObject);
begin
Button2.Enabled:=False;
Button3.Enabled:=False;
Button4.Enabled:=False;
end;
procedure TForm1.Button1Click(Sender: TObject);
var a1,b1:Integer;
begin
N1:=Edit1.Text;
N2:=Edit2.Text;
N11:=StrToInt(N1);
N22:=StrToInt(N2);
if N11<=0 then
N11:=1
Else if N11>99 then
N11:=99;
{else
ShowMessage('Длина массива X: Введите число');}
if N22<=0 then
N22:=1
Else if N22>99 then
N22:=99;
{else
ShowMessage('Длина массива Y: Введите число');}
randomize;
for a1:=0 to N11-1 do
A[a1]:=(-99+random(198));;
for b1:=0 to N22-1 do
B[b1]:=-99+random(198);
Button2.Enabled:=True;
end;
procedure TForm1.Button2Click(Sender: TObject);
var a1,b1:Integer;
begin
N1:=Edit1.Text;
N2:=Edit2.Text;
N11:=StrToInt(N1);
N22:=StrToInt(N2);
minA:=100;
minB:=100;
for a1:=1 to N11-1 do
if A[a1]<minA then
minA:=A[a1];
for b1:=1 to N22-1 do
if B[b1]<minB then
minB:=B[b1];
Button3.Enabled:=True;
end;
procedure TForm1.Button3Click(Sender: TObject);
var t:Integer;
begin
if minA<=minB then
t:=minA
else t:=minB;
Memo1.Lines.Clear;
Memo1.Lines.Add('t='+IntToStr(t)+' | '+'min of A='+
IntToStr(minA)+' | '+'min of B'+IntToStr(minB));
Button4.Enabled:=True;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
Edit1.Text:='Длина массива X';
Edit2.Text:='Длина массива Y';
Memo1.Lines.Clear;
Memo1.Lines.Add('Здесь будет результат программы (значение t) и'');
Memo1.Lines.Add('минимальные значения матриц X и Y.');
end;
//goto restart;
end.а) после нажатия 4-й кнопки 2,3 и 4-я кнопки отключались как при создании формы б) при нажатии 4-й кнопки в поле Memo1 Последний раз редактировалось Guerron, 05.05.2014 в 18:07. |
|
#8
|
||||
|
||||
|
Так в её обработчике (жим кнопки4) в конце пропишите тоже самое, что и при создании формы
Код:
... Button2.Enabled:=False; Button3.Enabled:=False; Button4.Enabled:=False; ... |
| Этот пользователь сказал Спасибо Alegun за это полезное сообщение: | ||
Guerron (06.05.2014)
| ||
|
#9
|
|||
|
|||
|
Не успел дописать второй момент. В общем вещь, что мне не нравится, заключается в том, что обе строки съезжают вверх, то есть удаляется всё нормально, строки обе создаются нормально, но чтобы увидеть первую строку надо вручную прокрутить невидимый скроллбар в Мемо, т.к. она выше видимой области оказывается, хотя и само поле Мемо имеет достаточные размеры даже для 4-х строк.
|
|
#10
|
||||
|
||||
|
Цитата:
Чтобы длинные строки не разбивались на несколько коротких отключи у Мемо перенос строк установкой свойства WordWrap в False. |
|
#11
|
|||
|
|||
|
Попробую ещё раз объяснить - я хочу, чтобы мои две строки были сразу видны вместе после нажатия кнопки, а на данный момент после нажатия строки идут со смещением так, что первая строка оказывается чуть выше, чем должна была быть
|
|
#12
|
||||
|
||||
|
В той же самой процедуре жима кнопки4 в конце (после заполнения мемо) пропишите строчку
Код:
... Memo1.Perform(WM_VScroll, SB_LINEUP, 0); ... |
|
#13
|
|||
|
|||
|
Спасибо всем за помощь и внимание, теперь всё работает идеально
![]() |