一.学生成绩管理系统(简单)
要求包括学生的基本信息:学号,姓名,三门成绩的输入
平均成绩;学生的所有信息;找出平均成绩最高的学生;按学生的平均分进行从高到低排序;修改学生成绩;
效果(代码实现)
分段代码
1.头函数
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h>
2. 结构体
struct Student { int id; char name[10]; float scores[3]; float average; };
3. 学生学号,姓名,三门成绩的输入
注:结构体成员的访问
两种方法:
#define MAX_Student 100 //声明学生人数的最大限值 int N = 0; printf("请输入学生人数:"); scanf("%d", &N); struct Student students[MAX_Student]; //结构体定义学生人数的最大限值 int i = 0, j = 0; for (i = 0; i < N; i++) { printf("请输入第%d个学生的学号:", i + 1); //因为i是从0开始的,而且个数是正整数,所以i+1 scanf("%d", &students[i].id); printf("请输入第%d个学生的姓名:", i + 1); scanf("%s", students[i].name); //这里name不用&的原因:name是一个char数组,数组名就是地址 printf("请输入第%d个学生的三门成绩:", i + 1); for (j = 0; j < 3; j++) { scanf("%f", &students[i].scores[j]); } }
4.学生的平均成绩
简单的for循环体结构,注意float类型
int i = 0, j = 0; for (i = 0; i < N; i++) { float sum = 0.0, average = 0.0; for (j = 0; j < 3; j++) { sum += students[i].scores[j]; //该学生三门成绩的总和 } students[i].average = sum / 3.0; //该生三门成绩的平均值 }
5. 学生的所有信息
for (i = 0; i < N; i++) { printf("学号:%d\n", students[i].id); printf("姓名:%s\n", students[i].name); for (j = 1; j <= 3; j++) //j=1是第几门的成绩不能是0,所以也需j<=N { printf("%s的第%d门课程的成绩:%.2f\n", students[i].name, j, students[i].scores[j - 1]); } printf("%s的三门课程平均分:%.2f\n", students[i].name, students[i].average); //%.2f保留小数点后两位 }
6. 找出平均成绩最高的学生
int maxindex = 0; for (i = 0; i < N; i++) { if (students[i].average > students[maxindex].average) { maxindex = i; } } //输出平均分成绩最高的学生 printf("平均分成绩最高学生的信息如下:\n"); printf("学号:%d\n", students[maxindex].id); printf("姓名:%s\n", students[maxindex].name); printf("平均成绩:%.2f\n", students[maxindex].average);
7. 按学生的平均分进行从高到低排序
这是该代码最困难的一个
涉及qsort排序
关于qsort知识点和本结构的解释:
return 1,表示elem1 > elel2;
return -1,表示elem1 < elel2;
return 0,表示elem1 = elel2;
int com_students_average(const void* p1, const void* p2) { float diff = ((struct Student*)p1)->average - ((struct Student*)p2)->average; if (diff > 0) return -1; // 降序排序 else if (diff < 0) return 1; else return 0; } int main() { printf("对学生的平均分排序:\n"); qsort(students, N, sizeof(students[0]), com_students_average); for (i = 0; i < N; i++) { printf("学号:%d\n", students[i].id); printf("姓名:%s\n", students[i].name); printf("%s的三门课程平均分:%.2f\n", students[i].name, students[i].average); //以下的for循环表示该生的这三门课程的成绩,因这里只需学生的平均分排序,可根据需要把该段代码是否屏蔽 //for (j = 1; j <= 3; j++) //{ // printf("%s的第%d门课程的成绩:%.2f\n", students[i].name, j, students[i].scores[j - 1]); //因为最开始输入时,我是定义j=0,所以这里要j-1 //} printf("\n"); } return 0; }
8. 修改学生成绩(简单)
直接给成绩重新赋值
printf("请按顺序重新输入学生成绩:\n"); //输入 for (i = 0; i < N; i++) { for (j = 1; j <=3; j++) { printf("输入修改%s学生的%d门成绩:", students[i].name,j); scanf("%f", &students[i].scores[j]); } } printf("\n"); //输出 for (i = 0; i < N; i++) { for (j = 1; j <= 3; j++) { printf("%s的第%d门课程的成绩:%.2f\n", students[i].name, j, students[i].scores[j]); } }
全部代码
头函数及声明
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<string.h> #define MAX_Student 100
总代码
//结构体 struct Student { int id; char name[10]; float scores[3]; float average; }; int com_students_average(const void* p1, const void* p2) { float diff = ((struct Student*)p1)->average - ((struct Student*)p2)->average; if (diff > 0) return -1; // 降序排序 else if (diff < 0) return 1; else return 0; } int main() { int N = 0; printf("请输入学生人数:"); scanf("%d", &N); struct Student students[MAX_Student]; int i = 0, j = 0; for (i = 0; i < N; i++) { printf("请输入第%d个学生的学号:", i + 1); scanf("%d", &students[i].id); printf("请输入第%d个学生的姓名:", i + 1); scanf("%s", students[i].name); printf("请输入第%d个学生的三门成绩:", i + 1); for (j = 0; j < 3; j++) { scanf("%f", &students[i].scores[j]); } //计算平均成绩 float sum = 0.0, average = 0.0; for (j = 0; j < 3; j++) { sum += students[i].scores[j]; } students[i].average = sum / 3.0; } printf("\n"); //输出所有学生的信息 for (i = 0; i < N; i++) { printf("学号:%d\n", students[i].id); printf("姓名:%s\n", students[i].name); for (j = 1; j <= 3; j++) { printf("%s的第%d门课程的成绩:%.2f\n", students[i].name, j, students[i].scores[j - 1]); } printf("%s的三门课程平均分:%.2f\n", students[i].name, students[i].average); } //找出平均成绩最高的学生 int maxindex = 0; for (i = 0; i < N; i++) { if (students[i].average > students[maxindex].average) { maxindex = i; } } printf("\n"); //输出平均分成绩最高的学生 printf("平均分成绩最高学生的信息如下:\n"); printf("学号:%d\n", students[maxindex].id); printf("姓名:%s\n", students[maxindex].name); printf("平均成绩:%.2f\n", students[maxindex].average); printf("\n"); //3.对学生的平均分进行排序 printf("对学生的平均分排序:\n"); qsort(students, N, sizeof(students[0]), com_students_average); for (i = 0; i < N; i++) { printf("学号:%d\n", students[i].id); printf("姓名:%s\n", students[i].name); printf("%s的三门课程平均分:%.2f\n", students[i].name, students[i].average); //for (j = 1; j <= 3; j++) //{ // printf("%s的第%d门课程的成绩:%.2f\n", students[i].name, j, students[i].scores[j - 1]); //} printf("\n"); } printf("\n"); //4.修改学生成绩 printf("请按顺序重新输入学生成绩:\n"); //输入 for (i = 0; i < N; i++) { for (j = 1; j <=3; j++) { printf("输入修改%s学生的%d门成绩:", students[i].name,j); scanf("%f", &students[i].scores[j]); } } printf("\n"); //输出 for (i = 0; i < N; i++) { for (j = 1; j <= 3; j++) { printf("%s的第%d门课程的成绩:%.2f\n", students[i].name, j, students[i].scores[j]); } } return 0; }
二.在数组中找鞍点
鞍点的说明:在n行n列的数组中,找出该元素的该行最大的元素,该列最小的元素,为鞍点
简单来说:行大列小
效果(代码实现)
分段代码
1.头函数
#include<stdio.h>
2.数组的输入
#define Line 6 //声明 int a[Line][Line] = { 0 }; int n = 0; scanf("%d", &n); int i = 0, j = 0; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { scanf("%d", &a[i][j]); } }
3.找行大列小
int maxindex = 0, row = 0; for (i = 0; i < n; i++) { maxindex = 0; //重新定义为0 for (j = 1; j < n; j++) { //找列小 if (a[i][maxindex] <= a[i][j]) maxindex = j; } for (row = 0; row < n; row++) { //找行大 if (a[row][maxindex] < a[i][maxindex]) break; } if (row == n) //如果row(行)==n,输出 { printf("a[%d][%d]\n", i, maxindex); break; } }
4.没有找到鞍点
//如果i==n还没找到鞍点,就输出NO if (i == n) { printf("NO\n"); }
全部代码
头函数及声明
#include<stdio.h> #define Line 6
总代码
int main() { int a[Line][Line] = { 0 }; int n = 0; scanf("%d", &n); int i = 0, j = 0; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { scanf("%d", &a[i][j]); } } int maxindex = 0, row = 0; for (i = 0; i < n; i++) { maxindex = 0;//重新定义为0 for (j = 1; j < n; j++) { //找列小 if (a[i][maxindex] <= a[i][j]) maxindex = j; } for (row = 0; row < n; row++) { //找行大 if (a[row][maxindex] < a[i][maxindex]) break; } if (row == n) { printf("a[%d][%d]\n", i, maxindex); break; } } if (i == n) { printf("NO\n"); } return 0; }