今天是释然发题解的第三天,以后每一天都会和大家分享学习路上的心得,希望和大家一起进步,一起享受coding的乐趣。
本文约2000字,预计阅读7分钟
昨天我们学习了矩阵旋转,忘记的小伙伴们可以看一下哦:
今天我们来聊一聊结构体,明天和大家分享链表的相关知识:
定义一个结构体:
首先我们要知道结构体是用来干嘛的,我们引用菜鸟教程中的定义:
C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。
结构用于表示一条记录,假设您想要跟踪图书馆中书本的动态,您可能需要跟踪每本书的下列属性:
Title
Author
Subject
Book ID
大概意思就是 每一个个体所拥有的属性
我们改变一个个体之后它的所有属性会和它一起发生改变,而数组只能去改变它那个位置的一个元素
声明一个结构体类型的一般形式为:
struct 结构体名
{ 成员表列 };
//注意末尾有分号,容易错
举两个例子:
struct Books
{
char title[50];//书名
char author[50];//作者
char subject[100];//主题
int book_id;//书本编号
} book;
struct Student
{ int num; //学号
char name[20];//姓名
char sex; //性别
int age; //年龄
float score; //得分
char addr[30]; //家庭住址
};
其实就是:由程序设计者指定了一个结构体类型struct Student
它包括num,name,sex,age,score,addr等不同类型的成员
!!成员可以属于另一个结构体类型
struct Date
{ int month; int day; int year; };
struct Stu
{ int num;char name[20];
char sex;int age;
struct Date birthday;
char addr[30];
};
就相当于这样的存储方式
结构体的用法
1.先声明结构体类型,再定义该类型变量
声明结构体类型struct Student,可以用它来定义变量
struct Student student1,student2;
//结构体类型名 结构体变量名
2.在声明类型的同时定义变量
struct student
{ int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
} student1,student2;
3.不指定类型名而直接定义结构体类型变量
其一般形式为:
struct { 成员表列 } 变量名表列;
//指定了一个无名的结构体类型
4.结构体数组:
定义结构体数组一般形式是
①
struct 结构体名
{成员表列} 数组名[数组长度];
② 先声明一个结构体类型,然后再用此类型定义结构体数组:
结构体类型 数组名 [数组长度];
eg: struct student stu[30];
好了这个时候我们来举一个例子:
例题:NBA总冠军
问题描述:又要考试了,Ljw决定放松一下,就打开电视,看见了篮球赛,他立即想到了每年的NBA总冠军队伍。由于复习紧张,他只记起了一部分,记忆的内容是正确的,可能不是按时间顺序排列的,记忆的内容可能有重复。现在请求学过编程的你帮助Ljw,按时间依次输出总冠军的球队(不能重复)。(NBA从 1947A.D 到2013A.D)
输入要求:第一行是一个整数n(0<n<80)接下来的n行,每行先是城市名(由大到小写字母、空格组成),后是时间(由数字组成)二者之间用空格隔开。输出要求:共n行,即排序后的NBA总冠军队伍。每行先是时间,后是城市名。
输入样例
3
Boston 1963
Boston 1959
Philly 1947输出样例
1947 Philly
1959 Boston
1963 Boston
那么这道题的意思很简单:我们定义一个结构用来存储每个冠军的年份和队名
struct NBA
{
char name[100];
int year;
}nba[1000],temp;//用temp保存中间的值
结构体的输入
for(i=0;i<n;i++)
{
cin>>nba[i].name;
cin>>nba[i].year;
}
然后我们把年份早的调到前面来,用两层循环来操作:
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(nba[k].year>nba[j].year)k=j;
if(k!=i)
{
temp=nba[i];
nba[i]=nba[k];
nba[k]=temp;
}
}
最后输出
for(i=0;i<n;i++)
cout<<nba[i].year<<" "<<nba[i].name<<endl;
好了,今天的初识结构就到这里。
释然每天发布一点自己学习的知识,希望2年后我们也能在ACM的赛场上见面,一起去追寻自己的程序猿之路吧!
后期也会和大家一起分享学习心得和学习经验呢,明天我们不见不散哦!
下期预告:
链表
如果大家有什么建议或者要求请后台留言,释然也想和大家一起进步呀!
联系方式:shirandexiaowo@foxmail.com