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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.01.2013, 22:58   #1
gulllak
Новичок
Джуниор
 
Регистрация: 25.12.2012
Сообщений: 2
Печаль Одномерные массивы и указатели

Задание:
В одномерном массиве, состоящем из N целых элементов, вычислить:
1) номер максимального элемента массива;
2) произведение элементов массива, расположенных между первым и вторым нулевыми
элементами.
Преобразовать массив таким образом, чтобы в первой его половине располагались элементы, стоявшие в нечетных позициях, а во второй половине — элементы, стоявшие в четных позициях.

Программа работает и все считает, но нужно добавить условие для второго пункта задания что бы выводил сообщение "Невозможно посчитать произведение" когда:
1) Когда нет нулей
2) Когда в массиве один ноль
3) Когда в массиве больше двух нулей
4) когда между нулями стоит один элемент
5) когда нули рядом друг с другом

Помогите дописать программу, я не пойму как эти условия добавить. Пожалуйста.

Вот мой код:
Код:
#include <iostream>
 
using namespace std;
 
 
int main()
{setlocale(0,"rus");
    int *m,n,i,j,UMN=1,NOM_MAX,MAX=-1000,NOMER1=-1,NOMER2=-1;
    cout<<"Введите кол-во элементов: ";
    cin>>n;
 
    m=new int[n];
 
    cout<<"Заполните массив из "<<n<<" элементов."<<endl;
    for(i=0;i<n;i++)// заполняем массив
    {
    cin>>m[i];
    if(m[i]==0 && NOMER1!=-1 && NOMER2==-1)NOMER2=i;
    if(m[i]==0 && NOMER1==-1)NOMER1=i;
    
 
    if(m[i]>MAX){MAX=m[i];NOM_MAX=i;}
    }
 
 
    for(i=NOMER1+1;i<NOMER2;i++)
    {
     UMN*=m[i];
    }
 
 cout<<endl<<"Номер максимального элемента: "<<NOM_MAX+1<<"."<<endl<<"Произведение элементов: "<<UMN<<"."<<endl;
 
 cout<<"Отсортированный массив :"<<endl;
    
    for(j=0;j<n;j++)
    if(j%2==0)cout<<m[j]<<" ";
 
    for(j=0;j<n;j++)
    if(j%2!=0)cout<<m[j]<<" ";
    cout<<endl;
 
 system("pause");
 
 
}

Последний раз редактировалось Stilet; 22.01.2013 в 11:56.
gulllak вне форума Ответить с цитированием
Старый 22.01.2013, 11:12   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

0) Код на форуме оформляется тегом CODE.

Цитата:
Программа работает и все считает
1) Если все элементы массива меньше -1000, программа выдаст неправильный ответ.
2) Массив не преобразовывается, массив просто выводится таким хитрым образом. На мой взгляд, это вполне легитимное решение задачи, но имейте в виду, что у Вашего преподавателя может быть другое мнение.
3) Для созданного динамического массива m не вызывается delete[]. В данной программе это не нужно, но я бы советовал привыкать к железному следованию правилу "если ресурс выделили, надо не забыть его освободить".
4) Вы уверены, что в случае, если между нулями стоит один элемент или нулей больше двух, произведение посчитать нельзя? Т.е. это формулировка задания, или Ваше понимание этой формулировки? Если первое, то имеет смысл завести дополнительную булеву переменную canMultiply (к слову, не очень хорошая идея называть переменные в C++ большими буквами - обычно так пишутся константы). Изначально canMultiply false, когда NOMER2 присваивается значение, она становится равной значению выражения (NOMER2 > NOMER1+2); на отдельной проверке "мы встретили третий ноль" она становится равной false; подсчёт произведения оборачивается в if(canMultiply), на else-ветке выводится сообщение "не шмогла".
Abstraction вне форума Ответить с цитированием
Старый 24.01.2013, 22:10   #3
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
Смущение

Я думаю это то что надо. Может условия витиеваты, но...
Код:
#include <stdio.h>
#include <stdlib.h>

int main()
{	
	int	i = 0, j = 0;		// Счетчики
	int *mass = NULL;
	int	N = 0;				// Количество элементов в массиве
	int max = 0, nmax = 0;	// max - максимальное значение
							// nmax - номер максимального значения
	int prod = 1, beginZero = 0, endZero = 0, Zero = 0;
	
	system("chcp 1251 > nul");

	printf(" Введите количество элементов в массиве: ");
	scanf("%d", &N);
	
	/* Динамическое выделение памяти */
	mass = (int*)malloc(sizeof(int)*N);
	if(mass == NULL)
	{
		printf("ERROR MEMORY!!!");
		exit(1);
	}
	printf(" Заполните массив из %d элементов\n", N);
	for(i = 0; i < N; i++)
	{
		scanf("%d", &mass[i]);
		if(mass[i] > max)
		{
			max = mass[i];
			nmax = i;
		}
		/* Подсчет количества нулей */
		if(mass[i] == 0 && Zero == 0)
		{
			beginZero = i+1;
			Zero++;
		}
		else if(mass[i] == 0 && Zero == 1)
		{
			endZero = i-1;
			Zero++;
		}
		else if(mass[i] == 0 && Zero == 2)
			Zero++;
		
	}
	printf(" *********************************\n");
	printf(" Индекс максимального элемента: %d", nmax);
	printf("\n *********************************\n");
	/* Проверка нуля */
	switch(Zero)
	{
		case 0:	printf(" В массиве нет нулей!\n");	break;
		case 1: printf(" В массиве один ноль\n");	break;
		case 2:
			{
				if(beginZero == endZero + 1)
					printf(" Нули рядом друг с другом!!!\n"); 
				else if(beginZero == endZero)
					printf(" Между нулями один элемент!\n"); 
				else
				{
					for(i = beginZero; i <= endZero; i++)
						prod *= mass[i];
					printf(" Произведение элементов: %d\n", prod);
				}
			} break;
		default: printf(" В массиве больше 2-х нулей\n");
	}
	
	printf(" *********************************\n");
	
	printf(" ОТСОРТИРОВАННЫЙ МАССИВ:\n");
	/* Сортировка массива */
	for(j = 0; j < 2; j++)
		for(i = 0; i < N; i++)
		{
			
			if((i % 2) != 0 && j != 0 && i != 0)
			{
				printf(" %d", mass[i]);
				i++;
			}
			else if((i % 2) == 0 && j == 0)
			{
				printf(" %d", mass[i]);
				i++;
			}
		}
	
	printf("\n");
	free(mass);	mass = NULL;
return 0;
}
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Одномерные массивы, двумерные массивы, строки Sand093 C++ Builder 11 20.05.2012 21:48
указатели на массивы и массивы указателей blacktener Общие вопросы C/C++ 16 13.06.2011 20:45
Даны одномерные массивы А и В. Сформировать массивы, состоящие из элемент LyaLya Помощь студентам 15 20.12.2009 14:12
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39
Указатели и массивы. (С++) Eddie Помощь студентам 8 24.04.2009 19:48