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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2009, 08:38   #1
Skrip
Пользователь
 
Аватар для Skrip
 
Регистрация: 04.06.2009
Сообщений: 45
По умолчанию Определить сумму элементов массива, кратных трем (Не выполняется условие)

Одна из поставленных задач, которая у меня не получается:
Определить сумму элементов массива, кратных трем (условие c[i]/3*3=c[i] для проверки кратности трем)..
Весь код:

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

char*Rus (const char*text);

void main()
{
	float C[40],sum=0,Y[40];
	int n,i;
	
	printf(Rus("Введите количесто элементов массива: "));
	cin>>n;

	
	printf(Rus("\nВведите элементы массива:\n"));
	for(i=0; i<n; i++)
		cin>>C[i];//ввод элементов массива
    
    printf(Rus("\nВведеный массив:\n"));
	for(i=0; i<n; i++)
		printf("%4.2f  ",C[i]);//вывод массива
	
	//Колличество положительных элементов массива
	int a=0;
	for(i=0;i<n;i++)
		if(C[i]>0)a++;
	
	printf(Rus("\n\nКолличество положительных элементов масcива: = %d\n"),a);

	//Определим сумму элементов массива кратных 3
	float d=0;
	i=0;
	while(i<n)
	{
		if(C[i]/3*3==C[i])d+=C[i]; 
		i++; 
	}
	
	printf(Rus("\nСумма элементов, кратных трем = %f\n"),d);
	
	
	//перестановка элементов в массиве
	int j=0;
	for(i=0;i<n;i++)
		if(C[i]<=1.)
		{ 
			Y[j++]=C[i];
			//printf("%d  %d", i,j);
		}
		
	for(i=0;i<n;i++)
		if(C[i]>1.) 
		{
			Y[j++]=C[i];
		}

	//вывод полученного массива
	for(i=0; i<n; i++)
		printf("%4.2f  ",Y[i]);
	printf("\n");


	system("PAUSE");		//Задержка перед выходом

}

char bufRus[256];
char*Rus (char const*text)
{
	CharToOem(text,bufRus);
	return bufRus;
}
Если задание не выполнимо, можно представить другой вариант проверки на кратность трем вещественных чисел.. Помогите!! Пожалуйста!!

Модератор: тег CODE
Я спокойный, вежливый и уравновешенный человек

Последний раз редактировалось Sazary; 04.06.2009 в 12:52.
Skrip вне форума Ответить с цитированием
Старый 04.06.2009, 08:43   #2
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

Проверка кратности:
Если остаток отделения равен 0!!!
Например
Код:
if((C[i]%3) == 0) d += C[i]
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 04.06.2009, 08:49   #3
Skrip
Пользователь
 
Аватар для Skrip
 
Регистрация: 04.06.2009
Сообщений: 45
По умолчанию

Так я так делала не получается.. это, наверно, для целых чисел..
Я спокойный, вежливый и уравновешенный человек
Skrip вне форума Ответить с цитированием
Старый 04.06.2009, 08:58   #4
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

А да точно!!! А вчём собственно проблема??? Считает больше или меньше???
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 04.06.2009, 09:03   #5
Skrip
Пользователь
 
Аватар для Skrip
 
Регистрация: 04.06.2009
Сообщений: 45
По умолчанию

//Определим сумму элементов массива кратных 3
float d=0;
i=0;
while(i<n)
{
if(C[i]/3*3==C[i])d+=C[i];
i++;
}

Вот здесь проблема.. он вообще не выполняет это условие.. вернее, выполняет, но как я предполагаю, округляет.. т.е. разделит число не кратное трем, получит дробное число, а когда умножит, снова то же.. странно..
Но мне надо чтоб он просуммировал все числа кратные трем, загвоздка в том, как найти эти числа..
Я спокойный, вежливый и уравновешенный человек
Skrip вне форума Ответить с цитированием
Старый 04.06.2009, 09:11   #6
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

