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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.07.2011, 18:37   #1
|Dima|
Пользователь
 
Регистрация: 06.07.2011
Сообщений: 21
По умолчанию Даный целые числа, заменить нулями члены, модуль которых при делении на p даёт в остатке q

Помогите написать программу на Си, не С++, обычный Си. Вот условие:
"Даный целые числа p, q, a1, .... a67 (p>q>=0). В последовательности a1, ....., a67 заменить нулями члены, модуль которых при делении на p даёт в остатке q"
|Dima| вне форума Ответить с цитированием
Старый 10.07.2011, 18:49   #2
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Код:
include <stdio.h>

int main(){

  int p,q,a[66]; // a[i] : i от 0 до 66

  // ввод данных
  scanf("%i",&p);
  scanf("%i",&q);
  for(int i=0;i<67;++i)
    scanf("%i",&a[i]);

  // собственно выполнение задачи
  for(int i=0;i<67;++i){
    if(a[i]<0)a[i]=-a[i]; // если отрицательное - меняем на положительное (модуль)
    if(a[i]%p==q)a[i]=0; // если a[i] при делении на p дает остаток q - меняем a[i] на ноль
  };
}
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 10.07.2011, 18:54   #3
|Dima|
Пользователь
 
Регистрация: 06.07.2011
Сообщений: 21
По умолчанию

Спасибо, за быстрый ответ
|Dima| вне форума Ответить с цитированием
Старый 10.07.2011, 18:56   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Я бы поправил момент с модулем, а то будет некоторая проблема с отрицательными числами, которые не дают нужный остаток (они станут положительными).
pu4koff вне форума Ответить с цитированием
Старый 10.07.2011, 18:57   #5
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Цитата:
Сообщение от pu4koff
Я бы поправил момент с модулем, а то будет некоторая проблема с отрицательными числами, которые не дают нужный остаток (они станут положительными).
В смысле? Нам без разницы, какой остаток у отрицательных, в задании сказано "модуль которых при делении на p даёт в остатке q"
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 10.07.2011, 21:12   #6
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от Granus Посмотреть сообщение
Код:
include <stdio.h>

int main(){

  int p,q,a[66]; // a[i] : i от 0 до 66

  // ввод данных
  scanf("%i",&p);
  scanf("%i",&q);
  for(int i=0;i<67;++i)
    scanf("%i",&a[i]);

  // собственно выполнение задачи
  for(int i=0;i<67;++i){
    if(a[i]<0)a[i]=-a[i]; // если отрицательное - меняем на положительное (модуль)
    if(a[i]%p==q)a[i]=0; // если a[i] при делении на p дает остаток q - меняем a[i] на ноль
  };
}
Во-первых, у вас неправильно реализован цикл. Если у вас массив объявлен со значением размерности равной 66, то и цикл должен быть объявлен как

Код:
for(int i=0;i<66;++i)
Во-вторых, вы предлагаете человеку ввести 68 чисел?!!! Не проще ли было инициализировать массив случайным образом?

В-третьих, так как не все компиляторы С поддерживают стандарт С99, то лучше было объявить переменную i в начале блока функции main.

В-четвертых, у вас неправильно объявлена функция main. В С она должна объявляться следующим образом

Код:
int main( void )
В пятых, вы вообще некорректно сделали задачу, так как вы меняете в массиве отрицательные элементы на положительные, а это в условиях задачи не требовалось! То есть вы к тому же портите исходный массив!
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 10.07.2011, 22:12   #7
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Помогите написать программу на Си, не С++, обычный Си.

Не, на обычном Си - это уныло и неинтересно.
Лоббируй преподу C++, убеждай, что все чиста продвинутые школьники уже давно пишут на C++. Дави его интеллектом :D

Код:
#include <stdlib.h>
#include <time.h>

#include <locale>
#include <iostream>

#include <algorithm>
#include <functional>
#include <iterator>

template <typename _InIt, typename _OutIt, typename _Pred1, typename _Fn1>
inline _OutIt transform_if(_InIt _First, _InIt _Last, _OutIt _Dest, _Pred1 _Pred, _Fn1 _Func)
{
	for ( ; _First != _Last; ++_First, ++_Dest)
		if (_Pred(*_First))
			*_Dest = _Func(*_First);
	return _Dest;
}

