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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.10.2009, 20:20   #1
realabs
Новичок
Джуниор
 
Регистрация: 02.10.2009
Сообщений: 2
По умолчанию элементы вектора

Помогите, пожалуйста, мыслями. Суть - составить программу нахождения элемента вектора, имеющего максимальное значение (это у меня получилось). Элементы, стоящие после максимального, заменить нулями и переставить в начало вектора (здесь я не понимаю, где в проекте воткнуться и как оформить присвоение и перестановку значений).
Помогите, пожалуйста, мудрыми мыслями.

Код:
// Стандартные включаемые файлы и прототипы функций
#include <stdio.h>
#include "rus8.h"

# define N 30						// Размер массива

// Прототип
int EArr(int *arrN, int size_of_arr, int *index);

int main()                           // Возвращает 0 при успехе
{
	int arr[N] = {1, 5, 7, 11, 21, 2, 238, 2, 23, 12, 35, 765, 409, 38, 49, 26, 43, 50, 19, 38,
	              12, 272, 29, 145, 95, 27, 46, 95, 26, 77},
		max_item, 
		index;
	
	rus();
	
	// Вызываем функцию EArr
	max_item = EArr( arr, N, &index );
	    
		printf("\n Максимальный элемент массива max = %i, а также индекс = %i \n", max_item, index);
	
	return 0;
}

// Описание функции

// Поиск максимального элемента
int EArr(int *arrN, int size_of_arr, int *index)
{
	int i = 0, // счётчик
		m;     // вспомогательные переменные
	
	// Проверка не кончился ли массив
	if ( i < N )
	{
		m = arrN[i];		// Присваиваем m первый элемент
		*index = 0;         // Изначально индекс = 0
		
		for (i; i < size_of_arr; i++ )		//Листаем массив до конца
		{
			if (m < arrN[i])
			{
				m = arrN[i]; // Ищем максимальный элемент
				*index = i;  // Считаем номер индекса
			}
		}

		return m;
	}
	else return 0;
}

Последний раз редактировалось Sazary; 03.10.2009 в 22:30.
realabs вне форума Ответить с цитированием
Старый 02.10.2009, 23:41   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Так все-таки вектора или массива? Потому что вектор - это std::vector, стандартный контейнер из стандартной же библиотеки C++, а вы пишете либо на C, либо, во всяком случае, в стиле C. При работе с векторами вам нужно будет воспользоваться итераторами для прохода по всему вектору.
А с заменой на нули я не понял - надо заменить эти элементы на нули, и нули же поместить в начало? Или переместить элементы в начало, а на их место поставить нули? Если так, то размер вектора-массива точно придется менять, а это означает что вам таки нужен std::vector, а не массив.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 02.10.2009, 23:52   #3
bondik
Форумчанин
 
Регистрация: 24.04.2008
Сообщений: 300
По умолчанию

Уважаемый ГРОМ в понимании преподавателей и многих "авторов",под словом вектор понимается линейный массив,это оффтоп,автор топика уточните а что делать если количество элементов после максимально больше количество перед максимальными,то куда переставлять,и можно ли переставлять на место максимального...
bondik вне форума Ответить с цитированием
Старый 03.10.2009, 00:01   #4
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

bondik, это мне, значит, повезло в свое время...
И собственно, да, задание несколько непонятно...
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 03.10.2009, 01:06   #5
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Вектор - одномерный массив. Это понятие существует как в информатике, так и в математике(одномерные матрицы).
2realabs:
После того, как Вы нашли max_item можно пробежаться циклом от него и до конца, обнуляя все элементы, после чего ещё одним циклом, опять же, начиная с index и до конца, переставляя местами элементы до максимального и после. Можно оптимизировать это действо, в одном цикле сразу обнуляя элементы до максимального, предварительно скопировав их значение в положение после максимального элемента. Так же присоединюсь к вопросу товарищей bondik и Гром - уточните задание
netrino вне форума Ответить с цитированием
Старый 03.10.2009, 10:45   #6
realabs
Новичок
Джуниор
 
Регистрация: 02.10.2009
Сообщений: 2
По умолчанию

Да, вектор = линейный массив. Извиняюсь, если запутал.
Поясню на цифрах. Например, есть массив [1,2,3,4,5,6,7,1,2,3]
Мы находим максимальное число 7, после него 1,2,3 приравниваем к нулю и получаем [1,2,3,4,5,6,7,0,0,0].
Следующим этапом необходимо сделать массив вида [0,0,0,1,2,3,4,5,6,7].
realabs вне форума Ответить с цитированием
Старый 03.10.2009, 11:55   #7
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

В таком случае все просто
Код:
int j, temp;
for(i = index + 1; i < N; i++)   //Каждый зануленный элемент отправляем в начало
   for (j = i - 1; j >= 0; j++)   //Меняя местами по очереди с впередистоящими
      {
      temp = arr[j];
      arr[j] = arr[i];
      arr[i] = temp;
      }
Если ничего случайно не напутал. Суть-то проста.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 03.10.2009, 17:21   #8
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Гром Посмотреть сообщение
В таком случае все просто
Код:
int j, temp;
for(i = index + 1; i < N; i++)   //Каждый зануленный элемент отправляем в начало
   for (j = i - 1; j >= 0; j++)   //Меняя местами по очереди с впередистоящими
      {
      temp = arr[j];
      arr[j] = arr[i];
      arr[i] = temp;
      }
Если ничего случайно не напутал. Суть-то проста.
Наверное должно было быть j--
Можно вот так:
Код:
int i, end_index, len_of_zero;
...

len_of_zero = N - index - 1;
end_index = N-1;

for(i = index; i >= 0; i--) {
	arr[end_index] = arr[i];
	end_index--;
}
for(i = 0; i < len_of_zero; i++)
	arr[i] = 0;

Последний раз редактировалось netrino; 03.10.2009 в 17:24.
netrino вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработчик вектора прерывания Festovec Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 07.04.2010 10:05
Помогите с сохранением вектора в файл slonik123 Общие вопросы C/C++ 0 15.05.2009 17:48
считивать значения в матритцы и вектора ciaonataha Общие вопросы C/C++ 1 20.04.2009 12:31
Пердача вектора в функцию по ссылке AlexeyLed Общие вопросы C/C++ 1 02.03.2009 19:44
Перехват вектора 09Н. Assembler. vladb2000 Помощь студентам 2 14.12.2007 11:31