Чё-то ничё в голову не приходит!!! Кроме как поделить число , а потом преобразовать в строку и со сторокой проработать!!! Как те такой вариант??
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 04.06.2009, 09:18   #7
Skrip
Пользователь
 
Аватар для Skrip
 
Регистрация: 04.06.2009
Сообщений: 45
По умолчанию

хм.. а как это будет выглядеть, что то я не очень понимаю..
Честно, мне уже любой вариант подходит.. Главное, чтоб прога заработала, и я поняла..))
Я спокойный, вежливый и уравновешенный человек
Skrip вне форума Ответить с цитированием
Старый 04.06.2009, 09:28   #8
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Остаток от деления вещественных чисел определяется посредством функции fmod, но она так же возвращает вещественное число. Вещественные числа просто так нельзя сравнивать, т.к. у них не 100% точность и в один прекрасный момент такое не сработает:
Код:
float a = 0.3;
float b = 0.3;
if (a == b) // a - это может быть по факту 0.3000000000001,
               // а b - 0.29999999999999999
{

}
Для этой цели в заголовочном файле float.h определена константа для float: FLT_EPSILON - это погрешность типа float. Таким образом проверка будет примерно такая:
Код:
float a; // a - это число, которое проверяем на кратность
...
float r = fmod(a, 3.0); // r - остаток от деления на 3
if (((r + FLT_EPSILON) > 0.0) &&
    ((r - FLT_EPSILON) < 0.0))
{
  // остаток равен нулю, а значит число кратно трём
  ...
}
Извиняюсь. Соврал немного. FLT_EPSILON - это минимальное число, при котором: 1.0+FLT_EPSILON != 1.0 именно для единицы и ни для какого другого числа.
Просто с англицким у меня плохо и читаю документацию между строк. Там же внизу написано, что можно использовать FLT_EPSILON, но для больших чисел эта константа будет как слону дробина и потому нужно будет "выдумывать" своё число
В том же MSDN, но для .NET Framework уже написано на великом и могучем:
Цитата:
Один из методов, которые рекомендуется применять вместо сравнения для проверки равенства, заключается в определении допустимой предельной разности двух значений (например, 0,1% одного из значений). Если абсолютная величина разности двух значений меньше или равна предельному значению, эта разность, вероятнее всего, является следствием различия в точности и, следовательно, значения равны.
Таким образом, более правильная проверка на равенство нулю будет примерно такой (погрешность берём в 0,1% от остатка, но можете взять другую величину):
Код:
float a; // a - это число, которое проверяем на кратность
...
float r = fmod(a, 3.0f); // r - остаток от деления на 3
float diff = r * 0.0001f;

// Вообще должно быть такое сравнение:
// if (fabs(r - 0.0f) <= diff)
// Но ноль можно отбросить и отстаётся:
if (fabs(r) <= diff) // остаток по модулю "укладывается" в погрешность
{
  // Значит остаток равен нулю и число кратно трём
  ...
}

Последний раз редактировалось pu4koff; 04.06.2009 в 13:22.
pu4koff вне форума Ответить с цитированием
Старый 04.06.2009, 13:56   #9
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

невнимательно прочитала предыдущие посты
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать

Последний раз редактировалось ACE Valery; 04.06.2009 в 13:58. Причина: ступила...
ACE Valery вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Для массива определить сумму всех элементов, стоящих после максимального HECTOR.A. Паскаль, Turbo Pascal, PascalABC.NET 4 17.06.2009 22:04
Необходимо определить максимальное значение, хранимое в 2-х массивах и указать сумму элементов массива Игорь777 Помощь студентам 1 29.03.2009 21:14
Определить сумму и количество четных элементов массива KREGI Общие вопросы Delphi 10 05.03.2009 18:18
Дан массив из N элементов (чисел),определить количество элементов кратных 3. Woha Общие вопросы C/C++ 2 08.12.2008 13:12