Консультация № 148732
28.10.2008, 06:09
50.00 руб.
0 3 2
Здравствуйте эксперты.
Помогите мне разобраться в следующей задаче. Программа Delphi 8.0.
Дана последовательность произвольных целых чисел. Два массива. Ввести 30 проивольных чисел в Memo1. Определить в последовательности номера всех четных значений и вывести найденный массив из четных чисел в Memo2. Определить количество элементов в полученном массиве и вывести в Label3.
При решении не удается обработать массив.


Приложение:
unit Unit10;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Borland.Vcl.Buttons, Borland.Vcl.StdCtrls, System.ComponentModel;

type
TForm10 = class(TForm)
Memo1: TMemo;
Memo2: TMemo;
Button1: TButton;
Button2: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
BitBtn1: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form10: TForm10;

implementation

{$R *.nfm}

procedure TForm10.BitBtn1Click(Sender: TObject); / Ввод массива
var i,n:integer;
a:array [1..30] of integer;
begin
n:=memo1.Lines.Count;
Memo2.clear;
for i:=1 to n do
begin
a[i]:=Strtoint(memo1.Lines[i-1]);
end;
end;

procedure TForm10.Button1Click(Sender: TObject);/Кнопка выхода из программы
begin
Close;
end;

procedure TForm10.FormCreate(Sender: TObject);
begin
Memo1.ScrollBars:=ssVertical;
Memo2.ScrollBars:=ssVertical;
Memo1.Clear;
Memo2.Clear;
end;

procedure TForm10.Button2Click(Sender: TObject); / Обработка массива и вывод результата в
var a,c,i,n:integer; / другой массив и количество чисел
begin / оставшихся в Label3
begin
c:=1;
for i:=1 to n do
if not odd(i) then
c:=i-1;
for i:=1 to n do
c:=Strtoint(memo2.Lines[i+1]);
Label3.Caption:='Количество ='+inttostr(c);
end;

end.

Обсуждение

Неизвестный
28.10.2008, 08:31
общий
это ответ
Здравствуйте, Спиридонов Данил Сергеевич!

вот ссылка на приложение: URL >> Тестовое приложние + исходники

