zoukankan      html  css  js  c++  java
  • C语言-结构体

    C语言中数组是把相同类型的数据类型的变量集中在一起了,而结构体则是把不同类型的变量聚集在一起。

    结构体也是一种数据类型,但是它是一种自定义的数据类型,也就是说和使用其他数据类型不一样,我们得先定义这种数据类型,然后才能用这种数据类型定义结构体变量,最后使用结构体变量。

    以下以学生结构体为例进行实际操作

    一、定义结构体数据类型,有三种方法,

    1、第一种是先定义结构体类型,再使用此类型定义变量:

    1 struct stu{
    2         int num;
    3         char *name;
    4         char sex;
    5         float score;
    6     };
    7      
    8     struct stu stu1,stu2;

    这种定义方式中,前面的1到6行定义结构体类型,第8行使用结构体类型定义结构体变量。接下来就可以使用变量stu1,stu2.

    2、第二种方法是定义结构体的同时定义结构体变量:

    1   struct stu{
    2         int num;
    3         char *name;
    4         char sex;
    5         float score;
    6     }stu1,stu2;

    这种方法比较简洁,但程序可读性较第一种差。

    3、第三种方法就是,如果我后续不会再定义新的结构体变量,那就可以在方法2的基础上忽略结构体名:

    1   struct {
    2         int num;
    3         char *name;
    4         char sex;
    5         float score;
    6     }stu1,stu2;

    但使用这种方法后续想定义结构体变量时没法定义,故不推荐。

    推荐使用第一种方法,先定义结构体类型,再定义结构体变量。

    二、结构体类型重定义:

    1、在定义结构体的同时进行重命名:

     1 typedef struct stu{
     2     int num;
     3     char *name;
     4     char sex;
     5     float score;
     6 } STU;
     7 
     8 //定义结构体变量:
     9 STU stu1;
    10 STU stu2;

    2、先定义结构体类型,后重命名:

     1 struct stu{
     2  int num;
     3  char *name;
     4  char sex;
     5  float score;
     6  } STU;
     7  
     8  typedef sturct stu STU;
     9  
    10  STU stu1;
    11  STU stu2;

    三、结构体变量的使用:

    1、基本使用:

     1 struct stu{  //定义结构体类型
     2         int num;
     3         char *name;
     4         char sex;
     5         float score;
     6     };
     7     
     8     struct stu stu1= {1, "汤唯唯", 'M', 76}; //定义结构体变量
     9     
    10     
    11     printf("%d学生的姓名是%s,性别是%c,成绩为%f", stu1.num, stu1.name, stu1.sex, stu1.score);  //使用结构体变量

    由以上程序可知,访问结构体变量中的成员值时,使用结构体变量名.结构体成员变量名的方式,如要访问stu1的姓名使用stu1.name;

    1 //结构体直接可以直接赋值
    2  stu1 = {1, "xiaoming", 'F', 89};
    3  stu2 = stu1;

    结构体变量可以直接赋值,相当于把所有成员变量的值赋给另一个结构体对应的成员变量。

    2、复杂应用:
    以下程序的功能是使用把每个学生的学号,姓名,性别,成绩封装再一个结构体变量中,然后把四个学生的以上信息使用数组封装,然后使用选择法对四个学生的成绩从高到低进行排序,然后循环输出的过程:(涉及数组、循环)

     1 struct stu{
     2         int num;
     3         char *name;
     4         char sex;
     5         float score;
     6     };
     7     
     8     //定义结构体变量数组
     9     struct stu st[4] = {{1, "汤唯唯", 'M', 76},
    10                         {2, "李亚鹏", 'M', 50},
    11                         {3, "周芷若", 'F', 80},
    12                         {4, "刘亦菲", 'F', 82}
    13                        };
    14     struct stu tmp;
    15     
    16     //选择法比较大小
    17     for (int i=0; i<3; i++) {
    18         int max=i;
    19         for (int j=i+1; j<4; j++) {
    20             if(st[max].score<st[j].score){
    21                 max=j;
    22             }
    23         }
    24         if (i!=max) {
    25             tmp=st[i];
    26             st[i]=st[max];
    27             st[max]=tmp;
    28         }
    29     }
    30 //    循环打印四个学生的成绩
    31     for (int i=0; i<4; i++) {
    32         printf("学号为%d的%s性别为%c,成绩为%.0f
    ",st[i].num,st[i].name,st[i].sex,st[i].score);
    33     }

    回车后返回的结果为:

    1 学号为4的刘亦菲性别为F,成绩为82
    2 学号为3的周芷若性别为F,成绩为80
    3 学号为1的汤唯唯性别为M,成绩为76
    4 学号为2的李亚鹏性别为M,成绩为50
    5 Program ended with exit code: 0

    注意:在对学生的成绩排序时,不能只对单独对成绩排序,要根据成绩把学生的所有信息进行交换,否则输出后每个学生的成绩就发生了变化,和以前不一致了,我们需要的只是排名次。

    3、结构体和函数的混合:计算两个复数相加:

    main主函数中的调用程序:

    1 struct complex x = {6.5, 8.9},y = {7.1, 9.4};
    2     struct  complex z;
    3     z = add(x,y);
    4     printf("和为:%5.1f+%4.1fi
    ",z.re,z.im);

    add()子函数的实现过程:

     1 struct complex{
     2     double re;
     3     double im;
     4 };
     5 
     6 struct complex add(struct complex a, struct complex b){
     7     struct complex z;
     8     z.re = a.re + b.re;
     9     z.im = a.im + b.im;
    10     return z;
    11 }

    前四行定义复数的结构体struct complex,6到11行定义了一个返回值为struct complex的函数,该函数的形参为两个struct complex类型的复数,在函数内部通过复数加法运算(实部+实部,虚部+虚部)的计算方法算出结果,之后返回给调用它的主函数,由主函数调用printf打印。

  • 相关阅读:
    你还在钟情于windows XP吗?
    我常用的vim快捷键
    2013年读的书(很多还没看完)
    期末考试了
    顺着自己的心,去做自己喜欢的事
    关于最近新闻泛滥的几点看法以及学习的个人观点
    华为OJ_1
    【Android】弹出软键盘时候让上面布局跟着上移的方法
    【Android】策略模式封装百度地图路线规划模块
    google觉得好用的插件(不断更新)
  • 原文地址:https://www.cnblogs.com/jiwangbujiu/p/5286349.html
Copyright © 2011-2022 走看看