东北林业大学acm大一培训(一)(结构体与数组)

1,结构体 :在存储和处理大批量数据时,一般会使用数组来实现,但是每一个数据的类型及含义必须一样。如果需要把不同类型、不同含义的数据当作一个整体来处理,如 1000 个学生的姓名、性别、年龄、体重、成绩等,怎么处理呢?
C++ 提供了结构体(struct)来解决这类问题。
2. C++ 中的结构体是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。
使用结构体,必须要先声明一个结构体类型,再定义和使用结构体变量。结构体类型的声明格式如下:

struct 类型名{
    数据类型1   成员名1;
    数据类型2   成员名2;};
  1. 也可以把结构体类型声明和变量定义合在一起,格式如下:
struct 类型名{
    数据类型1   成员名1; 
    数据类型2   成员名2;} 变量名; 

结构体变量具有以下特点:
(1)可以对结构体变量的整体进行操作。
例如:swap(a[i],a[j])
(2)可以对结构体变量的成员进行操作。
引用结构体变量中成员的格式为:
结构体变量名. 成员名
(3)结构体变量的初始化法与数组类似。
4.结构体数组:所谓结构体数组,是指数组中的每个元素都是一个结构体。在实际应用中,结构体数组常被用来表示一个拥有相同数据结构的群体,比如一个班的学生、一个车间的职工等。
例如:
二维数组与结构体

读入学生的信息(最多不超过100个):学号(不超过八位)、姓名(不超过20个字符)、C语言成绩(用整数表示)。统计优秀学生的信息(成绩在90分以上,包括90分)及个数。(要求用结构体实现)
Input
输入数据有多组,每组为n个学生的信息;
Output
输出数据优秀学生的信息及个数。
Sample Input
5
2015001
ZhangSan
90
2015002
LiMing
80
2015003
WangHong
70
2015004
ZhangXiao
95
2015005
WangFang
100
3
2015001
ZhangSan
60
2015002
LiMing
80
2015003
WangHong
85
Sample Output
2015001 ZhangSan 90
2015004 ZhangXiao 95
2015005 WangFang 100
3
0

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
struct student {
   char id[9];
   char name[21];
   int fenshu;
}a[100];

int main()
{ int n,i,t;
  while(~scanf("%d\n",&n))
{t=0;
   for(i=0;i<n;i++)
   {scanf("%s %s %d",a[i].id,a[i].name,&a[i].fenshu);}

   for(i=0;i<n;i++)
   {
       if(a[i].fenshu>=90) {printf("%s %s %d\n",a[i].id,a[i].name,a[i].fenshu);t++;}

   }
   printf("%d\n",t);
}


    return 0;
}

输入 n 个学生的信息,每个学生信息包括姓名、身高、学号。编程输出身高最高的学生的信息。
Input
第 1 行一个正整数 n,表示学生个数,n≤100。
以下 n 行,每一行依次输入学生的姓名、身高、学号。
Output
输出最高的学生信息,如存在身高一样的请输出学号小的那个同学。
Sample Input
5
John 172 20160302
David 173 20160306
Jason 168 20160309
Jack 152 20160311
Kitty 147 20160319
Sample Output
David 173 20160306

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
struct student {

 string  name,tall,id;
}stu[101];
bool cmp(student s1,student s2)
{
    if(s1.tall!=s2.tall) return s1.tall>s2.tall;
    else return s1.id<s2.id;
}

int main()
{int n,i;
  scanf("%d\n",&n);
       for(i=0;i<n;i++)
       {
         cin>>stu[i].name>>stu[i].tall>>stu[i].id;
       }
       sort(stu,stu+n,cmp);
       printf("%s %s %s\n",stu[0].name.c_str(),stu[0].tall.c_str(),stu[0].id.c_str());

    return 0;
}
Close
在实验7基础上简化读入学

生的信息:学号(8位整数)、姓名(20个字符)、1门课的成绩(2位小数)。 要求用输入、输出函数实现部分子功能。
Input
输入数据有1组,每组有n个学生信息。
Output
输出读入的学生信息,每行1个学生信息,各信息之间用2个空格分隔。
Sample Input
5
20140101
Li Ming
85
20140202
Zhao Li
98
20140013
Qiao En
92.5
20140404
Tian Ya
88.5
20140015
Lu Yao
89.4
Sample Output
20140101 Li Ming 85.00
20140202 Zhao Li 98.00
20140013 Qiao En 92.50
20140404 Tian Ya 88.50
20140015 Lu Yao 89.40

#include <iostream>
#include <bits/stdc++.h>
#include<cstdio>

using namespace std;
struct student{
  char id[10];
  char name[30];
 double fenshu;
};
int main()
{
  int n,i;
  while(scanf("%d",&n)!=-1)
{
  student stu[100];
getchar();
  for(i=1;i<=n;i++)
scanf("%s %[^\n] %lf ",stu[i].id,stu[i].name,&stu[i].fenshu);
   for(i=1;i<=n;i++)
  printf("%s  %s  %.2lf\n",stu[i].id,stu[i].name,stu[i].fenshu);

}
  return 0;
}

计算2个方阵的乘积!
Input
输入数据有多组,每组第1行为m (1 <m<10),表示方阵的大小,接下来为2个m行m列的数据data(i,j);( 1<data(i,j)<100)
Output
输出这2个方阵的乘积,具体见样例
Sample Input
2
1 2
1 2
3 1
1 3
Sample Output
5 7
5 7

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int i,j,n,l;
int a[11][11],b[11][11],str[11][11];
int main()
{

  while(scanf("%d\n",&n)!=-1)
  {  
       memset(str,0,sizeof(str));
      for(i=1;i<=n;i++)
      {
          for(j=1;j<=n;j++)
          {
              scanf("%d",&a[i][j]);
          }
      }
      for(i=1;i<=n;i++)
      {
          for(j=1;j<=n;j++)
          {
              scanf("%d",&b[i][j]);
          }
      }
      for(i=1;i<=n;i++)
      {
        for(j=1;j<=n;j++)
        {
            for(l=1;l<=n;l++)
            {
                str[i][j]=str[i][j]+a[i][l]*b[l][j];
            }
        }
    }
    for(i=1;i<=n;i++)
   {
      for(j=1;j<=n;j++)
      {   if(j!=n)
         printf("%d ",str[i][j]);
         else  printf("%d\n",str[i][j]);
      }
}
  }
    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值