Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.26;
Скачать: CL | DM;

Вниз

Написанную в паскале....   Найти похожие ветки 

 
Silica ©   (2006-03-05 10:07) [0]

программу хочу переделать под дельфи.
Вот код в дельфи в консольном режиме:

...
var i, N, BEG, FIN, BEFORE, COLOR : integer;
   A : array[1..4] of integer;
begin
 writeln("Vvedite kolichestvo kartochek:");
 readln(N);
 writeln("Vvedite nachalnii element:");
 readln(BEG);
 writeln("Vvedite konechnii element:");
 readln(FIN);
//  N := 10;
//  BEG := 1;
//  FIN := 10;
 A[FIN]:=BEG; {следующий за последним элементом – бывший первый}
 FIN:=BEG; {меняем ссылку на последний элемент}
 BEG:=A[BEG]; {новый первый элемент}
 A[FIN]:=0; {корректировка ссылки у последнего элемента}
 for i:=1 to N-1 do A[i]:=i+1;
 A[N]:=0; {установка ссылок в списке}
 BEG:=1; FIN:=N;
 COLOR:=1; {белый цвет = 1, черный = 0}
 while A[BEG]<>0 do
 {пока первый элемент не является} {одновременно и последним}
 begin
   BEFORE:=BEG; {сохраняем индекс начала списка}
   BEG:=A[BEG]; {удаляем первый элемент из списка}
   A[BEFORE]:=COLOR; {раскрашиваем удаленный элемент}
   {в нужный цвет}
   COLOR:=1-COLOR; {меняем цвет}
   A[FIN]:=BEG;  {переставляем элемент из}
   FIN:=BEG;  {начала списка в конец}
   BEG:=A[BEG];
   A[FIN]:=0
end;
A[BEG]:=COLOR;  {раскрашиваем последний элемент}
{списка}
for i:=1 to N do  {распечатка цветов}
if A[i]=0
then writeln("element", " " , i, " - chernii")
else writeln("element", " " , i, " - belii");
readln;
end.

А следующий код уже с формой и т.д.

procedure TForm1.Button1Click(Sender: TObject);
var i, n, nach, kon, pred, color : integer;
   a : array [1..4] of integer;
begin
 n := strtoint(edit1.text);
 nach := strtoint(edit2.text);
 kon := strtoint(edit3.Text);
 a[kon] := nach;{следующий за последним элементом - бывший первый}
 kon := nach;{меняем ссылку на последний элемент}
 nach := a[nach];{новый первый элемент}
 a[kon] := 0;{корректировка ссылки у последнего элемента}
 for i := 1 to n - 1 do
 a[i] := i + 1;
 a[n] := 0; {установка ссылок в списке}
 nach := 1;
 kon := n;
 color := 1;{белый цвет = 1, черный = 0}
 while a[nach] <> 0 do
 {пока первый элемент не является одновременно и последним}
 begin
   pred := nach;{сохраняем индекс начала списка}
   nach := a[nach];{удаляем первый элемент из списка}
   a[pred] := color;{раскрашиваем удаленный элемент в нужный цвет}
   color := 1 - color;{меняем цвет}
   a[kon] := nach;{переставляем элемент}
   kon := nach;{из начала списка в конец}
   nach := a[nach];
   a[kon] := 0;
 end;
 a[nach] := color;{раскрашиваем последний элемент списка}
 for i := 1 to n do{распечатка цветов}
 if a[i] = 0 then
   Memo1.Lines.Add("элемент" + " " + inttostr(i) + "- черный");
 if a[i] = 1 then
 begin
   Memo1.Lines.Add("элемент" + " " + inttostr(i) + "- белый");
 end;
end;
end.

У меня не получается вывести в МЕМО список так же как и консольном режиме.

Суть программы такова: имеется n черных и белых карточек, сложенных в стопку. Карточки раскладываются на стол в одну линию следующим образом: первая кладется на стол, вторая под низ стопки, третья- на стол, четвертая - под низ стопки и т.д., пока все карточки не будут выложены на стол. Каким должно быть исходное расположение карточек в стопке, чтобы разложенные на столе карточки чередовались по цвету: белая, черная, белая, черная и т.д.
Нужно вывести правильную комбинацию карточек.
Подскажите пожалуйста, какой код  с МЕМО нужен... :)


 
Marser ©   (2006-03-05 11:20) [1]

> У меня не получается вывести в МЕМО список так же как и
> консольном режиме.

На вскидку видно, что добавляете вы правильно. Просто вам нужно установить моноширинный шрифт, например Courier


 
Silica ©   (2006-03-05 20:09) [2]

А причем тут шрифт? При нажатии на кнопку высвечивается ошибка. Список вообще не выводится. Не помню, что написала, но было так, что он вывел мне в МЕМО одну строку "элемент 1 - белый". После изменений вообще теперь ничего не выводится. :(


 
Marser ©   (2006-03-05 20:59) [3]

Узких мест очень много. Например:
a : array [1..4] of integer;
nach := strtoint(edit2.text);
kon := strtoint(edit3.Text);
a[kon] := nach;{следующий за последним элементом - бывший первый}

Потенциально может обратиться к пятому элементу массива - ошибка.
memo1.lines.add при многих вариатах входных данных просто не может выполняться, как не выполнился бы там WriteLn и вообще что угодно.
Вы знакомы с отладчиком? Пройдитесь по своему коду с F7/F8 и многое станет ясно. Не на Делфи надо пенять.


 
Silica ©   (2006-03-06 13:02) [4]

Marser, а в консольном режиме то программа работает. И writeln работает, все выводит как надо.
P.S. Я вообще то на дельфи и не пеняла. :) Тут то проблема в том, что я не могу написать правильно код, не дельфи же это за меня делает. :)


 
umbra ©   (2006-03-06 13:15) [5]


> При нажатии на кнопку высвечивается ошибка

какая, если не секрет?


 
Silica ©   (2006-03-07 14:03) [6]

umbra:

... rased exception class EAccessViolation whith message "Access violation at address OOOOOOOB. Read of address OOOOOOOB". Process stoped...

Вот такая вот ошибка. Я английский не очень хорошо знаю. Но даже знание языка не помогло бы разобраться в этом address...


 
tesseract ©   (2006-03-07 14:59) [7]

Напоминает выход за пределы массива.


 
Плохиш ©   (2006-03-07 15:08) [8]


> Silica ©   (07.03.06 14:03) [6]

Девушка, Вы программиска или уборщица подрабатывающая программисткой? Встроенный в делфи отладчик преднозначен для поиска мест, где возникают ошибки и изучения состояния переменных в данный момент. А Вы даже не удосужились привести место кода, которое вызывает данную ошибку, хотя делфи при возникновении ошибок останавливает выполнение программы и показывает строку, являющуюся источником этой ошибки :-(
Ошибка означает, что Ваша программа попыталась обратиться к области памяти, к которой ей(программе) обращаться не разрешено.


 
Button1Click   (2006-03-09 02:22) [9]

Вот ошибки:

1. for i := 1 to n - 1 do  a[i] := i + 1;
в этой строке индекс I выходит за пределы массива array [1..4] of integer -
увеличте размер массива, например array [1..400] или используйте динамический массив.

2. Имя переменной color совпадает со свойством формы Form1.Color - измените имя переменной во всей программе.


 
Loginov Dmitry ©   (2006-03-09 08:35) [10]

Сравните:


> for i:=1 to N do  {распечатка цветов}
> if A[i]=0
> then writeln("element", " " , i, " - chernii")
> else writeln("element", " " , i, " - belii");


и


>  for i := 1 to n do{распечатка цветов}
>  if a[i] = 0 then
>    Memo1.Lines.Add("элемент" + " " + inttostr(i) + "- черный");
>
>  if a[i] = 1 then
>  begin
>    Memo1.Lines.Add("элемент" + " " + inttostr(i) + "- белый");
>
>  end;


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


 
Marser ©   (2006-03-09 23:47) [11]


> хотя делфи при возникновении ошибок останавливает выполнение
> программы и показывает строку, являющуюся источником этой
> ошибки :-(

Не всегда точно, особенно AV, что может вводить в заблуждение. Так, мне на днях заявляли, что $IFDEF вызывает оную ошибку, хотя на самом деле ошибка возникла раньше.


 
Defunct ©   (2006-03-09 23:59) [12]

> Так, мне на днях заявляли, что $IFDEF вызывает оную ошибку

забавно :)



Страницы: 1 вся ветка

Текущий архив: 2006.03.26;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.037 c
15-1141476138
lookin
2006-03-04 15:42
2006.03.26
Скриншот из файла, проигрываемого (Alternative) Media Player


15-1141579390
ArtemESC
2006-03-05 20:23
2006.03.26
Borland Pascal


3-1138716259
bobr12
2006-01-31 17:04
2006.03.26
oracle и trigger для добавления уникального значения


2-1141672750
mrAndersen
2006-03-06 22:19
2006.03.26
Текст


1-1140586210
__DATA__
2006-02-22 08:30
2006.03.26
Сохранение заголовков всех компонентов формы