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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2013, 21:50   #1
Ghost3
Ученик в c++
Форумчанин
 
Аватар для Ghost3
 
Регистрация: 28.02.2011
Сообщений: 162
По умолчанию Stack overflow (C++) (Задача с acmp №9)

Здравствуйте! Работая над задачей №9 с сайта acmp.ru на c++, возникла ошибка:
Цитата:
Необработанное исключение в "0x00c783b7" в "Zadachi.exe": 0xC00000FD: Stack overflow
Я бы мог стереть программу и начать все заново, но все же мне очень интересно (и полезно) узнать, что является причиной ошибки. Помогите пожалуйста найти ее

Вот текст программы:
Код:
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    ifstream infile ("input.txt");
    ofstream outfile ("output.txt");
    int i,n,k,l,sum=0,prz=1,min=0,mi,ma,max=0,a[1000000];
	infile >> n;
	for (i=1;i<=n;i++) infile >> a[i]; 
	for (i=1;i<=n;i++)
	{
		if (a[i]>0) sum+=a[i]; //считаем сумму положительных чисел

		if (max<a[i])   //здесь ищем максимальное число и запоминаем его индекс в массиве
		{
			max=a[i]; ma=i;
		}
		if (min>a[i])      //здесь ищем минимальное число и опять же запоминаем его индекс в массиве
		{
			min=a[i]; mi=i;
		}
		
		if (ma>=mi)     //здесь определяем, индекс максималь. числа больше, или минималь. числа, для удобства
		{
			k=ma; l=mi;
		}
		else
		{
			k=mi; l=ma;
		}
	}
	

	for (i=l;i<=k;i++) //здесь мы перемножаем элементы между максим. и миним. числами в массиве
	{
		prz=prz*a[i];
	}
	outfile << sum << " " << prz;
    return 0; 
}
Ghost3 вне форума Ответить с цитированием
Старый 04.02.2013, 22:19   #2
Ghost3
Ученик в c++
Форумчанин
 
Аватар для Ghost3
 
Регистрация: 28.02.2011
Сообщений: 162
По умолчанию

Обнаружил, что i принимает неким чудом значение -858993459... (причем не всегда)
вот измененный код:
Код:
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    ifstream infile ("input.txt");
    ofstream outfile ("output.txt");
	long int i,n,k,l=0,i1,i2,sum=0,pr=1,max=0,min=0,a[100000];
	infile >> n;
	for (i=1;i<=n;i++) infile >> a[i];

	for (i=1;i<=n;i++)
	{
		if (a[i]>0) sum+=a[i];

		if (a[i]>max)
		{
			max=a[i];
			i1=i;
		}
		if (a[i]<min)
		{
			min=a[i];
			i2=i;
		}
	}

	if (i1>i2)
	{
		k=i1;
		l=i2;
	}
	else
	{
		k=i2;
		l=i1;
	}

	for (i=l+1;i<=k-1;i++)
	{
		pr=pr*a[i];
	}
	outfile << sum << " " << pr;
    return 0; 
}
Ghost3 вне форума Ответить с цитированием
Старый 04.02.2013, 22:52   #3
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,374
По умолчанию

В Си не силен, но могу предположить, что массив:
Код:
long int a[100000];
требует слишком много памяти.

Я бы решил без массива.
Первый раз считываем числа и находим min и max и их порядковые номера.
Второй раз считываем числа и находим результат.

С другой стороны, поскольку это текстовый файл, то накатать набор из ста тысяч чисел - это около 25 страниц формата А4 ...
Таким образом, массив можно сократить ...
И вот ещё. По условию задачи:
"Значения суммы и произведения не превышают по модулю 3*10^4."
Т.о. можно обойтись типом int.



Вроде так ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 04.02.2013, 23:51   #4
MihalNik
МегаМодератор
СуперМодератор
 
Регистрация: 27.11.2012
Сообщений: 5,712
По умолчанию

Задача в один проход без массива.
Т.к. очередное число может стать мин. или макс., то в цикле нужно поддерживать сумму и произведение 3-х видов:
- м/у мин. и макс.
- от мин. до тек.
- от макс. до тек.
Благими намерениями устлана дорога на programmersforum.ru
MihalNik вне форума Ответить с цитированием
Старый 15.04.2013, 18:41   #5
Ghost3
Ученик в c++
Форумчанин
 
Аватар для Ghost3
 
Регистрация: 28.02.2011
Сообщений: 162
По умолчанию

Хах, хороший метод - забыть про задачу и свою программу совсем, через время взяться и со свежими мыслями писать программу заново.
Смотрю сейчас на старый код, и удивляюсь какой он "запущенный"

Решил! =)

Код:
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    ifstream infile ("input.txt");
    ofstream outfile ("output.txt");
    int i,n,sum=0,pro=1,max=-9999,min=9999,minp=0,maxp=0,r,a[512];
    infile >> n;
    for (i=1;i<=n;i++)
    {
        infile >> a[i];

        

        if (a[i]>0) sum+=a[i];

        if (min>a[i])
        {
            min=a[i];
            minp=i;
        }
        if (max<a[i])
        {
            max=a[i];
            maxp=i;
        }
        
    }

    if (minp>maxp)
    {
        r=minp;
        minp=maxp;
        maxp=r;
    }

    for (i=minp+1;i<maxp;i++)
    {
        pro*=a[i];
    }

    outfile << sum << " " << pro;
    return 0; 
}
Ghost3 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Stack overflow в СИ Sergey_Black Помощь студентам 3 28.01.2012 00:52
stack overflow! BaiAs Общие вопросы Delphi 1 27.05.2010 02:08
Stack Overflow Neeter БД в Delphi 2 03.06.2009 00:39
Stack OverFlow Tanya2008 Общие вопросы Delphi 6 11.05.2009 15:16
Stack Overflow??? Рустам Общие вопросы Delphi 7 01.04.2008 17:24