2014年9月3日 帮别人写的 (王艺)
//定义头文件
#include
#include
#include
//宏定义
#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
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
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
for(int j=0;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
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
for(int j=0;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
//printf("%d\n",b[i].name);
b[i].math=0;
b[i].renshu=0;
}
//计算求各班 对应的数学成绩 与 人数
for(int j=0;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
if(b[i].name==n){
b[i].math+=m;
b[i].renshu++;
break;
}
}
}
printf("\n各班数学平均成绩如下\n");//对各个班级数学成绩进行输出
for(int z=0;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: