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: