Помощь - Поиск - Пользователи - Календарь
Полная версия: сумма и кол-во отрицательных элементов
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
snopy
Помогите пожайлуста доделать программу.В одномерном массиве, из N вещественных элементов,(n<=50) вычислить сумму и количество отрицательных элементов массива, расположенных между максимальным и минимальным элементами.
Program one;
type
m=array[1..50] of integer;
var
a:m;
i,n:integer;
min,max,mini,maxi:integer;
procedure printArray(var a:m);
var
i:integer;
begin
  write('n=');
  readln(n);
  for i:=1 to n do
	a[i]:=random(100)-50
  end;
procedure outarray(var a:m);
var
i:integer;
begin
  for i:=1 to n do
  write('',a[i]:4);
end;
procedure minandmax(var a:m);
var
i:integer;
begin
	 max:=a[1];
	 min:=a[1];
			   for i:= 1 to n do
			  if a[i]>max then
begin max:=a[i]; maxi:=i;
	  for i:=1 to n do
	  if a[i]<min then
begin min:=a[i]; mini:=i;
writeln;
writeln('maxi=',maxi);
writeln('mini=',mini);
end;
end;
end;
procedure sumandkol(var a:m);
var
i,n,s:integer;
begin
writeln('maxi=',maxi);
writeln('mini=',mini);
	 s:=0;
	 n:=0;
	 while a[i]<0 do
		   begin
	 if ((a[i]>mini) and (a[i]<maxi)) then
s:=s+a[i];
end;
writeln('summs=',s);
n:=abs(max-min);
writeln('kol-vo',n);
end;
BEGIN
randomize;
printarray(a);
outarray(a);
minandmax(a);
sumandkol(a);
readln;
end.
Yevgeny
Сразу бросается в глаза, что массив твой не из вещественных чисел, а из целых!!!
m=array[1..50] of integer;

замени integer на real!!!
snopy
а что ещё исправить?
Yevgeny
не присвайвай минимальному и максимальному первый элемент массива!!!
сегодняшняя тема, там аналогичный поиск, масксимального и минимального, в этом вроде бы ошибка...
задачи на массив и матрицу
snopy
почему ведь должно проходится с первого
Client
Тебе не нужны значения мах и min, а нужны их номера.
uses crt;
const
n=10;
type
m=array[1..n] of integer;
var
a:m;
imin,imax:integer;

procedure printArray(var a:m);
var
i:integer;
begin
  for i:=1 to n do
    read(a[i])
  end;

procedure outarray(var a:m);
var
i:integer;
begin
  for i:=1 to n do
  write(a[i]:5);
end;

procedure minandmax(var a:m);
var
   i:integer;
begin
     imax:=1;
     imin:=1;
     for i:= 1 to n do begin
         if a[imax]<a[i] then imax:=i;
         if a[imin]>a[i] then imin:=i
     end;
     writeln(' IMAX= ',imax,' IMIN= ',imin);
end;

procedure sumandkol(var a:m);
var
i,n,s:integer;
begin
     s:=0;
     n:=0;
     for i:= imax+1 to imin-1 do begin //раз МЕЖДУ ними
         if a[i]<0 then s:=s+a[i];
         inc(n)
     end;

writeln('summs=',s);
writeln('kol-vo',n);
end;
BEGIN
clrscr;
printarray(a);
outarray(a);
minandmax(a);
sumandkol(a);
readkey;
end.
Вот мой вариант, исправь тока типы и ввод матрицы
Проверил не на все варианты, но не вижу причин чтоб не работало
snopy
всё равно где то ошибка
Yevgeny
видимо не все, если я не оибаюсь... smile.gif Нажмите для просмотра прикрепленного файла
Client
Цитата
расположенных между максимальным и минимальным элементами.
blum.gif И сколько между ними отрицательных элементов?
snopy
а если другой набор встречается то неправильно считается.
Yevgeny
сорри smile.gif
Client
Цитата
а если другой набор встречается то неправильно считается.
Не работает то, не работает сё... Ты покажи на каких примерах дало неправильный результат
Yevgeny
введи например, -10,-5...,20,1,2,3
и их ноль всё равно ведь будет... blum.gif smile.gif

Добавлено через 4 мин.
ну правильно, потому что s, и n должны быть параметрами процедуры, а не локальными переменными smile.gif вот и ошибка...
volvo
Сорри, что вмешиваюсь, а если imax будет БОЛЬШЕ imin - то цикл For не будет просто пропущен? Надо еще ко всему написанному поменять imin и imax местами так, чтобы imin было гарантированно НЕ МЕНЬШЕ чем imax...
Yevgeny
а вот и нет blink.gif
это я на счёт своего сообщения...
Client
Цитата
Сорри, что вмешиваюсь, а если imax будет БОЛЬШЕ imin - то цикл For не будет просто пропущен? Надо еще ко всему написанному поменять imin и imax местами так, чтобы imin было гарантированно НЕ МЕНЬШЕ чем imax...
Я только рад smile.gif
А всего-то надо чуть изменить
procedure sumandkol(var a:m);
var
i,n,s,k:integer;
begin
     s:=0;
     n:=0;
     if imin<imax then begin
        k:=imax;
        imax:=imin;
        imin:=k
     end;
     for i:= imax+1 to imin-1 do begin
         s:=s+a[i];
         inc(n)
     end;

writeln('summs=',s);
writeln('kol-vo',n);
end;
Про что, собственно, забыл уточнить
snopy
всем большое спасибо
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.