所以我在程序中遇到一些问题,我正在编写计算任意数量的数据的统计数据。您可能知道,C没有基于用户输入生成数组的本机方式,所以我做了一个。我对指针不太熟悉,因为我还没有学过它们。但是,我遇到的主要问题是我的程序不允许输入超过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);
}
答案 0 :(得分:0)
我担心你对C和编程语言的工作方式有一些普遍的错误理解。编程与数学不完全相同。如果你声明一个变量n和一个数组myarr [n],你的数组就会随着n的增长而增长。数组将在您声明它的位置取值n并将使用它。同样声明这样的数组也许不是一个好主意,我不认为许多C编译器会编译出人们期望的内容。在你的情况下,你声明一个大小为0的数组,它似乎最多可以处理16个数字,这完全取决于系统。您不能指望这种行为在不同的系统/编译器上保持一致。
相反,如果你真的需要它,你应该做的是使用动态内存。我已经写了一个很快你可以使用的简单例子。这绝不是一个完整的,但对于你的需求它应该足够好。每当您创建一个新的增长数组时,请使用initArr(&amp; arr)。例如,如果你有一个名为arr的MyArr类型的数组,你可以像这样arr.data [i]获得数组的数据,同时你可以获得数组的长度(有意义的数据),如arr.len。最后,您可以像这样arr.size获取数组的当前最大大小。请注意,您只应使用addElement(&amp; arr,x)添加新元素,因为此函数将负责数组增长。使用完阵列后,可以使用destrArr(&amp; arr)释放内存。即使你的程序退出内存时,这也是一种很好的做法。
最后请查看您的功能。我没有通过你的逻辑,但要记住,你永远不应超越界限。例如,您不应该尝试访问数组[-1]或数组[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);
}