c语言实现学生选课系统

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <string.h> 

struct work {       //学生信息结构体
	int Number;     //课程编号号
	char name[20];     //课程名称
	char sex;           // 课程性质
	char  date[20];       // 总学时
	char  date1[20];       // 授课学时
	char  date2[20];       // 上机学时
	float wages;        //学分
	char education[20]; //开课学期
	int xiaoxuan;  //选课信息
};
struct work worker[100], worker1;


void menu();  //主菜单
void input();  //输入课程信息
void save(int m);   //存储信息
int  read();    // 读取信息
void display();//浏览课程信息
void add();   //添加
void search();  //查找
void search_wages();  //按学分查找
void search_sex();  //按课程性质查找
void Delete();  //删除操作
void change();  //修改操作
void xuan();//选课操作
void Deletett();//退课操作


int main()
{
	int n;
	system("color F3");
	while (1)   
	{

		menu();      
		printf("请输入序号(1-8):  ");
		scanf_s("%d", &n);

		switch (n) {
		case 1:   system("cls");
			printf("\n");
			printf("录入课程信息\n");
			input();
			break;        
		case 2:   system("cls");
			printf("\n");
			printf("浏览课程信息\n");
			display();
			printf("\n按Enter键继续\n");
			getchar();
			getchar();
			system("cls");
			break;          //执行到相应程序跳出switch
		case 3:   system("cls");
			printf("\n");
			printf("查询课程信息\n");
			search();
			break;          //执行到相应程序跳出switch  
		case 4:   system("cls");
			printf("\n");
			printf("删除课程信息\n\n");
			Delete();
		case 5:   system("cls");
			printf("\n");
			printf("修改课程信息\n");
			display();                     //调用浏览函数  
			change();
			break;          //执行到相应程序跳出switch
		case 6:   system("cls");
			xuan();
		case 7:  system("cls");
			Deletett();
		case 8:	  system("cls");
			printf("Thank you for using !\n\n\n\n\n\n");
			getchar();
			getchar();
			exit(8);
			break;           //执行到相应程序跳出switch
		}
	}
}



void menu()   //主菜单
{
	printf("                学生选修课系统                           \n\n");
	printf("            1.录入课程信息              \n");	
	printf("	    2.浏览课程信息              \n");
	printf("            3.查询课程信息              \n");
	printf("	    4.删除课程信息              \n");
	printf("            5.修改课程信息              \n");	
	printf("	    6.选课+浏览+预警            \n");
	printf("            7.退课                      \n");
	printf("	   8.退出选课系统              \n");
	printf("\n");
}

void input()       //录入课程信息
{
	int i, j, m, num;
	char s = 'W';
	char t = 'M';
	char sex;
	printf("尊敬的领导,请您输入需要创建新的选修课程数量: ");
	scanf_s("%d", &m);
	system("cls");
	printf("\n");
	for (i = 0; i < m; i++)      //循环录入m个新的选修课程信息
	{
		printf("第%d个选修课信息输入:\n", i + 1);
		printf("请输入选修课号: ");
		scanf_s("%d", &num);
		worker[i].Number = num;         //将重新输入的选修课号录入程序中
		printf("请输入课程名称:  ");
		scanf("%s", &worker[i].name);
		do
		{
			printf("请输入课程性质(W/M)(W为一类,M为二类):  ");
			getchar();
			scanf("%c", &worker[i].sex);
		} while (1);
		printf("请输入总学时:  ");
		scanf("%s", &worker[i].date);


		do
		{
			printf("请输入学分:  ");
			scanf_s("%f", &worker[i].wages);
			if (worker[i].wages > 0)
			{
				break;
			}
			else
			{

				printf("对不起,您输入格式错误,请重新输入!\n");

			}
		} while (1);

		printf("请输入开课学期:  ");
		scanf("%s", worker[i].education);

		system("cls");
		printf("\n一个新的信息创建完成!\n\n");
	}
	save(m);      //保存入文件中
}


void save(int m)  //保存文件函数 
{
	int i;
	FILE* fp;
	if ((fp = fopen("C:\\选修课.txt", "wb")) == NULL) /*创建文件并判断是否能打开*/
	{
		printf("cannot open file!\n");
		exit(0);
	}
	for (i = 0; i < m; i++) /*将内存中职工的信息输出到磁盘文件中去*/
		if (fwrite(&worker[i], sizeof(struct work), 1, fp) != 1)
			printf("file write error!\n");
	fclose(fp);
}

int read()  //导入函数 
{
	FILE* fp;
	int i = 0;
	if ((fp = fopen("C:\\选修课.txt", "rb")) == NULL)
	{
		printf("cannot open file!\n");
		exit(0);
	}
	else
	{
		do {
			fread(&worker[i], sizeof(struct work), 1, fp);
			i++;
		} while (feof(fp) == 0);
	}
	fclose(fp);
	return(i - 1);
}

