这道题是我初次接触到指针的函数题。所以做的十分认真。
原题:题目详情 - 习题9-6 按等级统计学生成绩 (pintia.cn)
#include <stdio.h>
#define MAXN 10
struct student {
int num;
char name[20];
int score;
char grade;
};
int set_grade(struct student* p, int n);
int main()
{
struct student stu[MAXN], * ptr; //指针变量跟stu的类型是一样的
int n, i, count;
ptr = stu;
//指针变量 ptr 指向结构体数组的第一个元素,即指向 stu[0]。
scanf("%d\n", &n);
for (i = 0; i < n; i++) {
scanf("%d%s%d", &stu[i].num, stu[i].name, &stu[i].score);
}//输入部分
count = set_grade(ptr, n);
printf("The count for failed (<60): %d\n", count);//利用set_grade输出有几个不及格
printf("The grades:\n");
for (i = 0; i < n; i++)
printf("%d %s %c\n", stu[i].num, stu[i].name, stu[i].grade);//输出分数评级
return 0;
}
int set_grade(struct student* p, int n)
{
int a = 0;//不及格个数
for (int i =0;i <n;i++) //利用for循环n次,结尾记上p++来遍历结构数组
{
while (p->score < 60)
{
a++;
break;
}
while (p->score >= 0 && p->score <= 100)
{
if (p->score < 60)
p->grade = 'D';
else if (p->score >= 60 && p->score < 70)
p->grade = 'C';
else if (p->score >= 70 && p->score <= 84)
p->grade = 'B';
else
p->grade = 'A';
break;
}
p++;
}
return a;
}
以上是标准答案。
但是做第一遍时候我是打算用for(;p=stu+3;++p)作为循环遍历语句的,后来才发现结构数组stu并不在函数形参里。于是我开始了对题目给出函数的改动。
#include <stdio.h>
#define MAXN 10
struct student {
int num;
char name[20];
int score;
char grade;
};
int set_grade(struct student* p, int n, struct student stu[]);
int main()
{
struct student stu[MAXN], * ptr; //指针变量跟stu的是一样的
int n, i, count;
ptr = stu;
//指针变量 ptr 指向结构体数组的第一个元素,即指向 stu[0]。
scanf("%d\n", &n);
for (i = 0; i < n; i++) {
scanf("%d%s%d", &stu[i].num, stu[i].name, &stu[i].score);
}//输入部分
count = set_grade(ptr, n, stu);
printf("The count for failed (<60): %d\n", count);
// 利用set_grade部分输出有几个不及格
printf("The grades:\n");
for (i = 0; i < n; i++)
printf("%d %s %c\n", stu[i].num, stu[i].name, stu[i].grade);
//输出分数评级
return 0;
}
int set_grade(struct student* p, int n, struct student stu[])
{
p = stu;
int a = 0;//不及格个数
for (p;p<stu+n;++p)
{
while (p->score < 60)
{
a++;
break;
}
while (p->score >= 0 && p->score <= 100)
{
if (p->score < 60)
p->grade = 'D';
else if (p->score >= 60 && p->score < 70)
p->grade = 'C';
else if (p->score >= 70 && p->score <= 84)
p->grade = 'B';
else
p->grade = 'A';
break;
}
}
return a;
}
标出部分为改动。
这次主要的学习资料来源:结构体指针,C语言结构体指针详解 (biancheng.net)