重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
课程管理系统
功能:假定有 n 门课程,每门课程有课程编号,课程名称,总学时,学分,开课学期
等信息。试设计一课程管理系统,使之能提供以下功能:
1 对课程信息的录入、修改、删除功能;
2 按课程名排序后浏览;
3 按课程查询、按学分查询;
代码如下:
struct info
{int number;//课程编号
char name[100];//课程名称
int hours;//总学时
int credit;//学分
int semester;// 开课学期
bool flag;//数据有效标记,
};
这个结构体是用以保存数据,由整型变量 number 存储课程编号;大小为 100 字节的字符数组 name 存储课程名称;由整型变量 hours 存储总学时;由整型变量 credit 存储学分;由整型变量 semester 存储开课学期;由布尔整型变量 flag 存储数据有效标记。
还有以下一些实现功能的结构体:
struct info temp;//临时中转
struct info a[20];//数据存储
struct info newdata; //modify 中,修改的数据存储
struct info original;//del 中,删除数据的判据
二.主函数:代码如下:
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 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 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 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);
}
代码运行检测及结果你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