我的C/C++之路-010课(结构体使用的简单实例(学生成绩管理))

最近比较忙,几天没写了。今天做的是结构体的应用(学生的成绩管理),相信很多朋友都做过,我这里献丑下,C比较难控制,所以在里面有很多不是很好的功能,大家可以自己完善下。

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/**
	结构体使用的简单实例:
	1.创建学生成绩结构体(包含学号,姓名,语文,数学,英语成绩)
	使用链表指向下一个学生(由于输入学生个数未知,使用数组方式不怎么好)

	2.提供学生成绩插入,查询,更改,删除
*/
typedef struct Student
{
	char no[4];//3位数的学号,输入多的会出错
	char name[10];
	int chinese;
	int math;
	int english;
	struct Student *next;//指向下一个学生

}StudentList;
void init(StudentList *&);
void select(StudentList *);    //查询成绩
void insert(StudentList *&);   //录入成绩
void update(StudentList *&);   //更新成绩
void deleteData(StudentList *);//删除数据

void studentScoreManege()
{
	StudentList *stuList = NULL;
	int oprate;
	init(stuList);//初始化
	do{
		system("cls");
		fflush(stdin);
		puts("************* Student Data Oprate *******************");
		puts("*    1. select student score                        *");
		puts("*    2. insert student score                        *");
		puts("*    3. update student score                        *");
		puts("*    4. delete student data                         *");//删除全部数据,虽然实际不能这样做,这里为了简便设计
		puts("*    0. exit                                        *");
		puts("*****************************************************");
		printf("please select a number: ");
		
		scanf("%d",&oprate);
		switch(oprate)//根据不同选择执行不同操作
		{
		case 1:
			select(stuList);
			break;
		case 2:
			insert(stuList);
			break;
		case 3:
			update(stuList);
			break;
		case 4:
			deleteData(stuList);
			break;
		case 0:
		default:
			break;
		}
	}while(oprate!=0);
}
//初始化表头
void init(StudentList *&stuList)
{
	stuList = (StudentList *)malloc(sizeof(StudentList));
	stuList->next = NULL;
}

//查询成绩
void select(StudentList *stuList)
{
	StudentList *p = stuList->next;
	if(p==NULL)
	{
		puts("there is no data,please insert!!");
		puts("press any key to return!!!");
		getchar();
	}
	puts("**************  student score insert *********************");
	puts("No\tName\tChinese\tMath\tEnglish");
	while(p!=NULL)
	{
		printf("%s\t%s\t%d\t%d\t%d\n",p->no,p->name,p->chinese,p->math,p->english);
		p = p->next;
	}
	fflush(stdin);
	puts("press any key to return!!!");
	getchar();
}
//录入成绩
void insert(StudentList *&stuList)
{
	StudentList *p ,*s;
	p = stuList;
	while(p->next != NULL)
	{
			p = p->next;
	}
	do{
		s = (StudentList *)malloc(sizeof(StudentList));
		
		puts("please insert student data(NO,Name,Chinese,Math,English):");
		scanf("%3s%10s",&s->no,&s->name);
		scanf("%d%d%d",&s->chinese,&s->math,&s->english);
		//判断数据合法性,关于学号的重复性大家自己写校验
		if(s->chinese<0||s->chinese>100||s->math<0||s->math>100||s->english<0||s->english>100)
		{
			puts("input data error !!!");
			return;
		}
		s->next = NULL;
		p->next = s;
		p = p->next;//为下一次循环录入准备
		fflush(stdin);//清除缓冲区的 '\n' 不然下面的getchar()不起作用
		puts("Continue?ENTER to yes or input no to exit");//是否继续录入
	}while(getchar()=='\n');

}
//更新
void update(StudentList *&stuList)
{
	StudentList *p = stuList->next;
	char no[4];//3位学号,如用户输入4~位学号,这里关于越界的问题,大家自己处理
	fflush(stdin);//还是先清空缓冲区
	puts("please input student No: ");
	gets(no);
	//显示当前学号的学生数据
	if(p==NULL)
	{
		puts("there is no record,please insert!!");
		puts("press any key to return!!!");
		getchar();
		return;
	}
	else
	{
		while(p!=NULL)
		{
			if(!strcmp(p->no,no)){//如果查找到,则进行显示
				puts("NO\tNAME\tChinese\tMath\tEnglish");
				printf("%s\t%s\t%d\t%d\t%d\n",p->no,p->name,p->chinese,p->math,p->english);
				break;
			}
			else{
				p = p->next;
			}
		}
		if(p==NULL)//未找到
		{
			puts("can't find this student's record!!!");
			puts("press any key to return!!!");
			getchar();
			return;
		}
	}
	//只能这样简单的更新了,喜欢的自己改进
	puts("please update student data(Name,Chinese,Math,English):");
	scanf("%10s",&p->name);
	scanf("%d%d%d",&p->chinese,&p->math,&p->english);
	fflush(stdin);
	puts("update successful,press any key to return!!!");
	getchar();
}
//删除数据
void deleteData(StudentList *stuList)
{
	/* 前面这个部分和更新差不多,只是指针有变化,因为需要删除,
		比如 a->b->c,要删除b,则需要a->c后,才free(b),
		操作就是a->next=b->next
	*/
	StudentList *p = stuList,*q;
	char no[4];//3位学号,如用户输入4~位学号,这里关于越界的问题,大家自己处理
	fflush(stdin);//还是先清空缓冲区
	puts("please input student No: ");
	gets(no);
	//显示当前学号的学生数据
	if(p->next==NULL)
	{
		puts("there is no record !!!");
		puts("press any key to return!!!");
		getchar();
		return;
	}
	else
	{
		while(p->next!=NULL)
		{
			if(!strcmp(p->next->no,no)){//如果查找到,则进行显示
				puts("NO\tNAME\tChinese\tMath\tEnglish");
				printf("%s\t%s\t%d\t%d\t%d\n",p->next->no,p->next->name,p->next->chinese,p->next->math,p->next->english);
				break;
			}
			else{
				p = p->next;
			}
		}
		if(p->next==NULL)//未找到
		{
			puts("can't find this student's record!!!");
			puts("press any key to return!!!");
			getchar();
			return;
		}
	}
	puts("Are you sure delete this record? press ENTER to confirm or other key to cancel!!!");
	if(getchar()=='\n')//删除操作,如果这步不懂,大家可以去GOOGLE OR BAIDU链表的删除操作
	{
		q = p->next;
		p->next = q->next;
		free(q);//释放内存
	}
	puts("delete successful,press any key to return!!!");
	getchar();
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值