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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2017, 01:04   #1
Сергей21аа
 
Регистрация: 28.11.2017
Сообщений: 3
По умолчанию В одномерном целочисленном массиве a[n] вычислить 1) номер максимального элемента; 2) произведение элементов массива, между 1-м и 2-м нулевыми

Начал писать программу, не понимаю, что делать дальше. Вот задание: В одномерном массиве, состоящем из n целых элементов, вычислить:
1) номер максимального элемента массива;
2) произведение элементов массива, расположенных между первым и
вторым нулевыми элементами.
Преобразовать массив таким образом, чтобы в первой его половине
располагались элементы, стоявшие в нечетных позициях, а во второй
половине ‒ элементы, стоявшие в четных позициях.
А вот моё начало:
Код:
#include <stdio.h> 
#include <time.h> 
#include <stdlib.h> 
#include <conio.h> 
#define n 10 
int main () 
{ 
int a[n], i, maxelem, maxind; 
srand (time (NULL)); 
for (i=0; i<n; i++) 
a[i]=rand()%11; 
printf ("\n"); 
for (i=0; i<n; i++) 
printf ("%d ",a[i]); 
maxelem=a[0]; 
maxind=0; 
for (i=0; i<n; i++)
 {
 if (a[i]>maxelem)
 {
 maxelem=a[i];
 maxind=i; 
} 
} 
printf("\nmaxind=%i", maxind );
getch (); 
return(0); }

Можно сказать, что 1 задание сделал, дальше не понимаю, что делать

Последний раз редактировалось Serge_Bliznykov; 28.11.2017 в 09:42.
Сергей21аа вне форума Ответить с цитированием
Старый 28.11.2017, 09:30   #2
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

1) Скажи, что храниться в "maxelem" и "maxind" и как это соотноситься с твоим заданием?

2) (по поводу 2-го задания): а если нулевых элементов не будет вообще?
У тебя же случайное генерация значений, а значит может быть всё что угодно:

2.jpg


Возьми (временно) переназнач все элементы массива, типа такого:
Код:
a[0]=4;
a[1]=1;
a[2]=0;
......
......
т.е. чтобы данные соответствовали 2-му заданию.
Реши "в ручную" на бумаге это задание, - чтобы потом проверять с машинным расчётом...

Это задание легко решается с помощью параметров "for"-а
(скажи, какие параметры он требует):

3.jpg


... ну всё, осталось только найти "индексы 1-го и второго нулевых элементов" и подставить в "for".


3) (по поводу 3-го задания): можно сделать по разному... Ну сделай с использованием 2-х дополнительных массивов:

4.jpg

... сначала данные сортируются (по чётности позиции), а потом отсортированные данные "возвращаются" назад в родительский массив.

p.s.1: выведи на экран эти два массив, чтобы проверить правильность работы программы.
p.s.2: прочитай мой пост 4-ре раза, а то с первого раза ты половины информации не воспримешь
(по себе сужу).

Последний раз редактировалось ura_111; 28.11.2017 в 09:34.
ura_111 вне форума Ответить с цитированием
Старый 28.11.2017, 14:42   #3
Мановар
Пользователь
 
Регистрация: 13.11.2016
Сообщений: 84
По умолчанию

Код:
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <numeric>

int main()
{
	std::vector <int> v{ -8, 10, 0, -1,  4, -6, 7,  21, -5, 0, -3, 34, -10 };

	std::cout << " max element in position ---> " << std::max_element(begin(v), end(v)) - begin(v) << std::endl;

	auto zerro_1 = std::find(begin(v), end(v), 0);
	
	if (zerro_1 == end(v)) {
		std::cout << "No zerro element odnako\n";
	}
	else {
		auto pos1_0 = zerro_1 - begin(v);
		std::cout << "The first 0 in position ---> " << pos1_0 << std::endl;
		auto zerro_2 = std::find(begin(v) + pos1_0 + 1, end(v), 0);
		if (zerro_2 == end(v)) {
			std::cout << " No second zerro ";
			system("pause");
			return 1;
		}
		else {
			auto pos2_0 = zerro_2 - begin(v);
			std::cout << "The second 0 in position ---> " << pos2_0 << std::endl;
			std::cout << "Sum: " << std::accumulate(begin(v) + pos1_0, begin(v) + pos2_0, 0) << "\n";
		}
	}

	size_t i = 1;

	std::stable_partition(begin(v), end(v), [&i](auto const& el) {++i;  return i % 2 != 0; });

	std::copy(begin(v), end(v), std::ostream_iterator<int>(std::cout, "   "));

	system("pause");
}
Мановар вне форума Ответить с цитированием
Старый 03.12.2017, 15:28   #4
Сергей21аа
 
