对整数进行排序并给出平均值

时间:2015-06-17 22:08:47

标签: c

晚上好,我本周才开始学习C,所以请耐心等待。我需要我的程序来安排从最高到最低值的等级,并给出最大,最小和平均计算。如果你能指出我正确的方向,这将是伟大的。请记住,我还在学习C语言。

谢谢! 托尼

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

int main()
{
char name[40];
char mood[20];
char a1name[15];
char a2name[15];
char a3name[15];
char a4name[15];

int numberofassignments;    
int score;
int firstgrade;
int a1, a2, a3, a4, a5, a6;

/* Intro */


printf("Enter your first name: \n");
scanf("%s", name);

printf("Hello, %s, How are you? \n", name);
scanf("%s", mood);

printf("Glad you're %s. \n\r", mood);


printf("How many assignments do you have? \n");
scanf("%d", &numberofassignments);
printf("Ok so you have %d assignments.  \n", numberofassignments);

/* Assignment Names */

printf("What is the name of your first assignment? \n");
scanf("%s", a1name);

printf("What is the name of your Second assignment? \n");
scanf("%s", a2name);

printf("What is the name of your Third assignment? \n");
scanf("%s", a3name);

printf("What is the name of your Fourth assignment? \n");
scanf("%s", a4name);

/* Assignment Grades */

printf("What is your grade for %s? ", a1name);
scanf("%d", &a1);

printf("What is your grade for %s? ", a2name);
scanf("%d", &a2);

printf("What is your grade for %s? ", a3name);
scanf("%d", &a3);

printf("What is your grade for %s? ", a4name);
scanf("%d", &a4);

/* Assignment Grade and name overview */


printf("First Assignment: %s \n", a1name);
printf("Grade: %d \n", a1);

printf("First Assignment: %s \n", a2name);
printf("Grade: %d \n", a2);

printf("First Assignment: %s \n", a3name);
printf("Grade: %d \n", a3);

printf("First Assignment: %s \n", a4name);
printf("Grade: %d \n", a4);




return 0;
}

1 个答案:

答案 0 :(得分:2)

您的代码还有很大的改进空间,但我会尝试只关注您提出的问题,看看我是否可以帮助您找到解决方案。 @BLUEPIXY给出的评论中的第一个建议(关于一系列结构)也是我开始的地方。例如:

typedef struct
{
    char name[15];
    int grade;
} Assignment;

使用上述结构,您现在可以声明类型Assignment的变量(或在本例中为数组),如下所示:

Assignment assignmentData[15];

在这种情况下使用结构有两个优点。一个是,对于给定的作业(即assignmentData[0]),我们现在将名称与成绩相关联。另一个是你现在可以利用循环,如下所示:

unsigned char i;

/* Note 1: numberofassignemnts must be less than 15. */
for (i = 0; i < numberofassignments; i++)
{
    /* Note 2: As @Mauricio points out in the comment, you
       will have problems if the user inputs more than 15 characters. */
    printf("What is the name of assignment number %d?\n", (i+1));
    scanf("%s", assignmentData[i].name);

    printf("What is your grade for %s?\n", assignmentData[i].name);
    scanf("%d", &assignmentData[i].grade);
}

此时您可以看到使用上述结构的优势。对结构进行排序可以通过不同的方式进行...例如,您可以声明第二个数组:

Assignment sortedAssignments[15];

然后,使用while()循环迭代原始分配。首先将具有最高成绩的作业放入sortedAssignments,直到您将所有赋值数据移动到sortedAssignments中。它不是最优雅的解决方案,但它易于理解和实施。我还鼓励您搜索有关链接列表和其他排序方法的信息。它们可以更高效,并允许您根据用户输入动态创建更大的数据集......但我离题了。

最后,最大值,最小值和平均值的函数实现起来非常简单。排序后,您知道最大值是数组中的第一个赋值(sortedAssignments[0].grade),最小值是数组中的最后一个赋值(sortedAssignments[numberofassignments - 1].grade)。在我们上面使用的原始for()循环中,平均值可以在另一个循环中完成......甚至更好:

    ...
    scanf("%d", &assignmentData[i].grade);

    /* Assuming that we declared: int avg = 0;*/
    avg = avg + assignmentData[i].grade;
}  /* End of for() loop */

avg = avg / numberofassignments;

我希望这有助于让你走上正轨。我特意遗漏了代码来实际排序你的作业,因为这是你应该自己尝试的。祝你好运!