• C语言博客06-结构体


    1.本章学习总结

    1.1 学习内容总结

    结构体如何定义、成员如何赋值

    1.结构体的一般形式为:
       
         struct  结构体名
        {
         数据类型   成员名1;
         数据类型   成员名2;
         :
         数据类型   成员名n;
         };
    
    2.结构体的定义及赋值
    
     ·1先定义结构体类型再定义变量名,这是C语言中定义结构体类型变量最常见的方式。
          struct 结构体名
         {
                 成员列表;
         };
         struct 结构体名 变量名;
     ·2在定义类型的同时定义变量。
         这种形式的定义的一般形式为:
            struct 结构体名
            {
                      成员列表;
            }变量名; 
     ·3直接定义结构类型变量
        其一般形式为:
             struct      //没有结构体名
             {
                       成员列表;
              }变量名;
    

    结构体数组排序做法

    1. 先定义结构体类型,再定义结构体变量。
    
    struct student{
    
        char no[20];       //学号
    
        char name[20];    //姓名
    
         char sex[5];    //性别
    
        int age;          //年龄
    
    };             
    struct student stu1,stu2;
    
    //此时stu1,stu2为student结构体变量
    
    
    2. 定义结构体类型的同时定义结构体变量。
    
    struct student{
    
        char no[20];        //学号
    
        char name[20];     //姓名
    
        char sex[5];      //性别
    
        int age;            //年龄
    
    } stu1,stu2;   
    此时还可以继续定义student结构体变量,如:
    struct student stu3;
    
    3、不指定类型名而直接定义结构体变量
    
    struct{
    
        char no[20];        //学号
    
        char name[20];      //姓名
    
        char sex[5];      //性别
    
        int age;          //年龄
    
    } stu1,stu2;   
     ·一般不使用这种方法,因为直接定义结构体变量stu1、stu2之后,就不能再继续定
      义该类型的变量。
    
    
    4、用typedef定义结构体变量
    typedef struct stdudent
    {
    
           char name[20];
    
           int age;
    
    }student_t;
    
    定义了这个之后,下面有2中方法可以定义结构体变量
    第一种: struct student student_1;   
     //定义了一个student_1的结构体变量
    第二种:student_t student_1            
     //定义了一个student_1的结构体变量
     
    

    结构体指针怎么用

     结构体指针:
     分为“指向结构体变量的指针”和“指向结构体数组的指针”
    
    1.首先定义一个结构体,给它取名:
    
    typedef struct node{
    
    struct node * next;//指向下一节点
    
    }pnode;//指针名
    
    2.定义结构体指针与指针变量,给出几种不同的定义方式
    
    struct node *a,b;
    
    pnode *c,d;
    
    linklist  p;
    
    
    这里的a即指向结构体node的指针,b为结构体变量。两者之间关系为:
    
    a=&b;
    
    其他定义方式之间关系为:
    
    c=&d; 
    c=&b;
    d=b;
    p=a;
    p=c;
    p=&b;    
    p=&d
    
    像这之中c和p也是指向结构体node的指针。
    
    3.结构体成员的访问:
    
    指针可以用 "->" 来访问成员变量,结构体对象用  "." 来访问,指针也可以用 "." 来访问,
    
    (1)结构体对象访问成员变量时:
    
    b.data=2;
    
    (2)指针的访问成员变量方式:
    
    a->data=2;
    
    (*a).data=2;
    
    4.函数传递结构体指针和变量的方法
    
    因为指针指向结构体的首地址,设函数为:
    
    int sum(struct node *a,struct node *p);
    
    传递时:
    
    指针为:sum(a,c);
    
    结构体变量为:sum(&b,&d);
    
    

    共用体、枚举类型做法

    ·共用体
      使用同一段内存单元存放不同类型的变量,或者说使几个不同的变量共享同一段内
      存的结构,称为“共用体”类型的结构,声明与定义如下:
    union Data{
        int n;
        char ch;
        double f;
    };
    union Data a, b, c;
     (1)其使用和结构体相似,但是初始赋值只能赋一个变量的值;
     (2)结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间
      没有影响;
     (3)共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
     (4)结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在
       缝隙),共用体占用的内存等于最长的成员占用的内存。
    ·枚举类型
      所谓“枚举”就是把可能的值一一列举出来,变量的值只限于列举出来的值的范围内。
       枚举类型的定义形式为:
       enum typeName{ valueName1, valueName2, valueName3, ...... };  
    
       例如,列出一个星期有几天:
    
        enum week{ Mon, Tues, Wed, Thurs, Fri, Sat, Sun };
    
      ·可以看到,我们仅仅给出了名字,却没有给出名字对应的值,这是因为枚举值默认
       从 0 开始,往后逐个加 1(递增);也就是说,week 中的 Mon、Tues … Sun 
       对应的值分别为 0、1 … 6。
      我们也可以给每个名字都指定一个值:
    
        enum week{ Mon = 1, Tues = 2, Wed = 3, Thurs = 4, Fri = 5,
         Sat = 6, Sun = 7 };
    
    
    更为简单的方法是只给第一个名字指定值:
    
    enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };
    
    这样枚举值就从 1 开始递增,跟上面的写法是等效的。
    枚举是一种类型,通过它可以定义枚举变量:
     
    enum week a, b, c;
    
    也可以在定义枚举类型的同时定义变量:
    
    enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a, b, c;
    
    有了枚举变量,就可以把列表中的值赋给它:
    
    enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };
    enum week a = Mon, b = Wed, c = Sat;
    
    或者:
    
    enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a = Mon, 
     b = Wed, c = Sat;
    
    需要注意的是:
    (1) 枚举列表中的 Mon、Tues、Wed 这些标识符的作用范围是全局的(严格来说是
      main() 函数内部),不能再定义与它们名字相同的变量。
    (2) Mon、Tues、Wed 等都是常量,不能对它们赋值,只能将它们的值赋给其他的
      变量。
    (3)枚举和宏其实非常类似:宏在预处理阶段将名字替换成对应的值,枚举在编译阶
      段将名字替换成对应的值。我们可以将枚举理解为编译阶段的宏。
    (4)这意味着,Mon、Tues、Wed 等都不是变量,它们不占用数据区(常量区、全局
      数据区、栈区和堆区)的内存,而是直接被编译到命令里面,放到代码区,所以不
      能用&取得它们的地址。
    
    

    1.2 本章学习体会

     ·结构体的知识,上课的时候听不懂,还是在练习了几道pta题目才有点了解,尤其是对结构体数组的应用,
     ·定义结构体后,如何把数据存入结构体数组中.
     ·文件这一节,我刚开始学习的时候不知道它有什么作用,感觉他好像没什么用处,学习的时候也觉得看上
      去好像非常简单,就是开文件,对文件进行操作,关文件这几个步骤。实际上运用起来感觉很麻烦。
     ·这次的大作业,也是问了好几个同学,关于文件这方面的知识,还有参考书本上的东西,才完成的。我问
      了他们一些文件的知识,以及参考了他们在构建这个大作业的思路。
    

    2.综合作业--“我爱成语”

    (1) 首先,定义头文件,主要通过封装不同的函数来实现不同的函数功能

    主函数

     主函数中首先通过IdiomRead函数进行函数的判断,用来判断输入的用户和密码是否是
     正确的,判断后将进入成语系统,然后再进行调用界面函数和读取函数。
    



     函数(IdiomPut)通过fgetc函数读取成语数据,通过函数的传参过程将个GetRead中
     的数据传到本函数中,进一步来判断并将所读取的数据传入到接下来的出题函数中,
     
    





     出题函数IdiomGet用随机数的生成来进行随机的生成题目,即随机的从成语库中挑选出成语,并随机
     的用下划线进行替换,随机的题目进行作答,如果输入的是正确的就输出正确,如果输入错误,则进
     行提醒并给出正确的成语,最后还有判断是否有退出,当输入“我要继续时就会从头开始”,当输入“我
     要退出时”会调用函数NextOne()进行进一步的判断,确认退出,通过函数NextOne()的返回值进行判断
     
    



    我的输入与调试结果

  • 相关阅读:
    基础算法(C#)
    Mac系统Docker安装Redis
    Mac系统Docker安装jenkins
    设计模式-缓存驻留模式
    设计模式列表
    vs问题---...inDebugJns.Gaea.dll”标记为系统必备组件,必须对其进行强签名。
    vs问题--------------标记为系统必备组建
    Excel--------Excel实现数据对比
    IIS--------问题解决(.net开发中localhost可以访问,本地ip不可以)
    .NET--------枚举扩展方法(枚举转list,获取枚举描述)
  • 原文地址:https://www.cnblogs.com/lowena/p/12051208.html
Copyright © 2020-2023  润新知