Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 02.03.2014, 14:37   #1 (permalink)
Светик123
Member
 
Регистрация: 02.03.2014
Сообщений: 32
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Unhappy Turbo Pascal. Нужна помощь

задание: Задана последовательность из N вещественных чисел. Вычислить порядковый номер числа наиболее приближенному к среднему арифметическому максимального и минимального чисел данной последовательности.
проблема: при вводе одинаковых значений нужно чтобы ВСЕ номера наиболее приближенных элементов выводились на экран, а не как у меня - только последний
текст программы:
program srednee;
uses crt;
const H=30;
procedure vvod(z:integer; var N:integer);
begin
repeat
{$i-}
writeln ('Vvedite kolichestvo elementov posledovatelnosti (tseloe chislo), 1<N<30'); readln (N);
z:=ioresult;
{$I+}
if ioresult <>0 then
begin
writeln ('Nekorrektnii vvod. Vvedite kolichestvo elementov posledovatelnosti (tseloe chislo), 1<N<30'); readln(N);
end
until z = 0;
end;
procedure deistvie(min, max:real; var sr:real);
begin
sr:=(min+max)/2;
writeln('srednee = ',sr:3:2);
end;
procedure vivod(var nomer:integer);
begin
writeln(' poriadkovii nomer chisla naibolee pribligennogo k srednemy arifmeticheskom - ',nomer);
end;
var A,B:array [1..H] of real;
N, i, nomer,z:integer;
max,min,sr,prib:real;
begin
{$I-}
clrscr;
writeln('Programma nahodit poriadkovii nomer chisla naibolee pribligennogo');
writeln('k srednemy arifmeticheskomy max i min chisel dannoi posledovatelnosti');
repeat
vvod(z,N);
if (N > H) or (N<=1) then
begin
writeln ('Necorrektnii vvod. 1<N<30');
writeln ('Vvedite kolichestvo elementov posledovatelnosti (tseloe chislo), 1<N<30'); readln (N);
end;
until (N < H) and (N > 1);
for i:=1 to N do
begin
repeat
{$I-}
write('element[', i, ']=');
readln (A[i]);
z:=ioresult;
{$I+}
if z <>0
then
begin
writeln('Vvedennoe chislo nekorrectno! Povtorite vvod.');
end;
until z = 0;
end;
writeln ('rezyltat vvoda: ');
write('array: [');
for i:= 1 to N do
begin
write(',',A[i]:1:2);
end;
write (']');
readln;
min:=A[1];
for i:=1 to N do if (A[i] <= min) then min:=A[i];
writeln('min = ',min:3:2);
max:=A[1];
for i:=1 to N do if (A[i] >= max) then max:=A[i];
writeln('max = ',max:3:2);
deistvie (min,max,sr);
for i:=1 to N do B[i]:=abs(sr-A[i]);
prib:=B[i];
nomer:=1;
for i:=1 to N do if (B[i] <= prib) then
begin
prib:=B[i];
nomer:=i;
end;
vivod (nomer);
readkey;
end.
заранее спасибо за внимание
Светик123 вне форума   Ответить с цитированием

Старый 02.03.2014, 14:37
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Вам не нужно тратить время на поиск аналогичных тем, вот они

Нужна срочная помощь с программой на Pascal
Работа с файлами, Pascal, нужна помощь
Строки, Pascal. Нужна помощь
Помощь в написании программы по TURBO PASCAL
Нужна помощь в решении задачи Pascal
Pascal, ABC, тип записи, нужна помощь

Старый 02.03.2014, 20:13   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Да, Света, - наворотили от души! Нет, оно, конечно, прекрасно, что Вы стараетесь использовать подпрограммы, но это не значит, что каждый чих (типа нахождения среднего арифметического двух чисел) нужно непременно оформлять в виде процедуры или функции. Кроме того, Вы, похоже, несколько путаетесь со статусами переменных (параметров) подпрограмм (глобальные, формальные, внутренние). Но ничего, разберетесь. Очень много лишнего.
Ну вот, как вариант:
Код:
Uses CRT;

const
 H=30;

var
 A,B:array[1..H] of real;
 N,i:integer;
 max,min,sr,prib:real;

procedure vvod;
var z,q:Integer;
begin
 {$I-}
 repeat
  writeln ('Vvedite kolichestvo elementov posledovatelnosti (tseloe chislo), 1<N<30');
  readln(N);
  z:=ioresult;
  if (z<>0) or (N<1) or (N>H) then writeln ('Nekorrektnii vvod!');
 until (z=0) and (N>0) and (N<=H);
 for q:=1 to N do
  begin
   repeat
    write('element[', q:2, ']= ');
    readln(A[q]);
    z:=ioresult;
    if z<>0 then writeln('Vvedennoe chislo nekorrectno! Povtorite vvod.');
   until z=0;
  end;
 writeln;
 writeln ('rezyltat vvoda: ');
 for q:= 1 to N do write(A[q]:8:2);
 writeln;
end;

Begin
 {$I-}
 clrscr;
 writeln('Programma nahodit poriadkovii nomer chisla naibolee pribligennogo');
 writeln('k srednemy arifmeticheskomy max i min chisel dannoi posledovatelnosti');
 vvod;
 min:=A[1];
 max:=A[1];
 for i:=2 to N do
  begin
   if (A[i]<min) then min:=A[i];
   if (A[i]>max) then max:=A[i];
  end;
 writeln('min = ',min:3:2);
 writeln('max = ',max:3:2);
 writeln;
 sr:=(min+max)/2;
 for i:=1 to N do B[i]:=abs(sr-A[i]);
 prib:=B[1];
 for i:=2 to N do if B[i]<prib then prib:=B[i];
 writeln('Iskomyie nomera:');
 for i:=1 to N do if B[i]=prib then write(i:3);
 readkey;
End.
Vladimir_S вне форума   Ответить с цитированием
Старый 04.03.2014, 16:10   #3 (permalink)
Светик123
Member
 
Регистрация: 02.03.2014
Сообщений: 32
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

спасибо))
насчет процедур и функций - нас так заставляют делать с целью познакомиться со всей этой конструкцией. но да, я, наверное, слишком сильно раздробила программу
еще раз спасибо за помощь)
Светик123 вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 12:10.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.