Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2015, 17:20   #1
Fredoom
Новичок
Джуниор
 
Регистрация: 10.11.2015
Сообщений: 6
По умолчанию Помогите с одномерным массивом(исправьте мою ошибку в программе)

Все сделать в одной программе!

1) Вычислить значения 33 элементов одномерного целочисленного массива X в интервале (-9, 6) с использованием генератора случайных чисел.

2)Вычислить среднеквадратичное значение каждых третьих элементов второй половины массива.

3)Определить наименьший по модулю элемент первой трети массива.

4)Упорядочить чётные по значению элементы первой половины массива по убыванию обратных.

Люди добрые, помогите мне в решений данной задачи, почему моя программа не работает как нужно?


Вот моя программа:


Код:
Program Lab4;
const Title =' Работа 4, Вар. 387.';
n=33;
type vect=array [1..n] of integer;
var a,b,i:integer;
X:vect;
S,mn,min:real;

procedure VECTOR (n,a,b:integer; var X:vect);
var i: integer;
begin
randomize;
for i:= 1 to n do 
X[i]:=a+round((b-a)*random(10));
end;


function SUM(n:integer; X:vect):real;
Var i,sum:integer;
S:real;
begin
sum:=0;
for i:=3 to (n div 3) do 
if (i mod 2)=0 then
sum:=sum+X[i]*X[i];
S:=sqrt(sum/n);
end;

function MIN1 (n:integer; X:vect):real;
var i:integer;
mn, min:real;
begin
mn:=0;
for i:=round(n/1)+1 to round(1*n/3) do
if abs(X[i])>mn then min:=X[i]; 
writeln('min',min);
end;

procedure porjadok (n:integer; var X:vect);
var i,j,k,c:integer;
begin
for i:=1 to (n div 2)-1 do
if (X[i] mod 2)=0 then
begin
k:=i;
for j:=i+1 to n div 2 do
if (X[i] mod 2)=0 then
if (X[j]<X[k]) then X[k]:=c;
end;
end;

procedure writevect(n:integer; X:vect);
var i:integer;
begin
randomize;
for i:=1 to n do
begin
X[i]:=a+round((b-a)*random(100));
write(X[i]:5);
end; 
end;
procedure writeMIN1(n:integer; X:vect);
var i:integer;
begin
for i:=1 to n do
writeln(min);
end;
procedure writeSUM(n:integer; X:vect);
Var i:integer;
S:real;
begin
for i:=1 to n do
write(S:3);
end;
procedure writeporjadok(n:integer; X:vect);
var i,k:integer;
begin
for i:=1 to n do
Write(X[k]:3);
end;
begin 
write(' Интервал значений от a= ');readln(a); 
write('до= ');readln(b); 
writeln;writeln(' ':25,'Исходные данные'); 
writeln('Размерность вектора n = ',n); 
writeln('Интервал [',a,',',b,']');writeln; 
writeln(' ':26,'Результаты расчета'); 

writeln('Вектор X из ',n,' элементов в интервале [',a,',',b,'], полученных'); 
writeln('при помощи генератора случайных чисел'); 
writevect(n,X);
writeln;
writeln('среднеквадратичное значение каждых третьих элементов второй половины массива'); 
writeSUM(n,X);
S:=sum(n,X); writeln(' S=',S:3); 

writeln('наименьший по модулю элемент первой трети масcива '); 
writeMIN1(n,X); 
min:=X[i]; writeln('',min:5);

writeln('Упорядочить чётные по значению элементы первой половины массива по убыванию обратных '); 
writeporjadok(n,x);
end.

Последний раз редактировалось Вадим Мошев; 10.11.2015 в 17:30.
Fredoom вне форума Ответить с цитированием
Старый 10.11.2015, 17:44   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

во-первых, везде, где вектор должен изменяться, нужно его передавать в процедуры с модификатором VAR:
Код:
procedure writevect(n:integer; var X:vect);
во-вторых, фраза "почему моя программа не работает как нужно?" - это почти ничего. Что не работает, в чём это проявляется? Указывайте, что именно не работает, что Вы вводите, что получаете, а что, по вашему мнению, Вы должны получить.


