您的位置:首页 > 其它

简易的学生成绩录入程序(完整版)

2017-04-30 21:11 260 查看
从开始学习C语言开始,不知不觉已经接近一个月了。通过一步一步的写小程序,自己也渐渐掌握了C语言的一些基础语法。最后以这个简易的学生成绩录入小程序来巩固一下这段时间的学习成果,就当做是一次期末测验吧。

该程序总体上包括两个模块,分为是登录模块(log.c)和处理模块(system.c),登录模块包含注册账号密码和验证账号密码功能,只有成功登录,才能进入处理模块进行学生信息的录入。处理模块包含录入新学生信息,修改学生信息,获取所有学生成绩信息(按平均分从高到低排序)功能。每个学生信息包括:学号,姓名,数学成绩,英语成绩和平均分。经过保存后,学生信息会以二进制文件的形式保存下来,下次登录程序时会自动读取。

log.c(主程序)

#include <stdio.h>
#include <string.h>
#include "system.c" //导入模块
//用户登录验证系统-改良

struct log //定义log结构用于存储用户账号和密码信息
{
char name[15];
char password[10];
};
int num;
void logging(struct log person); //登录函数
void regis(struct log person); //注册函数
void jiami(char*p); //密码加密函数
int main()
{
FILE*fp;
int choice; //操作序号
struct log person;
if ((fp=fopen("num.dat","rb"))!=NULL) //读取当前已注册用户的人数
{
fread(&num,sizeof(int),1,fp);
fclose(fp);
}
do{
printf("输入操作对应序号:1.登录 2.注册 3.退出(目前已注册用户:%d)\n",num);
scanf("%d",&choice);
switch (choice)
{
case 1:logging(person);break;
case 2:regis(person);break;
case 3:break;
default:break;
}
}while(choice!=3);
if ((fp=fopen("num.dat","wb"))!=NULL) //存储当前已注册用户的人数
{
fwrite(&num,sizeof(int),1,fp);
fclose(fp);
}
return 0;
}

void logging(struct log person)
{
FILE*fp;
struct log read;
int flag=0; //辅助开关
if ((fp=fopen("logging.dat","rb"))==NULL) //若没有一个注册用户,则无法登录
{
printf("不存在注册用户\n");
}else
{
printf("请输入账号\n");
scanf("%s",person.name);
printf("请输入密码\n");
scanf("%s",person.password);
jiami(person.password);
fread(&read,sizeof(struct log),1,fp);
while(!feof(fp))
{
if((strcmp(person.name,read.name)==0) && (strcmp(person.password,read.password)==0)) //从注册信息文件读取信息,验证账号和密码
{
printf("登录成功\n");
fclose(fp);
flag=1;
score();
break;
}
fread(&read,sizeof(struct log),1,fp);
}
if (flag==0) {printf("用户名不存在或密码不正确\n"); fclose(fp);}
}
}

void regis(struct log person)
{
FILE*fp;
char check[10];
int flag_check,flag_check1; //两个辅助开关
struct log read;
do{
flag_check1=0;
printf("请输入新账号\n");
scanf("%s",person.name);
if ((fp=fopen("logging.dat","rb"))!=NULL)
{
fread(&read,sizeof(struct log),1,fp);
while(!feof(fp))
{
if (strcmp(person.name,read.name)==0) //防止用户名被重复注册
{
printf("该账户已被注册\n");
flag_check1=1;
break;
}
fread(&read,sizeof(struct log),1,fp);
}
fclose(fp);
}
}while(flag_check1);
do{
flag_check=0;
printf("请输入新账号的密码\n");
scanf("%s",person.password);
printf("请再次输入密码\n");
scanf("%s",check);
if (strcmp(person.password,check)!=0) //防止密码误输入
{
printf("两次输入的密码不一致\n");
flag_check=1;
}
}while(flag_check);
jiami(person.password);
if ((fp=fopen("logging.dat","ab"))==NULL)
{
printf("注册失败\n");
}else
{
fwrite(&person,sizeof(struct log),1,fp); //把账号和密码写入注册文件
printf("注册成功\n");
num++;
fclose(fp);
}
}

