Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Написание проги с одномерным массивом!


Автор: Baton2007 12.12.2007, 15:56
Мне дали задание: Дано натуральное число N  и последовательность A1 , A2 , ...... An состоящая из N чисел . Надо получить последовательность , которая в отличается от исходной тем , что все нечетные элементы удвоены.
Мне нужно написать эту прогарамму с помощью датчика случайных чисел (random) и одномерного массива.
Я написал вот такую
Код
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <ctime>

int main()
{
   int n=10;
   int A[n];
   srand(time(0));
   for (int i=0;i<n;i++)
   {
       A[i]=rand()%10;
       printf("%3i",A[i]);
   }
   printf("\n");
   for (int i=1;i<n;i+=2)
       A[i]=A[i]<<1;
   for (int i=0;i<n;i++)
       printf("%3i",A[i]);
   getch();
}



Ноработает она не коректно объясните почему и помогите исправить!

Автор: Alek86 12.12.2007, 15:59
в чем именно некорректность?

Автор: Baton2007 12.12.2007, 16:02
Именно в том что  она не удваивает нечетные члены массива а должна удваивать!

Автор: crazy_hand 12.12.2007, 16:07
Ты при проверке какую индексацию подразумеваешь: с нуля или с единицы? Если с нуля, то тебе нужно цикл с i=0 начинать, если с единицы - то у тебя все правильно.

Автор: Baton2007 12.12.2007, 16:13
С нуля т.к рандомом задается если я не ошибаюсь с 0 до 10!

Автор: crazy_hand 12.12.2007, 16:17
причем здесь рандом? Ты когда exe смотришь и проверяешь результат считаешь с нуля или с единицы? Если с единицы - то у тебя все правильно. Если с нуля то цикл
Код
 for (int i=1;i<n;i+=2)
       A[i]=A[i]<<1;

нужно начинать с 0, т.е.
Код
 for (int i=0;i<n;i+=2)
       A[i]=A[i]<<1;

Автор: bsa 12.12.2007, 16:19
Работать должно. Попробуй в printf заменить "%3i" на "%3i ". И перед getch() поставь printf("\n");

Добавлено через 1 минуту и 20 секунд
crazy_hand, все с точностью до наоборот: 0 - это четное число.

Автор: crazy_hand 12.12.2007, 16:28
Да, все верно, 0 - четное число.
Если у него цикл с 1: смотрим результат - если считать с 0, то результат неверный, а если считать с 1, то все правильно. Соответственно если в цикле начинать с i=0, то тогда считая ответ начиная с 0 - все верно будет.

У меня все пашет на ура. Только к n пришлось модификатор const добавить ;)

Автор: bsa 12.12.2007, 16:33
Baton2007, тебе надо удваивать нечетные элементы или элементы, стоящие на нечетных позициях?

Автор: crazy_hand 12.12.2007, 16:43
bsa
мда, судя по сорцу - элементы на нечетных позициях, судя по постам - нечетные элементы

Baton2007
Посмотри, может тебе так нужно?:
нечетные элементы :
Код
for (int i=0;i<n;i++)
       if( A[i]%2 ) A[i]=A[i]<<1;

Автор: Baton2007 12.12.2007, 16:59
Надо удваивать нечетные элементы а не элементы стоящие на нечетных позициях!

Автор: bsa 12.12.2007, 17:02
Замени:
Код
   for (int i=1;i<n;i+=2)
       A[i]=A[i]<<1;
На:
Код
   for (int i=0;i<n;i++)
       if (A[i]%2) 
            A[i] *= 2;

Автор: SergeCpp 12.12.2007, 17:12
Можно и без условия

A[ i ] = A[ i ] << ( A[ i ] & 1 );

P.S.

A[ i ] <<= A[ i ] & 1;

Автор: crazy_hand 12.12.2007, 17:27
SergeCpp
найс, мог бы ставить плюсы - поставил бы smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)