Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатели на элементы массива 
:(
    Опции темы
Narim
Дата 6.4.2011, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 28.3.2011

Репутация: нет
Всего: нет



здравствуйте, не выходит с задачей, можете исправить, код сам идет, только вычисляет не правильно, вот условие: задача на языке СИ) 
Даны натуральное число 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;
}

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


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

Это сообщение отредактировал(а) bsa - 6.4.2011, 15:48
PM MAIL   Вверх
Vard
Дата 6.4.2011, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 5.4.2011

Репутация: нет
Всего: нет



вычислить что?

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

Код

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


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

Код

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


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

Это сообщение отредактировал(а) Vard - 6.4.2011, 15:25
PM MAIL   Вверх
Narim
Дата 6.4.2011, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 28.3.2011

Репутация: нет
Всего: нет



вычислить это x1xn+x2xn-2+...+xnx1, 
PM MAIL   Вверх
borisbn
Дата 6.4.2011, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



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

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


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Vard
Дата 6.4.2011, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 5.4.2011

Репутация: нет
Всего: нет



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


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

Код

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


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


Это сообщение отредактировал(а) Vard - 6.4.2011, 15:36
PM MAIL   Вверх
Narim
Дата 6.4.2011, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 28.3.2011

Репутация: нет
Всего: нет



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


второе слагаемое точно x2xn-2, а не x2xn-1 ? 
прошу прощение, ошибся, верное условие x2xn-1
PM MAIL   Вверх
borisbn
Дата 6.4.2011, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



для учебного проекта (изучение указателей) такое подойдёт
Код

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

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

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



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Vard
Дата 6.4.2011, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 5.4.2011

Репутация: нет
Всего: нет



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

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

Это сообщение отредактировал(а) Vard - 6.4.2011, 15:55
PM MAIL   Вверх
borisbn
Дата 6.4.2011, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



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

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

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


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
JackYF
Дата 6.4.2011, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 6
Всего: 162



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



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
volatile
Дата 7.4.2011, 01:00 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Цитата(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 раз.
}

PM MAIL   Вверх
borisbn
Дата 7.4.2011, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



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

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

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



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Vard
Дата 7.4.2011, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 5.4.2011

Репутация: нет
Всего: нет



Цитата(borisbn)

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


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

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

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

Это сообщение отредактировал(а) Vard - 7.4.2011, 17:39
PM MAIL   Вверх
borisbn
Дата 7.4.2011, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



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

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

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

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


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Vard
Дата 7.4.2011, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 5.4.2011

Репутация: нет
Всего: нет



я имел ввиду что то типа этого, воспользуемся твоим циклом


Код

//  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: все, доперло, простите, компилятор лох

Это сообщение отредактировал(а) Vard - 7.4.2011, 18:13
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0895 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.