void jiami(char*p) //对密码进行加密
{
for (;*p!='\0';p++)
{
*p=*p^15;
}
}
system.c(被导入的模块)

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10
//定义学生的数据结构,包含学号,姓名,数学成绩,英语成绩,平均分信息,进行录入,修改学生信息,打印成绩表等操作
struct student
{
int num;
char name[10];
int math,english;
double average;
};
int sum=0;
void score()
{
int choice;
struct student students[MAXSIZE];
void new_student(struct student *p); //录入新学生信息
void change(struct student*p); //修改学生信息
void get(struct student*p); //获取所有学生成绩
void open(struct student*,int*); //读取二进制文件中的学生
void save(struct student*,int*); //保存学生信息
open(students,&sum);
do{
printf("输入操作对应的序号\n1.录入成绩 2.修改成绩 3.获取所有学生成绩 4.保存 5.注销\n");
scanf("%d",&choice);
switch (choice)
{
case 1: new_student(students);break;
case 2: change(students);break;
case 3: get(students);break;
case 4: {if (sum!=0) {save(students,&sum);}else{printf("保存成功\n");}break;}
case 5: break;
default: printf("无效操作序号\n");break;
}
}while(choice!=5);
}

void open(struct student*p,int*psum)
{
FILE*fp;
FILE*num;
if ((num=fopen("studentnum.dat","rb"))!=NULL)
{
fread(psum,sizeof(int),1,num);
fclose(num);
}
if ((fp=fopen("info.dat","rb"))!=NULL)
{
fread(p,sizeof(struct student),*psum,fp);
fclose(fp);
printf("读取数据成功\n");
}
}

void save(struct student*p,int*psum)
{
FILE*fp;
FILE*num;
if ((num=fopen("studentnum.dat","wb"))!=NULL)
{
fwrite(psum,sizeof(int),1,num);
fclose(num);
}else
{
printf("保存失败\n");
}
if ((fp=fopen("info.dat","wb"))!=NULL)
{
fwrite(p,sizeof(struct student),*psum,fp);
fclose(fp);
printf("保存成功\n");
}else
{
printf("保存失败\n");
}
}

void new_student(struct student *p)
{
int flag =0,num_new,i,flag1;
struct student *p1; //用于检查学号是否重复
do {
if (sum<MAXSIZE){
do {
p1=p;
flag1=0;
printf("输入学生学号\n");
scanf("%d",&num_new);
for (i=0;i<sum;p1++) //检查学号是否重复
{
if (p1->num==num_new)
{
printf("学号重复\n");
flag1=1;
break;
}
i++;
}
if (flag1==0) (p+sum)->num=num_new;
}while(flag1==1);
printf("输入学生姓名\n");
scanf("%s",(p+sum)->name);
printf("输入学生数学成绩\n");
scanf("%d",&((p+sum)->math));
printf("输入学生英语成绩\n");
scanf("%d",&((p+sum)->english));
(p+sum)->average=((p+sum)->math+(p+sum)->english)/2;
sum+=1;
printf("继续录入输入1,否则输入0\n");
scanf("%d",&flag);
}else
{
printf("系统已满,无法录入\n");
break;
}
}while(flag==1);
}

void change(struct student*p)
{
int num_change,i,choice;
printf("输入待修改学生的学号\n");
scanf("%d",&num_change);
for (i=0;i<sum;p++)
{
if (p->num==num_change)
{
printf("输入修改的信息类型对应的序号\n1.学号 2.姓名 3.数学成绩 4.英语成绩\n");
scanf("%d",&choice);
switch (choice)
{
case 1:
{
printf("输入新学号\n");
scanf("%d",&(p->num));
break;
}
case 2:
{
printf("输入新姓名\n");
scanf("%s",p->name);
break;
}
case 3:
{
printf("输入新数学成绩\n");
scanf("%d",&(p->math));
break;
}
case 4:
{
printf("输入新英语成绩\n");
scanf("%d",&(p->english));
break;
}
default:{
printf("无效输入\n");
break;
}
}
if (choice==3 ||choice==4) //如果修改成绩,则平均分也要变
{
p->average=(p->math+p->english)/2;
}
break;
}
i++;
}
if (i==sum)
{
printf("没有此学生\n");
}
}

void get(struct student*p)
{
int compare( const void*a,const void*b);
int i;
if (sum==0)
{
printf("空\n");
}else
{
printf("学号 姓名 数学成绩 英语成绩 平均分\n");
qsort(p,sum,sizeof(struct student),compare); //按平均分从高到低排序
for (i=0;i<sum;p++)
{
printf("%d %s %d %d %.1f\n",p->num,p->name,p->math,p->english,p->average);
i++;
}
}
}

int compare( const void*a,const void*b)
{
return ((struct student*)b)->average - ((struct student*)a)->average;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: