0

我正在完成一个程序,我将一堆非负双精度读入一个数组,然后计算这些值的平均值和标准偏差。然后均值加上stand dev 代表得到一个 B
我在下一部分遇到了麻烦,我需要从给我 B 的数字数组中找到最低分数,然后在数组中找到没有得到 B的最高值。我在这部分遇到了很多麻烦,任何帮助都会令人惊叹。 我还必须让程序停止
EOF已输入其中,但我也无法弄清楚该部分,因此也将不胜感激。现在我只是让它适用于所有正值并在引入负值时停止,这是我的代码:

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

int main () {
    int arr[100];
    int y, x;
    int i;
    double mean = 0;
    double std = 0;
    double this = 0;
    i = 0;

    printf("Enter next number, EOF to stop > ") ;
    scanf("%d",&x);
    while (x >= 0) {
        arr[i++] = x;
        printf ("Enter next number, EOF to stop > " );
        scanf("%d",&x);
    }

    y = i;

    double sum = 0;
    double sum1= 0;

    for(i = 0; i < y; i++){
        sum = sum + arr[i];
    }
    mean = sum / y;

    for (i = 0; i < y; i++){
        sum1 = sum1 + pow((arr[i] - mean), 2);
    }

    std = sum1 / ((float)y - 1);

    this = mean + sqrt(std);

    if (10 > y) {
        printf("**You must enter atleast 10 scores***\n");
        return 0;
    }

    printf("Mean = %.2lf, Standard Deviation = %.2lf\n", mean, sqrt(std));
    printf("Scores above %.2lf get a B\n", this);

    return 0;
}
4

3 回答 3

0

首先,如果你打算在 -ansi -pedantic C 中编程,所有变量都必须定义在块的顶部。例如:

正确:func() {

variable v1;
variable v2;

perform_stuff();

}

正确:func() {

perform_stuff()

variable v1;

}

现在你的问题是:如果你想保存一个双值数组,数组应该是 double 类型,而不是 int 类型。

找到数组中的最小数字:该选项几乎没有可能的选项,首先,您可以要求用户输入从最低到最高的值,然后到达数组 [0](第一个位置 = 最低值) . 但如果您不/不能,请始终使用快速排序:http : //www.cquestions.com/2008/01/c-program-for-quick-sort.html 将数组从最低值排序到最高值,然后使用二进制搜索找到您想要的值:http ://www.cquestions.com/2008/01/c-program-for-binary-search.html 来搜索您想要的值。

或者你也可以让它以 O(N) 的效率工作:

int heighest_smaller_than_mean = 0;

int minimum_smaller_than_mean = 平均值;

for(i = 0; i < 意思; i++) {

if(heighest_smaller_than_mean < arr[i])
heighest_smaller_than_mean = arr[i];

if(smallest_smaller_than_mean < arr[i])
smallest_smaller_than_mean = arr[i];

}

希望我正确理解你:)

于 2013-05-10T07:14:46.570 回答
0

代码:

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

int main () {
    int arr[100];
    int y, x;
    int i;
    double mean = 0;
    double std = 0;
    double margin = 0;
    i = 0;

    printf("Enter next number, EOF to stop > ") ;
    scanf("%d",&x);
    while (x >= 0) {
        arr[i++] = x;
        printf ("Enter next number, EOF to stop > " );
        scanf("%d",&x);
    }

    y = i;
    if (10 > y) {
        printf("**You must enter atleast 10 scores***\n");
        return 0;
    }

    double sum = 0;
    double sum1= 0;

    for(i = 0; i < y; i++){
        sum = sum + arr[i];
    }
    mean = sum / y;

    for (i = 0; i < y; i++){
        sum1 = sum1 + pow((arr[i] - mean), 2);
    }

    std = sum1 / ((float)y - 1.0);

    margin = mean + sqrt(std);


    printf("Mean = %.2lf, Standard Deviation = %.2lf\n", mean, sqrt(std));
    printf("Scores above %.2lf get a B\n", margin);

    int below = arr[0]; // highest value in the array that will not get a B
    int above = arr[0]; // lowest value in the array that will give a B

    for (i=0; i<y; i++) {
        if ((arr[i] > below) && (arr[i] < margin)) {
            below = arr[i];
        }
        else if ((arr[i] > margin) && (arr[i] < above)) {
            above = arr[i];
        }
    }

    return 0;
}
于 2013-05-10T07:07:28.253 回答
0

对于第二个问题,不要使用 读取输入fscan(%d, &x),而是创建一个字符数组(例如char [] str = new char[5];)并使用 扫描它fscan(%s, &str)。然后,使用 . 将该字符串与另一个包含“EOF”的字符串进行比较if (strcmp(str, eofStr) == 0) break。使用 atoi 将字符串转换为整数。

要找到带有 B 的最低分数,请存储一个整数,以保存带有 B 的最低数字。将初始值设置为 A 等级值。遍历循环并与每次迭代的分数进行比较。如果分数较低,但仍为 B,则将当前最低分数与此分数交换。完成循环,您将获得 B 的最低分。您可以做同样的事情以获得没有 B 的最高分。

int low = this + sqrt(std);
for (int i = 0; arr[i] > 0; i++) {
    if (low > arr[i] && arr[i] >= this) low = arr[i];
}
于 2013-05-10T06:27:54.497 回答