你的C语言够入门嵌入式吗???不妨做做这道考核题(学生信息系统)。#C语言考核题

前言

  本博文是对我自己C语言知识的考核题,也是入门嵌入式开发对C语言能力的要求。想要入门嵌入式的朋友可以一起做这道考核题。

1.考核题

  C语言考核题如下:
  题目:采用两个结构体,一个结构体记录学生信息,一个记录年级信息。
  情景:链表A,每个节点存放一个新链表,假设五个链表B1、B2、B3、B4、B5.
  场景:一个年级,相当于链表A,该年级的五个班,相当于B1、B2、B3、B4、B5,
  功能:录入成绩,语文、数学、英语,找出三科总分最高分、最低分,算出平均分。
  说明:本题主要考的是怎样才能在链表中插入链表动态创建链表只有怎样创建5个班每个班5个人,后面的功能录入成绩,语文、数学、英语,找出三科总分最高分、最低分,算出平均分,和静态链表是大同小异。动态创建链表

2.解题思路

  首先定义两个结构体,一个用于存放班级信息,一个用于存放学生信息。
  其次是将两个结构体连接起来,这是可以用到结构体指针。通过指针把两个结构体连接起来。
  最后通过输出两个结构体连接成的链表时进行平均数,最大值,最小值计算。

3.建立两个结构体

  1.班级结构体

struct StudentGrade  //学生班级结构体
{
	int grade;       //班级
	struct StudentGrade *next;  //指向学生班级结构体的指针变量next
	struct StudentInformation *nnext; //指向学生信息结构体的指针变量nnext
};

  2.学生信息结构体

struct StudentInformation   //学生信息结构体
{
	char   name[32];        //学生姓名
	float  chinese;         //语文成绩
	float  maths;           //数学成绩
	float  english;         //英语成绩
	struct StudentInformation *next2;  //指向学生信息结构体的指针变量
};

4.静态创建链表中嵌套链表并输出

1.分别定义3个班级,3个学生的结构体变量

    //                       班级 指向班级结构体指针  指向学生信息结构体指针
    struct StudentGrade g1 = {1,     NULL,            NULL};  //学生班级1
	struct StudentGrade g2 = {2,     NULL,            NULL};  //学生班级2
	struct StudentGrade g3 = {3,     NULL,            NULL};  //学生班级
	//                              姓名 语文    数学    英语 指向学生信息结构体指针
	struct StudentInformation i1 = {"aa",102,   103,    145, NULL};       //学生1
	struct StudentInformation i2 = {"bb",100.26,115.56, 145, NULL};       //学生2
	struct StudentInformation i3 = {"cc",145.27,103.445,146, NULL};       //学生3

