第五章:结构体
主要内容:
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;
}