template <typename T>
struct modulo : public std::unary_function<typename, bool>
{
	modulo(T mod) : mod_(mod) {}
	bool operator()(T val) const
	{
		return abs(val) % mod_ == 0;
	}
	T mod_;
};

struct Zero
{
	template  <typename T>
	T operator()(T) const { return T(); }
};

struct R : public std::unary_function<void, int>
{
	int operator()() const
	{
		return rand() % 21 - 10;
	}
};

template  <typename _InIt>
void print(_InIt begin, _InIt end)
{
	typedef typename std::iterator_traits<_InIt>::value_type T;
	typedef std::ostream_iterator<T> O;

	std::copy(begin, end, O(std::cout, " "));
}

int main()
{
	setlocale(LC_ALL, "");
	srand((unsigned) time(NULL));

	std::cout << "Enter size of array: ";
	
	int N;
	std::cin >> N;
	int* arr = new int[N];
	std::generate_n(arr, N, R());

	std::cout << "Enter q: ";
	int q;
	std::cin >> q;
	
	print(arr, arr + N);
	std::cout << std::endl;

	transform_if(arr, arr + N, arr, modulo<int>(q), Zero());

	print(arr, arr + N);
	std::cout << std::endl;

	return 0;
}
Rififi вне форума Ответить с цитированием
Старый 11.07.2011, 01:14   #8
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Цитата:
Во-первых, у вас неправильно реализован цикл. Если у вас массив объявлен со значением размерности равной 66, то и цикл должен быть объявлен как
Лопухнулся, да. Массив хотел объявить как a[67], в циклах тогда все верно.
Цитата:
Во-вторых, вы предлагаете человеку ввести 68 чисел?!!! Не проще ли было инициализировать массив случайным образом?
Я ничего не предлагаю. В условии не сказано, как его вводить. Хоть с удаленного сервера получать. Если человек хоть что-то понимает - заменить ввод на нечто более приемлемое.
Цитата:
В-третьих, так как не все компиляторы С поддерживают стандарт С99, то лучше было объявить переменную i в начале блока функции main.
Нормальные компиляторы уже и C++0x поддерживают. Хотя вообще наверное да, Вы правы, надо бы.
Цитата:
В-четвертых, у вас неправильно объявлена функция main. В С она должна объявляться следующим образом
Про это забыл, да. Не так часто пишу на чистом си)
Цитата:
В пятых, вы вообще некорректно сделали задачу, так как вы меняете в массиве отрицательные элементы на положительные, а это в условиях задачи не требовалось! То есть вы к тому же портите исходный массив!
А вот тут Вы не правы. В задании ни слова про то, что исходный массив нельзя менять. Более того, в задании сказано "заменить нулями члены", т.е. по условию массив менять надо) Ну если оставлять отрицательные отрицательными, то все тривиально меняется
Код:
if((a[i]>=0)&&(a[i]%p==q)a[i]=0;
if((a[i]<0)&&((-a[i])%p==q)a[i]=0;
или
Код:
if(((a[i]>=0)?a[i]:-a[i])%p==q)a[i]=0;
И вообще, лучше бы свое решение привели, более правильное, а не мое критиковали)
Получилось бы и короче, и автору темы проще.
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
c++ ..при компиляции даёт ошибку.. silveran Помощь студентам 6 17.05.2011 15:32
Потоки - Существуют ли методы у которых в параметре не целые типы(long,int), а вещественные? DRAgon™ Общие вопросы по Java, Java SE, Kotlin 10 08.02.2011 18:56
При делении чисел выводятся непонятные числа! khorolpavel Общие вопросы C/C++ 2 29.11.2010 16:17
Даны натуральные числа n,p, целые числа a1 , ... ,an. Наталья111 Фриланс 10 09.11.2010 20:09
Найти все целые числа,у которых ровно 6 делителей; jenja Общие вопросы C/C++ 3 03.10.2008 20:32