c - 输出打印扫描功能两次,而不是一次。需要修复

标签 c shell loops pointers gcc

我这里的代码效果很好:

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


int* get_data(int num_grades);
float calc_average(int num_grades, int grades[]);
void display_average(float ave);
float standard_deviation(int num_grades);
void display_standarddeviation(float standarddev);
float calc_median(int num_grades, int grades[]);
void display_median(float median);

int main(int argc, char* argv[])
{
    const int MAX_GRADE = 100;
    printf("enter number of grades: ");
    int num_grades;
    scanf("%d", &num_grades);

    int* result = get_data(num_grades);

    if(num_grades == 0)
    {
        printf("no grades to average\n");
    }
    else
    {
        float ave = calc_average(num_grades, result);
        display_average(ave);
        float standarddev = standard_deviation(num_grades);
        display_standarddeviation(standarddev);
        float median = calc_median(num_grades, result);
        display_median(median);
    }

    free(result);
    return 0;
}

float calc_average(int num_grades, int grades[])
{
    float ave;
    int i;
    int sum = 0;
    for(i = 0; i < num_grades; i++)
    {
        sum += grades[i];
    }
    ave = (float)sum/num_grades;

    return ave;
}

float calc_median(int num_grades, int grades[])
{
    float median;
    int i;
    for (i = 0; i < num_grades; i++)
    {
        if(i % 2)
        {
            median = (grades[i/2] + grades[(i/2)+1]) / 2.0;
        }
        else 
        {
            median = grades[(i/2)+1];
        }
    }

    return median;
}

float standard_deviation(int num_grades)
{
    float standarddev;
    int i;
    float formula = 0.0f;
    int* result = get_data(num_grades);
    formula = powf((*result - calc_average(num_grades, result)), 2);

    float ave = formula/num_grades;
    standarddev = sqrtf(ave);

    return standarddev;     
}


void display_average(float ave)
{
    printf("average: %.2f\n", ave);
}
void display_standarddeviation(float standarddev)
{
    printf("standard deviation: %.2f\n", standarddev);
}
void display_median(float median)
{
    printf("median: %.2f\n", median);
}

int* get_data(int num_grades)
{
    int* a;
    a = malloc(num_grades * sizeof(int));
    int i;
    for(i = 0; i < num_grades; i++)
    {
        printf("enter a grade: ");
        int grade;
        scanf("%d", &grade);
        if(grade <= 100)
        {
            a[i] = grade;
        }
        else
        {
            printf("grade needs to be > 0 and <= 100\n");
            i--;
        }
    }

    return a;
}

但是,输出如下所示:

enter number of grades: 5
enter a grade: 75
enter a grade: 77
enter a grade: 80
enter a grade: 85
enter a grade: 90
average: 81.40
enter a grade: 75
enter a grade: 77
enter a grade: 80
enter a grade: 85
enter a grade: 90
standard deviation: 2.86
median: 85.00

我希望输出如下所示:

enter number of grades: 5
enter a grade: 75
enter a grade: 77
enter a grade: 80
enter a grade: 85
enter a grade: 90
average: 81.40
standard deviation: 2.86
median: 85.00

如何调整此代码,使其不会在扫描函数上运行双循环?

最佳答案

standard_deviation 函数已损坏。它再次获得成绩:

float standard_deviation(int num_grades)
{
    float standarddev;
    int i;
    float formula = 0.0f;
    int* result = get_data(num_grades); /* XXX */
    formula = powf((*result - calc_average(num_grades, result)), 2);

你可以这样重写:

float standard_deviation(int num_grades, int* result)
{
    float standarddev;
    int i;
    float formula;
    formula = powf((*result - calc_average(num_grades, result)), 2);

当然还要相应地更新main

关于c - 输出打印扫描功能两次,而不是一次。需要修复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28130486/

相关文章:

java - For循环前进两个数字而不是一个

c - 在 Linux 上运行 FreeBSD 静态二进制文件?

linux - 帮助查找和替换字符串的 Shell 脚本

shell - xvfb 运行 : line 171: kill: (25939) - No such process

shell - 二郎 shell pretty-print 深度

c# - 如何循环遍历列表的一部分而另一部分保持不变

检查 C 中是否有可变参数

c - C 中函数的两个或多个值

c - 进一步优化 PLUS MULTIPLY 代码的方法 (codechef)

javascript - 即使我将其设置为不循环,HTML 5 视频也会继续循环