|
|
Регистрация | << Правила форума >> | 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
|
|||
|
|||
Спасибо всем за помощь и внимание, теперь всё работает идеально
|