PDA

Просмотр полной версии : Помогите решить 2 задачи (Delphi)



WhiteBard
08.04.2008, 11:30
Нужна помощь в решении 2 задач на Delphi:
1. Составить программу, которая в кольцевой список из n элементов добавляет m новых элементов так, чтобы новый элемент вставлялся через k элементов кольца.
2. Число компонент файла f, компонентами которого являются целые числа, кратно 1. Переписать компоненты файла f в файл g, изменяя порядок чисел в каждой десятке так, чтобы в начале шли отрицательные числа десятки, а за ними – неотрицательные.
Сам пробовал решать. Вот, что получилось:
1.

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[i].link:=i+1
end;
spisok[n].link:=spisok[1].link;
i:=1;
repeat
listbox1.Items.add(inttostr(spisok[i].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[i].inf));
i:=i+1
until (i=n+m);
end;

2.

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[i];
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[i];
buf[i]:=min;
end;
g.Write(buf,sizeof(buf));
for i:=1 to 10 do
listbox2.Items.add(inttostr(buf[i]));
end;
f.Free;
g.Free;
end;
end;

Программы выдают ошибки. Вобщем, выручайте =)

MOTOCoder
08.04.2008, 16:34
По второй задаче:
в первую очередь, несоответствие типов данных: Вы записываете значения типа integer, т.е. 4 байта, а читаете затем 10 байт в буфер из 11(хотя по логике нужно из 10 т.е. array[1..10]of integer вместо array[0..10]of integer) значений integer, т.е. читайте не 10, а 40 байт, а лучше напишите SizeOf(buf)

WhiteBard
09.04.2008, 07:12
Попоробывал исправить эту ошибку. При n=10 работает, но результат довольно странный, т.е. работает неправильно. При n=20 начинает выдавать какую-то ошибку и не дает результата.
А что насчет первой задачи?

MOTOCoder
09.04.2008, 18:58
Вл второй я бы сделал так:

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[i]<0 then
begin
A2[j]:=A1[i];
inc(j);
lb2.Items.Add(IntToStr(A2[J-1]));
end;
for i:=1 to 10 do
if A1[i]>=0 then
begin
A2[j]:=A1[i];
inc(j);
lb2.Items.Add(IntToStr(A2[J-1]));
end;
fsD.Write(A2,SizeOf(Arr10));
end;
fsD.Free;

end;

end.



У меня все работает.

WhiteBard
10.04.2008, 04:02
Вторая задача работает. Спасибо огромное. =))) А что насчет первой задачи?

somewhere
10.04.2008, 10:55
А что насчет первой задачи?
Ищите в разделе Delphi&Pascal или в этом же, уже решалось когда-то подобная задача.

WhiteBard
11.04.2008, 07:24
Ищите в разделе Delphi&Pascal или в этом же, уже решалось когда-то подобная задача.
А ссылки случаем нет, а то перерывать оба раздела - это же ужас.
P.S. Все еще требуется помощь в решении первой задачи =)

WhiteBard
12.04.2008, 02:14
Люди, выручайте! Решить задачи нужно до понедельника!

WhiteBard
14.04.2008, 13:24
Сроки сдачи работы немного перенесли. Так что по прежнему необходимо решить задачу №1. Попробывал переделать ее сам. Вот до чего додумался:
procedure TForm1.BitBtn1Click(Sender: TObject);

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[i].link:=spisok[i+1].link;
end;
spisok[n].link:=spisok[1].link;
i:=1;
repeat
listbox1.Items.add(inttostr(spisok[i].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[i].inf));
i:=i+1
until (i=n);
end;
end;

Результат: вставляются 2 новых элемента в конец списка, а не через к (как это требуется в условии). В чем я ошибся? Может все-таки кто-нибудь поможет доделать эту задачу?