大一寒假作业之《学生选修课程系统设计》

本文介绍了如何用C语言实现一个简单的选修课程管理系统,包括文件操作,如读取、写入、删除和修改课程信息,以及菜单驱动的用户交互界面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天大一的学妹问了我一个关于学生选修课程系统设计的c语言寒假作业,正好借此机会复习一下c语言中的文件操作。

课程要求

假定有n门课程,每门课程有课程编号,课程名称,学时,学分,开课学期等信息,学生可按要求(如总学分不得少于60)自由选课。试设计一选修课程系统,使之能提供以下功能:

  1. 每一条记录包括一门选修课程信息的课程编号,课程名称,学时,学分,开课学期等信息,选修课程信息需要保存到文本文件(lesson.dat)中。
  2. 浏览选修课课程记录功能:从文件中读取所有选修课课程信息并显示(从lesson.dat文件中读取记录,每20个一停顿,用户按下任意键后继续显示下20条记录) 。
  3. 添加选修课课程信息:添加新选修课课程信息并保存到lesson.dat文件中,添加新选修课课程信息时,需判断不能添加相同课程编号的选修课程。
  4. 查询功能:从lesson.dat文件完成按学分或课程编号查找选修课课程记录,并显示。
  5. 选修课课程信息删除、修改功能(任选加分项)。

技术要求:

  1. 系统以菜单方式工作。

代码部分不完全由我编写,程序也只是实现了一个简单的小项目,主要复习了c语言的文件操作。
为了能让学妹看懂程序,相关解释已详细注释在程序中。

实现代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 300

typedef struct lesson {
	int id;				//课程编号
	char name[50];		//课程名称
	int lessoncount;	//课程学时
	int credits;		//课程学分
	int last;			//持续学期
} LESSON;

int ReadFromFile(LESSON stu[]);
void print(LESSON stu[], int n);
int input(LESSON stu[], LESSON addLesson[], int n);
void WritetoFile(LESSON stu[], int n);
int isLessonExist(LESSON *lessons, int n, int id);
void deletelesson (LESSON *lessons, int *n, int id);
void Modify(LESSON *lessons, int n, int id);
void Updata(LESSON stu[], int n);

//从键盘输入n个课程的信息到stu中
int main() {
	LESSON stu[N];
	int n, sum;
	int choice, id; //用户选择操作的编号,课程ID
	while(1) {
		printf("请选择操作:\n");
		printf("1.添加课程\n");
		printf("2.删除课程\n");
		printf("3.修改课程\n");
		printf("4.显示课程列表\n");
		printf("5.退出\n");
		printf("请选择: ");
		scanf("%d", &choice);
		
		n = ReadFromFile(stu);//课程总数
		switch (choice) {
			case 1://添加课程
				printf("how many lessons ?");
				scanf("%d", &n);
				LESSON addLesson[1000];
				sum = input(stu, addLesson, n);
				WritetoFile(addLesson, sum);
				break;
			case 2://删除课程
				printf("请输入要删除的课程编号:");
				scanf("%d", &id);
				deletelesson (stu, &n, id);
				break;
			case 3://修改课程
				printf("请输入要修改的课程编号:");
				scanf("%d", &id);
				Modify(stu, n, id);
				break;
			case 4://课程展示
				print(stu, n);
				break;
			case 5://退出系统
				printf("感谢下次使用!\n");
				exit(0);
			default://其余操作无效
				printf("输入无效,请重新选择!\n");
		}
		printf("\n");
	}
	return 0;
}

int input(LESSON stu[], LESSON addLesson[], int n) {
	int i, sum = 0;
	for (i = 0; i < n; i++) {
		printf("Input lessons %d:\n", sum + 1);
		printf("请输入课程编号:");
		scanf("%d", &addLesson[i].id);
		//检查课程编号是否存在
		if (isLessonExist(stu, n, addLesson[i].id)) {
			printf("该编号已存在请重新输入!\n");
			i --;
			continue;
		}
		//如果课程编号不存在,则读入课程信息
		printf("请输出课程名称: ");
		scanf("%s", addLesson[i].name);
		printf("请输出课程学时: ");
		scanf("%d", &addLesson[i].lessoncount);
		printf("请输出课程学分: ");
		scanf("%d", &addLesson[i].credits);
		printf("请输出课程持续学期: ");
		scanf("%d", &addLesson[i].last);
		sum ++;
	}
	return sum;
}

//输出n个课程信息到文件
void WritetoFile(LESSON stu[], int n) {
	FILE *fp;
	if ((fp = fopen("lesson.dat", "ab")) == NULL) {
		printf("Failure to open score lesson.dat ! \n");
		exit(0);
	}
	fwrite(stu, sizeof(LESSON), n, fp); //按数据块读写文件
	fclose(fp);
}

int ReadFromFile(LESSON stu[]) {
	FILE *fp;
	int i;
	if ((fp = fopen("lesson.dat", "a+")) == NULL) {
		printf("Failure to open score lesson.dat ! \n");
		exit(0);
	}
	// fscanf(fp, "%d", n); //从文件中读出n个课程
	for (i = 0; !feof(fp); i++) {
		fread(&stu[i], sizeof(LESSON), 1, fp);
	}
	fclose(fp);
	printf("total lessons is %d.\n", i - 1);
	return i - 1; //返回文件中的课程数
}

//输出n个课程的学生信息到公屏上
void print(LESSON stu[], int n) {
	int i;
	for (i = 0; i < n; i++) {
		if (i && i % 20 == 0) {
			printf("请按任意键显示更多课程!\n");
			puts("");
			getchar();
		}
		printf("%20d%10s%10d%10d%10d\n", stu[i].id, stu[i].name
		       , stu[i].lessoncount, stu[i].credits, stu[i].last);
	}
}

//查找课程
int isLessonExist(LESSON *lessons, int n, int id) {
	int i = 0;
	for (i = 0; i < n; i++) {
		if (lessons[i].id == id) {
			return 1;
		}
	}
	return 0;
}

//删除课程
void deletelesson(LESSON *lessons, int *n, int id) {
	int flag = 0; //标记课程是否删除成功
	int i = 0;
	for (i = 0; i < *n; i++) {
		if (lessons[i].id == id) {
			//查找到课程
			//将最后一个课程移到当前位置
			lessons[i] = lessons[(*n) - 1];
			(*n)--;
			flag = 1;
			break;
		}
	}
	if (flag) {
		printf("课程删除成功\n");
		Updata(lessons, *n);
	} else {
		printf("未找到指定课程编号!\n");
	}
}

//修改课程
void Modify(LESSON *lessons, int n, int id) {
	int flag = 0; //切记,表示课程是否删除成功
	int i = 0;
	for (i = 0; i < n; i++) {
		if (lessons[i].id == id) {
			printf("请输入新的课程名称:");
			scanf("请输入新的课程名称:");
			scanf("%s", lessons[i].name);
			printf("请输入新的课程学分:");
			scanf("%d", &lessons[i].credits);
			flag = 1;
			break;
		}
	}
	if (flag) {
		printf("课程信息更新成功!\n");
		Updata(lessons, n);
	} else {
		printf("未找到指定编号!\n");
	}
}

//更新课程信息
void Updata(LESSON stu[], int n) {
	FILE *fp;
	fp = fopen("lesson.dat", "wb");
	fwrite(stu, sizeof(LESSON), n, fp); //按数据块读写文件
	fclose(fp);
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值