gpt4 book ai didi

c - 一维统计程序

转载 作者:行者123 更新时间:2023-11-30 17:04:16 25 4
gpt4 key购买 nike

因此,我编写的用于计算任意数量数字的统计数据的程序遇到了一些问题。您可能知道,C 没有一种基于用户输入来增长数组的 native 方法,因此我制作了一种。我对指针不太熟悉,因为我还没有学过它们。然而,我遇到的主要问题是我的程序不允许我输入超过 16 个数字。关于原因有什么想法吗?

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

float getMin(float arr[], int size)
{
int i;
float minimum = arr[0];

for (i=1; i < size; i++) {
if (arr[i] < minimum) {
minimum = arr[i];
}
}

return(minimum);
}

float getMax(float arr[], int size)
{
int i;
float maximum;

for(i=0; i<size; i++) {
if (arr[i] > maximum) {
maximum = arr[i];
}
}

return(maximum);
}

float getAverage(float arr[],int size)
{
int i;
float avg, sum;

for(i=0; i<size; i++) {
sum += arr[i];
}

avg = sum/size;

return avg;
}

float getVar(float arr[], int size, float average)
{
int i;
float var, diff[size], sq_diff[size], sum;

for(i=0; i<size; i++) {
diff[i] = arr[i] - average;
}

for(i=0; i<size; i++)
{
sq_diff[i] = pow(diff[i], 2);
}

var=getAverage(sq_diff, size);

return(var);
}

float getStdDev(float var)
{
float std_dev = sqrt(var);

return(std_dev);
}

int main(void)
{
int n=0, i=0;
float array[n], x;

printf("This program computes 1-D statistics.");
printf("\nEnter a negative number to stop input.\n");

do {
printf("Number %d: ", i+1);
scanf("%f", &x);

n++;

array[i] = x;

i++;

}while(x >= 0);

float avg = getAverage(array, n-1);
float var = getVar(array, n-1, avg);

printf("\nMinimum: %f", getMin(array, n-1));
printf("\nMaximum: %f", getMax(array, n));
printf("\nAverage: %f", getAverage(array, n-1));
printf("\nVariance: %f", getVar(array, n-1, avg));
printf("\nStandard Deviation: %f", getStdDev(var));

return(0);
}

最佳答案

恐怕您对 C 和编程语言的工作原理存在一些普遍的误解。编程与数学并不完全相同。如果你声明一个变量 n 和一个数组 myarr[n],你的数组不会随着 n 的增长而增长。该数组将采用您声明它时的值 n 并使用该值。同样声明这样的数组可能不是一个好主意,我认为许多 C 编译器不会编译出人们所期望的结果。在您的例子中,您声明了一个大小为 0 的数组,事实上它似乎最多可以处理 16 个数字,这完全取决于系统。您不能期望这种行为在不同的系统/编译器上保持一致。

如果您确实需要,您应该做的是使用动态内存。我写了一个简单的例子,你可以很快使用。这绝不是完整的,但对于您的需求来说它应该足够好了。每当您创建新的增长数组时,请使用 initArr(&arr)。例如,如果您有一个名为 arr 的 MyArr 类型数组,您可以像这样 arr.data[i] 那样获取数组的数据,同时您可以像这样 arr.len 那样获取数组的长度(有意义的数据)。最后,您可以获得数组的当前最大大小,如下所示 arr.size。请注意,您应该只使用 addElement(&arr, x) 添加新元素,因为此函数将处理数组增长。使用完数组后,可以使用 destrArr(&arr) 释放内存。这是一个很好的实践,即使当你的程序退出时,内存无论如何都会被释放。

最后请检查您的功能。我没有仔细研究过你的逻辑,但请记住,你永远不应该超越界限。例如,您不应尝试访问 array[-1] 或 array[size_of_array],其中 size_of_array 是数组的总大小。请记住,声明为 float arr[100] 的数组只能在 arr[0] 到 arr[99] 区域中安全使用。另外,执行 sum += x 相当于执行 sum = sum + x。考虑一下如果不初始化 sum 的初始值是多少。事实上,它取决于但可能包含垃圾值。

尝试查看编译器警告并修复它们。理解它们是值得的,而且很少值得忽视。如果您使用的是 gcc,请尝试使用 -Wall 标志,它可能会给您更多值得一看的警告。

我希望这对您有所帮助并且不会太令人困惑。无论如何,请查看以下代码并将您的函数和库添加回来。这应该是开箱即用的。

祝你好运! :)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define INIT_SIZE 2

typedef struct MyArr {
float *data;
int size;
int len;
} MyArr;

int initArr(MyArr *arr) {
arr->data = (float *)malloc(INIT_SIZE*sizeof(float));
if (arr->data == NULL) {
printf("OUT OF MEMORY\n");
return -1;
}
arr->size = INIT_SIZE;
arr->len = 0;
return 1;
}

int addElement(MyArr *arr, float x) {
if (arr->len == arr->size) {
int i;
float *tmp = (float *)malloc(2*arr->size);
if (tmp == NULL) {
printf("OUT OF MEMORY\n");
return -1;
}
for (i = 0; i < arr->size; ++i) {
tmp[i] = arr->data[i];
}
free(arr->data);
arr->data = tmp;
arr->size = 2*arr->size;
}
arr->data[arr->len] = x;
arr->len++;
return 1;
}

void destrArr(MyArr *arr) {
free(arr->data);
arr->size = 0;
arr->len = 0;
}

int main(void)
{
int n=0, i=0;
float x;
MyArr array;
initArr(&array);

printf("This program computes 1-D statistics.");
printf("\nEnter a negative number to stop input.\n");

do {
printf("Number %d: ", i+1);
scanf("%f", &x);

n++;

addElement(&array, x);

i++;

}while(x >= 0);

float avg = getAverage(array.data, n-1);
float var = getVar(array.data, n-1, avg);

printf("\nMinimum: %f", getMin(array.data, n-1));
printf("\nMaximum: %f", getMax(array.data, n));
printf("\nAverage: %f", getAverage(array.data, n-1));
printf("\nVariance: %f", getVar(array.data, n-1, avg));
printf("\nStandard Deviation: %f", getStdDev(var));

destrArr(&array);
return(0);
}

关于c - 一维统计程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35881357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com