Регистрация: 28.11.2017
Сообщений: 3
По умолчанию

с 1 и 2 заданием разобрался, не могу понять, почему не работает 3 задание, ошибок не выдает, но работает неправильно и еще нужно сделать эту программу с использованием функции, это я вообще без понятия как. Код:
#include <time.h>
#include <stdlib.h>
#include <conio.h>
#define n 10


int main ()
{
int a[n], i, maxelem, maxind, k, one, two, pr, b[5], c[5], m, r;
srand (time (NULL));
for (i=0; i<n; i++)
a[i]=rand()%11;
printf ("\n");
for (i=0; i<n; i++)
printf ("%d ",a[i]);
maxelem=a[0];
maxind=0;
for (i=0; i<n; i++)
{
if (a[i]>maxelem)
{
maxelem=a[i];
maxind=i;
}
}
printf("\nmaxind=%i", maxind );
k=0;
for ( i = 0; i < n; i++)
{
if (a[i] == 0 && k < 1)
{
one = i;
k++;
}
}
k=1;
for ( i = one; i < n; i++)
{
if (a[i + 1] == 0 && k < 2)
{
two = i+1;
k++;
}
}
pr=1;
for ( i = one + 1; i < two; i++)
{
pr=pr*a[i];
}
printf ("\npr=%i", pr);

for( i=0; i<n; i++)
{
if((i%2)==0)
{
b[m]=a[i];
m++;
}
else
{
c[r]=a[i];
r++;
}
}
for (i=0;i<n;i++)
{
a[i]=b[i];
}
for (i=0;i<n;i++)
{
a[m+i]=c[i];
}
printf("\n%i", a[i]);
getch ();
return(0);
}
Сергей21аа вне форума Ответить с цитированием
Старый 03.12.2017, 17:57   #5
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

У меня ошибку вывело на "srand(time(NULL));" -я его закомментировал. Но, если у тебя всё ОК, тогда можешь разкомментировать.
Сопоставь со своим кодом:

Код:
#include <stdio.h> 
#include <time.h> 
#include <stdlib.h> 
#include <conio.h> 
#define n 10 


int main()
{
	int a[n], i, maxelem, maxind, k, one, two, pr, b[5], c[5], m, r;
//	srand(time(NULL));
	for (i = 0; i<n; i++)
		a[i] = rand() % 11;
	printf("\n");
	for (i = 0; i<n; i++)
		printf("%d ", a[i]);
	maxelem = a[0];
	maxind = 0;
	for (i = 0; i<n; i++)
	{
		if (a[i]>maxelem)
		{
			maxelem = a[i];
			maxind = i;
		}
	}
	printf("\nmaxind=%i", maxind);
	k = 0;
	for (i = 0; i < n; i++)
	{
		if (a[i] == 0 && k < 1)
		{
			one = i;
			k++;
		}
	}
	k = 1;
	for (i = one; i < n; i++)
	{
		if (a[i + 1] == 0 && k < 2)
		{
			two = i + 1;
			k++;
		}
	}
	pr = 1;
	for (i = one + 1; i < two; i++)
	{
		pr = pr*a[i];
	}
	printf("\npr=%i", pr);

	m = 0;
	r = 0;
	for (i = 0; i<n; i++)
	{
		if ((i % 2) == 0)
		{
			b[m] = a[i];
			m++;
		}
		else
		{
			c[r] = a[i];
			r++;
		}
	}
	
	for (i = 0; i<m; i++)
	{
		a[i] = b[i];
		a[m + i] = c[i];
	}

	printf("\n");
	for (i = 0; i<n; i++)
	{
		printf("%i ", a[i]);
	}
	getch();
	return(0);
}
ura_111 вне форума Ответить с цитированием
Старый 03.12.2017, 18:20   #6
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Хотя нет, возврат лучше так:

