Помогите решить 2 задачи (Delphi)
Нужна помощь в решении 2 задач на Delphi:
1. Составить программу, которая в кольцевой список из n элементов добавляет m новых элементов так, чтобы новый элемент вставлялся через k элементов кольца.
2. Число компонент файла f, компонентами которого являются целые числа, кратно 1. Переписать компоненты файла f в файл g, изменяя порядок чисел в каждой десятке так, чтобы в начале шли отрицательные числа десятки, а за ними – неотрицательные.
Сам пробовал решать. Вот, что получилось:
1.
[syntax='Delphi']
procedure TForm1.BitBtn1Click(Sender: TObject);
Type
sp=record
inf: integer;
link: integer;
end;
var
spisok: array[1..100] of sp;
k,i,n,m,m1,p: integer;
begin
listbox1.Clear;
listbox2.clear;
n:=strtoint(edit1.text);
m:=strtoint(edit2.Text);
k:=strtoint(edit3.Text);
for i:=0 to (n-2) do begin
spisok[i+1].inf:=Random(10);
spisok[i+1].link:=spisok[i+2].link;
spisok.link:=i+1
end;
spisok[n].link:=spisok[1].link;
i:=1;
repeat
listbox1.Items.add(inttostr(spisok.inf));
i:=i+1
until (i=n);
p:=1;
m1:=1;
repeat
spisok[p].inf:=Random(10);
spisok[p].link:=spisok[p+1].link;
spisok[p-1].link:=p;
p:=p+k;
m1:=m1+1
until (p>n) or (m1=m);
i:=1;
repeat
listbox2.Items.add(inttostr(spisok.inf));
i:=i+1
until (i=n+m);
end;
[/syntax]
2.
[syntax='Delphi']
procedure TForm1.BitBtn1Click(Sender: TObject);
var f,g:TFileStream;
a,i,j,l,s,min,k,n:integer;
buf:array [0..10] of integer;
begin
listbox1.clear;
listbox2.Clear;
n:=strtoint(edit1.text);
if (n mod 10)<>0 then begin
showmessage ('vvedite chislo kratnoe 10');
edit1.Clear
end
else
begin
s:=n div 10;
g:=TfileStream.Create('F:\Программирование\индивидуальное задание\Задача 3\файлы\g.dat', fmCreate);
f:=TfileStream.Create('F:\Программирование\индивидуальное задание\Задача 3\файлы\f.dat', fmCreate);
Randomize;
for i:=1 to n do begin
a:=Random(30+(-15));
f.write(a,sizeof(a));
listbox1.items.add(inttostr(a))
end;
for l:=1 to s do begin
f.read(buf,10);
for i:=1 to 10 do begin
min:=buf;
k:=i;
for j:=(i+1) to n do begin
if min>buf[j] then begin
min:=buf[j];
k:=j;
end;
end;
buf[k]:=buf;
buf:=min;
end;
g.Write(buf,sizeof(buf));
for i:=1 to 10 do
listbox2.Items.add(inttostr(buf));
end;
f.Free;
g.Free;
end;
end;
[/syntax]
Программы выдают ошибки. Вобщем, выручайте =)
1. Составить программу, которая в кольцевой список из n элементов добавляет m новых элементов так, чтобы новый элемент вставлялся через k элементов кольца.
2. Число компонент файла f, компонентами которого являются целые числа, кратно 1. Переписать компоненты файла f в файл g, изменяя порядок чисел в каждой десятке так, чтобы в начале шли отрицательные числа десятки, а за ними – неотрицательные.
Сам пробовал решать. Вот, что получилось:
1.
[syntax='Delphi']
procedure TForm1.BitBtn1Click(Sender: TObject);
Type
sp=record
inf: integer;
link: integer;
end;
var
spisok: array[1..100] of sp;
k,i,n,m,m1,p: integer;
begin
listbox1.Clear;
listbox2.clear;
n:=strtoint(edit1.text);
m:=strtoint(edit2.Text);
k:=strtoint(edit3.Text);
for i:=0 to (n-2) do begin
spisok[i+1].inf:=Random(10);
spisok[i+1].link:=spisok[i+2].link;
spisok.link:=i+1
end;
spisok[n].link:=spisok[1].link;
i:=1;
repeat
listbox1.Items.add(inttostr(spisok.inf));
i:=i+1
until (i=n);
p:=1;
m1:=1;
repeat
spisok[p].inf:=Random(10);
spisok[p].link:=spisok[p+1].link;
spisok[p-1].link:=p;
p:=p+k;
m1:=m1+1
until (p>n) or (m1=m);
i:=1;
repeat
listbox2.Items.add(inttostr(spisok.inf));
i:=i+1
until (i=n+m);
end;
[/syntax]
2.
[syntax='Delphi']
procedure TForm1.BitBtn1Click(Sender: TObject);
var f,g:TFileStream;
a,i,j,l,s,min,k,n:integer;
buf:array [0..10] of integer;
begin
listbox1.clear;
listbox2.Clear;
n:=strtoint(edit1.text);
if (n mod 10)<>0 then begin
showmessage ('vvedite chislo kratnoe 10');
edit1.Clear
end
else
begin
s:=n div 10;
g:=TfileStream.Create('F:\Программирование\индивидуальное задание\Задача 3\файлы\g.dat', fmCreate);
f:=TfileStream.Create('F:\Программирование\индивидуальное задание\Задача 3\файлы\f.dat', fmCreate);
Randomize;
for i:=1 to n do begin
a:=Random(30+(-15));
f.write(a,sizeof(a));
listbox1.items.add(inttostr(a))
end;
for l:=1 to s do begin
f.read(buf,10);
for i:=1 to 10 do begin
min:=buf;
k:=i;
for j:=(i+1) to n do begin
if min>buf[j] then begin
min:=buf[j];
k:=j;
end;
end;
buf[k]:=buf;
buf:=min;
end;
g.Write(buf,sizeof(buf));
for i:=1 to 10 do
listbox2.Items.add(inttostr(buf));
end;
f.Free;
g.Free;
end;
end;
[/syntax]
Программы выдают ошибки. Вобщем, выручайте =)
Мне не нравятся те, кому не нравлюсь я!
По второй задаче:
в первую очередь, несоответствие типов данных: Вы записываете значения типа integer, т.е. 4 байта, а читаете затем 10 байт в буфер из 11(хотя по логике нужно из 10 т.е. array[1..10]of integer вместо array[0..10]of integer) значений integer, т.е. читайте не 10, а 40 байт, а лучше напишите SizeOf(buf)
в первую очередь, несоответствие типов данных: Вы записываете значения типа integer, т.е. 4 байта, а читаете затем 10 байт в буфер из 11(хотя по логике нужно из 10 т.е. array[1..10]of integer вместо array[0..10]of integer) значений integer, т.е. читайте не 10, а 40 байт, а лучше напишите SizeOf(buf)
Ни что так не ограничивает фантазию программиста, как компилятор...
Попоробывал исправить эту ошибку. При n=10 работает, но результат довольно странный, т.е. работает неправильно. При n=20 начинает выдавать какую-то ошибку и не дает результата.
А что насчет первой задачи?
А что насчет первой задачи?
Мне не нравятся те, кому не нравлюсь я!
Вл второй я бы сделал так:
[syntax='Delphi']
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Spin;
type
TForm1 = class(TForm)
lb1: TListBox;
lb2: TListBox;
seCnt: TSpinEdit;
bGenerate: TButton;
bChange: TButton;
procedure bGenerateClick(Sender: TObject);
procedure bChangeClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Type
Arr10=array [1..10] of integer;
var
Form1: TForm1;
fsD,fsF:TFileStream;
A1,A2:Arr10;
implementation
{$R *.dfm}
procedure TForm1.bGenerateClick(Sender: TObject);
var
i:integer;
N:integer;
begin
if (seCnt.Value mod 10)<>0 then
begin
showmessage('Введите число, кратное 10');
exit;
end;
fsF:=TFilestream.Create('e:\temp\f.dat',fmCreate);
for i:= 1 to seCnt.Value do
begin
N:=Random(1000);
if Random(5)<2 then
N:=-N;
fsF.Write(N,SizeOf(N));
lb1.Items.Add(IntToStr(N));
end;
fsF.Free;
end;
procedure TForm1.bChangeClick(Sender: TObject);
var
i,j:integer;
begin
fsF:=TFileStream.Create('e:\temp\f.dat',fmOpenRead);
fsD:=TFileStream.Create('e:\temp\d.dat',fmCreate);
while fsF.Position<fsF.Size do
begin
fsF.Read(A1,SizeOf(Arr10));
j:=1;
for i:=1 to 10 do
if A1<0 then
begin
A2[j]:=A1;
inc(j);
lb2.Items.Add(IntToStr(A2[J-1]));
end;
for i:=1 to 10 do
if A1>=0 then
begin
A2[j]:=A1;
inc(j);
lb2.Items.Add(IntToStr(A2[J-1]));
end;
fsD.Write(A2,SizeOf(Arr10));
end;
fsD.Free;
end;
end.
[/syntax]
У меня все работает.
[syntax='Delphi']
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Spin;
type
TForm1 = class(TForm)
lb1: TListBox;
lb2: TListBox;
seCnt: TSpinEdit;
bGenerate: TButton;
bChange: TButton;
procedure bGenerateClick(Sender: TObject);
procedure bChangeClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
Type
Arr10=array [1..10] of integer;
var
Form1: TForm1;
fsD,fsF:TFileStream;
A1,A2:Arr10;
implementation
{$R *.dfm}
procedure TForm1.bGenerateClick(Sender: TObject);
var
i:integer;
N:integer;
begin
if (seCnt.Value mod 10)<>0 then
begin
showmessage('Введите число, кратное 10');
exit;
end;
fsF:=TFilestream.Create('e:\temp\f.dat',fmCreate);
for i:= 1 to seCnt.Value do
begin
N:=Random(1000);
if Random(5)<2 then
N:=-N;
fsF.Write(N,SizeOf(N));
lb1.Items.Add(IntToStr(N));
end;
fsF.Free;
end;
procedure TForm1.bChangeClick(Sender: TObject);
var
i,j:integer;
begin
fsF:=TFileStream.Create('e:\temp\f.dat',fmOpenRead);
fsD:=TFileStream.Create('e:\temp\d.dat',fmCreate);
while fsF.Position<fsF.Size do
begin
fsF.Read(A1,SizeOf(Arr10));
j:=1;
for i:=1 to 10 do
if A1<0 then
begin
A2[j]:=A1;
inc(j);
lb2.Items.Add(IntToStr(A2[J-1]));
end;
for i:=1 to 10 do
if A1>=0 then
begin
A2[j]:=A1;
inc(j);
lb2.Items.Add(IntToStr(A2[J-1]));
end;
fsD.Write(A2,SizeOf(Arr10));
end;
fsD.Free;
end;
end.
[/syntax]
У меня все работает.
Ни что так не ограничивает фантазию программиста, как компилятор...
Вторая задача работает. Спасибо огромное. =))) А что насчет первой задачи?
Мне не нравятся те, кому не нравлюсь я!
Ищите в разделе Delphi&Pascal или в этом же, уже решалось когда-то подобная задача." писал(а):А что насчет первой задачи?
It's a long way to the top if you wanna rock'n'roll
somewhere писал(а):Ищите в разделе Delphi&Pascal или в этом же, уже решалось когда-то подобная задача.
А ссылки случаем нет, а то перерывать оба раздела - это же ужас.
P.S. Все еще требуется помощь в решении первой задачи =)
Мне не нравятся те, кому не нравлюсь я!
Люди, выручайте! Решить задачи нужно до понедельника!
Мне не нравятся те, кому не нравлюсь я!
Сроки сдачи работы немного перенесли. Так что по прежнему необходимо решить задачу №1. Попробывал переделать ее сам. Вот до чего додумался:
procedure TForm1.BitBtn1Click(Sender: TObject);
[syntax='Delphi']
Type
sp=record
inf: integer;
link: integer;
end;
var
spisok: array[1..100] of sp;
k,i,n,m: integer;
begin
listbox1.Clear;
listbox2.clear;
n:=strtoint(edit1.text);
m:=strtoint(edit2.Text);
k:=strtoint(edit3.Text);
if (k*m>n) then begin
showmessage ('число вставляемых элементов превосходит размер списка');
edit1.Clear;
edit2.Clear;
edit3.Clear;
listbox1.Clear;
listbox2.clear
end
else begin
for i:=0 to (n-2) do begin
spisok[i+1].inf:=Random(10);
spisok[i+1].link:=spisok[i+2].link;
spisok.link:=spisok[i+1].link;
end;
spisok[n].link:=spisok[1].link;
i:=1;
repeat
listbox1.Items.add(inttostr(spisok.inf));
i:=i+1
until (i=n);
for i:=1 to m do begin
spisok[n+1].inf:=Random(10);
spisok[k].link:=spisok[n+1].link;
spisok[n+1].link:=spisok[k+1].link;
n:=n+1;
end;
i:=1;
repeat
listbox2.Items.add(inttostr(spisok.inf));
i:=i+1
until (i=n);
end;
end;
[/syntax]
Результат: вставляются 2 новых элемента в конец списка, а не через к (как это требуется в условии). В чем я ошибся? Может все-таки кто-нибудь поможет доделать эту задачу?
procedure TForm1.BitBtn1Click(Sender: TObject);
[syntax='Delphi']
Type
sp=record
inf: integer;
link: integer;
end;
var
spisok: array[1..100] of sp;
k,i,n,m: integer;
begin
listbox1.Clear;
listbox2.clear;
n:=strtoint(edit1.text);
m:=strtoint(edit2.Text);
k:=strtoint(edit3.Text);
if (k*m>n) then begin
showmessage ('число вставляемых элементов превосходит размер списка');
edit1.Clear;
edit2.Clear;
edit3.Clear;
listbox1.Clear;
listbox2.clear
end
else begin
for i:=0 to (n-2) do begin
spisok[i+1].inf:=Random(10);
spisok[i+1].link:=spisok[i+2].link;
spisok.link:=spisok[i+1].link;
end;
spisok[n].link:=spisok[1].link;
i:=1;
repeat
listbox1.Items.add(inttostr(spisok.inf));
i:=i+1
until (i=n);
for i:=1 to m do begin
spisok[n+1].inf:=Random(10);
spisok[k].link:=spisok[n+1].link;
spisok[n+1].link:=spisok[k+1].link;
n:=n+1;
end;
i:=1;
repeat
listbox2.Items.add(inttostr(spisok.inf));
i:=i+1
until (i=n);
end;
end;
[/syntax]
Результат: вставляются 2 новых элемента в конец списка, а не через к (как это требуется в условии). В чем я ошибся? Может все-таки кто-нибудь поможет доделать эту задачу?
Мне не нравятся те, кому не нравлюсь я!