Родились сегодня:
AnnaTar


Лидеры рейтинга

ID: 405049

vsetin

Студент

2656


ID: 401284

Михаил Александров

Советник

910

Россия, Санкт-Петербург


ID: 226425

Konstantin Shvetski

Модератор

645

Россия, Северодвинск


ID: 400669

epimkin

Профессионал

388


ID: 259041

Алексеев Владимир Николаевич

Мастер-Эксперт

380

Россия, пос. Теплоозёрск, ЕАО


ID: 325460

CradleA

Мастер-Эксперт

299

Беларусь, Минск


ID: 137394

Megaloman

Мастер-Эксперт

262

Беларусь, Гомель


8.9.0

20.06.2021

JS: 2.9.2
CSS: 4.5.10
jQuery: 3.6.0
DataForLocalStorage: 2021-06-24 14:46:01-standard


Создание программ на языках Pascal, Delphi и Lazarus.

Администратор раздела: Зенченко Константин Николаевич (Старший модератор)

Консультация онлайн # 160130

Раздел: Pascal / Delphi / Lazarus
Автор вопроса: Volodin Leonid
Дата: 10.02.2009, 20:29 Консультация закрыта
Поступило ответов: 1


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

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

Последнее редактирование 10.02.2009, 21:18 Зенченко Константин Николаевич (Старший модератор)
Ответ # 243355 от Micren
Здравствуйте, 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

Micren

Посетитель
10.02.2009, 20:38
Мини-форум консультации # 160130
Tit#LM

1

= общий =    10.02.2009, 20:46

Первая страница Здесь
Посмотрите, там есть совет, а то удалят повторный вопрос

неизвестный

2

= общий =    10.02.2009, 20:56

СПС, на этой строчке: START_X:Double=1.0;
Пише ошибку: НЕИЗВЕСТНОЕ ИМЯ ТИПА "DOUBLE"
Неподскажите как исправить?

Micren

3

= общий =    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.

Tit#LM

4

= общий =    10.02.2009, 21:16

Опоздали, удалили уже. Я обратилась, восстановить сообщение, может получится, ждите или уж не обессудьте.
Нельзя в эту же рассылку второй такой же вопрос задавать, это на будущее. Удачи.

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Лучшие эксперты раздела

puporev

Профессор

Рейтинг: 133

Зенченко Константин Николаевич

Старший модератор

Рейтинг: 99

Лысков Игорь Витальевич

Мастер-Эксперт

Рейтинг: 1

Асмик Гаряка

Советник

Рейтинг: 0

Орловский Дмитрий

Мастер-Эксперт

Рейтинг: 0

lamed

Академик

Рейтинг: 0