第三篇:初识结构体

今天是释然发题解的第三天,以后每一天都会和大家分享学习路上的心得,希望和大家一起进步,一起享受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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Shirandexiaowo

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

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

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

打赏作者

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

抵扣说明:

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

余额充值