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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2011, 22:25   #11
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Хорошо, ваш код получше будет. Но здесь
Код:
if(sum>=sum_max)
лучше сделать строгое условие, иначе если в массиве нет ни одного положительного числа, то условие выполнится.
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 13.04.2011, 22:37   #12
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Спасибо, что показали мне такой алгоритм. Адаптировал свой код под него:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <locale.h>

void mas_rand(const int, int*, const int = 50);
void mas_prnt(const int, int*);
bool mas_find1(const int, int*, int&, int&, int&);

int main()
{
	setlocale(LC_ALL, "Russian"); // вывод текста на русском языке
	system("COLOR F0"); // цвет текста и фона
	srand(time(0)); // инициализация генератора случайных чисел

	int count;
	int* massiv;
	printf("Введите количество элементов массива: ");
	scanf("%d", &count);
	massiv = new int [count]; // выделение памяти под массив
	mas_rand(count, massiv);
	printf("Значения массива сгенерированы случайным образом:\n");
	mas_prnt(count, massiv);

	int first, last, sum;
	if (mas_find1(count, massiv, first, last, sum))
		printf("Сумма максимальной последовательности положительных чисел\nсоставляет %d, это числа c %d-го до %d-го.\n", sum, first + 1, last + 1);
	else
		printf("Последовательность положительных чисел не найдена.\n");
	delete [] massiv; // освобождение памяти из-под массива

	system("PAUSE");
}

void mas_rand(const int N, int*Mas, const int range)
{
	for (int i = 0; i < N; i ++)
		Mas[i] = rand()%(range*2+1) - range; // случайное число в диапазоне range [-50; 50]
}

void mas_prnt(const int N, int*Mas)
{
	for (int i = 0; i < N; i ++)
	{
		printf("%d%c", Mas[i], (i == N-1) ? ('\n') : ('\t'));
	}
}

bool mas_find1(const int N, int*Mas, int&first, int&last, int&sum)
{
	int max_sum = 0;
	int max_first = 0;
	int max_last = 0;
	bool found = false;
	for (int i = 0; i < N; i ++)
	{
		int cur_sum = 0;
		int cur_first = i;
		while ((Mas[i] > 0) && (i < N))
			cur_sum += Mas[i++];
		if (cur_sum > max_sum)
		{
			found = true;
			max_sum = cur_sum;
			max_first = cur_first;
			max_last = i - 1;
		}
	}
	if (found)
	{
		first = max_first;
		last = max_last;
		sum = max_sum;
		return true;
	}
	else
		return false;
}
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 14.04.2011, 11:35   #13
ololo-schoolboy
Форумчанин
 
Регистрация: 25.12.2010
Сообщений: 247
По умолчанию

Цитата:
лучше сделать строгое условие
В первом варианте моего кода я так и делал, но потом исправил так как ноль тоже положительное (хотя хз он знака не имеет вроде...)
Цитата:
иначе если в массиве нет ни одного положительного числа, то условие выполнится.
когда отбрасывал
Код:
 && i-1>begin
, не заметил что возможен такой баг, тогда можно так:
Код:
if(sum>=sum_max && i>begin)
ololo-schoolboy вне форума Ответить с цитированием
Старый 14.04.2011, 14:18   #14
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Цитата:
ноль тоже положительное
С каких пор? Ноль не входит ни в отрицательные, ни в положительные числа.
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 14.04.2011, 17:24   #15
ololo-schoolboy
Форумчанин
 
Регистрация: 25.12.2010
Сообщений: 247
По умолчанию

Я ж говорю хз
ololo-schoolboy вне форума Ответить с цитированием
Старый 14.04.2011, 23:06   #16
promt
Пользователь
 
Регистрация: 28.03.2011
Сообщений: 32
По умолчанию

0 тоже нужно пропускать
promt вне форума Ответить с цитированием
Старый 15.04.2011, 00:08   #17
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Цитата:
Сообщение от promt Посмотреть сообщение
0 тоже нужно пропускать
Тогда в следующей строке:
Код:
while ((Mas[i] > 0) && (i < N))
Сделайте нестрогое условие следующим образом:
Код:
while ((Mas[i] >= 0) && (i < N))
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 17.04.2011, 00:17   #18
promt
Пользователь
 
Регистрация: 28.03.2011
Сообщений: 32
По умолчанию

Вот переделал по Си, и чуть кода почистил.Но она не так работает.

Код:
#include<stdio.h>
#include<conio.h>
int main()
{
	int i;
	int x[10];
	int sum=0;
	int begin=0;
	int sum_max=0;
	int begin_max=0;
        clrscr();
	puts("Vvedite elementu massiva:");
	for(i=0; i<10;i++)
	scanf("%d",&x[i]);
	for(i=0;i<10;i++)
	{
	 sum=0;
	 begin=i;
	 while((x[i]>=0) &&(i<10))
		sum+=x[i++];
	 if(sum>=sum_max)
	 {
		sum_max=sum;
		begin_max=begin;
	 }
     }
     puts("Naydenna posledovatelnost:");
     for(i=begin_max; x[i]>=0;i++)
	printf("%d",x[i]);
     getch();
}
Эту задачку нада так реализовать.Есть массив(10) чисел 4, 5 ,6, -3, 2, 1, 1, 1, 0 1
Нужно подсчитать сумму элементов массива до отрицательного числа или до нуля. То есть нужно перебирать массив и считать 4+5+6 = 15 - этопервая сумма, по том идет -3, её пропустить и начать считать следующую сумму 2+1+1+1 = 5 - это вторая сумма, 0 пропускать и считать третью сумму это 1, далее массив заканчивается. И нада определить, что максимальная сумма получилась в первой непрерывной последовательность до -3. Соответственно печатать сумму и элементы этой последовательности.
promt вне форума Ответить с цитированием
Старый 17.04.2011, 00:37   #19
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Цитата:
и чуть кода почистил
Запихнуть все в одну функцию - это не называется почистить. Что касается задачи, то в моем коде все происходит именно так, как вы описали, только значения случайным образом генерируются и вместо последовательности выводится индекс ее первого и последнего элемента. Между прочим, имея эти индексы, можно без проблем и саму последовательность вывести:
Код:
void mas_prntseq(const int, int*, const int, const int); // прототип
...
mas_prntseq(count, massiv, first, last); // вызов
...
void mas_prntseq(const int N, int*Mas, const int first, const int last) // реализация
{
	for (int i = first; i <= last; i ++)
	{
		printf("%d%c", Mas[i], (i == last) ? ('\n') : ('\t'));
	}
}
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 24.04.2011, 17:40   #20
jon888
 
Регистрация: 09.11.2009
Сообщений: 5
По умолчанию

А если будет такая последовательность чисел 2 4 2 -1 -2 3 2 0 2 9
И нужно вывести суму єще 2-й и 3-й последовательности то как тогда ?
Ведь такой алгоритм выводит только 1-ю.
jon888 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Long double. Максимальная точность. juzam Общие вопросы C/C++ 2 05.10.2010 14:48
Максимальная высота h fort-_-minor Общие вопросы C/C++ 6 04.08.2010 13:41
Максимальная длина слова Anarki Общие вопросы C/C++ 4 30.09.2009 00:10
Максимальная высота элемента predtech HTML и CSS 2 23.07.2009 13:51