【问题标题】:C program- find the lowest student score above, and the highest score below the boundaryC 程序 - 找到上面的最低学生分数,以及低于边界的最高分数
【发布时间】:2013-05-11 00:09:08
【问题描述】:

我正在完成一个程序,我将一堆非负双精度数据读入一个数组,然后计算这些值的平均值和标准偏差。那么平均值加上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;
}

【问题讨论】:

    标签: c


    【解决方案1】:

    代码:

    #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;
    }
    

    【讨论】:

      【解决方案2】:

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

      正确: 函数() {

      variable v1;
      variable v2;
      
      perform_stuff();
      

      }

      正确: 函数() {

      perform_stuff()
      
      variable v1;
      

      }

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

      查找数组中的最小数: 该选项几乎没有可能的选项,首先,您可以要求用户输入从最低到最高的值,然后到达数组 [0](第一个位置 = 最低值)。但如果您不/不能,请始终使用 quicksorthttp://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

      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];
      

      }

      希望我理解正确:)

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 在我写出最低和最高分部分的代码时,你有一个可以参考的例子吗?这会很有帮助
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-18
        • 1970-01-01
        • 2019-03-01
        相关资源
        最近更新 更多