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

从开始学习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;  
 }


  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
C# 学生成绩管理系统是一个用于管理学生信息和成绩的应用程序。它可以帮助学校或教育机构轻松地记录、查询和分析学生的成绩数据。以下是一个可能的C# 学生成绩管理系统的完整版的功能和实现思路: 1. 学生信息管理:系统应该能够添加、编辑和删除学生的基本信息,如姓名、学号、性别、年龄等。可以使用一个学生类来表示学生对象,并使用集合(如List)来存储学生信息。 2. 成绩录入:系统应该提供一个界面,让教师或管理员输入学生的各科成绩。可以为每个学生创建一个成绩类,包含学生学号和各科成绩属性。可以使用嵌套的集合(如Dictionary)来存储学生的成绩信息。 3. 成绩查询:系统应该提供查询学生成绩的功能,可以按学号或姓名进行查询,并显示学生的各科成绩。可以使用LINQ查询语句来实现成绩的查询和排序。 4. 成绩统计与分析:系统应该能够计算学生的总分和平均分,并提供各科成绩的最高分和最低分。可以使用LINQ查询语句来实现成绩的统计和分析。 5. 成绩报表:系统应该能够生成学生的成绩报表,包括学生基本信息和各科成绩。可以使用文件操作来将报表保存为文本文件或Excel文件。 6. 用户权限管理:系统应该提供不同用户角色的权限管理,如管理员可以添加和删除学生信息,教师可以录入和查询成绩。可以使用角色和权限的方式来实现用户权限管理。 以上是一个可能的C# 学生成绩管理系统的完整版的功能和实现思路,具体的实现方式可以根据需求和设计进行调整和扩展。希望对你有所帮助!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值