Прерывается выполнение программы

filimoncc

Подсчитать сумму элементов, расположенных между первым максимальным и последним минимальными элементами. Если максимальный элемент встречается позже минимального, то выдать сообщение об этом.При выполнении программа вылетает, если максимальный элемент встречается позже минимального. Что не так?
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
cout<<"elementov v macccive 100"<<endl;
 float a[100];//объявляем массив
 int n;
 cout<<"Vvedite n<=100 (kol-vo elementov v maccive)"<<endl;
cin>>n;
 for (int i=0; i<n; i++)
 {cout<<"a["<<i<<"]=";cin>>a[i];}
 int one=0, second;// One=0 если максимальный элемент стоит первым
 float maxim, minim;
 maxim=a[0];
  minim=a[0];
 
 for (int i=1; i<n; i++)
 {
 if (maxim<a[i])
 {maxim=a[i];//нашел максимум
one=i;}
 
if (minim>=a[i])
 {minim=a[i];//нашел минимум
second=i;}
 }
 
if (one<second)//если максимальный элемент первее минимального, то выполняется цикл под условием
 {float s=0;
 for (int j=one+1; j<second; j++)
 {s+=a[j];}//считаем сумму меж макс. и миним.
 cout<<"s="<<s<<endl;}
else
 cout<<"Maksimal'nyj jelement vstrechaetsja pozzhe minimal'nogo"<<endl;
 
 
 
 return 0;}
9 ответов

filimoncc

filimoncc, а вы не боитесь выхода за границы массива в 32 - 33 строках?


filimoncc

Ryuk, боюсь, однако в каком он месте выходит за границу? Можете правильный код дать? И вообще, когда максимальный элемент первее минимального, то программа работает, а когда наоборот, то вылетает.


filimoncc

filimoncc, я же вам указал строки, в которых ошибка. У вас элемент массива j, может быть равен 15, в то время как в массиве всего 10 элементов.


filimoncc

А ещё такая штука странная выходит (см. скриншот):


filimoncc

filimoncc, вы о последних двух строках?


filimoncc

Почему, когда заполняю массив цифрами 1 2 3 4 5 - вылетает, а 1 1 1 1 5 - работает?!?Ryuk, я о том, что программа в разных вариациях чисел ведет себя по разному.


filimoncc

filimoncc, для начала избавьтесь от выхода за границы массива. В проверке на минимум, у вас стоит условие >=, если будут два одинаковых минимальных элемента в начале и в конце массива, то у вас i, всегда будет равно последнему индексу элемента. В начале программы вы сначала объявляете массив, а затем даете ему размерность 100, хотя потом вводите n как размерность. По последним стандартам С++, можно сначала ввести n, а затем объявить массив
float a[n];
Я указал на ошибки которые попались на глаза. Исправьте их, а потом посмотрим.


filimoncc

filimoncc, для начала избавьтесь от выхода за границы массива. В проверке на минимум, у вас стоит условие >=, если будут два одинаковых минимальных элемента в начале и в конце массива, то у вас i, всегда будет равно последнему индексу элемента. В начале программы вы сначала объявляете массив, а затем даете ему размерность 100, хотя потом вводите n как размерность. По последним стандартам С++, можно сначала ввести n, а затем объявить массив
float a[n];
Я указал на ошибки которые попались на глаза. Исправьте их, а потом посмотрим.
1)Не понимаю о каком выходе заграницу массива вы говорите, всё там верно. 2) Про поиск минимального. В условие сказано, что Подсчитать сумму элементов, расположенных между первым максимальным и последним минимальными элементами. 3) Сделал по новому стандарту В итоге прога перестала вылетать, странно как-то. Код:
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
cout<<"Vvedite kol-vo elementov v maccive"<<endl;
 int n;
cin>>n;
 float a[n];//объявляем массив
 
 
 for (int i=0; i<n; i++)
 {cout<<"a["<<i<<"]=";cin>>a[i];}
 int one=0, second;// One=0 если максимальный элемент стоит первым
 float maxim, minim;
 maxim=a[0];
  minim=a[0];
 
 for (int i=1; i<n; i++)
 {
 if (maxim<a[i])
 {maxim=a[i];//нашел максимум
one=i;}
 
if (minim>=a[i])
 {minim=a[i];//нашел минимум
second=i;}
 }
 
if (one<second)//если максимальный элемент первее минимального, то выполняется цикл под условием
 {float s=0;
 for (int j=one+1; j<second; j++)
 {s+=a[j];}//считаем сумму меж макс. и миним.
 cout<<"s="<<s<<endl;}
else
 cout<<"Maksimal'nyj jelement vstrechaetsja pozzhe minimal'nogo"<<endl;
 
 
 
 return 0;}
Ryuk, помогите в этой теме, а то уже забыли В чём ошибка?


filimoncc

filimoncc, странного ничего нет, ваш массив объявлялся изначально из 100 элементов, затем вы крутили циклы до введенного n, а если n = 20, то остальные 80 элементов просто висят в памяти.