p.s. программу я не запускал. возможно, там ещё косяки есть...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.11.2015, 21:48   #3
Fredoom
Новичок
Джуниор
 
Регистрация: 10.11.2015
Сообщений: 6
По умолчанию

Проблема такова:

после запуска программы я получаю такое:


Интервал значений от a= -9
до= 6

Исходные данные
Размерность вектора n = 33
Интервал [-9,6]

Результаты расчета
Вектор X из 33 элементов в интервале [-9,6], полученных
при помощи генератора случайных чисел
891 561 696 846 696 441 381 786 246 141 291 321 1086 381 891 531 831 1176 1371 -9 831 576 756 51 651 996 51 846 861 486 1296 1416 1446
среднеквадратичное значение каждых третьих элементов второй половины массива
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 S= 0
наименьший по модулю элемент первой трети масcива
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
).Program.Main()[END]


неисправна программы по решению трех последних задач:
2)среднеквадратичное значение каждых третьих элементов второй половины массива
3)наименьший по модулю элемент первой трети масcива
4)Упорядочить чётные по значению элементы первой половины массива по убыванию обратных.

почему выводятся одни нули? Вывод программы составлен неправильно?
Fredoom вне форума Ответить с цитированием
Старый 11.11.2015, 10:21   #4
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

Цитата:
Сообщение от Fredoom Посмотреть сообщение
Проблема такова:

Вектор X из 33 элементов в интервале [-9,6], полученных
при помощи генератора случайных чисел
891 561 696 846 696 441 381 786 246 141 291 321 1086 381 891 531 831 1176 1371 -9 831 576 756 51 651 996 51 846 861 486 1296 1416 1446


неисправна программы по решению трех последних задач:
2)среднеквадратичное значение каждых третьих элементов второй половины массива
3)наименьший по модулю элемент первой трети масcива
4)Упорядочить чётные по значению элементы первой половины массива по убыванию обратных.
то есть первое выполняется
Цитата:
Сообщение от Fredoom Посмотреть сообщение
Все сделать в одной программе!

1) Вычислить значения 33 элементов одномерного целочисленного массива X в интервале (-9, 6) с использованием генератора случайных чисел.
так наверно лучше будет
Код:
procedure VECTOR (n,a,b:integer; var X:vect);
var i: integer;
begin
randomize;
for i:= 1 to n do 
X[i]:=random(b-a+1)+a;
end;
Терпение!Дежурный экстрасенс скоро свяжется с вами!
Dvoishnik вне форума Ответить с цитированием
Старый 11.11.2015, 10:45   #5
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

зачем было инициализировать массив, если вы это делаете еще раз здесь
Код:
procedure writevect(n:integer; X:vect);
var i:integer;
begin
randomize;
for i:=1 to n do
begin
X[i]:=a+round((b-a)*random(100));
write(X[i]:5);
end; 
end;
эта функция вообще не нужна так как у вас уже есть вывод.
Код:
procedure writeporjadok(n:integer; X:vect);
var i,k:integer;
begin
for i:=1 to n do
Write(X[k]:3); // откуда k взялось ??
end;
как так вообще ?
Код:
function SUM(n:integer; X:vect):real;
Var i,
sum:integer; //sum имя функции это же
S:real;
begin
sum:=0;
for i:=3 to (n div 3) do 
if (i mod 2)=0 then
sum:=sum+X[i]*X[i];
S:=sqrt(sum/n); // и результат вы хрен знает куда присваиваете 
end;
Терпение!Дежурный экстрасенс скоро свяжется с вами!

Последний раз редактировалось Dvoishnik; 11.11.2015 в 11:15. Причина: добавил
Dvoishnik вне форума Ответить с цитированием
Старый 11.11.2015, 15:04   #6
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

если я правильно понял задание как то так должно получится.
Код:
const 
	n=33;
	m=17;
type 
	vect=array [1..n] of integer;
var 
	a,b:integer;
	X:vect;


procedure VECTOR (n,a,b:integer; var X:vect);
	var i: integer;
