每条记录包括:课程编号,课程名称,课程性质,学分,开课时期;
能够添加,删除,修改功能;
能够查询课程信息;
能够按开课学期统计总学分。
如何用c语言编写课程信息管理系统?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
关注 /* 课程管理系统: 功能:假定有n门课程,每门课程有课程编号,课程名称,总学时,学分,开课学期 等信息。试设计一课程管理系统,使之能提供以下功能: 1对课程信息的录入、修改、删除功能; 2按课程名排序后浏览; 3按课程查询、按学分查询; */ #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> #include<stdbool.h> struct info { int number;//课程编号 char name[100];//课程名称 int hours;//总学时 int credit;//学分 int semester;//开课学期 bool flag;//数据有效标记 } temp;//临时中转 struct info a[20];//数据存储 int size = sizeof(struct info);//结构体单条数据占用空间 int n = 0;//有效数据个数 void input();//1 录入信息 void look();//2 浏览所有信息(排序后) void QueryName();//3 查询信息(名称) void modify();//4 修改信息 void del();//5 删除信息 void QueryCredit();//6 查询信息(学分) void writeToFile(); void load(); //copy类的函数主要用于数据的排序 void copy1(int i); void copy2(int i, int j); void copy3(int i); void display_all();//显示所有的有效数据 void display(); //特定行的数据 void display_header();//表头 void display_end();//表尾 int main(void)//true { long long t = 0; FILE* fp; if ((fp = fopen("info.dat", "rb+")) != NULL) { fpos_t pos;//定义pos fgetpos(fp, &pos);//获取文件指针,写入pos fseek(fp, 0, SEEK_END);//文件指针指向末尾 t = ftell(fp);//获取文件指针到文件头部的字节大小 fsetpos(fp, &pos);//文件指针还原 fclose(fp);//释放文件 } n = t / size; //以上实现了有效数据条数n的获取 printf("有效数据:%d条\n", n); char c;//选项代码 while (1) { printf("\n\n\n\n"); printf(" student course management system \n"); printf("-----------------------------------------------------------------"); printf("\n\n"); printf(" 1 录入信息 2 浏览所有信息(排序后) 3 查询信息(名称) \n"); printf(" 4 修改信息 5 删除信息 6 查询信息(学分) \n"); printf(" 0 exit system \n"); printf(" \n\n"); printf("------------------------------------------------------------------"); printf("\n please select:"); c = getchar(); switch (c) { case '0'://exit system { return 0; } case '1': { input();//1 录入信息 getchar(); break; } case '2': { look();//2 浏览所有信息(排序后) getchar(); break; } case '3': { QueryName();//3 查询信息(名称) getchar(); break; } case '4': { modify();//4 修改信息 getchar(); break; } case '5': { getchar(); del();//5 删除信息 getchar();//防止功能失效 break; } case '6': { QueryCredit();//6 查询信息(学分) getchar(); break; } default: { getchar(); printf("\ninput error,please try again:\n"); break; } } } return 0; } void input(void)//1 录入信息 true { char ch; while (1) { printf("课程编号"); scanf("%d", &temp.number); printf("课程名称"); scanf("%s", &temp.name); printf("总学时"); scanf("%d", &temp.hours); printf("学分"); scanf("%d", &temp.credit); printf("开课学期"); scanf("%d", &temp.semester); temp.flag = 1; n++;//有效数据增加1条 copy3(n - 1);//由temp中写入数组中 getchar();//接受换行符 printf("是否继续录入?[y/n]\n"); ch = getchar(); if (ch == 'n' || ch == 'N') break; } writeToFile();//统一写入文件info.dat } void look(void)//2 浏览所有信息(排序后) true { load(); //sort for (int i = 0; i < n - 1; i++) { int k = i;// 最小元素的下标 for (int j = i + 1; j < n; j++) if (strcmp(a[k].name, a[j].name) > 0)//从小到大排序 k = j;//如果a[k]>a[j],即有元素比我们认为的最小元素更小,那就更新最小元素的下标 if (k != i) {//等效于三步交换法 copy1(i); copy2(i, k); copy3(k); } } display_header();//表头 display_all();//内容 display_end();//表尾 } void QueryName(void)//3 查询信息(名称)true { char ch; char CName[100];//用于存储课程的名称 while (1) { printf("请输入课程名称:"); scanf("%s", CName); getchar(); load(); display_header(); for (int i = 0; i < n; i++) { // printf("%d\n",i); if (strcmp(a[i].name, CName) == 0) { printf("ture.\n"); copy1(i); display(); } } display_end(); printf("是否继续查询?[y/n]\n"); scanf("%c", &ch); if (ch == 'n' || ch == 'N') break; } } void modify(void)//4 修改信息 { struct info newdata;//modify中修改的数据存储 int num; load();//读原文件info.dat look(); printf("用课程编号来确定修改的数据行:"); scanf("%d", &num); getchar(); printf("\n\n"); printf(" student course info \n"); printf("------------------------------------------------------------------\n"); printf("你想修改什么?\n"); printf("1.课程名称 2.总学时 3.学分\n"); printf("4.开课学期\n"); printf("------------------------------------------------------------------"); printf("\n please select:"); char c = getchar(); while (c > '4' || c < '1') { printf("\n输入错误,重试"); c = getchar(); } getchar(); switch (c) { case '1'://1.课程名称 { printf("请输入新名称:"); gets(newdata.name); for (int i = 0; i < n; i++) if (a[i].number == num) strcpy(a[i].name, newdata.name); break; } case '2'://2.总学时 { printf("请输入新总学时:"); scanf("%d", &newdata.hours); for (int i = 0; i < n; i++) if (a[i].number == num) a[i].hours = newdata.hours; break; } case '3'://3.学分 { printf("请输入新学分:"); scanf("%d", &newdata.credit); for (int i = 0; i < n; i++) if (a[i].number == num) a[i].credit = newdata.credit; break; } case '4'://4.开课学期 { printf("请输入新开课学期:"); scanf("%d", &newdata.semester); for (int i = 0; i < n; i++) if (a[i].number == num) a[i].semester = newdata.semester; break; } } writeToFile(); } void del(void)//5删除信息 { struct info original;//删除数据的判据 long long t = 0; FILE* ftemp; load();//读原文件info.dat printf("\n\n"); printf(" student course info \n"); printf("------------------------------------------------------------------\n"); printf("你想通过哪种方式来查找需要删除的记录?\n"); printf("1.课程编号 2.课程名称 3.总学时\n"); printf("4.学分 5.开课学期\n"); printf("-----------------------------------------------------------------"); printf("\n please select:"); char c = getchar(); while (c > '5' || c < '1') { printf("\n输入错误,重试"); c = getchar(); } getchar(); switch (c) { case '1'://1.课程编号 { printf("请输入课程编号:"); scanf("%d", &original.number); for (int i = 0; i < n; i++) if (a[i].number == original.number) a[i].flag = false; break; } case '2'://2.课程名称 { printf("请输入课程名称:"); gets(original.name); for (int i = 0; i < n; i++) if (strcmp(a[i].name, original.name) == 0) a[i].flag = false; break; } case '3'://3.总学时 { printf("请输入总学时:"); scanf("%d", &original.hours); for (int i = 0; i < n; i++) if (a[i].hours == original.hours) a[i].flag = false; break; } case '4'://4.学分 { printf("请输入学分:"); scanf("%d", &original.credit); for (int i = 0; i < n; i++) if (a[i].credit == original.credit) a[i].flag = false; break; } case '5'://5.开课学期 { printf("请输入开课学期:"); scanf("%d", &original.semester); for (int i = 0; i < n; i++) if (a[i].semester == original.semester) a[i].flag = false; break; }} if ((ftemp = fopen("temporary.dat", "wb")) == NULL)//写打开临时文件temporary.dat { printf("Open the file failure...\n"); exit(EXIT_SUCCESS); } for (int i = 0; i < n; i++) if (a[i].flag == false) continue; else fwrite(&a[i], size, 1, ftemp);//不是则将这写入临时文件temporary.dat fpos_t pos;//定义pos fgetpos(ftemp, &pos);//获取文件指针,写入pos fseek(ftemp, 0, SEEK_END);//文件指针指向末尾 t = ftell(ftemp);//获取文件指针到文件头部的字节大小 fsetpos(ftemp, &pos);//文件指针还原 fclose(ftemp); n = t / size;//因为文件的变动,更新n的值 int back1 = remove("info.dat"); int back2 = rename("temporary.dat", "info.dat");//将临时文件名改为原文件名 if (!back1 && !back2) printf("成功!\n"); else printf("%d %d\n失败!\n", back1, back2); } void QueryCredit(void)//6 查询信息(学分) true { char ch; int mark;//用于存储课程的学分 while (1) { printf("请输入课程学分:"); scanf("%d", &mark); getchar(); load(); display_header(); for (int i = 0; i < n; i++) { if (mark == a[i].credit) { copy1(i); display(); } } display_end(); printf("是否继续查询?[y/n]\n"); ch = getchar(); if (ch == 'n' || ch == 'N') break; } } void writeToFile(void)//true { FILE* fp; if ((fp = fopen("info.dat", "wb")) == NULL) { printf("无法打开此文件\n"); exit(EXIT_SUCCESS); } for (int i = 0; i < n; i++) { if (fwrite(&a[i], size, 1, fp) != 1) { printf("file write error.\n"); } } fclose(fp); } void copy1(int i)//第一步 { temp.number = a[i].number; strcpy(temp.name, a[i].name); temp.hours = a[i].hours; temp.credit = a[i].credit; temp.semester = a[i].semester; temp.flag = a[i].flag; } void copy2(int i, int j)//第二步 { a[i].number = a[j].number; strcpy(a[i].name, a[j].name); a[i].hours = a[j].hours; a[i].credit = a[j].credit; a[i].semester = a[j].semester; a[i].flag = a[j].flag; } void copy3(int i)//第三步 { a[i].number = temp.number; strcpy(a[i].name, temp.name); a[i].hours = temp.hours; a[i].credit = temp.credit; a[i].semester = temp.semester; a[i].flag = temp.flag; } void load(void)//true { FILE* fp; if ((fp = fopen("info.dat", "rb")) == NULL) { printf("无法打开此文件\n"); exit(EXIT_SUCCESS); } for (int i = 0; i < n; i++) { if (fread(&a[i], size, 1, fp) != 1) { if (feof(fp)) { fclose(fp); printf("file end.\n"); } else printf("file read error.\n"); } } fclose(fp); } void display_header(void)//true { printf("\n\n"); printf(" student course info \n"); printf("------------------------------------------------------------------"); printf("\n"); printf("课程编号 课程名称 总学时 学分 开课学期 \n"); printf("------------------------------------------------------------------\n"); } void display_end(void)//true { printf("------------------------------------------------------------------\n"); } void display_all(void)//true { for (int i = 0; i < n; i++) printf("%8d%16s%14d%14d%14d\n", a[i].number, a[i].name, a[i].hours, a[i].credit, a[i].semester); } void display(void)//true { printf("%8d%16s%14d%14d%14d\n", temp.number, temp.name, temp.hours, temp.credit, temp.semester); }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 运筹学排序问题中的在线排序
- ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
- ¥30 求一段fortran代码用IVF编译运行的结果
- ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
- ¥15 C++ 头文件/宏冲突问题解决
- ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
- ¥50 安卓adb backup备份子用户应用数据失败
- ¥20 有人能用聚类分析帮我分析一下文本内容嘛
- ¥30 python代码,帮调试,帮帮忙吧
- ¥15 #MATLAB仿真#车辆换道路径规划