C语言中结构体,字符串,文件及数据类型转化的使用小结

2011年11月17日 发表评论 阅读评论
//
这个题涉及到了结构体,指针,字符串和文件,综合性较强。其中这个例题的关键点在于:
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<10;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<10;j++)
   {
     sum2[0]=sum2[0]+s[j].xscore;
   }
for(j=0;j<10;j++)
  {
    sum2[1]=sum2[1]+s[j].yscore;
  }
for(j=0;j<10;j++)
  {
    sum2[2]=sum2[2]+s[j].zscore;
  }
for(i=0;i<3;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<5;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<10;i++)
   {
     sum1[i]=s[i].xscore+s[i].yscore+s[i].zscore;
     ave[i]=sum1[i]/3;
   }
   for(i=0;i<10;i++)
   {
       for(j=i+1;j<10;j++)
       {
           if(ave[i]<ave[j])
           {
               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<10;i++)
   {
       printf("%s   %fn",s[a[i]].name,ave[i]);
   }
}

void output(struct Students s[])        //输出总表
{
   int i;
   printf("学号     姓名     第一门课成绩     第二门课成绩     第三门课成绩n");
   for(i=0;i<10;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



本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

分类: C/C++/Java/Delphi 标签:
  1. 2011年12月3日10:07 | #1

    Thanks for sharing. Always good to find a real eexprt.

  2. 2012年7月25日04:42 | #2

    This blog has some very helpful info on it. Cheers for sharing it with me!