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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2018, 11:23   #1
Kiwi_Warrior
Новичок
Джуниор
 
Регистрация: 21.04.2018
Сообщений: 2
По умолчанию Проблема с обработкой массива в функции. Язык Си

Здравствуйте! Написала код, рассчитывающий среднеквадратичное оклонение элементов одномерного массива. Цель работы, собственно, в создании функции и указателя на подфункцию. Проблема же в чем: массив считывается, но при его обработке в функции расчета обрабатывается не он, а какие-то левые данные(либо, от случая к случаю первые 3-4 элемента массива, дальше -NAN, +NAN и проч.). На вывод либо выводит тоже самое(рандомные числа), либо верно, либо часть верно, часть нет. Преподаватель указал на строку 59, дескать, там семантическая ошибка. Но я не могу сообразить где(в проге всего второй семестр, до этого вообще не было, так что опыта не шибко много). Отладчик показывает, что если часть элементов исходного массива все-таки обрабатывается, то подсчет верный идет.
Среда разработки Борланд 3.1++, система винда 8.1 64бит
В деве на выводе дает верные значения, но подсчет все равно неверный.
Тем не менее, требуют только в Борланде все делать.
Если есть возможность - подскажите, в чем может быть ошибка.
Код:
#include<stdio.h>
#include<conio.h>
#include<math.h>

#define N 20
double a,b;

void input(double *x, int *);//функция ввода 
double func_sum(double (*)(double x), double *x, int, double *)//функция расчета среднеквадратичного отклонения
void output (double *x, int, double);//подфункция, на которую создается указатель
double func(double x);//функция вывода

int main()
{
 double x[N];//массив
 double (*pf)(double x)=func;//указатель на функцию
 int n;
 double S;//среднеквадратичное отклонение
clrscr();

 input(x,&n);//ввод
 func_sum(pf,x,n,&S);//расчет
 output(x,n,S);//вывод

getch();
return 0;
}

void input(double *x, int *n)//ввод
{
 double *p;
 printf("Введите количество элементов массива :");
 scanf("%d",n);
 if((*n)>N){
 (*n)=N;}

 printf("Введите константы для расчета:");
 scanf("%lf %lf",&a,&b);

 printf("Введите элементы массива:");
 for(p=x;p<x+(*n); p++)
 { scanf("%lf",p);}
 }

 void output(double *x, int n, double S)//вывод
 {
  double *p;
  for(p=x; p<x+n; p++)
  {
  printf("%lf\n",*p);
  }
  printf("‘Среднеквадратичное отклонение равно %lf",S);
  }

 double func(double x)//подфункция
 {
  return (sqrt(fabs(a+sin(x*b))));
  }

 double func_sum(double(*pf)(double x), double *x, int n, double *S)//функция расчета 
 {
  double *p;
  double sum=0, sumM=0, M=0;
  (*S)=0;
  p=&x[0];
  for(p=x; p<x+n; p++)
  {
   sumM+= pf(*p);
   }
   M=sumM*(double)(1/n);
   for(p=x; p<x+n; p++)
   {
   sum+=((pf(*p))-M)*((pf(*p))-M);
   }
   (*S)=(sqrt(fabs((double)(1/(n-1)))))*sum;
   return (*S);
   }


________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(это кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.


Учла, спасибо!

Последний раз редактировалось Kiwi_Warrior; 21.04.2018 в 13:44.
Kiwi_Warrior вне форума Ответить с цитированием
Старый 21.04.2018, 19:40   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Начните с того, что узнаете сколько будет
Код:
(double)(1/n)
p51x на форуме Ответить с цитированием
Старый 21.04.2018, 20:41   #3
Kiwi_Warrior
Новичок
Джуниор
 
Регистрация: 21.04.2018
Сообщений: 2
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Начните с того, что узнаете сколько будет
Код:
(double)(1/n)
Намек понят! Огромное спасибо)
Преобразование типа будет 1/(double)(n)
Теперь все пашет
Kiwi_Warrior вне форума Ответить с цитированием
Старый 21.04.2018, 21:44   #4
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от Kiwi_Warrior Посмотреть сообщение
Намек понят! Огромное спасибо)
Преобразование типа будет 1/(double)(n)
Теперь все пашет
можно так

Код:
1./n
alexzk вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с потокоаой обработкой OmegaBerkut C# (си шарп) 5 18.02.2017 16:14
Проблемы с обработкой массива в подпрограмме [Pascal] artems67 Помощь студентам 4 20.12.2016 10:17
Проблема с обработкой хтмл gufon Общие вопросы Delphi 13 28.03.2011 11:44
Проблема с обработкой нажатой клавиши Bayazet Общие вопросы Delphi 7 10.02.2009 13:21
Проблема с обработкой DBF файла oleg kutkov Общие вопросы C/C++ 1 22.08.2008 21:07