void display()  //浏览选修课信息
{
	int i;
	int m = read();   //读取文件
	printf("\n所有选修课信息:\n");
	printf("\n选修课号\t选修课名称\t性质\t总学时\t学分\t开课学期\n");
	for (i = 0; i < m; i++)
		printf("\n%d\t%s\t%c\t%s\t%5.2f\t%s\n", worker[i].Number, worker[i].name, worker[i].sex, worker[i].date, worker[i].wages, worker[i].education);
	printf("\n");
}

void search()//查询选修课信息
{
	int t;
	do {
		printf("\n 学分查询请按 1;   课程性质查询请按 2;  进入主菜单请按 0 : ");
		scanf("%d", &t);     //输入数字对应操作选项
		if (t >= 0 && t <= 3)
		{
			break;
		}
		else { printf("您输入有误,请重新选择!"); }
	} while (0);
	system("cls");
	while (1)
	{
		switch (t)
		{
		case 0: main();
			break;
		case 1: printf("\n按学分查询\n");
			//search_wages();
			break;
		case 2: printf("\n按课程性质查询\n");
			search_sex();
			break;
		default:break;
		}
		system("cls");
	}
}

void search_sex()//按课程性质查信息
{
	char num1;
	int i, t, n = 0;
	int m = read();
	printf("\n请输入要查找的课程性质:  ");
	scanf("%d", &num1);
	for (i = 0; i < m; i++)    //遍历  
		if (num1 == worker[i].sex)
		{
			if (n == 0)
			{
				printf("\n已找到以下信息:\n");
				printf("\n选修课号\t选修课名称\t性质\t总学时\t学分\t开课学期\n");
			}
			n++;
			printf("\n %d\t%s\t%c\t%s\t%5.2f\t%s\n", worker[i].Number, worker[i].name, worker[i].sex, worker[i].date, worker[i].wages, worker[i].education);
		}
	if (n == 0)  //没有一个符合条件
	{
		printf("\n没有!\n");
		getchar();
		getchar();
	}
	else
	{
		printf("\n查询到有 %d 个员工符合要求。\n", n);
		printf("\n");
		printf("删除选修课请按 1,修改信息请按 2,继续查询请按 3,返回上一层请按 4,返回主菜单请按 0 :");
		scanf("%d", &t);       //输入数字对应操作选项
		switch (t)
		{
		case 0: system("cls");
			main();
			break;
		case 1: //Delete();
			break;
		case 2: //change();
			break;
		case 3: break;
		case 4: system("cls");
			search();
			break;
		default:break;
		}
	}
	printf("返回主菜单请按 0 :");
	scanf("%d", &t);       //输入数字对应操作选项
	switch (t)
	{
	case 0: system("cls");
		main();
		break;
	case 1: //Delete();
		break;
	case 2: //change();
		break;
	case 3: break;
	case 4: system("cls");
		search();
		break;
	default:break;
	}
}

void Delete()   //删除课程信息 
{
	int m = read();    //读取文件
	int i, j, t, n, f, Num;   //f用于调用第一个switch中的函数   t用于下面第二个switch语句调用Delete和返回   n用于下面确认是否删除 
	display();
	printf("请您输入要删除的选修课号:  ");
	scanf("%d", &Num);
	for (i = 0, f = 1; f && i < m; i++)
	{
		if (worker[i].Number == Num)
		{
			printf("\n已找到此选修课,原始记录为:\n");
			printf("\n选修课号\t选修课名称\t性质\t总学时\t学分\t开课学期\n");
			printf("\n %d\t%s\t%c\t%s\t%5.2f\t%s\n", worker[i].Number, worker[i].name, worker[i].sex, worker[i].date, worker[i].wages, worker[i].education);
			printf("\n确认删除请按 1,取消删除请按 0: ");
			scanf("%d", &n);
			if (n == 1)
			{
				for (j = i; j < m - 1; j++)
					worker[j] = worker[j + 1];      //当找到第j个职工时,for语句后j自加了1,所以下面的应该把改后的信息赋值给第j-1个人     
				f = 0;
			}
			else f = 2;
		}
	}
	system("cls");
	switch (f) {
	case 0: m = m - 1;
		printf("\n\t\t\t\t\t删除成功!\n");
		save(m);     //调用保存函数    
		display();  //调用浏览函数
		break;
	case 1: printf("\n\t\t\t\t对不起,没有!\n");
		display();  //调用浏览函数
		break;
	case 2: printf("\n\t\t\t\t取消删除!\n");
		break;
	}
	//display();  /*调用浏览函数*/
	printf("\n继续删除请按1,返回主菜单请按0: ");
	scanf("%d", &t);    //输入t调用switch中的函数
	system("cls");
	switch (t)
	{
	case 1:  Delete();
		break;
	case 0:  system("cls");
		main();
		break;
	default: break;
	}
	system("cls");
}

