一、结构体的定义与使用:
1.定义
在主函数内也可以在主函数外定义,下面是习惯用法:
struct student //定义一个叫做“student”的结构体;
{
//以下是其中各种元素;
char name[22];
char xuehao;
int age;
double mark;
}p[1001]; //给该结构体一个别名“p”,便于使用,且定义为一个结构体数组;
也可以这样:
#include <bits/stdc++.h>
using namespace std;
struct student
{
char name[22];
char xuehao;
int age;
double mark;
}; //此处不写;
int main()
{
struct student p[1001]; //在主函数内进行声明,效果相同;
return 0;
}
2.使用
*先补充一点sort函数的使用基础:
*再补充一点关于正则表达式“%[^\n]”:可用于需要输入带有空格的字符型数组(如英文名),这个表达式用于输入语句,如:
scanf("%[^\n]",&stu[i].name); //意为输入直到键入回车(也就是\n)时停止输入;
还有一点很重要,不能在结构体声明中初始化结构体成员,因为结构体声明只是创建一个新的数据类型,还不存在这种类型的变量。例如,以下声明是非法的:
//非法结构体声明
struct Date
{
int day = 23,
month = 8,
year = 1983;
};
因为结构体声明只声明一个结构体“看起来是什么样子的”,所以不会在内存中创建成员变量。只有通过定义该结构体类型的变量来实例化结构体,才有地方存储初始值。
我们通过一个题目来解释:NEFU OJ:谁考了第k名-排序
代码如下:
#include <bits/stdc++.h>
using namespace std;
struct stu //定义一个结构体;
{
char xuehao[10]; //学号,用字符型数组填数字时最好开大两格以上;
double chengji; //成绩
}p[105]; //别名为“p”,105个元素
bool cmp(stu a,stu b) //定义一个比较方式,名为“cmp”
{
return a.chengji>b.chengji; //排序方式:"<"是升序,">"是降序(可以记箭头方向)
}
int main()
{
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++)
{
getchar(); //这里注意使用getchar来防止回车被写入xuehao字符串;
scanf("%s %lf",&p[i].xuehao,&p[i].chengji);}
sort(p,p+n,cmp); //sort的使用:sort(起始地址,最后一个元素的下一个地址,自定义比较函数(可以不填));
//sort默认升序排序,可以用less换成降序排序;
printf("%s %g",p[k-1].xuehao,p[k-1].chengji);
return 0;
}
初学者在使用中要注意,在循环中使用结构体内变量时,格式为:“别名[循环变量]”.“变量名”,不要忘了循环变量。
二、结构体专题练习&题解
1.NEFU OJ:奇数单增序列
//这题比较简单,没什么好说的;
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int str[n];
for(int i=0;i<n;i++)
cin>>str[i];
int str1[n],k=0;
for(int i=0;i<n;i++)
{
if(str[i]%2!=0)
{
str1[k]=str[i];
k++;
}
}
sort(str1,str1+k);
for(int i=0;i<k;i++)
{
if(i!=k-1)
cout<<str1[i]<<",";
else
cout<<str1[i];
}
return 0;
}
2.NEFU OJ:成绩排序
//也简单;
#include <bits/stdc+&