а вот пример возможного решения Вашей задачи.
Тут нет ограничений на количество введенных чисел, т.к. это определяется динамически.
Код:

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Memo1: TMemo;
Memo2: TMemo;
Label1: TLabel;
Label3: TLabel;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Memo1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
type TIntArray = array of integer; // массив динамический, мы можем хранить сколько угодно чисел
{$R *.dfm}
{
Здравствуйте эксперты.
Помогите мне разобраться в следующей задаче. Программа Delphi 8.0.
Дана последовательность произвольных целых чисел. Два массива. Ввести 30 проивольных чисел в Memo1.
Определить в последовательности номера всех четных значений и вывести найденный массив из четных чисел в Memo2.
Определить количество элементов в полученном массиве и вывести в Label3.
При решении не удается обработать массив.
}
// функция разделяет строку на числа
function SplitStringToInt(src,delim:String):TIntArray;
var s:String;
x,i,z:integer;
begin
z := Pos(delim,src)-1;
if(z <=1)then exit;
s := Copy(src,1,z);
src := Copy(src,z+2,length(src));
i := 0;
while(s <> '')do
begin
SetLength(result,i+1);
result[i] := StrToIntDef(s,0);
inc(i);
z := Pos(delim,src)-1;
if z<= 0 then
begin
SetLength(result,i+1);
result[i] := StrToIntDef(src,0);
break;
end;
s := Copy(src,1,z);
src := Copy(src,z+2,length(src));
end;
end;
//--------------- функция получает массив целых чисел---------------------------
function GetEvenNumber({в hint сохраним номера}var hint:String;a:TIntArray):TIntArray;
var j,i,n:integer;
begin
j := 0;
n := length(a);
SetLength(result,n);
for i:=0 to n-1 do
begin
if a[i] mod 2 = 0 then
begin
hint := Format('%s-%d',[hint,i]);
SetLength(result,j+1);
result[j] := a[i]; inc(j);
end;
end;
end;
//------------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var i,n:integer;
s:String;
ar:TIntArray;
begin
s := Trim(Memo1.Text);
s := AnsiReplaceStr(s,#$D,' ');
s := AnsiReplaceStr(s,#$A,'');
if(length(s) <=0) then
begin
MessageBox(GetActiveWindow,'Не заполненны числа','Ошибка',MB_OK+MB_ICONSTOP);
Memo1.SetFocus;
exit;
end;
ar := SplitStringToInt(s,' ');
if(ar = nil) then exit
else
begin
Memo2.Clear;
s := '';
ar := GetEvenNumber(s,ar);
Label3.Caption := Format('Четные элементы в следующих позияциях:'#13+'%s',[s]);
n := length(ar);
Label1.Caption := Format('Всего найдено четных элементов: %d',[n]);
for i:=0 to n-1 do
Memo2.Lines.Add(IntToStr(ar[i]));
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Label3.WordWrap := true;
Label3.Height := 42;
Memo1.WordWrap := false;
end;

procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
if not (key in['.'..'9',' ']) then Key := #0; //запрет вводить не числа и пробел
end;
end.

Неизвестный
28.10.2008, 08:34
общий
То что я собирал в Delphi 7 - не имеет значения. Откройте проект в Вашей Delphi и все.
События и процедуры/функции вообще не привязаны к версии Delphi
Неизвестный
28.10.2008, 08:44
общий
это ответ
Здравствуйте, Спиридонов Данил Сергеевич!
В приложении исправленный код Вашей программы с подробными комментариями.
Проект целиком можете скачать по этой ссылке: скачать.

Удачи!

Приложение:
unit Unit1;

interface

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

type
TForm10 = class(TForm)
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
Memo2: TMemo;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
BitBtn1: TBitBtn;
Label4: TLabel;
procedure BitBtn1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form10: TForm10;

implementation

{$R *.dfm}
// объявляенные здесь переменные называются глобальными и видны в любом месте программы
var a : array [1..30] of integer; // массив исходных чисел
n : integer = 0; // количество введенных пользователем чисел, по умолчанию = 0
// переменная также глобальная, т.к. используется в нескольких различных функциях программы

procedure TForm10.BitBtn1Click(Sender: TObject); // Ввод массива
var i : integer;
begin
n := memo1.Lines.Count; // определяем, сколько строк пользователь ввел в Memo1
// оно равно количеству чисел (полагаем, что пустые строки не вводятся)
if (n>30) then
n := 30; // если введено более 30 чисел, то обрабатывать будем только первые 30
Memo2.clear; // очищаем Memo2
for i:=1 to n do // записываем в массив все введенные пользователем числа
begin
a[i] := Strtoint(memo1.Lines[i-1]);
end;
end;

procedure TForm10.Button1Click(Sender: TObject);//Кнопка выхода из программы
begin
//Close;
Application.Terminate; // использование данного метода предпочтительнее,
// т.к. он полностью освобождает память при закрытии программы
end;

procedure TForm10.FormShow(Sender: TObject);
begin
//Memo1.ScrollBars:=ssVertical; // Данные свойства уже установлены через Object Inspector
//Memo2.ScrollBars:=ssVertical;
Memo1.Clear; // При загрузке программы очищаем содержимое Memo1 и Memo2
Memo2.Clear;
end;

procedure TForm10.Button2Click(Sender: TObject); // Обработка массива и вывод результата в
// другой массив и количество чисел
// оставшихся в Label3
var i:integer;
c : integer; // количество четных чисел
b : array [1..30] of integer; // массив с результатом. Также из 30 элементов,
//т.к. все числа в Memo1 могут оказаться четными
begin
c := 0; // задаем начальное количество четных чисел равным нулю,
// т.к. может быть не введено ни одного четного числа
for i := 1 to n do // проверяем все введенные числа на четность
if not odd(a[i]) then // здесь проверяем, четное ли число записано в массиве a[i]
begin // в Вашей исходной программе проверялась четность i - т.е. номера элемента
inc(c); // увеличиваем количество четных чисел
b[c] := a[i]; // если число четное, то сохраняем его в массив b[].
end;
for i := 1 to c do // выводим все сохраненные в массиве b[] числа в Memo2
memo2.Lines.Add(IntToStr(b[i]));

Label3.Caption:='Количество = '+inttostr(c); // выводим в Label3 количество четных чисел
end;


end.
Форма ответа