大一寒假培训(一)(补)
刚把(二)写了,想着把(一)也补一下。
昨天是寒假培训的第一天,老师普及了一下c++与c的区别,又讲了结构体的知识,以下是习题。
nefu 952 二维矩阵对角线和
Description
计算m×m的方阵的对角线所有元素的和。
Input
输入数据有多组,每组第1行为m( 2<=m<=10),接下来有m行m列的数据1<=a(i,j)<=100;
Output
对于你刚输入的这个矩阵,输出方阵的对角线所有元素的和。(交叉位置元素要多次计算的)
Sample Input
3
1 2 3
4 5 6
7 8 9
Sample Output
30
Hint
交叉位置元素要多次计算的
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a[10][10];
int m,sum;
while(cin>>m){
for(int i=0;i<m;i++) //输入矩阵的数据
for(int j=0;j<m;j++)
cin>>a[i][j];
sum=0;
for(int i=0;i<m;i++){
sum+=a[i][i]; //计算主对角线
sum+=a[i][m-1-i]; //计算副对角线
}
cout<<sum<<endl;
}
return 0;
}
nefu 1064 矩阵的外围
Description
在军事训练中,战士们站成一个方阵(也可能是一个长方形),每个战士身上都有1个编号,现在军队领导想知道,站在队伍外围战士们的编号之和是多少?大一的你能帮帮他吗? 本题20分
Input
输入数据有多组,每组第一行n和m(1<n,m<=10),代表行数和列数。接下来是n行m列个战士的编号值value[i],0<= value[i] <=100;
Output
在一行内输出外围战士的编号之和。
Sample Input
3 3
1 2 3
4 5 6
0 1 0
Sample Output
17
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a[10][10];
int m,n,sum;
while(cin>>n>>m){
for(int i=0;i<n;i++) //输入数据
for(int j=0;j<m;j++)
cin>>a[i][j];
sum=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(i==0||j==0||i==n-1||j==m-1) //第一行,第一列,最后一行,最后一列四个至少一个成立时,使sum加上该值
sum+=a[i][j];
cout << sum << endl;
}
return 0;
}
nefu 955 五人帮
Description
5人帮的含义就是数字和该数字所对应的上、下、左、右和自己本身的数值之和,请求出矩阵中5人帮的最大值是多少?
Input
输入数据只有多组,每组第1行为2个数m和n(1 <m,n<10),代表行数和列数; 接下来输入这m行和n列个数data(i,j)(1< data(i,j)<100)
Output
输出该矩阵5人帮的最大值!
Sample Input
3 4
1 2 3 4
3 4 5 6
2 3 3 9
Sample Output
24
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a[11][11]={0}; //为了不越界,多开了一些数组,使数据周边均为0
int m,n;
while(cin>>n>>m){ //从a[1][1]输入,可留一行一列0
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
int max=0,jie;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
jie=a[i][j]+a[i-1][j]+a[i+1][j]+a[i][j-1]+a[i][j+1]; //计算五人帮
max=max(max,jie);
}
for(int i=0;i<11;i++) //初始化数组,防止下一组数据过少,导致数组右方和下方的数据不为0
for(int j=0;j<11;j++)
a[i][j]=0;
cout<<max<<endl;
}
return 0;
}
nefu 1031 回转小矩阵
Description
现在有一个n*m行的矩阵A 逆时针旋转90度形成一个新的矩阵B,将B矩阵输出来。
快敲代码,动作!
Input
多组样例,每行两个整数n,m( 1<=n<=100, 1<=m<=100 )
Output
输出矩阵B
Sample Input
3 5
1 2 3 4 5
2 4 9 2 1
3 4 5 7 9
Sample Output
5 1 9
4 2 7
3 9 5
2 4 4
1 2 3
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a[100][100];
int m,n;
while(cin>>n>>m){
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>a[i][j];
for(int i=m-1;i>=0;i--){ //没有用函数将矩阵调转,直接输出结果。。。
for(int j=0;j<n;j++){
cout <<a[j][i];
if(j!=n-1)
cout <<' ';
}
cout<<endl;
}
}
return 0;
}
nefu 954 矩阵相乘
Description
计算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 <bits/stdc++.h>
using namespace std;
int main()
{
int a[10][10],b[10][10],c[10][10];
int m,n;
while(cin>>m){
for(int i=0;i<m;i++)
for(int j=0;j<m;j++)
cin>>a[i][j];
for(int i=0;i<m;i++)
for(int j=0;j<m;j++)
cin>>b[i][j];
for(int i=0;i<m;i++)
for(int j=0;j<m;j++){
c[i][j]=0; //矩阵相乘时,每算一个c[i][j]前,都要对它初始化
for(int k=0;k<m;k++){ //线性代数告诉我们,c[i][j]为矩阵a中第i行的元素
c[i][j]+=a[i][k]*b[k][j]; //乘上矩阵b中第j列对应的元素的值之和
}
for(int i=0;i<m;i++){
for(int j=0;j<m;j++){
cout<<c[i][j];
if(j!=m-1)
cout <<' ';
}
cout <<endl;
}
}
return 0;
}
让我们先来了解一下结构体。
结构体的定义
C++ 中的结构体是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。
使用结构体,必须要先声明一个结构体类型,再定义和使用结构体变量。结构体类型的声明格式如下:
struct 类型名{
数据类型1 成员名1;
数据类型2 成员名2;
…
};
定义结构体变量
定义结构体变量格式如下:
struct 结构体类型名 变量名列表;
也可以把结构体类型声明和变量定义合在一起,格式如下:
struct 类型名{
数据类型1 成员名1;
数据类型2 成员名2;
…
} 变量名;
引用结构体变量中成员的格式为:结构体变量名. 成员名 例:stu1.num
nefu 1053 结构体应用
Description
在实验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 <bits/stdc++.h>
using namespace std;
int main()
{
struct student{
int num;
char name[20];
double grade;
}stu1;
int n;
while(cin>>n){
for(int i=0;i<n;i++){
cin >> stu1.num;
gets(stu1.name); //题目描述为带空格的名字,用gets输入
cin >> stu1.grade;
printf("%d %s %.2f\n",stu1.num,stu1.name,stu1.grade);
}
}
return 0;
}
nefu 1637 身高问题
Description
输入 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 <bits/stdc++.h>
using namespace std;
int main()
{
struct student{
int height;
char name[10];
int num;
}stu1[100];
int n,as[100],z,x;
while(~scanf("%d",&n)){
for(int i=0;i<n;i++)
cin >> stu1[i].name >> stu1[i].height >> stu1[i].num;
int maxn=stu1[0].height;
for(int i=1;i<n;i++) //找出最高的身高
if(maxn<stu1[i].height)
maxn=stu1[i].height;
z=0;
for(int i=0;i<n;i++) //若身高最高的同学不止一个,把他们的编号都记下来
if(stu1[i].height==maxn)
as[z++]=i;
int y=as[0];
int minn=stu1[y].num;
x=y;
for(int i=1;i<z;i++){ //找到学号小的同学,记下他的编号
y=as[i];
if(minn>stu1[y].num){
minn=stu1[y].num;x=y;
}
}
cout << stu1[x].name << ' ' << stu1[x].height << ' ' << stu1[x].num << endl;
}
return 0;
}
2020.1.3 补 学了排序后,有了新的代码
#include <bits/stdc++.h>
using namespace std;
typedef struct stu{
char name[20];
int height;
int num;
}stu;
bool cmp(stu a,stu b) //先按身高排序,再按学号排序
{
if(a.height!=b.height) return a.height>b.height;
return a.num<b.num;
}
int main()
{
int n;
while(cin>>n){
stu a[n];
for(int i=0;i<n;i++)
cin>>a[i].name>>a[i].height>>a[i].num;
sort(a,a+n,cmp);
cout<<a[0].name<<" "<<a[0].height<<" "<<a[0].num<<endl;
}
return 0;
}
sort排序详见大一寒假培训(二)——快排与桶排
nefu 1638 成绩统计
Description
兴趣小组收集学员成绩信息,每个学员的成绩有两种表示方法,一种用 best、good、poor 三种等级来表示,还有一种就是直接用分数来表示(百分制)。请保存学员成绩信息,并且统计有多少人是用等级来表示成绩的,用分数来表示成绩的人的平均分是多少(取整就行)。
Input
第 1 行一个正整数 n,表示学员人数,n≤1000。
第 2~n+1 行,每行一个字符和一个字符串,中间用一个空格隔开。第一个字符表示这个学生成绩类型,有 C、N 两种分别代表等级表示和分数表示,第二个字符串表示成绩信息。
Output
一行两个整数,分别表示用等级表示成绩的人数和用分数表示成绩时人的平均分(取整),中间用一个空格隔开。
Sample Input
5
C best
C good
N 90
C poor
N 98
Sample Output
3 94
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,x,sum,y;
while(~scanf("%d",&n)){
struct student{
char qu;
char grade[5];
int cheng;
}stu[n];
x=sum=y=0;
for(int i=0;i<n;i++){
cin >> stu[i].qu;
if(stu[i].qu=='C'){ //用等级表示
cin >> stu[i].grade;
x++;
}
else{ //用成绩表示
cin >> stu[i].cheng;
y++;
sum+=stu[i].cheng; //计算总成绩
}
}
sum=sum/y; //计算平均分
cout << x << ' ' << sum <<endl;
}
return 0;
}
nefu 1186 优秀学生
Description
读入学生的信息(最多不超过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 <bits/stdc++.h>
using namespace std;
struct student{
int num;
char name[20];
int grade;
}stu[100];
int main()
{
int n,you[100],z;
while(cin >> n){
for(int i=0;i<n;i++)
cin >> stu[i].num >> stu[i].name >> stu[i].grade;
int x=0;z=0;
for(int i=0;i<n;i++)
if(stu[i].grade>=90){ //优秀学生
x++;
you[z++]=i;
}
for(int i=0;i<z;i++){
int y=you[i];
cout << stu[y].num << ' ' << stu[y].name << ' ' << stu[y].grade << endl;
}
cout << x <<endl;
}
return 0;
}
nefu 1147 谁不及格?
Description
聪聪的班主任王老师最近有点忙,可是他又是一位非常细心的老师,每次考试成绩都有专门的东西来记录,学期结束的时候给每位学生算了加权之后,他都要“关心关心”成绩不好的学生,并在假期给他们补补功课。什么是成绩不好呢?在王老师眼里,成绩不好当然就是加权成绩不及格咯!如今王老师这么忙,正好看你成天写程序闲着没事儿,于是他想让聪明的你来帮他写个程序,把那些不及格的同学的名单打印给他。
Input
输入包含多组数据,每组输入一个数n(1<=n<=10),然后接下来输入n个同学的信息,每个同学的信息分3行,第一行姓名name(姓名长度不超过20个字母),第二行学号x,长度为10(例:2015215098),第三行学生的平均加权成绩。
Output
每组数据第一行输出一个数k,表示不及格学生的个数,然后接下来输出3*k行不及格学生信息,第一个k行输出不及格学生姓名(按输入顺序),第二个k行输出学生学号(按输入顺序),第三个k行输出学生成绩(按输入顺序)(保留2位小数)。若是没有同学不及格,那么输出“They are Great!!”。
Sample Input
2
zhu dan
2015213678
79.99
wang meng
2015213902
83.78
1
tiancai
2015234930
59.08
Sample Output
They are Great!!
1
tiancai
2015234930
59.08
#include <bits/stdc++.h>
using namespace std;
struct student{
int num;
char name[20];
double grade;
}stu[10];
int main()
{
int n,z,you[10];
while(cin >> n){
getchar();
for(int i=0;i<n;i++){
scanf("%[^\n] %d %lf",stu[i].name,&stu[i].num,&stu[i].grade);
//用scanf输入含有空格的字符时,需用%[^\n],表示的意思是以换行为结束的标志
getchar();
}
int x=0;z=0;
for(int i=0;i<n;i++)
if(stu[i].grade<60){
x++;
you[z++]=i;
}
if(x){
cout << x << endl;
for(int i=0;i<z;i++)
cout << stu[you[i]].name << endl;
for(int i=0;i<z;i++)
cout << stu[you[i]].num << endl;
for(int i=0;i<z;i++)
printf("%.2f\n",stu[you[i]].grade);
}
else
cout << "They are Great!!" << endl;
}
return 0;
}