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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2009, 16:59   #1
LuBuMaster
Пользователь
 
Регистрация: 30.10.2009
Сообщений: 56
Смущение Массив

Здравствуйте, коллеги! помогите пожалуйста студенту! я пишу тут массив и не получается несколько вещей
Во первых он не всегда выводит правельное кол-во отрицательных элементов!
Во вторых считает неправельно сумму после мин по модулю отрицательного элемента
И не знаю как сделать сортировку элементов по возрастанию по модулю((
Пишу в Visual Studio 2008 помогите плз! задание я прикрепил



вот мой код



Код:
#include <stdafx.h>
#include <conio.h>
#include <stdio.h> 
#include <math.h>

int _tmain(int argc, _TCHAR* argv[])
{   float a[100];
	int n,i,summ=0,min=0,k=0;     //k-кол-во отриц элементов
	printf("Enter n ");
    scanf("%i",&n);
	for (i=1;i<=n;i++)
    {
	    printf("\n a[%i]= ",i);
        scanf("%f",&a[i]);
    }
	min=a[1];
    for (i=1;i<=n;i++)
{	
	{ 
		if(a[i]<0)   //количество отрицательных элементов массива;
		{
			k++;
            
		}
		if(fabs(a[i])<fabs(a[min]))  //находим номер минимального по модулю элемента.
		{
			min=i;
		}
	}
	for (i=1;i<=n;i++)
	{
		for(int i=min+1;i<n;i++)  //сумму модулей элементов массива, расположенных после минимального по модулю элемента.
		{
		summ=+a[i];
		
        }
		for(int n=0;i<n;i++)
		{
			a[i]*=a[i];   //Заменить все отрицательные элементы массива их квадратами
			printf("Zamena otricatelnich elementov ih qvadratami %f \n",a[i]);	
            
		}
	}

}
	printf("Kol-vo otricatelnich elementov= %i \n",k);
    printf("Summa modulei massiva  posle min po moduly el= %i \n",summ);
   

	getch();
	return 0;
}
Изображения
Тип файла: jpg Безымянный.jpg (66.8 Кб, 135 просмотров)

Последний раз редактировалось Stilet; 27.11.2009 в 17:22.
LuBuMaster вне форума Ответить с цитированием
Старый 27.11.2009, 17:42   #2
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
И не знаю как сделать сортировку элементов по возрастанию по модулю((
3. Сортировку по возрастанию делать умеете? Вот тоже самое, только вместо оператора пишите функцию abs() с переданным ей оператором. (abs - возвращает модуль числа, находится в заголовочном файле math.h)

т.е это как-то так:
Код:
...
//это в теле цикла
for(q=0;q<n;q++)
{
   for(w=0;w<n;w++)
   {
      if(abs(a[i])<abs(a[i+1]))
      {
       bufer=a[i];
       a[i]=a[i+1];
       a[i+1]=bufer;
       }
   }
}

поясню, тут 2 независимых два цикла в цикле (это обычная сортировка "пузырьком"), "буфер" - просто какая-нибудь переменная.
...
1. У вас программа залазиет не в ту область памяти.

Цитата:
for (i=1;i<=n;i++)
Индексация массивов начинается с 0, ваша программа пропускает первый элемент и, к тому же, залезает в память, стоящую за последним элементом.
Правильно:
Код:
for (i=0;i<n;i++)
или
Код:
for (i=0;i<=(n-1);i++)//коряво, но тоже правильно
2. Вероятно, что причина ошибки такая же, как и у первой.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 27.11.2009 в 17:52.
ROD вне форума Ответить с цитированием
Старый 27.11.2009, 20:37   #3
LuBuMaster
Пользователь
 
Регистрация: 30.10.2009
Сообщений: 56
По умолчанию

спасибо щас вобью попробую!)
LuBuMaster вне форума Ответить с цитированием
Старый 27.11.2009, 20:57   #4
LuBuMaster
Пользователь
 
Регистрация: 30.10.2009
Сообщений: 56
По умолчанию

#include <stdafx.h>
#include <conio.h>
#include <stdio.h>
#include <math.h>

int _tmain(int argc, _TCHAR* argv[])
{ float a[100];
int n,i,summ=0,min=0,k=0,q,w,bufer; //k-кол-во отриц элементов
printf("Enter n ");
scanf("%i",&n);
for (i=1;i<=n;i++)
{
printf("\n a[%i]= ",i);
scanf("%f",&a[i]);
}
min=a[1];
for (i=0;i<n;i++)
{
{
if(a[i]<0) //количество отрицательных элементов массива;
{
k++;

}
if(fabs(a[i])<fabs(a[min])) //находим номер минимального по модулю элемента.
{
min=i;
}
}
for(i=0;i<n;i++)
{
for(int i=min+1;i<n;i++) //сумму модулей элементов массива, расположенных после минимального по модулю элемента.
{
summ=+a[i];

}
for(int n=0;i<n;i++)
{
a[i]*=a[i]; //Заменить все отрицательные элементы массива их квадратами
printf("Zamena otricatelnich elementov ih qvadratami %f \n",a[i]);

}
for(q=0;q<n;q++)
{
for(w=0;w<n;w++)
{
if(abs(a[i])<abs(a[i+1]))
{
bufer=a[i];
a[i]=a[i+1];
a[i+1]=bufer;
}
}
}

}

}
printf("Kol-vo otricatelnich elementov= %i \n",k);
printf("Summa modulei massiva posle min po moduly el= %i \n",summ);


getch();
return 0;
}




вот аткой код получится должен?

всё равно проблемы
1) отрицательные элементы выводит 1 даже если я сделаю так что их будет много
2) я не врубаю как он считает сумму их модулей! вообще неясно как он при всех отрицательных числах массива выдаёт ответ -2! хотя ответ должен быть положителен!
3) вот я вставил ваш цикл! я так понял q это тоже самое что i ? а тогда w что это?
LuBuMaster вне форума Ответить с цитированием
Старый 27.11.2009, 23:58   #5
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Я немного подправил ваш код, теперь, вроде бы, все правильно (если я правильно понял задание). Еще я заменил Сишные функции ввода на Сиплюсплюсные (printf на cout и scanf на cin) (просто мой компилятор на них что-то бузил,а разбираться с ними желания не было, если нужно, можете вернуть все как было). К стати, у вас в конце убийственная ошибка была, вы сумму выводили не правильно (там всегда выводился ноль, даже если сумма была посчитана другая).

Так же я немного "причесал" код, ибо ваш код читать очень трудно. (рекомендую "причесывать" свой ко примерно так же, тогда он будет более читабельным и наглядным.)
Кроме того у вас были ошибки с лишними скобками (виною тому отсутствие отступов, как у меня в "при чесаном" коде.)

P.S.
Особого желания писать комментарии у меня не было, если что-то не понятно - спросите.

Код:
#include <conio.h> 
#include <math.h>
#include <iostream>

using namespace std;
int main()
{
	float a[100];
	float min=0,summ=0,bufer;//почему так - см. ниже
	int n,i,k=0,q,w; 
	int num_of_min=0;//k-кол-во отриц элементов, изначально была ошибка (см. цикл с поиском наименьшего)
	printf("Enter n ");
	cin>>n;
	for (i=0;i<n;i++)//здесь я заменил что-то
	{
		cout<<"a ["<<i<<"] ";
		cin>>a[i];
		cout<<endl;
	}
	min=a[0];//рекмоендую делать их одного типа.

	for (i=0;i<n;i++)
	{ 	 
		if(a[i]<0) //количество отрицательных элементов массива;
		{
			k++;
		}

		if(fabs(a[i])<fabs(a[num_of_min])) //находим номер минимального по модулю элемента.
		{
			num_of_min=i;
		}
	}

	for(i=0;i<n;i++)
	{
		for(i=num_of_min+1;i<n;i++) //сумму модулей элементов массива, расположенных после минимального по модулю элемента.
		{
			summ+=a[i];//Здесь у вас был знак операции не правильный ("=+")
		}
	}
	for(n=0;i<n;i++)
	{
		a[i]*=a[i]; //Заменить все отрицательные элементы массива их квадратами
		printf("Zamena otricatelnich elementov ih qvadratami %f \n",a[i]); 
	}
	
	for(q=0;q<n;q++)
	{
		for(w=0;w<n;w++)
		{
			if(abs(a[i])<abs(a[i+1]))
			{
				bufer=a[i];
				a[i]=a[i+1];
				a[i+1]=bufer;
			}
		}
	}

	
	cout<<"Kol-vo otricatelnich elementov= "<<k<<endl;
	cout<<"Summa modulei massiva posle min po moduly el= "<<summ<<endl;;

	_getch();
	return 0;
}
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 28.11.2009 в 00:05.
ROD вне форума Ответить с цитированием
Старый 28.11.2009, 00:06   #6
LuBuMaster
Пользователь
 
