昨天大一的学妹问了我一个关于学生选修课程系统设计的c语言寒假作业,正好借此机会复习一下c语言中的文件操作。
课程要求
假定有n门课程,每门课程有课程编号,课程名称,学时,学分,开课学期等信息,学生可按要求(如总学分不得少于60)自由选课。试设计一选修课程系统,使之能提供以下功能:
- 每一条记录包括一门选修课程信息的课程编号,课程名称,学时,学分,开课学期等信息,选修课程信息需要保存到文本文件(lesson.dat)中。
- 浏览选修课课程记录功能:从文件中读取所有选修课课程信息并显示(从lesson.dat文件中读取记录,每20个一停顿,用户按下任意键后继续显示下20条记录) 。
- 添加选修课课程信息:添加新选修课课程信息并保存到lesson.dat文件中,添加新选修课课程信息时,需判断不能添加相同课程编号的选修课程。
- 查询功能:从lesson.dat文件完成按学分或课程编号查找选修课课程记录,并显示。
- 选修课课程信息删除、修改功能(任选加分项)。
技术要求:
- 系统以菜单方式工作。
代码部分不完全由我编写,程序也只是实现了一个简单的小项目,主要复习了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);
}