Код:
	for (i = 0; i < m; i++)
	{
		a[i] = b[i];
	}
	for (i = 0; i < r; i++)
	{
		a[i + m] = c[i];
	}
как у тебя было, только с ограничениями в "for"-х.
ura_111 вне форума Ответить с цитированием
Старый 03.12.2017, 20:27   #7
Сергей21аа
 
Регистрация: 28.11.2017
Сообщений: 3
По умолчанию

Я разобрался и сделал так. Код:
#include <time.h>
#include <stdlib.h>
#include <conio.h>
#define n 10


int main ()
{
int a[n], i, maxelem, maxind, k, one, two, pr, m1=0, m2, w;
srand (time (NULL));
for (i=0; i<n; i++)
a[i]=rand()%11;
printf ("\n");
for (i=0; i<n; i++)
printf ("%d ",a[i]);
maxelem=a[0];
maxind=0;
for (i=0; i<n; i++)
{
if (a[i]>maxelem)
{
maxelem=a[i];
maxind=i;
}
}
printf("\nmaxind=%i", maxind );
k=0;
for ( i = 0; i < n; i++)
{
if (a[i] == 0 && k < 1)
{
one = i;
k++;
}
}
k=1;
for ( i = one; i < n; i++)
{
if (a[i + 1] == 0 && k < 2)
{
two = i+1;
k++;
}
}
pr=1;
for ( i = one + 1; i < two; i++)
{
pr=pr*a[i];
}
printf ("\npr=%i", pr);
printf ("\n");
if ((n % 2) == 1)
m2 = n - 2;
else
m2 = n - 1;
while (m1 < m2)
{
w = a[m2];
a[m2] = a[m1];
a[m1] = w;
m1 =m1 + 2;
m2 =m2 - 2;
}
for (i = 0; i <= (n - 1); i++)
printf(" %d ", a[i]);
_getch();
return 0;
}
ОСТАЛОСЬ КАК-ТО СДЕЛАТЬ ЭТУ ПРОГРАММУ С ИСПОЛЬЗОВАНИЕМ ФУНКЦИИ, ТОЛЬКО КААААК, БЕЗ ПОНЯТИЯ ВООБЩЕ
Сергей21аа вне форума Ответить с цитированием
Старый 03.12.2017, 22:07   #8
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Функция - это чёрный ящик, который принимает параметры (переменные) и возвращает обработанный результат. Типа такого:

1.jpg


а вообще, если ничего не понятно, посмотри видео:

https://www.youtube.com/watch?v=HoBeQEXhhn8

https://www.youtube.com/watch?v=QCGXOsQbnd0

https://www.youtube.com/watch?v=wy00um2PjZE

https://www.youtube.com/watch?v=1BXIejckBds

https://www.youtube.com/watch?v=sNvjOSmtdnY

............
............

на ютубе посмотри... Обращай внимание "как передавать в функцию переменные" и "как из функции получить результат"...

В любом случае (здесь никто за тебя решать не будет) тебе надо немного поработать: почитать, посмотреть, поэкспериментировать с кодом...

Это не трудно - уверяю тебя. В интернете куда не копнёшь - везде тема функций, для языка Си, расписана в мельчайших подробностями и с множественными примерами.
ura_111 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PASCAL Определить порядковый номер и значение максимального элемента массива n элементов Наталья18) Помощь студентам 2 22.12.2015 09:14
В целочисленном одномерном массиве A(N) найти номер последнего максимального значения среди нечетных элементов (Pascal) Vladimir Ryabov Помощь студентам 0 27.11.2011 13:59
В одномерном массиве , состоящем из n целочисленных элементов, вычислить номер максимального элемента мас Ufa Помощь студентам 1 21.04.2010 14:06
В одномерном массиве, состоящем из n вещественных элементов, вычислить сумму элементов массива HazelHen Общие вопросы C/C++ 2 29.03.2009 15:16
вычислить номер и величину максимального элемента массива, произведение элементов, среднее арифметическое Romer9999 Паскаль, Turbo Pascal, PascalABC.NET 6 19.01.2009 16:35