C语言课设-班级成绩统计分析

2014年9月3日 帮别人写的 (王艺) 

//定义头文件
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//宏定义
#define MAX 18
#define MAXLIN 100
//一个学生的结构体存储结构
typedef struct Stu{				//存数据用的
	char num[MAX];		//学号
	char name[MAX];		//姓名
	char sex[MAX];		//性别
	char banji[MAX];	//班级
	char math[MAX];		//数学
	char english[MAX];	//英语
	char wuli[MAX];		//物理
}Stu;
//一个班级的数学结构体
typedef struct ban{
	int name;
	int math;
	int renshu;
}ban;
int counts=0;		//全局计数
//字符串截取函数
void substring(char *s,int i,int n,char *t)	
{
 int j=0;
 for(;j<n;j++)
  t[j]=s[i++];
 t[j]=0;
}
//==================================================================================================================================
//只是读取
//==================================================================================================================================
//初始化函数  读取所有学生
void Init(Stu stu[MAXLIN]){				//这个函数只是读取  别的函数调用了这个函数
	counts=0;
	char str1[20]={"D:\\File04.txt"};		//读取的文件名
	FILE *fp;						//文件指针
	char haha[35]={"NULL"};			//取数据结构数组
	char haha1[27];					//取具体数值数组
	if((fp=fopen(str1,"rt"))==NULL){		//开始读取
		printf("文件夹打开失败!\n");
		exit(0);
	}
	fgets(haha,36,fp);			//读取数据结构	
	while(fgets(haha1,28,fp)!=NULL){				//循环读取具体数值,并输出
		substring(haha1,0,3,stu[counts].num);		//学号
		substring(haha1,4,6,stu[counts].name);		//姓名
		substring(haha1,11,2,stu[counts].sex);		//性别
		substring(haha1,14,3,stu[counts].banji);		//班级
		substring(haha1,18,2,stu[counts].math);		//数学
		substring(haha1,21,2,stu[counts].english);	//英语
		substring(haha1,24,2,stu[counts].wuli);		//物理
		counts++;
	}
	fclose(fp);				//关闭文件
}
//==================================================================================================================================
//求所有班级      功能3 调用
//==================================================================================================================================
//初始化班级 
void InitBanji(Stu stu[MAXLIN],ban b[MAXLIN],int &p){				//实现功能2
	int countban=0;		//记录一共多少条班级数据  有重复的班级
	int a,bb,c;			//字符串转为 数字 用到
	Init(stu);	//调用初始化函数,进行初始化
	int countbanji[MAXLIN];				//保存班级字符串
	for(int i=0;i<counts;i++){				//循环把 字符串变为 整形
		a=stu[i].banji[0]-'0';				//字符串变为整形  -'0'
		bb=stu[i].banji[1]-'0';
		c=stu[i].banji[2]-'0';
		countbanji[countban++]=a*100+bb*10+c;	//赋值成一个百位数
	}
	//数据去重  并把数据输出来
	for(i=0;i<countban;i++){
		for(int j=0;j<i;j++){
			if(countbanji[i]==countbanji[j]){
				break;
			}
		}
		if(i==j){
			b[p++].name=countbanji[i];
		}
	}
}
//==================================================================================================================================
// 功能1
//==================================================================================================================================
//读入功能函数  这个是最开始写的功能 和初始化有点重复 本可以调用初始化函数 但也没问题 我懒得改了
void DuRu(Stu stu[MAXLIN]){									//对应的功能是1
	int count=0;		//计数
	char str1[20]={"D:\\File04.txt"};		//读取的文件名
	FILE *fp;						//文件指针
	char haha[35]={"NULL"};			//取数据结构数组
	char haha1[27];					//取具体数值数组
	if((fp=fopen(str1,"rt"))==NULL){		//开始读取
		printf("文件夹打开失败!\n");
		exit(0);
	}
	fgets(haha,36,fp);			//读取数据结构	
	printf("%s\n",haha);		//输出数据结构
	while(fgets(haha1,28,fp)!=NULL){				//循环读取具体数值,并输出
		substring(haha1,0,3,stu[count].num);		//学号
		substring(haha1,4,6,stu[count].name);		//姓名
		substring(haha1,11,2,stu[count].sex);		//性别
		substring(haha1,14,3,stu[count].banji);		//班级
		substring(haha1,18,2,stu[count].math);		//数学
		substring(haha1,21,2,stu[count].english);	//英语
		substring(haha1,24,2,stu[count].wuli);		//物理
		printf("%s\t",stu[count].num);			//输出
		printf("%s\t",stu[count].name);
		printf("%s\t",stu[count].sex);
		printf("%s\t",stu[count].banji);
		printf("%s\t",stu[count].math);
		printf("%s\t",stu[count].english);
		printf("%s\n",stu[count].wuli);
		count++;
	}
	printf("\n");
	fclose(fp);				//关闭文件
	printf("文件%s输出完毕",str1);		//输出完毕提示
	printf("\n\n");			//换行
}
//==================================================================================================================================
//功能2
//==================================================================================================================================
//确定班级函数
void BanJi(Stu stu[MAXLIN]){
	int countban=0;		//记录一共多少条班级数据  有重复的班级
	int a,b,c;			//字符串转为 数字 用到
	Init(stu);	//调用初始化函数,进行初始化
	int countbanji[MAXLIN];				//保存班级字符串
	for(int i=0;i<counts;i++){				//循环把 字符串变为 整形
		a=stu[i].banji[0]-'0';				//字符串变为整形  -'0'
		b=stu[i].banji[1]-'0';
		c=stu[i].banji[2]-'0';
		countbanji[countban++]=a*100+b*10+c;	//赋值成一个百位数
	}
	//数据去重  并把数据输出来
	printf("\n这些学生所属的班级有:\n");
	for(i=0;i<countban;i++){
		for(int j=0;j<i;j++){
			if(countbanji[i]==countbanji[j]){
				break;
			}
		}
		if(i==j){
			printf("%d\n",countbanji[i]);
		}
	}
	printf("所有班级输出完毕!\n\n");
}
//==================================================================================================================================
//功能3
//==================================================================================================================================
//计算数学平均成绩函数
void Math(Stu stu[MAXLIN]){
	int a,bb,c,m,n;
	ban b[MAXLIN];
	int p=0;
	InitBanji(stu,b,p);		//初始化班级信息
	for(int i=0;i<p;i++){
	//	printf("%d\n",b[i].name);
		b[i].math=0;
		b[i].renshu=0;
	}
	//计算求各班 对应的数学成绩 与 人数
	for(int j=0;j<counts;j++){
		a=stu[j].math[0]-'0';		//数学成绩
		bb=stu[j].math[1]-'0';
		m=a*10+bb;
		a=stu[j].banji[0]-'0';		//班级
		bb=stu[j].banji[1]-'0';
		c=stu[j].banji[2]-'0';
		n=a*100+bb*10+c;
		for(i=0;i<p;i++){			//成绩与人数匹配对应 班级
			if(b[i].name==n){
				b[i].math+=m;
				b[i].renshu++;
				break;
			}
		}
	}
	printf("\n各班数学平均成绩如下\n");		//对各个班级数学成绩进行输出
	for(int z=0;z<p;z++){
		printf("班级:%d\t",b[z].name);
		printf("数学总分:%d\t",b[z].math);
		printf("班级人数:%d\t",b[z].renshu);
		printf("班级数学平均成绩:%d\n",b[z].math/b[z].renshu);
	}
	printf("输出完毕!\n\n");
}
//==================================================================================================================================
//退出函数
//==================================================================================================================================
void TuiChu(){
	printf("\n谢谢您的使用!\n");	//输出友情话语
}
//==================================================================================================================================
//主函数
//==================================================================================================================================
int main(){
	int choice;  //选择
	Stu stu[MAXLIN];		//结构体数组
	while(true){		//死循环,操作数不止一次
		//输出界面
		printf("**********欢迎使用班级成绩统计分析系统**********\n");
		printf("----------读入数据请输入 1  --------------------\n");
		printf("----------确定班级请输入 2  --------------------\n");
		printf("----------计算班级数学平均成绩  请输入 3  ------\n");
		printf("----------退出请输入 0  ------------------------\n");
		printf("您的选择是:");
		//输入要进行的操作选择
		scanf("%d",&choice);
		//异常处理
		if(choice<0||choice>3){
			printf("请输入 0--3 之间的数!\n");
			//接着输入
			continue;
		}
		//根据选择进入相应的功能函数
		switch(choice){
		case 1: DuRu(stu);
			break;
		case 2: BanJi(stu);
			break;
		case 3:	Math(stu); 
			break;
		case 0:	TuiChu(); 
			exit(0);
		}
	}
	//返回0
	return 0;
}

运行程序截图:

 

选择1:

 

选择2:

 

 

选择3:



  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值