begin
 randomize;
 for i:= 1 to n do
	X[i]:=random(b-a+1)+a;
end;


function SUM(n:integer; X:vect):real;
	Var S,i:integer;
begin
 s:=0;
 I:=(n div 2);
 while I<=n do
	begin
	 s:=s+x[i]*x[i];
	 I:=I+3;
	end;
SUM:=sqrt(s/((I-(n div 2))/3));
end;

function MIN (n:integer; X:vect):integer;
	var mn,i:integer;
begin
 mn:=abs(X[1]);
 for i:=2 to (n div 3) do
	if ((abs(X[i])) < mn)
		then mn:=X[i];
min:=mn;
end;


procedure porjadok (var X:vect);
	var i,j,c:integer;
	    x1:array[1..17] of integer;
begin
J:=0;
for i:=1 to m do
 if (x[i] mod 2) = 0 then
  begin
    INC(J);
	x1[J]:=x[i];
  end;
for i := 1 to m-1 do
 for j := 1 to m-i do
    if x1[j] > x1[j+1] then
     begin
      c := x1[j];
      x1[j] := x1[j+1];
      x1[j+1] := c;
     end;
J:=0;
for i:=1 to m do
 if (x[i] mod 2) = 0 then 
  begin
    INC(J);
	x[i]:=x1[J];
  end; 
end;


procedure writeporjadok(n:integer; X:vect);
	var i:integer;
begin
 for i:=1 to n do
	Write(X[i]:3);
end;

begin
write(' Интервал значений от a= ');readln(a); 
write('до= ');readln(b); 
writeln;writeln(' ':25,'Исходные данные'); 
writeln('Размерность вектора n = ',n); 
writeln('Интервал [',a,',',b,']');writeln; 
writeln(' ':26,'Результаты расчета'); 

writeln('Вектор X из ',n,' элементов в интервале [',a,',',b,'], полученных'); 
writeln('при помощи генератора случайных чисел'); 
VECTOR(n,a,b,x);
writeporjadok(n,x);

writeln;
writeln('среднеквадратичное значение каждых третьих элементов второй половины массива');
writeln(sum(n,x):3);

writeln('наименьший по модулю элемент первой трети масcива ');
writeln(min(n,x):5);

writeln('Упорядочить чётные по значению элементы первой половины массива по убыванию обратных ');
porjadok(x);
writeporjadok(n,x);
readln;
end.
Терпение!Дежурный экстрасенс скоро свяжется с вами!

Последний раз редактировалось Dvoishnik; 11.11.2015 в 15:08.
Dvoishnik вне форума Ответить с цитированием
Старый 11.11.2015, 17:53   #7
Fredoom
Новичок
Джуниор
 
Регистрация: 10.11.2015
Сообщений: 6
По умолчанию

Я премного благодарен вам, DVOISHNIK!

Программа рабочая, все исправно. Посидел над тем, что вы написали, немного понял. Еще раз большое спасибо!

Вот, что получил по вашей программе:

Интервал значений от a= -9
до= 6


Исходные данные
Размерность вектора n = 33
Интервал [-9,6]

Результаты расчета
Вектор X из 33 элементов в интервале [-9,6], полученных
при помощи генератора случайных чисел
-1 -6 2 6 1 6 3 -4 -7 2 1 -8 2 -1 -2 5 -4 -1 -2 2 4 0 -3 -2 -2 -3 4 2 1 4 -4 -1 2
среднеквадратичное значение каждых третьих элементов второй половины массива
2.97209241668783
наименьший по модулю элемент первой трети масcива
1
Упорядочить чётные по значению элементы первой половины массива по убыванию обратных
-1 -8 -6 -4 1 -4 3 -2 -7 0 1 0 0 -1 0 5 0 -1 -2 2 4 0 -3 -2 -2 -3 4 2 1 4 -4 -1 2
Fredoom вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Исправьте ошибку в программе xxxartikxxx Паскаль, Turbo Pascal, PascalABC.NET 5 26.11.2012 07:02
исправьте ошибку в программе Tolian92 Помощь студентам 0 20.05.2012 12:38