复习2—结构体

第五章:结构体
主要内容:
1.结构体类型的定义
2.结构体变量的引用
3.结构体变量的初始化
4.结构体数组
5.指向结构体变量的指针

1.
struct     [结构体名]
{
      类型标识符    成员名;
      类型标识符    成员名;
         …………….
};
struct是关键字,不能省略。结构体类型与结构体变量概念不同
类型:不分配内存,不能赋值、存取、运算;
变量;分配内存,可以赋值、存取、运算;
结构体可以嵌套
例如:
 

 struct  date
    {    int month;
          int day;
          int year;
    };
   struct  student
  {   int  num;
       char name[20];
       struct  date  birthday;//struct可以省略
  }stu;


或者:
  

 struct  student
  {   int  num;
       char name[20];
       struct  date 
      {    int month;
            int day;
            int year;
      }birthday;
  }stu;


不过第二种方法会导致date结构体作用域只在结构体内部,在外面不能用
2.
结构体变量不能整体赋初值,初始化的时候可以,
cin>>student1.num;     student1.num=100;//正确
cin>>stuudent1;//错误
但是可以将结构体变量整体赋给另一个结构体变量
student2=student1;
嵌套的结构体变量必须逐层引用。
student1.birthday.day=25;
结构体变量中的成员可以同一般变量一样进行运算。
student1.birthday.day++;       student1.score+=60;

3.
初始化三种形式,与定义的三种形式对应
形式一:
struct     结构体名
{
      类型标识符    成员名;
      类型标识符    成员名;
         …………….
};
struct  结构体名  结构体变量={初始数据};
形式二:
struct     结构体名
{
      类型标识符    成员名;
      类型标识符    成员名;
         …………….
}结构体变量={初始数据};
形式三://不常用
struct
{
      类型标识符    成员名;
      类型标识符    成员名;
         …………….
}结构体变量={初始数据};
4.
结构体数组内各个元素在内存中连续存放。
5.
一个结构体变量的指针就是该变量所占据的内存段的起始地址。
例如;(三种输出类型等价)
 

int main( ){
    struct Student 
       { int num;   char name[10];char sex;  float score;};
   Student stu, *p=&stu;
   stu.num=10301;  strcpy(stu.name,″Wang Fu″);     
   stu.sex=‘f’;   stu.score=89.5;
   cout<<stu. num<<″ ″<<stu.name<<″ ″<<stu.sex<<″  ″<<stu.score<<endl;
   cout<<(*p).num<<″ ″<<(*p).name<<″ ″<<(*p).sex<<″ ″<<(*p).score<<endl;
 cout<<p->num<<″ ″<< p-> name<<″ ″<< p-> sex<<″ ″<< p-> score<<endl;
   return 0;
}

题目整理:
题1:设有3个候选人,最终只能有1人当选为领导。今有10个人参加投票,从键盘先后输入这10个人所投的候选人的名字,要求最后输出这3个候选人的得票结果。
 

#include <iostream>
#include<cstring>
using namespace std;
struct Person
{
      char name[20];
       int count;
};
int main( ){
 Person  leader[3]={"li",0,"zhang",0,"wang",0};
  int i,j;
  char leader_name[20];
  for(i=0;i<10;i++){
            cin>>leader_name;
            for(j=0;j<3;j++)
            if(strcmp(leader_name,leader[j].name)==0)
                leader[j].count++;
   }
  for(i=0;i<3;i++){
            cout<<leader[i].name<<":"<<leader[i].count<<endl;
   }
   return 0;
}

题2:输入n个学生数据记录(姓名,学号,5门课成绩)算出总分,按照总分从高到底输出这些数据

#include <iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct student
{
    char name[20];
    int num;
    int sum;
};
bool comp(student x,student y)
{
    return x.sum>y.sum;
}
int main()
{
    int i,j,n,score,b;
    cin>>n;
    student stu[n];
    for(j=0;j<n;j++)
    {    b=0;
         stu[j].sum=0;
        cin>>stu[j].name>>stu[j].num;
        for(i=0;i<5;i++)
        {
            cin>>score;
          b+=score;
        }
        stu[j].sum=b;
        //cout<<stu[j].sum;
}
     sort(stu,stu+n,comp);
      for(i=0;i<n;i++)
     {
         cout<<stu[i].name<<" "<<stu[i].num<<" "<<stu[i].sum<<endl;
     }
    return 0;
}

题3:

N只小白鼠(1<N< 100), 每只鼠头上戴着一 顶有颜色的帽子。现在称出每只白鼠的重量,要求按照白鼠重量从大到小的顺序输出它们头上帽子的颜色。帽子的颜色用'r’,'b'等字符来表示。不同的小白鼠可以戴相同颜色的帽子。白鼠的重量用整数表示。

#include<iostream>
#include<algorithm>
using namespace std;
struct mouse
{
    double weight;
    char colour;
};
bool comp(mouse x,mouse y)
{
    return x.weight>y.weight;
}
int main()
{
    int n,i;
    cin>>n;
    mouse m[n];
    for(i=0;i<n;i++)
    {
        cin>>m[i].weight>>m[i].colour;
    }
    sort(m,m+n,comp);
    for(i=0;i<n;i++)
        cout<<m[i].weight<<" "<<m[i].colour<<endl;
    return 0;
}


2.3两题都用到了排序,我选择了比较简单的sort方法,上学期学习了冒泡排序和简单选择排序,这里顺带复习一下(分别用两种方法对10个数从小到大进行排序)
冒泡排序:
 

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
   int a[10],i,j,temp;
   for(i=0;i<10;i++)
    cin>>a[i];
   for(i=1;i<=9;i++)
    for(j=0;j<=9-i;j++)
   {
       if(a[j]>a[j+1])
       {
           temp=a[j];
           a[j]=a[j+1];
           a[j+1]=temp;
       }
   }
   for(i=0;i<10;i++)
    cout<<a[i]<<" ";
    return 0;
}

简单选择排序:

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
   int a[10],i,j,k,temp;
   for(i=0;i<10;i++)
    cin>>a[i];
   for(i=0;i<=8;i++)
    {
      k=i;
      for(j=i+1;j<10;j++)
      {
          if(a[k]>a[j])
            k=j;
      }
      temp=a[i];a[i]=a[k];a[k]=temp;
    }
   for(i=0;i<10;i++)
    cout<<a[i]<<" ";
    return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

季沐晴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值