объявление функции и вызов и определение в c - PullRequest
0 голосов
/ 21 октября 2018

Почему этот код не работает после печати массива, если я принимаю значение n> = 9?

#include <stdio.h>
#include <math.h>

float mean_function(float array[],int n);
int main() {
    int i,n;
    float array[n],mean,sum=0,s2,summation,deno,C[i],elements;
    printf("Enter No of Elements\n");
    scanf("%d",&n);
    printf("Enter Elements\n");
    for(i=0;i<n;i++){
        scanf("%f",&array[i]);
        printf("%f",array[i]);
    }
    printf("sample variance(s2) : (sum((x-mean)*(x-mean)))/(n-1) /n");
    printf("population variance(sigma2) : (sum((x-u)*(x-u))/n");
    mean_function(array,n);
    for(i=0;i<n;i++) {
        deno=((array[i]-mean)*(array[i]-mean));
        C[i]=deno;
        summation=summation+C[i];
    }
    s2=((summation)/(n-1));
    printf("s2=%f \n",s2);
}
float mean_function(float array[],int n) {
    int i;
    float sum=0,mean;
    for(i=0;i<n;i++){ sum=sum+array[i]; }
    mean=(sum/n);
    return mean;
} 

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Почему этот код не работает после печати массива, если я принимаю значение n> = 9?

Некоторые мысли о вашем коде (и о поэтапной сборке программ):

  1. Массивы в C не меняются в размере после определения.VLA отсутствуют по разным причинам.malloc () находится в.
  2. Используйте double, если нет особой причины для использования чисел с плавающей запятой.
  3. Определите и инициализируйте одну переменную в строке.Uninit vars может привести только к ошибке, упомянутой @ Jens.
  4. Объявления функций вверху (что вы сделали)
  5. Во время разработки не нужно усложнять вещи с помощью scanf(по крайней мере, изначально).Это только добавляет необоснованный уровень сложности.Если вы тестируете статистические функции (среднее, дисперсия), поместите числа в предварительно определенный статический массив и сначала проверьте функциональность.
  6. C [i], как было объявлено с неинициализированным i.
  7. ДляНа этом начальном этапе построения этой программы я включаю базовую программу.
  8. Я не фанат нулевого пространства между токенами (но не обращайте на это внимания)
  9. Подумайте о том, чтобы называть свой массив чем-то иным, чем 'массивом'.
  10. Расчет размера массива примеров позволяет изменить количество элементов, не изменяя ничего в коде;что добавляет еще один уровень сложности к и без того сложной фазе.

#include <stdio.h>
#include <math.h>

double sample_mean(double* p, int n);
int main()
{
    double samples[] = {1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 16.5, 2.3};
    double mean = 0.0;

    int size_samples = sizeof samples/sizeof(double);
    printf("size_samples = %d\n", size_samples);

    mean = sample_mean(samples, size_samples);
    printf("Mean = %.2lf", mean);

}
// -------------------------------
double sample_mean(double* p, int n)
{
    double mean = 0.0;
    double total = 0.0;

    for(int i = 0; i < n; i++)
        total += *p++;
    mean = total/n;

    return mean;
}

Как только эта функция присутствует (сохранена), вы можете начать работать над другими функциями статистики.Таким образом, вы можете работать шаг за шагом, чтобы приблизиться к желаемому результату.Далее вы можете определить sample_variance(double* p, int n) и работать над этим, зная, что дополнительные (новые ошибки) не приходят из вашего кода, написанного до сих пор.
Вывод:


size_samples = 8<br>
Mean = 5.24

Надеюсь, это поможет.

0 голосов
/ 21 октября 2018

Код, вероятно, не выполняется, поскольку array[n] объявлено с неинициализированным n.В то время, когда вы читаете n с помощью scanf (), массив не «автоматически увеличивается до нужного размера».Вы должны либо объявить array достаточно большим, либо, если вы действительно хотите, чтобы он был определен пользователем, использовать malloc для его выделения (см. comp.lang.c FAQ ) и все тегированные массивы вопросов Stackoverflow...)

Кроме того, scanf в какой-то момент дает сбой.Обратите внимание, что при вводе чисел в строке ввода также вводится символ «Ввод» ('\n').Вы никогда не читаете новую строку, поэтому следующий scanf завершается неудачей.

Это становится очевидным, когда вы фактически проверяете возвращаемое значение из scanf с помощью кода, подобного следующему:

if (scanf("%f", &array[i]) == 1) {
   /* successfully converted 1 item */
}
else {
   /* scanf failed */
}

Обычно вы хотите пропуститьпробелы на входе.Вы делаете это, помещая пробел в формате scanf.Обратите внимание, что один пробел указывает scanf пропустить любой объем пробела.

if (scanf(" %f", &array[i]) == 1) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...