本人也是一位c语言初学者,如果真的想学习编程,建议还是从c语言开始学,了解计算机的基本逻辑。个人感觉面向对象编程的c++更难学。这个成绩管理系统涉及到的c语言基础还是挺全面的,其中大部分都是我照搬某位大哥的,改了一点小错误,增加了密码功能,防止数据被修改。大家相互学习吧。
这是完整的操作逻辑:
讲一下那个简单加密的基本原理就是进行两次异或运算值会还原,设置参数死加密,其实还是挺容易破解的。
这三个文件分别是转码前的密码、储存在本地的密码(已简单转码)、和解码后的密码。
所有的排序使用的都是冒泡排序法。
下面是完整的源代码,有注释,看完估计需要一点时间。文件指针fpm指向加密成绩文件,fp指向我们需要操作的文件“cj.txt”。
//头文件 #include#include #include #include int random1=187361,random2=37896;//实现文件加解密的参数 //成绩结构体 struct score { char snum[11];//学号 char sname[11];//姓名 float chinese;//单科成绩 float math; float english; float sumcj;//总成绩 int rank;//排名 }; //函数声明 void showmenu();//菜单 void lr(int);//录入成绩 int sc(int);//删除成绩 void xg(int);//修改成绩 void cx(int);//查询成绩 void cxmenu(void);//二级成绩查询菜单 void xhcx(int);//学号查询 void xmcx(int);//姓名查询 void sumcx(int);//总成绩查询 void yw(int);//单科成绩查询 void sx(int); void yy(int); void over(int);//结束查询菜单 void jspm(int);//计算排名 void xs(int);//成绩显示 void js(int);//结束主菜单 void changep();//管理员密码配置 int main() { int flag,n,count;struct score stu[200];char ch;//flag主菜单标志序号,n录入人数,count计当前人数。 FILE *fp,*fpm; fp=fopen("cj.txt","w+");//cj.txt是当前成绩信息文件 fpm=fopen("加密成绩信息.txt","a+"); if(fpm==NULL) { printf("打开文件失败,请重试!n"); getch(); fclose(fpm); exit(0); } if(fp==NULL) { printf("打开文件失败,请重试!n"); getch(); fclose(fp); exit(0); } FILE *fpp=fopen("password.txt","r");//password.txt是储存密码的文件 if(fpp==NULL) { printf("打开密码文件失败,请联系技术支持!n"); getch(); fclose(fpp); exit(0); } int c; rewind(fpm); while ((c=fgetc(fpm))!=EOF) fputc(c^random1,fp); fclose(fpm); rewind(fp); ch=fgetc(fp); if(ch==EOF) count=0;//空文件 else { count=0; rewind(fp); while(!feof(fp))//文件没有读到末尾(至少执行一次) { fscanf(fp,"%s %s %f %f %f %f %dn",&stu[count].snum,&stu[count].sname,&stu[count].chinese,&stu[count].math,&stu[count].english,&stu[count].sumcj,&stu[count].rank); count++; } } fclose(fp); int id; printf("请选择身份:1.管理员 2.访客 3.退出n"); do { scanf("%d",&id); if(id==1) { int c;char pass[20],idpass[20]; printf("请输入管理员密码:"); scanf("%s",&idpass); while(6>strlen(idpass)||strlen(idpass)>19) { printf("请重新输入:"); scanf("%s",idpass); } FILE *fpj=fopen("jiema.txt","w+");//解码后的密码文件 if(fpj==NULL) { printf("打开文件失败,请重试!n"); getch(); fclose(fpj); exit(0); } while ((c = fgetc(fpp))!= EOF) fputc(c^random2,fpj); fclose(fpp); rewind(fpj); fscanf(fpj,"%s",&pass); fclose(fpj);remove("jiema.txt");//用完即删,在文件缓冲区中即被删除 if(!strcmp(pass,idpass)) { do { showmenu(); scanf("%d",&flag);//选择操作 switch(flag) { case 1: printf("请输入您要录入的人数:"); scanf("%d",&n); lr(n); count += n;break; case 2: count=sc(count);break; case 3: xg(count);break; case 4: cx(count);break; case 5: jspm(count);break; case 6: xs(count);break; case 7: changep();break; case 0: js(count);break; default:printf("输入错误,请重试!n");getch();break; } }while(flag!=0); return 0; } else { printf("密码错误,请重试。若密码失效,请联系技术支持。"); getch(); return 0; } } if(id==2) { cx(count); return 0; } if(id==3) return 0; printf("身份选择错误,按重新输入:"); }while(id!=3); } //0显示菜单 void showmenu() { system("cls"); printf("*----------------------------------------------------*n"); printf("* 欢迎使用**成绩管理系统** *n"); printf("*----------------------------------------------------*n"); printf("* 1: 录入成绩 *n"); printf("* 2: 删除成绩 *n"); printf("* 3: 修改成绩 *n"); printf("* 4: 成绩查询(存档) *n"); printf("* 5: 成绩计算并排名 *n"); printf("* 6: 显示当前成绩信息 *n"); printf("* 7: 配置管理员密码 *n"); printf("* 0: 加密储存并退出系统 *n"); printf("*----------------------------------------------------*n"); printf("选择操作<0-6>n"); return; } //1录入成绩 void lr(int n) { struct score stu[200]; FILE *fp; fp=fopen("cj.txt","a"); if(fp==NULL) { printf("打开文件失败,请重试!n"); getch(); fclose(fp); exit(0); } printf("请输入全部学生的学号,姓名,语文成绩,数学成绩,英语成绩;n"); int i; for(i=0;i<=n-1;i++) { printf("----第%d个学生----n", i+1); printf("学号:"); scanf("%s",&stu[i].snum); printf("姓名:"); scanf("%s",&stu[i].sname); printf("语文成绩:"); scanf("%f",&stu[i].chinese); printf("数学成绩:"); scanf("%f",&stu[i].math); printf("英语成绩:"); scanf("%f",&stu[i].english); stu[i].sumcj=0;//总成绩和排名初始化为0 stu[i].rank=0; fprintf(fp,"%s %s %.1f %.1f %.1f %.1f %dn",stu[i].snum,stu[i].sname,stu[i].chinese,stu[i].math,stu[i].english,stu[i].sumcj,stu[i].rank); } fclose(fp); printf("添加学生成功,请按任意键返回n"); getch(); } //2删除成绩(建议删除成绩后重新计算排名) int sc(int n) { struct score stu[200]; struct score stuu[199];//删除后的结构体数组 char stnum[11];//学号 int find=0; printf("请输入你要删除的学生学号:"); scanf("%s", &stnum); FILE *fp; fp=fopen("cj.txt","r"); if(fp==NULL) { printf("打开文件失败!n"); getch(); return -1; } int c=0; int index=0;//用于记录目标序号 while(!feof(fp))//遍历文件 { fscanf(fp,"%s %s %f %f %f %f %dn", &stu[c].snum,&stu[c].sname,&stu[c].chinese,&stu[c].math,&stu[c].english,&stu[c].sumcj,&stu[c].rank); if(strcmp(stnum,stu[c].snum)==0) { find = 1;//根据学号查找,找到赋值为1 index = c;//记录编号 } c++; } fclose(fp); if(find==0) { printf("没有该学生成绩信息,请按任意键返回n"); getch(); return n; } else { int i; //删除 for(i=0;i n"); } //4.1学号查询 void xhcx(int n) { struct score stu[200]; char snum[11]; printf("请输入你要查询学生的学号:"); scanf("%s",&snum); FILE *fp; fp=fopen("cj.txt ","r"); if(fp==NULL) { printf("打开文件失败!n"); getch(); exit(0); } int c = 0; while(!feof(fp)) { fscanf(fp,"%s %s %f %f %f %f %dn",&stu[c].snum,&stu[c].sname,&stu[c].chinese,&stu[c].math,&stu[c].english,&stu[c].sumcj,&stu[c].rank); c++; } int i; for(i=0;i strlen(pass)||strlen(pass)>19) { printf("密码格式错误,请重新输入:"); scanf("%s",pass); } printf("请再次输入新密码(最小6位,最高19位,任意字母数字):"); scanf("%s",&passtoo); if(!strcmp(passtoo,pass)) { FILE *fpb=fopen("before.txt","w+");//转码前的密码文件 if(fpb==NULL) { printf("打开文件失败,请重试!n"); getch(); fclose(fpb); } fprintf(fpb,"%s",passtoo); FILE *fpp=fopen("password.txt","w"); if(fpp==NULL) { printf("打开文件失败,请重试!n"); getch(); fclose(fpp); } rewind(fpb); int c; while ((c=fgetc(fpb))!=EOF) fputc(c^random2,fpp); fclose(fpp);fclose(fpb);remove("before.txt");//用完即删 printf("密码配置成功,按任意键返回"); getch(); return; } else { printf("输入错误,按任意键返回"); getch();return; } } //0加密保存信息并退出系统 void js(int n) { FILE *fp,*fpm; fp=fopen("cj.txt","r"); if(fp==NULL) { printf("打开文件失败,请重试!n"); getch(); fclose(fp); exit(0); } fpm=fopen("加密成绩信息.txt","w"); if(fpm==NULL) { printf("打开文件失败,请重试!n"); getch(); fclose(fp); exit(0); } int c; while ((c=fgetc(fp))!= EOF) fputc(c^random1,fpm);//这里用的是random1,与密码文件不同。 fclose(fp);fclose(fpm); printf("总人数是%d,欢迎下次使用!按任意键结束程序", n); getch(); remove("cj.txt"); return; }
在首次运行程序前需要初始化密码文件,否则程序无法运行。建议参考配置管理员密码函数写一个简单的转码器,用来初始化密码文件,注意参数要相同,另外可以随时修改密码,密码文件需要和程序在同一目录下。