void change()     //修改课程信息 
{
	int Number;
	char name[20];
	char sex;
	char  date[20];
	char education[20];
	float wages;
	int b = 1, c, i, j, n, t, k = 0, g;
	int m = read();               //导入文件内的信息
	printf("\n");
	printf("请输入要修改的选修课的选修课号:  ");
	scanf("%d", &Number);
	system("cls");
	for (i = 0; i < m; i++)
	{
		if (worker[i].Number == Number)
		{
			k = 1;
			printf("\n已找到,其记录为:\n");
			printf("\n选修课号\t选修课名称\t性质\t总学时\t学分\t开课学期\n");
			printf("\n %d\t%s\t%c\t%s\t%5.2f\t%s\n", worker[i].Number, worker[i].name, worker[i].sex, worker[i].date, worker[i].wages, worker[i].education);
			printf("\n确认修改请按1,取消修改请按0:");
			scanf("%d", &n);
			if (n == 1)
			{
				printf("\n需要进行修改的选项\n 1.选修课号  2.选修课名  3.性质  4.总学时  5.学分  6.开课信息    \n");
				printf("请输入你想修改的那一项序号:  ");
				scanf("%d", &c);               //输入数字对应操作选项   
				do {
					switch (c)
					{
					case 1: printf("选修课号改为: ");
						scanf("%d", &g);
						worker[j].Number = g;         //将重新输入的职工号录入程序中
						break;
					case 2: printf("选修课名改为: ");
						scanf("%s", name);
						strcpy(worker[i].name, name);
						break;
					case 3: printf("性质改为:");
						getchar();
						scanf("%c", &sex);
						worker[i].sex = sex;
						break;
					case 4: printf("总学时改为: ");
						scanf("%s", &date);
						strcpy(worker[i].date, date);
						break;

					case 5: printf("学分改为: ");
						scanf("%f", &wages);
						worker[i].wages = wages;
						break;
					case 6: printf("开课学期改为: ");
						scanf("%s", education);
						strcpy(worker[i].education, education);
						break;

					}
					printf("\n确认修改 请按1,重新输入 请按2:   ");
					scanf("%d", &b);
					if (b == 1)
					{
						system("cls");
						save(m);//储存修改后的数据
						printf("\n");
						display();//浏览修改后的数据
					}
				} while (b == 2);
			}
		}

		else if (i == (m - 1)) i++;
	}
	if (k == 0) {
		printf("\n对不起,您输入有误!\n");
		getchar();
		getchar();
	}
	else {
		printf("\n继续修改请按 1,退出修改请按 0:  ");
		scanf("%d", &t);
	}
	system("cls");
	switch (t)
	{
	case 1: display();
		change();//返回修改函数
		break;
	case 0: break;
	default:break;
	}
	system("cls");
}

void xuan()
{
	int num, i, m, t, zong = 0;
	display();
	printf("尊敬的同学,请输入需要选的选修课程数量: ");
	scanf_s("%d", &m);
	printf("\n");
	for (i = 0; i < m; i++)//循环录入m个新的选修课程信息
	{
		printf("第%d个选修课信息输入:\n", i + 1);
		printf("请输入选修课号: ");
		scanf_s("%d", &num);
		worker[i].xiaoxuan = num;         //将重新输入的选修课号录入程序中
		zong += worker[i].wages;

	}
	printf("选课成功\n返回主菜单请按1:\n");
	if (zong < 30)
		printf("警告!!!!所选课总学分少于30,建议再次选择");
	scanf("%d", &t);
	if (t == 1)
		system("cls");
	main();

}

void Deletett()   //删除选课信息 
{
	int m = read();    //读取文件
	int i, j, t, n, f, Num;
	display();
	printf("请您输入要退选的选修课号:  ");
	scanf("%d", &Num);
	for (i = 0, f = 1; f && i < m; i++)
	{
		if (worker[i].Number == Num)    //判断输入职工号是否与原职工号相同
		{
			printf("\n已找到此选修课,原始记录为:\n");
			printf("\n选修课号\t选修课名称\t性质\t总学时\t学分\t开课学期\n");
			printf("\n %d\t%s\t%c\t%s\t%5.2f\t%s\n", worker[i].Number, worker[i].name, worker[i].sex, worker[i].date, worker[i].wages, worker[i].education);
			printf("\n确认退课请按 1,取消退课请按 0: ");
			scanf("%d", &n);
			if (n == 1)   //如果删除,则其他的信息都向前移一行  
			{
				for (j = i; j < m - 1; j++)
					worker[j].xiaoxuan = worker[j + 1].xiaoxuan;
				f = 0;
			}
			else f = 2;
		}
	}
	system("cls");
	switch (f) {
	case 0: m = m - 1;
		printf("\n\t\t\t\t删除成功!\n");
		save(m);     //调用保存函数    
		display();  //调用浏览函数
		break;
	case 1: printf("\n\t\t\t对不起,没有!\n");
		display();  //调用浏览函数
		break;
	case 2: printf("\n\t\t\t\t取消删除!\n");
		break;
	}
	//display();  /*调用浏览函数*/
	printf("\n返回主菜单请按0: ");
	scanf("%d", &t);    //输入t调用switch中的函数
	system("cls");
	switch (t)
	{
	case 0:  system("cls");
		main();
		break;
	default: break;
	}
	system("cls");
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值