记录学完C语言巩固练手的小项目
题目
链表A,每个节点存放一个新的链表B1,B2,B3,B4,B5的头结点。
场景:一个年级,相当于链表A,
该年级有5个班,每个班有5个人,相当于链表B
做一个学生成绩管理系统,学生成绩有语文、数学、英语
功能:录入成绩找三科总分的最高分、最低分,算出平均分
基础要求
C语言函数、指针、结构体和链表
通过双链表方式实现
整体代码
#include <stdio.h>
#include <stdlib.h>
struct Student//创建学生结构体
{
int num;
int chinese;
int math;
int english;
double average;
double sum;
struct Student *next;
};
struct Class//创建班级结构体
{
struct Student *stuhead;
int classnum;
struct Class *next;
};
struct Student *insertStuMessage(struct Student *head, struct Student *new)//头插法
{
if(head == NULL){//如果头结点为空
head = new;
}else{
new->next = head;
head = new;
}
return head;
}
struct Student *createStudent(struct Student *head, int stunum, int classnum)//动态创建学生链表
{
int i;
int num = stunum;//学生的人数
double sum;
double average;
struct Student *new;
for(i=0;i<stunum;i++){
new = (struct Student *)malloc(sizeof(struct Student));
printf("请输入第%d班第%d个学生的学号:\n",classnum,num);
scanf("%d",&(new->num));
printf("请输入第%d个学生的语文成绩:\n",num);
scanf("%d",&(new->chinese));
printf("请输入第%d个学生的数学成绩:\n",num);
scanf("%d",&(new->math));
printf("请输入第%d个学生的英语成绩:\n",num);
scanf("%d",&(new->english));
sum = new->chinese + new->math + new->english;
new->sum = sum;
average = sum/3;
new->average = average;
num--;
head = insertStuMessage(head,new);
}
return head;
}
struct Class *insertClaMessage(struct Class *head, struct Class *new)//头插法
{
if(head == NULL){
head = new;
}else{
new->next = head;
head = new;
}
return head;
}
struct Class *createClass(struct Class *head, int classnum, int stunum)//动态创建班级链表
{
struct Class *new = NULL;
struct Student *stuHead;
int num = classnum;
int i;
for(i=0;i<classnum;i++){
new = (struct Class*)malloc(sizeof(struct Class));
new->classnum = num;
stuHead = createStudent(stuHead,stunum,num);
new->stuhead = stuHead;
num--;
head = insertClaMessage(head,new);
}
return head;
}
void printMessage(struct Class *head, int classnum, int stunum)//打印输入的成绩
{
struct Class *p1 = head;
struct Student *p2 = NULL;
int k = stunum;
int i=0;
while(i < classnum)
{
p2 = p1->stuhead;
while(p2 != NULL && k>0){
printf("%d班第%d个学生的学号:%d\n",p1->classnum,k,p2->num);
printf("语文成绩为:%d\n",p2->chinese);
printf("数学成绩为:%d\n",p2->math);
printf("英语成绩为:%d\n",p2->english);
printf("总分成绩为:%lf\n",p2->sum);
printf("平均分成绩为:%lf\n",p2->average);
p2 = p2->next;
k--;
}
k = stunum;
p1 = p1->next;
i++;
}
}
int getMax(struct Class *head, int classnum, int stunum)//和获取学生总分最大值
{
struct Class *p1 = head;
struct Student *p2 = (struct Student *)malloc(sizeof(struct Student));
p2 = p1->stuhead;
int i = 0;
int j = 0;
int max = 0;
while(i < classnum){
while(j < stunum*classnum){
if(max < p2->sum){
max = p2->sum;
}
p2 = p2->next;
j++;
}
p1 = p1->next;
i++;
}
printf("****************************\n");
printf("最高总分为:%d\n",max);
printf("****************************\n");
}
int getMin(struct Class *head, int classnum, int stunum)//获取学生总分最小值
{
struct Class *p1 = head;
struct Student *p2 = (struct Student *)malloc(sizeof(struct Student));
p2 = p1->stuhead;
int i = 0;
int j = 0;
int min = 10000;
while(i < classnum){
while(j < stunum*classnum){
if(min > p2->sum){
min = p2->sum;
}
p2 = p2->next;
j++;
}
p1 = p1->next;
i++;
}
printf("****************************\n");
printf("最低总分为:%d\n",min);
printf("****************************\n");
}
float getAverage(struct Class *head, int classnum, int stunum)
{
struct Class *p1 = head;
struct Student *p2 = (struct Student *)malloc(sizeof(struct Student));
int i = 0;
int j = 0;
double sum = 0;
double average;
p2 = p1->stuhead;
while(i < classnum){
while(j < stunum*classnum){
sum = sum+p2->sum;
p2 = p2->next;
j++;
}
p1 = p1->next;
i++;
}
average = sum/(stunum*classnum);
printf("***********************\n");
printf("年级平均分为:%lf\n",average);
printf("************************\n");
}
int main()
{
printf("*************************\n");
printf("欢迎来到学生成绩管理系统\n");
printf("*************************\n");
int a;//班级人数
int b;//学生人数
int max;
struct Class *head;
printf("请输入有几个班级:\n");
scanf("%d",&a);
printf("请输入有几个学生:\n");
scanf("%d",&b);
head = createClass(head,a,b);
printMessage(head,a,b);
getMax(head,a,b);
getMin(head,a,b);
getAverage(head,a,b);
return 0;
}
代码解析
先创建学生结构体和班级结构体
struct Student//创建学生结构体
{
int num;
int chinese;
int math;
int english;
double average;
double sum;
struct Student *next;
};
struct Class//创建班级结构体
{
struct Student *stuhead;
int classnum;
struct Class *next;
};用头插法插入的方法,动态创建学生链表
struct Student *insertStuMessage(struct Student *head, struct Student *new)//头插法
{
if(head == NULL){//如果头结点为空
head = new;
}else{
new->next = head;
head = new;
}
return head;
}
struct Student *createStudent(struct Student *head, int stunum, int classnum)//动态创建学生链表
{
int i;
int num = stunum;//学生的人数
double sum;
double average;
struct Student *new;
for(i=0;i<stunum;i++){
new = (struct Student *)malloc(sizeof(struct Student));
printf("请输入第%d班第%d个学生的学号:\n",classnum,num);
scanf("%d",&(new->num));
printf("请输入第%d个学生的语文成绩:\n",num);
scanf("%d",&(new->chinese));
printf("请输入第%d个学生的数学成绩:\n",num);
scanf("%d",&(new->math));
printf("请输入第%d个学生的英语成绩:\n",num);
scanf("%d",&(new->english));
sum = new->chinese + new->math + new->english;
new->sum = sum;
average = sum/3;
new->average = average;
num--;
head = insertStuMessage(head,new);
}
return head;
}同理头插法和动态创建班级链表
struct Class *insertClaMessage(struct Class *head, struct Class *new)//头插法
{
if(head == NULL){
head = new;
}else{
new->next = head;
head = new;
}
return head;
}
struct Class *createClass(struct Class *head, int classnum, int stunum)//动态创建班级链表
{
struct Class *new = NULL;
struct Student *stuHead;
int num = classnum;
int i;
for(i=0;i<classnum;i++){
new = (struct Class*)malloc(sizeof(struct Class));
new->classnum = num;
stuHead = createStudent(stuHead,stunum,num);
new->stuhead = stuHead;
num--;
head = insertClaMessage(head,new);
}
return head;
}其余的就是打印输入的成绩(可省略),避免出错
还有就是获取最大值getMax,最小值getMin,平局值getAverage
主函数main()进行的一些函数的调用
师承--抖音上官社长(上官可编程)
版权声明:本文为weixin_57672679原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。