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


Автор: Narim 6.4.2011, 15:11
здравствуйте, не выходит с задачей, можете исправить, код сам идет, только вычисляет не правильно, вот условие: задача на языке СИ) 
Даны натуральное число n, действительные числа x1...,xn. вычислить: x1xn+x2xn-1+...+xnx1
Код
#include <stdio.h>
#include <conio.h>
#define n 4
main()
{
clrscr();
int x[n],i,s,*ptr;
printf(" massiv\n");
for(i=0;i<n;i++)
scanf("%d",&x[i]);
ptr=x; s=0;
for(i=0;i<n;i++)
s+=*(ptr+i)**(ptr+2*n-1-i);
printf("s=%d\n",s);
getch();
return 0;
}

заранее спасибо. ( программа с использованием указателей)


Модератор: Не забываем пользоваться кнопочкой "Код"

Автор: Vard 6.4.2011, 15:19
вычислить что?

ошибка очевидно вот в этой строчке

Код

s+=*(ptr+i)**(ptr+2*n-1-i);


если идет первая итерация цикла (i=0),  то эта строка, если принять во внимание, что n = 4, принимает вид

Код

s+=*ptr * *(ptr+7)


значение *(ptr+7) не определено

Автор: Narim 6.4.2011, 15:29
вычислить это x1xn+x2xn-2+...+xnx1, 

Автор: borisbn 6.4.2011, 15:34
Цитата(Narim @  6.4.2011,  15:11 Найти цитируемый пост)
вычислить: x1xn+x2xn-2+...+xnx1

второе слагаемое точно x2xn-2, а не x2xn-1 ?

Автор: Vard 6.4.2011, 15:34
Цитата(Narim @ 6.4.2011,  15:11)
вычислить: x1xn+x2xn-2+...+xnx1


С учетом этого необходимо отредактировать строчку в вашем цикле:

Код

s+=*(ptr+i)**(ptr+n-1-i);


кажется так
Но, как справделиво заметил borisbn, это относится к формуле с x2xn-1

Автор: Narim 6.4.2011, 15:41
Цитата(Narim @  6.4.2011,  15:11 )
вычислить: x1xn+x2xn-2+...+xnx1


второе слагаемое точно x2xn-2, а не x2xn-1 ? 
прошу прощение, ошибся, верное условие x2xn-1

Автор: borisbn 6.4.2011, 15:51
для учебного проекта (изучение указателей) такое подойдёт
Код

s+=*(ptr+i)**(ptr+n-1-i);

но я бы руки повырывал бы кодеру, который такое сделал бы такое в боевом проекте.
Сравни, что понятнее ?
Код

for ( i = 0, j = n - 1; i < n; i++, j-- )
    s += x[ i ] * x[ j ];

Автор: Vard 6.4.2011, 15:54
Цитата(borisbn @ 6.4.2011,  15:51)
но я бы руки повырывал бы кодеру, который такое сделал бы такое в боевом проекте.

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

Автор: borisbn 6.4.2011, 19:43
Vard, it's a sarcasm, is't it ?

Интересно, справится компилятор с такой оптимизацией (пройтись до середины и умножить на 2) ?
Вряд ли.
Завтра проверю

bsa, кнопка код, в данном случае, не особо помогла :( нет ?

Автор: JackYF 6.4.2011, 21:50
Narim, 
M
JackYF
Название темы должно быть более ёмким, КАПС тоже не приветствуется.

Автор: volatile 7.4.2011, 01:00
Цитата(Narim @  6.4.2011,  15:11 Найти цитируемый пост)
Указатели на элементы массива 

возможно составитель задачи расчитывал увидеть именно указатели
Код

int *ptr1 = &x[0];
int *ptr2 = &x[n-1];

for (; ptr1 <= ptr2; ++ptr1, --ptr2)
{
   int t = *ptr1 * *ptr2;
   s += (ptr1 == ptr2) ? t : 2*t; // При нечетном n, средний элемент прибляем только 1 раз.
}

Автор: borisbn 7.4.2011, 08:58
Цитата(borisbn @  6.4.2011,  19:43 Найти цитируемый пост)

Интересно, справится компилятор с такой оптимизацией (пройтись до середины и умножить на 2) ?
Вряд ли. Завтра проверю

проверил. ессно не справился

Автор: Vard 7.4.2011, 17:35
Цитата(borisbn)

Vard, it's a sarcasm, is't it ?


Чувааак....   isn't it *

Цитата(borisbn @ 7.4.2011,  08:58)
проверил. ессно не справился

с чем не справился?
с тем, чтобы пройти только половину цикла представленного выше, а потом результат умножить на 2?
ну и особо рассмотреть средний элемент - если нечетное количество элементов, то не домножать его на 2, алгоритмически грамотно оформив

Автор: borisbn 7.4.2011, 17:47
Цитата(Vard @  7.4.2011,  17:35 Найти цитируемый пост)
Чувааак....   isn't it *

тьфу, блин, очепятко. Это всё КПК, это не я smile

Цитата(Vard @  7.4.2011,  17:35 Найти цитируемый пост)
с чем не справился?с тем, чтобы пройти только половину цикла представленного выше, а потом результат умножить на 2?ну и особо рассмотреть средний элемент - если нечетное количество элементов, то не домножать его на 2

ага smile
ну... я так считаю, что от компилятора всегда можно требовать чего-то большего...
зато он (компилятор VC) развернул цикл в 4 раза (я исправил n на 400).

Автор: Vard 7.4.2011, 17:58
я имел ввиду что то типа этого, воспользуемся твоим циклом


Код

//  i < n / 2 - проходим половину цикла, возможно теряя средний элемент, если нечетное количество, но мы его потом учтем, так и задумано
for ( i = 0, j = n - 1; i < n/2; i++, j-- )
    s += x[ i ] * x[ j ];

s*=2;

// прибавляем произведения среднего элемента на самого себя, если количество элементов нечетное
if( n % 2 )
    s+=x[n/2+1]*x[n/2+1]


Add: все, доперло, простите, компилятор лох

Автор: borisbn 7.4.2011, 20:54
Vard, вот я и думал/верил/рассчитывал, что компилятор так и сделает

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