Помогите решить 2 задачи (Delphi)

Ответить
Аватара пользователя
WhiteBard
Сообщения: 7
Зарегистрирован: 08 апр 2008, 04:06

Помогите решить 2 задачи (Delphi)

Сообщение WhiteBard » 08 апр 2008, 10:30

Нужна помощь в решении 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]
Программы выдают ошибки. Вобщем, выручайте =)
Мне не нравятся те, кому не нравлюсь я!

MOTOCoder
Сообщения: 542
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

Re: Помогите решить 2 задачи (Delphi)

Сообщение MOTOCoder » 08 апр 2008, 15:34

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

Аватара пользователя
WhiteBard
Сообщения: 7
Зарегистрирован: 08 апр 2008, 04:06

Re: Помогите решить 2 задачи (Delphi)

Сообщение WhiteBard » 09 апр 2008, 06:12

Попоробывал исправить эту ошибку. При n=10 работает, но результат довольно странный, т.е. работает неправильно. При n=20 начинает выдавать какую-то ошибку и не дает результата.
А что насчет первой задачи?
Мне не нравятся те, кому не нравлюсь я!

MOTOCoder
Сообщения: 542
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

Re: Помогите решить 2 задачи (Delphi)

Сообщение MOTOCoder » 09 апр 2008, 17:58

Вл второй я бы сделал так:
[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]

У меня все работает.
Ни что так не ограничивает фантазию программиста, как компилятор...

Аватара пользователя
WhiteBard
Сообщения: 7
Зарегистрирован: 08 апр 2008, 04:06

Re: Помогите решить 2 задачи (Delphi)

Сообщение WhiteBard » 10 апр 2008, 03:02

Вторая задача работает. Спасибо огромное. =))) А что насчет первой задачи?
Мне не нравятся те, кому не нравлюсь я!

Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 16:14
Откуда: 71 RUS
Контактная информация:

Re: Помогите решить 2 задачи (Delphi)

Сообщение somewhere » 10 апр 2008, 09:55

&quot писал(а):А что насчет первой задачи?
Ищите в разделе Delphi&Pascal или в этом же, уже решалось когда-то подобная задача.
It's a long way to the top if you wanna rock'n'roll

Аватара пользователя
WhiteBard
Сообщения: 7
Зарегистрирован: 08 апр 2008, 04:06

Re: Помогите решить 2 задачи (Delphi)

Сообщение WhiteBard » 11 апр 2008, 06:24

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

А ссылки случаем нет, а то перерывать оба раздела - это же ужас.
P.S. Все еще требуется помощь в решении первой задачи =)
Мне не нравятся те, кому не нравлюсь я!

Аватара пользователя
WhiteBard
Сообщения: 7
Зарегистрирован: 08 апр 2008, 04:06

Re: Помогите решить 2 задачи (Delphi)

Сообщение WhiteBard » 12 апр 2008, 01:14

Люди, выручайте! Решить задачи нужно до понедельника!
Мне не нравятся те, кому не нравлюсь я!

Аватара пользователя
WhiteBard
Сообщения: 7
Зарегистрирован: 08 апр 2008, 04:06

Re: Помогите решить 2 задачи (Delphi)

Сообщение WhiteBard » 14 апр 2008, 12:24

Сроки сдачи работы немного перенесли. Так что по прежнему необходимо решить задачу №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 новых элемента в конец списка, а не через к (как это требуется в условии). В чем я ошибся? Может все-таки кто-нибудь поможет доделать эту задачу?
Мне не нравятся те, кому не нравлюсь я!

Ответить