C语言中结构体,字符串,文件及数据类型转化的使用小结
//
这个题涉及到了结构体,指针,字符串和文件,综合性较强。其中这个例题的关键点在于:
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
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/scfd/515.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.