Консультация № 160130
10.02.2009, 20:29
0.00 руб.
10.02.2009, 21:18
0 5 1

Нужна помощь в след. задаче:
Определить массив Y=X*X-cosX, где X=1.0, 1.2, 1.4, 1.6.....10(шаг 0,2).выделить массив положительных значений Yp и вывести этот массив с сортировкой по возрастанию в 8 колонок.Элементы нечётных колонок заключить в квадратные скобки.

Условие правильное.
Пожалуйста, кто может помогите.

Обсуждение

Неизвестный
10.02.2009, 20:38
общий
это ответ
Здравствуйте, Volodin Leonid!
Вот Ваша программа. В программе используются динамические массивы.
Код:

program Pascal_160106;
const
{ Начальное значение для X }
START_X:Double=1.0;
{ Конечное значение для X }
END_X:Double=10;
{ Шаг }
STEP_X:Double=0.2;
type
DoublePtr=^Double;
var
Y,Yp,YPtr,YpPtr,TmpPtr,Min:DoublePtr;
X,Size,Tmp:Double;
Y_size,Yp_size,i,j,col:Word;
begin
{ Вычисляем размер массива Y }
Size:=(END_X-START_X)/STEP_X;
Y_size:=Trunc(Size)+1;
{ Выделяем память }
GetMem(Y,SizeOf(Double)*Y_size);
{ Сохраняем в массив данные и выводим его }
WriteLn('Array Y:');
Yp_size:=0; { Считаем положительные }
X:=START_X;
YPtr:=Y; { Указатель на начало массива }
while X<=END_X do begin
YPtr^:=X*X-cos(X);
X:=X+STEP_X; { Увеличим X на величину шага }
if YPtr^>0 then Inc(Yp_size); { Считаем положтительные }
Write(YPtr^:7:3,',');
Inc(YPtr); { На следующий элемент }
end;
WriteLn(#8,' ');
{ Если есть положительные }
if Yp_size>0 then begin
{ Выделяем память для Yp }
GetMem(Yp,SizeOf(Double)*Yp_size);
YPtr:=Y; YpPtr:=Yp; { Указатели на начало массивов }
WriteLn('Disordered Array Yp:');
for i := 1 to Y_size do begin
if YPtr^>0 then begin
{ Заносим положительные в Yp }
YpPtr^:=YPtr^;
Write(YpPtr^:7:3,',');
Inc(YpPtr); { На следующий элемент Yp }
end;
Inc(YPtr); { На следующий элемент Y }
end;
WriteLn(#8,' ');
{ Сортируем массив Yp }
YpPtr:=Yp;
for i := 1 to Yp_size-1 do begin
{ Ищем минимальный элемент среди i..Yp_size }
TmpPtr:=YpPtr;
Min:=YpPtr;
for j := i+1 to Yp_size do begin
Inc(TmpPtr);
if YpPtr^>TmpPtr^ then Min:=TmpPtr;
end;
{ Меняем найденный минимальный с i-м }
Tmp:=Min^;
Min^:=YpPtr^;
YpPtr^:=Min^;
Inc(YpPtr); { Переходим к следующему }
end;
{ Выводим сортированный Yp }
WriteLn('Sorted Array Yp:');
col:=0;
YpPtr:=Yp;
for i := 1 to Yp_size do begin
if not Odd(col) then Write('[',YpPtr^:7:3,'] ')
else Write(YpPtr^:7:3,' ');
col:=(col+1) mod 8;
if col=0 then WriteLn;
Inc(YpPtr);
end;
WriteLn;
FreeMem(Yp,SizeOf(Double)*Yp_size);
end else WriteLn('No positive values');
FreeMem(Y,SizeOf(Double)*Y_size);
ReadLn;
end.


Результат работы:
Код:

Array Y:
0.460, 1.078, 1.790, 2.589, 3.467, 4.416, 5.429, 6.497, 7.617, 8.782,
9.990, 11.238, 12.527, 13.857, 15.231, 16.654, 18.130, 19.667, 21.272, 22.953,
24.716, 26.571, 28.525, 30.584, 32.754, 35.040, 37.443, 39.967, 42.610, 45.371,
48.246, 51.232, 54.321, 57.509, 60.786, 64.146, 67.579, 71.079, 74.639, 78.251,
81.911, 85.615, 89.360, 93.145, 96.970,100.839
Disordered Array Yp:
0.460, 1.078, 1.790, 2.589, 3.467, 4.416, 5.429, 6.497, 7.617, 8.782,
9.990, 11.238, 12.527, 13.857, 15.231, 16.654, 18.130, 19.667, 21.272, 22.953,
24.716, 26.571, 28.525, 30.584, 32.754, 35.040, 37.443, 39.967, 42.610, 45.371,
48.246, 51.232, 54.321, 57.509, 60.786, 64.146, 67.579, 71.079, 74.639, 78.251,
81.911, 85.615, 89.360, 93.145, 96.970,100.839
Sorted Array Yp:
[ 0.460] 1.078 [ 1.790] 2.589 [ 3.467] 4.416 [ 5.429] 6.497
[ 7.617] 8.782 [ 9.990] 11.238 [ 12.527] 13.857 [ 15.231] 16.654
[ 18.130] 19.667 [ 21.272] 22.953 [ 24.716] 26.571 [ 28.525] 30.584
[ 32.754] 35.040 [ 37.443] 39.967 [ 42.610] 45.371 [ 48.246] 51.232
[ 54.321] 57.509 [ 60.786] 64.146 [ 67.579] 71.079 [ 74.639] 78.251
[ 81.911] 85.615 [ 89.360] 93.145 [ 96.970] 100.839
Неизвестный
10.02.2009, 20:46
общий
Первая страница [b]Здесь[/b]
Посмотрите, там есть совет, а то удалят повторный вопрос
Неизвестный
10.02.2009, 20:56
общий
СПС, на этой строчке: START_X:Double=1.0;
Пише ошибку: НЕИЗВЕСТНОЕ ИМЯ ТИПА "DOUBLE"
Неподскажите как исправить?
Неизвестный
10.02.2009, 21:12
общий
Вы наверное запускаете в PascalABC?
В следующий раз предупреждайте об этом поскольку это очень специфический паскаль. Он не только в этой строке ошибку найдет.
TP 7 откомпилировал программу нормально. Если у Вас есть возможность перейдите на TP или FreePascal(еще лучше), а это мучение удалите с винта.
Вот программа для PascalABC:
Код:

program Pascal_160106;
const
START_X:Real=1.0;
END_X:Real=10;
STEP_X:Real=0.2;
type
RealPtr=^Real;
var
Y,Yp,YPtr,YpPtr,TmpPtr,Min:RealPtr;
X,Size,Tmp:Real;
Y_size,Yp_size,i,j,col:Integer;
begin
Size:=(END_X-START_X)/STEP_X;
Y_size:=Trunc(Size)+1;
GetMem(Y,SizeOf(Real)*Y_size);
WriteLn('Array Y:');
Yp_size:=0;
X:=START_X;
YPtr:=Y;
while X<=END_X do begin
YPtr^:=X*X-cos(X);
X:=X+STEP_X;
if YPtr^>0 then Inc(Yp_size);
Write(YPtr^:7:3,',');
YPtr:=YPtr+1;
end;
WriteLn(#8,' ');
if Yp_size>0 then begin
GetMem(Yp,SizeOf(Real)*Yp_size);
YPtr:=Y; YpPtr:=Yp;
WriteLn('Disordered Array Yp:');
for i := 1 to Y_size do begin
if YPtr^>0 then begin
YpPtr^:=YPtr^;
Write(YpPtr^:7:3,',');
YpPtr:=YpPtr+1;
end;
YPtr:=YPtr+1;
end;
WriteLn(#8,' ');
YpPtr:=Yp;
for i := 1 to Yp_size-1 do begin
TmpPtr:=YpPtr;
Min:=YpPtr;
for j := i+1 to Yp_size do begin
TmpPtr:=TmpPtr+1;
if YpPtr^>TmpPtr^ then Min:=TmpPtr;
end;
Tmp:=Min^;
Min^:=YpPtr^;
YpPtr^:=Min^;
YpPtr:=YpPtr+1;
end;
WriteLn('Sorted Array Yp:');
col:=0;
YpPtr:=Yp;
for i := 1 to Yp_size do begin
if not Odd(col) then Write('[',YpPtr^:7:3,'] ')
else Write(YpPtr^:7:3,' ');
col:=(col+1) mod 8;
if col=0 then WriteLn;
YpPtr:=YpPtr+1;
end;
WriteLn;
FreeMem(Yp);
end else WriteLn('No positive values');
FreeMem(Y);
ReadLn;
end.
Неизвестный
10.02.2009, 21:16
общий
Опоздали, удалили уже. Я обратилась, восстановить сообщение, может получится, ждите или уж не обессудьте.
Нельзя в эту же рассылку второй такой же вопрос задавать, это на будущее. Удачи.
Форма ответа