Регистрация: 30.10.2009
Сообщений: 56
По умолчанию

спасибо!
ошибку в цикле понял!
но так и не понял как возвести отрицательные элементы масива в квадрат и вывести на экран в порядке возрастания все элементы =(

он же не выводит элементы массива
LuBuMaster вне форума Ответить с цитированием
Старый 28.11.2009, 00:08   #7
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
но так и не понял как возвести отрицательные элементы массива в квадрат и вывести на экран в порядке возрастания все элементы =(

он же не выводит элементы массива
Не заметил эту часть задания.

Если исходный массив больше нигде не нужен, то будем в нем работать, иначе копируем его в другой и работаем с "другим" массивом.

Код:
//возводим все отрицательные элементы в квадрат
for(i=0;i<n;i++)
{
   if(a[i]<0)
   {
      a[i]=a[i]*a[i];
   }
}
Далее сортируем по возрастанию.
сортируем по возрастанию
Код:
for(q=0;q<(n-1);q++)
{
   for(w=(n-1);w>=0;w--)
   {
      if(a[i])<a[i+1])
      {
       bufer=a[i];
       a[i]=a[i+1];
       a[i+1]=bufer;
       }
   }
}

и выводим:

Код:
//выводим на экран отсортированный массив
for(i=0;i<n;i++)
{

   cout<<a[i]<<" ";

}
cout<<endl;
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 28.11.2009 в 00:14.
ROD вне форума Ответить с цитированием
Старый 28.11.2009, 00:10   #8
LuBuMaster
Пользователь
 
Регистрация: 30.10.2009
Сообщений: 56
По умолчанию

буду очень благодарен!
LuBuMaster вне форума Ответить с цитированием
Старый 28.11.2009, 00:20   #9
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Ма-а-аленькая ошибочка, мы посчитали сумму элементов после минимального по модулю, а надо сумму модулей элементов после минимального по модулю.

Цитата:
for(i=num_of_min+1;i<n;i++) //сумму модулей элементов массива, расположенных после минимального по модулю элемента.
{
summ+=a[i];//Здесь у вас был знак операции не правильный ("=+")
}
вот тут summ+=a[i]; замените на summ+=abs(a[i]);
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 28.11.2009, 00:26   #10
LuBuMaster
Пользователь
 
Регистрация: 30.10.2009
Сообщений: 56
По умолчанию

Спасибо!)
а как выводить в порядке возрастания элементы массива?

это ведь через эту вроде надо делать?

for(q=0;q<(n-1);q++)
{
for(w=(n-1);w>=0;w--)
{
if(a[i])<a[i+1])
{
bufer=a[i];
a[i]=a[i+1];
a[i+1]=bufer;
}
}
}


а не выводит ничего(((
LuBuMaster вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двумерный массив, одномерный массив. Branbal Помощь студентам 14 18.11.2009 12:40
Массив Skrip Общие вопросы Delphi 3 15.10.2009 14:03
Массив Paul Oakenfold Паскаль, Turbo Pascal, PascalABC.NET 1 24.04.2009 19:31
Массив Walter Помощь студентам 3 02.01.2009 17:21
Упорядочить массив в порядке возрастания и напечатать входной и исходный массив. TheVenny Помощь студентам 3 26.11.2008 15:06