当前位置:   article > 正文

struct(结构体)_struct结构

struct结构

     在实际问题中,一组数据往往具有不同的数据类型。

    例如, 在学生登记表中,姓名应为字符型(char[]);学号可为整型(int)或字符型(char[]);年龄应为整型(char);性别应为字符型(char);成绩可为整型(int)或实型(double)。 显然不能用一个数组来存放这一组数据。 因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类型——“结构”。

   “结构”是一种构造类型,它是由若干“成员”组成的。 每一个成员可以是一个基本数据类型或者又是一个构造类型。 结构即是一种“构造”而成的数据类型, 那么在说明和使用之前必须先定义它,也就是构造它。如同在说明和调用函数之前要先定义一样。

1.定义结构体及结构体变量

结构体的一般形式:

struct 结构体类型名//struct是关键字

{

成员表;//可以有多个

成员函数;//可以有也可以没有

}结构变量量表;//可以同时定义多个结构体变量用“,”隔开,另外结构变量表后面的“;”不能漏掉。例如:

  1. struct student//定义一个名叫student的struct类型
  2. {
  3. string name;//定义名字
  4. int chinese;//定义语文成绩
  5. int math;//定义数学成绩
  6. int total;//定义总成绩
  7. }a[111];//同时定义了a的数组变量
  8. //也可以下面这样:
  9. struct student
  10. {
  11. string name;
  12. int chinese;
  13. int math;
  14. int total;
  15. };
  16. student a[111];//这里同样可以定义多个结构体变量


注意:结构体变量名不能与结构体名重复;在定义结构体时,系统不会对其分配实际内存,只有定义结构体变量时,系统才会为其分配内存。

2.结构体变量的特点
(1).结构体变量可以整体操作。例如;
  swap(a[i],a[i+1]);
(2).结构体变量的成员的访问也很方便、清晰。例如:
  cin>>a[i].name>>a[i].chinese>>a[i].math;
(3).结构体变量的初始化和数组的初始化类似。例如:
  student op={"gaoxiang",80,90,170};
3.成员调用
一般形式:
结构体.成员名
例如: a[i].name;

操作:
cin>>a[i].name;                            //一般形式不能写cin>>a[i];
a[i].tatal=a[i].chinese+a[i].math;  // 就像整形变量一样使用
实际上结构体成员之间的操作与该成员类型所具有的操作是一致的。
成员元算符”.“在存取成员时具有最高优先级,并具有左结合性。在包含结构体的结构体的调用时,可记作:
student.abc.menbb
解释:说明结构体变量student有结构体成员abc;
     结构体变量abc有成员menbb.
4.成员函数调用

一般形式:
    结构体变量名.成员函数
结构体成员函数默认将结构体变量作为引用参数。


5.sort排序的使用
bool cmp(结构体类型名 x,结构体类型名 y)
{
    return x.结构体变量名>y.结构体变量名;
}
见代码:
  1. bool cmp(struct x,struct y)
  2. {
  3. return x.total>y.total;
  4. }


5.struct的内存储存方式
   结构体 struct 是多个相互关联数据的集合,这些数据以整体形式存储在内存。
例如:
  1. struct A
  2. {
  3. char a; //char占1个字节
  4. int b; //int 占4个字节
  5. short c; //short占2个字节
  6. };

那么结构体A是否占1+4+2=7个字节的内存大小呢,7个似乎很合理,但事实上,为了兼容各种不同的硬件,结构体内存分配采用特定字节对齐方式。

           1.数据类型对齐值:即为sizeof的值。
           2.结构体对齐值:结构体中对齐值最大类型的对齐值。
           3.结构体总大小为 其对齐值得增数倍,需要时编译器会自动添加空字节。
           4.结构体元素按顺序分配内存
            按照上述规则:


        a在第0个字节开始,占一个字节;b则在第4个字节开始,占4个字节;c在第8个字节开始,占2个字节。为使结构体总大小为其对齐值得倍数,添加两个空字节,结构体总大小为12.


6.题目解释
题目内容:

输入N个学生的语文、数学和英语的得分,按总分从高到低输出,总分数相同按数学成绩的高低输出,两者相同按输入顺序排序。

输入格式:

第一行:有一个整数n(1<=n<=100);
接下来n行:每行有一个姓名,语文成绩,数学成绩,英语成绩(成绩整数范围(0<=成绩<=100)

输出格式:

n行:每行格式有:姓名 语文 数学 英语 总分

输入样例:

5
gaoxing 78 96 80
wangxi 70 99  69
liujia 90 87 77
zhangjin 78 91 67
tom 89 87 78

输出样例:

gaoxing 78 96 80 254
liujia 90 87 77 254
tom 89 87 78 254
wangxi 70 99 69 238
zhangjin 78 91 67 236

代码:
  1. #include<bits/stdc++.h>//万能头文件
  2. using namespace std;
  3. struct A
  4. {
  5. string name;//姓名
  6. int chinese;//语文
  7. int math;//数学
  8. int english;//英语
  9. int total;//总成绩
  10. int num;//序号
  11. }s[101];//结构体
  12. bool cmp(A x,A y)//判断比较
  13. {
  14. return x.total==y.total? (x.math==y.math? x.num<y.num:x.math>y.math):x.total>y.total;
  15. //判断 按总分从高到低排序,总分数相同按数学成绩的高低排序,两者相同按输入顺序排序。
  16. }
  17. int main()
  18. {
  19. int n;
  20. cin>>n;
  21. for(int i=1;i<=n;++i)//输入
  22. {
  23. cin>>s[i].name>>s[i].chinese>>s[i].math>>s[i].english;
  24. s[i].total=s[i].chinese+s[i].math+s[i].english;
  25. s[i].num=i;
  26. }
  27. sort(s+1,s+n+1,cmp);
  28. for(int i=1;i<=n;++i)//输出
  29. {
  30. cout<<s[i].name<<" ";
  31. cout<<s[i].chinese<<" ";
  32. cout<<s[i].math<<" ";
  33. cout<<s[i].english<<" ";
  34. cout<<s[i].total<<endl;
  35. }
  36. return 0;
  37. }





声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/142993
推荐阅读
相关标签
  

闽ICP备14008679号