// 这个题涉及到了结构体,指针,字符串和文件,综合性较强。其中这个例题的关键点在于: 1、结构体中字符串的赋值 字符串有三种赋值方法:a、声明字符串时直接赋值;b、用scanf函数给字符串输入值; c、用strcpy函数给字符串赋值 ,这种方法最为常用 需要注意的是出了前两种方法不能直接给字符串赋值,必须用strcpy进行赋值!!! 2、文件中数据的读取处理 这里用到的与文件有关的函数有三个:a、fopen打开文件;b、fgets依次取出文件中的每一行 c、strtok以某一个字符串为界分解字符串 3、数据类型的转化 在将字符串分解之后需要将分解出的字符串转化成所需的类型,这里用到了stdlib.h中的专门用于类型转化的函数。 // \#include “stdio.h” \#include “string.h” \#include “stdlib.h” struct Students //结构体 { int no; char name\[10\]; int xscore; int yscore; int zscore; }; void average1(struct Students s\[\]) //每个学生三门课的平均分 { float sum1\[10\]; int i; for(i=0;i { sum1\[i\]=s\[i\].xscore+s\[i\].yscore+s\[i\].zscore; printf(“%s的三门课的平均分为%f.n”,s\[i\].name,sum1\[i\]/3); } } void average2(struct Students s\[\]) //每门课的平均分 { float sum2\[3\]={0,0,0}; int i,j; for(j=0;j { sum2\[0\]=sum2\[0\]+s\[j\].xscore; } for(j=0;j { sum2\[1\]=sum2\[1\]+s\[j\].yscore; } for(j=0;j { sum2\[2\]=sum2\[2\]+s\[j\].zscore; } for(i=0;i { printf(“第%d门课的平均分为%fn”,i+1,sum2\[i\]/10); } } void input(struct Students p\[\],char filename\[\]) //导入数据 { FILE \*fp; //文件指针,指向文件 int i,j=0; char str\[30\]; //容纳从文件中取出的一行字符串 char \*str2\[5\]; //容纳一行字符串拆分成的五部分 char \*q; //分解一行字符串时用到的指针 if((fp=fopen(filename,”rt”))==NULL) { printf(“要打开的文件不存在!n”); exit(1); } while(fgets(str,30,fp)) //从文件中依次读取每一行 { q=strtok(str,”,”); //按“,”将每一行字符串分解并保存 for(i=0;i { str2\[i\]=q; q=strtok(NULL,”,”); } p\[j\].no=atoi(str2\[0\]); //把分解出的字符串依次转化数据类型之后存入结构体数组 strcpy(p\[j\].name,str2\[1\]); //字符串的赋值通常情况下需要strcpy函数 p\[j\].xscore=atoi(str2\[2\]); p\[j\].yscore=atoi(str2\[3\]); p\[j\].zscore=atoi(str2\[4\]); j++; } } void sort(struct Students s\[\]) //按平均分从小到大排序 { float sum1\[10\]; float ave\[10\]; int a\[10\]={0,1,2,3,4,5,6,7,8,9}; //用数组a来存放成绩排序时所对应的学生的变化 int i,j; for(i=0;i { sum1\[i\]=s\[i\].xscore+s\[i\].yscore+s\[i\].zscore; ave\[i\]=sum1\[i\]/3; } for(i=0;i { for(j=i+1;j { if(ave\[i\] { int t; t=a\[i\]; a\[i\]=a\[j\]; a\[j\]=t; float temp; temp=ave\[i\]; ave\[i\]=ave\[j\]; ave\[j\]=temp; } } } for(i=0;i { printf(“%s %fn”,s\[a\[i\]\].name,ave\[i\]); } } void output(struct Students s\[\]) //输出总表 { int i; printf(“学号 姓名 第一门课成绩 第二门课成绩 第三门课成绩n”); for(i=0;i { printf(“%d %s %d %d %dn”,s\[i\].no,s\[i\].name,s\[i\].xscore,s\[i\].yscore,s\[i\].zscore); } } int main() //主函数 { char filename\[100\]; struct Students s\[10\]; printf(“请输入文件路径:”); scanf(“%s”,filename); input(s,filename); printf(“—————-每个学生三门课的平均成绩——————-n”); average1(s); printf(“—————-每门课的平均成绩——————–n”); average2(s); printf(“——————按从大到小平均分排序——————n”); sort(s); printf(“———————-输出总表———————–n”); output(s); }
摘自:http://blog.sina.com.cn/s/blog_416bc4600100roex.html