大一寒假训练:结构体

一、结构体的定义与使用:

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+&
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值