2.把班级和学生信息连接在一起

    g1.next  = &g2;  //把班级结构体g1中的班级结构体指针变量next指向班级结构体g2
	g1.nnext = &i1;  //把班级结构体g1中的学生信息结构体指针变量nnext指向学生信息结构体i1
	i1.next2 = &i2;  //把学生信息结构体i1中的学生信息结构体指针变量next2指向学生信息结构体i2
	i2.next2 = &i3;  //把学生信息结构体i2中的学生信息结构体指针变量next2指向学生信息结构体i3
	g2.next  = &g3;  //把班级结构体g2中的班级结构体指针变量next指向班级结构体g3
	g2.nnext = &i1;  //把班级结构体g2中的学生信息结构体指针变量nnext指向学生信息结构体i1

  通过上面的代码就把三个学生的信息嵌入到班级一和班级二中了,(看不懂这里的朋友可以点击一下这里

3.输出创建的链表中嵌套链表

    puts("班级\t姓名\t语文\t数学\t英语");    //'\t'为制表符,默认空格4次
	//输出班级一的第一位同学的成绩
	printf("%d\t%s\t%.2f\t%.2f\t%.2f\t \n",
	      g1.grade,g1.nnext->name,g1.nnext->chinese,g1.nnext->maths,g1.nnext->english);
	//输出班级一的第二位同学的成绩
	printf("%d\t%s\t%.2f\t%.2f\t%.2f\t \n",
	      g1.grade,g1.nnext->next2->name,g1.nnext->next2->chinese,g1.nnext->next2->maths,g1.nnext->next2->english);
	//输出班级一的第三位同学的成绩      
	printf("%d\t%s\t%.2f\t%.2f\t%.2f\t \n",
	      g1.grade,g1.nnext->next2->next2->name,g1.nnext->next2->next2->chinese,g1.nnext->next2->next2->maths,g1.nnext->next2->next2->english);
	
	//输出班级二的第一位同学的成绩
	printf("%d\t%s\t%.2f\t%.2f\t%.2f\t \n",
	      g2.grade,g2.nnext->name,g2.nnext->chinese,g2.nnext->maths,g2.nnext->english);
	//输出班级二的第二位同学的成绩      
	printf("%d\t%s\t%.2f\t%.2f\t%.2f\t \n",
	      g2.grade,g2.nnext->next2->name,g2.nnext->next2->chinese,g2.nnext->next2->maths,g2.nnext->next2->english);
	//输出班级二的第三位同学的成绩      
	printf("%d\t%s\t%.2f\t%.2f\t%.2f\t \n",
	      g2.grade,g2.nnext->next2->next2->name,g2.nnext->next2->next2->chinese,g2.nnext->next2->next2->maths,g2.nnext->next2->next2->english);

  通过上述代码即可输出一班,二班学生的成绩。(看不懂’->'号的朋友可以点击这里

4.输出结果

静态输出链表桥头链表图

5.完整程序代码

#include <stdio.h>
/*
   时间:    2023年8月28日22:12:14
   程序功能:学生信息系统
*/

struct StudentInformation
{
	char   name[32];
	float  chinese;
	float  maths;
	float  english;
	struct StudentInformation *next2;
};

struct StudentGrade
{
	int grade;
	struct StudentGrade *next;
	struct StudentInformation *nnext;
};

int main()
{
	struct StudentGrade g1 = {1,NULL,NULL};
	struct StudentGrade g2 = {2,NULL,NULL};
	struct StudentGrade g3 = {3,NULL,NULL};
	
	struct StudentInformation i1 = {"aa",102,103,145,NULL};
	struct StudentInformation i2 = {"bb",100.26,115.56,145,NULL};
	struct StudentInformation i3 = {"cc",145.27,103.445,146,NULL};
	
	g1.next = &g2;
	g1.nnext = &i1;
	i1.next2 = &i2;
	i2.next2 = &i3;
	g2.next = &g3;
	g2.nnext = &i1;
	
	puts("班级\t姓名\t语文\t数学\t英语");
	printf("%d\t%s\t%.2f\t%.2f\t%.2f\t \n",
	      g1.grade,g1.nnext->name,g1.nnext->chinese,g1.nnext->maths,g1.nnext->english);
	printf("%d\t%s\t%.2f\t%.2f\t%.2f\t \n",
	      g1.grade,g1.nnext->next2->name,g1.nnext->next2->chinese,g1.nnext->next2->maths,g1.nnext->next2->english);
	printf("%d\t%s\t%.2f\t%.2f\t%.2f\t \n",
	      g1.grade,g1.nnext->next2->next2->name,g1.nnext->next2->next2->chinese,g1.nnext->next2->next2->maths,g1.nnext->next2->next2->english);
	
	printf("%d\t%s\t%.2f\t%.2f\t%.2f\t \n",
	      g2.grade,g2.nnext->name,g2.nnext->chinese,g2.nnext->maths,g2.nnext->english);
	printf("%d\t%s\t%.2f\t%.2f\t%.2f\t \n",
	      g2.grade,g2.nnext->next2->name,g2.nnext->next2->chinese,g2.nnext->next2->maths,g2.nnext->next2->english);
	printf("%d\t%s\t%.2f\t%.2f\t%.2f\t \n",
	      g2.grade,g2.nnext->next2->next2->name,g2.nnext->next2->next2->chinese,g2.nnext->next2->next2->maths,g2.nnext->next2->next2->english);
	
	return 0;
}

5.静态链表写了,是否可以动态创建呢?

1.创建一个结构体类型的学生班级的指针函数(班级)

struct StudentGrade *grade()  //结构体类型的学生班级的指针函数班级
{
	struct StudentGrade *new; //定义一个学生班级结构体指针变量new
	
	new = (struct StudentGrade *)malloc(sizeof(struct StudentGrade));  //为new动态分配一个结构体学生班级指针类型的大小为一个结构体学生班级大小的内存空间。
	puts("请输入班级");
	scanf("%d",&(new->grade));  //获取班级数
	new->next = NULL;           //将学生班级结构体指针变量new中的学生班级结构体指针变量next赋为空,防止悬挂指针。
	new->nnext = NULL;          //将学生班级结构体指针变量new中的学生信息结构体指针变量nnext赋为空,防止悬挂指针。
	
	return new;                 //返回new
}

2.创建一个结构体类型的学生信息的指针函数(信息)

struct StudentInformation *information()  //结构体类型的学生信息的指针函数(信息)
{
	struct StudentInformation *new;  //定义一个学生信息结构体指针变量new
	
	new = (struct StudentInformation *)malloc(sizeof(struct StudentInformation));  //为new动态分配一个结构体学生信息指针类型的大小为一个结构体学生信息大小的内存空间。
	
	//以下是分别输入学生学的姓名,语文成绩,数学成绩,英语成绩。
	puts("请输入姓名");
	scanf("%s",new->name);
	puts("请输入语文成绩");
	scanf("%f",&(new->chinese));
	puts("请输入数学成绩");
	scanf("%f",&(new->maths));
	puts("请输入英语成绩");
	scanf("%f",&(new->english));
	
	new->next2 = NULL;  //将学生信息结构体指针变量new中的学生信息结构体的指针变量next2赋空,防止悬挂指针。
	
	return new;
}

6.创建两个关键插入函数

1.创建一个空类型的名为插入班级的函数

void insterGrade(struct StudentGrade **head) //插入班级函数 形参为学生班级结构体二级指针变量head
{
	struct StudentGrade *new = grade();  //定义一个学生班级结构体指针变量new指向班级函数并调用
	
	if(*head == NULL)  //head的外层级为空
	{
		*head = new;   //把new赋给head的外层级
	}
	else
	{
		new->next = *head; //把head的外层所存放的学生班级信息赋给new的指向学生班级结构体的指针变量next
		*head = new;  //把new赋给head的外层级。
	}
}

2.创建一个空类型的名为插入信息函数

void insterInformation(struct StudentGrade *head)  //插入信息函数 形参为学生班级结构体指针变量head
{
	struct StudentInformation *new = information(); //定义一个学生信息结构体指针变量new指向信息函数并调用
	
	if(head->nnext == NULL) //如果head的指向学生信息结构体的指针变量nnext为空
	{
		head->nnext = new;  //把new赋给head的指向学生信息结构体的指针变量nnext
	}
	else
	{
		new->next2 = head->nnext; //把head的指向学生信息结构体的指针变量nnext赋给new的指向学生信息结构体的指针变量
		head->nnext = new;  //把new赋给head的指向学生信息结构体的指针变量nnext
	}
} 

7.建立最大值,最小值,平均值函数

1.创建一个空类型的名为获取最大值函数

void getMax(struct StudentGrade *head) //获取最大值函数 形参为学生班级结构体指针变量head
{
	struct StudentGrade *p = head;  //定义一个学生班级结构体指针变量p指向head
	
	while(p != NULL) //如果p不等于空
	{
		struct StudentInformation *p2 = p->nnext;  //定义一个学生信息结构体指针变量p2指向p的指向学生信息结构体的指针变量nnext
		while(p2 != NULL)//如果p2不等于空
		{
			if(p2->chinese > p2->maths && p2->chinese > p2->english)  //让p2中的语文的值分别与数学,英语的值比较,如果都大于,取语文最大值。以下每个if都类似算法。
			{
				printf("%d班的%s同学的最高分成绩为语文:%.2f\n",p->grade,p2->name,p2->chinese);
			}
			if(p2->maths > p2->chinese && p2->maths > p2->english)
			{
				printf("%d班的%s同学的最高分成绩为数学:%.2f\n",p->grade,p2->name,p2->maths);
			}
			if(p2->english > p2->chinese && p2->english > p2->maths)
			{
				printf("%d班的%s同学的最高分成绩为英语:%.2f\n",p->grade,p2->name,p2->english);
			}
			p2 = p2->next2;  //历循p2学生信息中所有同学的成绩信息
		}
		putchar('\n');   //输出换行符
		p = p->next;     //历循p学生班级中的所有班级
	}
}

2.创建一个空类型的名为获取最小值函数

void getMin(struct StudentGrade *head)  //获取最小值函数 形参为学生班级结构体指针变量head
{
	struct StudentGrade *p = head;  //定义一个学生班级结构体指针变量p指向head
	
	while(p != NULL)  //如果p不等于空
	{
		struct StudentInformation *p2 = p->nnext;  //定义一个学生信息结构体指针变量p2指向p的指向学生信息结构体的指针变量nnext
		while(p2 != NULL)  //如果p2不等于空
		{
			if(p2->chinese < p2->maths && p2->chinese < p2->english)  //让p2中的语文的值分别与数学,英语的值比较,如果都小于,取语文最小值。以下每个if都类似算法。
			{
				printf("%d班的%s同学的最低分成绩为语文:%.2f\n",p->grade,p2->name,p2->chinese);
			}
			if(p2->maths < p2->chinese && p2->maths < p2->english)
			{
				printf("%d班的%s同学的最低分成绩为数学:%.2f\n",p->grade,p2->name,p2->maths);
			}
			if(p2->english < p2->chinese && p2->english < p2->maths)
			{
				printf("%d班的%s同学的最低分成绩为英语:%.2f\n",p->grade,p2->name,p2->english);
			}
			p2 = p2->next2;  //历循p2学生信息中所有同学的成绩信息
		}
		putchar('\n');  //输出换行符
		p = p->next;    //历循p学生班级中的所有班级
	}
}

3.创建一个空类型的名为获取平均值函数

void getAverage(struct StudentGrade *head)  //获取平均值函数 形参为学生班级结构体指针变量head
{
	struct StudentGrade *p = head;  //定义一个学生班级结构体指针变量p指向head
	float tmp;                      //定义一个浮点型(原因是平均值可能为小数)的平均值变量tmp
	while(p != NULL)  //如果p不等于空
	{
		struct StudentInformation *p2 = p->nnext;  //定义一个学生信息结构体指针变量p2指向p的指向学生信息结构体的指针变量nnext
		while(p2 != NULL)  如果p2不等于空
		{
			tmp = (p2->chinese + p2->maths + p2->english)/3; //tmp等于p2中语文,数学,英语之和除以三。
			printf("%d班的%s同学的三科平均分为%.2f\n",p->grade,p2->name,tmp); //让平均值以保留2位小数输出。
			p2 = p2->next2;  //历循p2学生信息中所有同学的成绩信息
		}
		putchar('\n');  //输出换行符
		p = p->next;    //历循p学生班级中的所有班级
	}
}

8.打印学生成绩表函数

void printLink(struct StudentGrade *head)  //打印表函数 形参为学生班级结构体指针变量head
{
	struct StudentGrade *p = head;  //定义一个学生班级结构体指针变量p指向head
	
	puts("班级\t姓名\t语文\t数学\t英语"); //以4个空格间隔输出班级,姓名,语文,数学,英语
	while(p != NULL)  //如果p不等于空
	{
		printf("%d\t",p->grade);  //输出班级号
		struct StudentInformation *p2 = p->nnext;  //定义一个学生信息结构体指针变量p2指向p的指向学生信息结构体的指针变量nnext
		while(p2 != NULL)  //如果p2不等于空
		{
			printf("%s\t%.2f\t%.2f\t%.2f\t \n",
			       p2->name,p2->chinese,p2->maths,p2->english);   //输出p2中的语文,数学,英语成绩。
			p2 = p2->next2;  //历循p2学生信息中所有同学的成绩信息
			printf("%d\t",p->grade);  //输出班级号以修改对齐格式
		}
		putchar('\n');  //输出换行符
		p = p->next;    //历循p学生班级中的所有班级
	}
}

9.主函数

int main()
{
	struct StudentGrade *head = NULL;  //定义一个学生班级结构体指针变量head指向空
	
	int i;    //for外层循环变量
	int j;    //for内层循环变量
	int tmp;  //班级数变量
	int tmp2; //人数变量
	
	puts("\n程序功能:C语言考核题《学生管理系统》\n");
	
	puts("请输入有几个班级,每个班为几个人,以空格间隔,按回车结束");
	scanf("%d %d",&tmp,&tmp2);
	
	for(i=0; i<tmp; i++)
	{   insterGrade(&head);  //外层for循环调用插入班级函数,已实现建立学生班级                                                                              
		for(j=0; j<tmp2; j++)
		{
			insterInformation(head); //内层for循环调用插入信息函数,已实现建立学生信息
		}
	}
	
	printLink(head);  //打印学生成绩表
	getMax(head);     //获取最大值
	getMin(head);     //获取最小值
	getAverage(head); //获取平均值
	
	return 0;
}

10.完整程序代码

#include <stdio.h>
#include <stdlib.h>
/*
   时间:    2023年8月28日22:12:14
   程序功能:学生信息系统
*/

struct 	StudentInformation
{
	char   name[32];
	float  chinese;
	float  maths;
	float  english;
	struct StudentInformation *next2;
};

struct StudentGrade
{
	int grade;
	struct StudentGrade *next;
	struct StudentInformation *nnext;
};

struct StudentGrade *grade()
{
	struct StudentGrade *new;
	
	new = (struct StudentGrade *)malloc(sizeof(struct StudentGrade));
	puts("请输入班级");
	scanf("%d",&(new->grade));
	new->next = NULL;
	new->nnext = NULL;
	
	return new;
}

struct StudentInformation *information()
{
	struct StudentInformation *new;
	
	new = (struct StudentInformation *)malloc(sizeof(struct StudentInformation));
	puts("请输入姓名");
	scanf("%s",new->name);
	puts("请输入语文成绩");
	scanf("%f",&(new->chinese));
	puts("请输入数学成绩");
	scanf("%f",&(new->maths));
	puts("请输入英语成绩");
	scanf("%f",&(new->english));
	new->next2 = NULL;
	
	return new;
}

void insterGrade(struct StudentGrade **head)
{
	struct StudentGrade *new = grade();
	
	if(*head == NULL)
	{
		*head = new;
	}
	else
	{
		new->next = *head;
		*head = new;
	}
}

void insterInformation(struct StudentGrade *head)
{
	struct StudentInformation *new = information();
	
	if(head->nnext == NULL)
	{
		head->nnext = new;
	}
	else
	{
		new->next2 = head->nnext;
		head->nnext = new;
	}
} 

void printLink(struct StudentGrade *head)
{
	struct StudentGrade *p = head;
	
	puts("班级\t姓名\t语文\t数学\t英语");
	while(p != NULL)
	{
		printf("%d\t",p->grade);
		struct StudentInformation *p2 = p->nnext;
		while(p2 != NULL)
		{
			printf("%s\t%.2f\t%.2f\t%.2f\t \n",
			       p2->name,p2->chinese,p2->maths,p2->english);
			p2 = p2->next2;
			printf("%d\t",p->grade);
		}
		putchar('\n');
		p = p->next;
	}
}

void getMax(struct StudentGrade *head)
{
	struct StudentGrade *p = head;
	
	while(p != NULL)
	{
		struct StudentInformation *p2 = p->nnext;
		while(p2 != NULL)
		{
			if(p2->chinese > p2->maths && p2->chinese > p2->english)
			{
				printf("%d班的%s同学的最高分成绩为语文:%.2f\n",p->grade,p2->name,p2->chinese);
			}
			if(p2->maths > p2->chinese && p2->maths > p2->english)
			{
				printf("%d班的%s同学的最高分成绩为数学:%.2f\n",p->grade,p2->name,p2->maths);
			}
			if(p2->english > p2->chinese && p2->english > p2->maths)
			{
				printf("%d班的%s同学的最高分成绩为英语:%.2f\n",p->grade,p2->name,p2->english);
			}
			p2 = p2->next2;
		}
		putchar('\n');
		p = p->next;
	}
}

void getMin(struct StudentGrade *head)
{
	struct StudentGrade *p = head;
	
	while(p != NULL)
	{
		struct StudentInformation *p2 = p->nnext;
		while(p2 != NULL)
		{
			if(p2->chinese < p2->maths && p2->chinese < p2->english)
			{
				printf("%d班的%s同学的最低分成绩为语文:%.2f\n",p->grade,p2->name,p2->chinese);
			}
			if(p2->maths < p2->chinese && p2->maths < p2->english)
			{
				printf("%d班的%s同学的最低分成绩为数学:%.2f\n",p->grade,p2->name,p2->maths);
			}
			if(p2->english < p2->chinese && p2->english < p2->maths)
			{
				printf("%d班的%s同学的最低分成绩为英语:%.2f\n",p->grade,p2->name,p2->english);
			}
			p2 = p2->next2;
		}
		putchar('\n');
		p = p->next;
	}
}

void getAverage(struct StudentGrade *head)
{
	struct StudentGrade *p = head;
	float tmp;
	while(p != NULL)
	{
		struct StudentInformation *p2 = p->nnext;
		while(p2 != NULL)
		{
			tmp = (p2->chinese + p2->maths + p2->english)/3;
			printf("%d班的%s同学的三科平均分为%.2f\n",p->grade,p2->name,tmp);
			p2 = p2->next2;
		}
		putchar('\n');
		p = p->next;
	}
}

int main()
{
	struct StudentGrade *head = NULL;
	
	int i;
	int j;
	int tmp;
	int tmp2;
	
	puts("\n程序功能:C语言考核题《学生管理系统》\n");
	
	puts("请输入有几个班级,每个班为几个人,以空格间隔,按回车结束");
	scanf("%d %d",&tmp,&tmp2);
	
	for(i=0; i<tmp; i++)
	{   insterGrade(&head);
		for(j=0; j<tmp2; j++)
		{
			insterInformation(head);
		}
	}
	
	printLink(head);
	getMax(head);
	getMin(head);
	getAverage(head);
	
	return 0;
}

11.程序运行结果

在这里插入图片描述

结束语

  很高兴您能看到这里,这篇博文我在2023年9月份写了静态创建链表,因为学业繁重,不得不托到寒假来完成,可能无法达到刚完成考核题时的知识储备状态,不能写出更优质的内容,请见谅!接下来我会更新51单片机的电动车报警器博文,敬请期待!!!

  • 31
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值