大一寒假训练一(二维数组和结构体)【更新完成】
本次训练共8题,本文附AC代码和题目链接。
本次训练均为基础题,会用二维数组和结构体就行了,很简单。
#include <stdio.h>
int main()
{
int i,j,m,n,maxi,maxj,max,a[101][101];
while(scanf("%d%d",&m,&n)!=-1)
{
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
scanf("%d",&a[i][j]);
}
max=a[1][1];
maxi=maxj=1;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
if(a[i][j]>max)
{
max=a[i][j];
maxi=i;
maxj=j;
}
}
}
printf("%d %d %d\n",maxi,maxj,max);
}
return 0;
}
#include <stdio.h>
int main()
{
int a[101][101],b[101][101],i,j,m,n,s[101][101];
while(scanf("%d%d",&m,&n)!=-1)
{
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
scanf("%d",&a[i][j]);
}
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
scanf("%d",&b[i][j]);
}
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
s[i][j]=a[i][j]+b[i][j];
if(j==n)printf("%d\n",s[i][j]);
else printf("%d ",s[i][j]);
}
}
}
return 0;
}
#include <stdio.h>
int main()
{
int a[101][101],i,j,m,s;
while(scanf("%d",&m)!=-1)
{
for(i=1;i<=m;i++)
{
for(j=1;j<=m;j++)
scanf("%d",&a[i][j]);
}
s=0;
for(i=1;i<=m;i++)
{
for(j=1;j<=m;j++)
{
if(i==j)
s=s+a[i][j];
if(i+j==m+1)
s=s+a[i][j];
}
}
printf("%d\n",s);
}
return 0;
}
nefu 954 矩阵相乘
这题要想清楚矩阵是怎么相乘的以及如何处理下标
#include <stdio.h>
int main()
{
int m,i,j,k,a[20][20],b[20][20];
while(scanf("%d",&m)!=-1)
{
for(i=1;i<=m;i++)
{
for(j=1;j<=m;j++)
scanf("%d",&a[i][j]);
}
for(i=1;i<=m;i++)
{
for(j=1;j<=m;j++)
scanf("%d",&b[i][j]);
}
int s[20][20]={0};
for(i=1;i<=m;i++)
{
for(j=1;j<=m;j++)
{
for(k=1;k<=m;k++)
s[i][j]=s[i][j]+a[i][k]*b[k][j];
}
}
for(i=1;i<=m;i++)
{
for(j=1;j<=m;j++)
{
if(j==m)printf("%d\n",s[i][j]);
else printf("%d ",s[i][j]);
}
}
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main()
{
int m,n,i,j,k,s,ans,a[20][20];
while(cin>>m>>n)
{
memset(a,0,sizeof(a));
for(i=0;i<=m+1;i++)
{
for(j=0;j<=n+1;j++)
{
if(i>=1&&i<=m&&j>=1&&j<=n)
cin>>a[i][j];//相当于在原二维矩阵外面再加一层0
}
}
ans=0;
for(i=0;i<=m+1;i++)
{
for(j=0;j<=n+1;j++)
{
if(i>=1&&i<=m&&j>=1&&j<=n)
{
s=a[i][j]+a[i-1][j]+a[i+1][j]+a[i][j-1]+a[i][j+1];
if(s>ans) ans=s;
}
}
}
printf("%d\n",ans);
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
struct student
{
char num[10],name[30];
double score;
};
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].num,stu[i].name,&stu[i].score);
for(i=1;i<=n;i++)
printf("%s %s %.2lf\n",stu[i].num,stu[i].name,stu[i].score);
}
return 0;
}
有一种很好的不跳过空格输入字符串的写法:
char s[100];
scanf(" %[^\n]",s);
这就比用gets(s)不跳过空格输入字符串好用多了。
nefu 1637 身高问题
sort函数中自定义cmp函数:先按身高降序排列,若身高相同则按学号升序排列,排序后数组中的第一个元素就是身高最大且学号最小的。
#include <bits/stdc++.h>
using namespace std;
struct node
{
string name,h,num;
}p[101];
bool cmp(node a,node b)
//先按身高降序排列,若身高相同则按学号升序排列,排序后数组中的第一个元素就是身高最大且学号最小
{
if(a.h!=b.h)return a.h>b.h;
else return a.num<b.num;
}
int main()
{
int n,i;
cin>>n;
for(i=0;i<n;i++)
cin>>p[i].name>>p[i].h>>p[i].num;
sort(p,p+n,cmp);
printf("%s %s %s\n",p[0].name.c_str(),p[0].h.c_str(),p[0].num.c_str());
return 0;
}
nefu 1638 成绩统计
其实这题不用结构体就能做
#include <bits/stdc++.h>
using namespace std;
string flag,level;
int n,i,cnt,sum,mark;
int main()
{
cin>>n;
cnt=sum=0;
for(i=1;i<=n;i++)
{
cin>>flag;
if(flag=="C")
{cin>>level;cnt++;}
else
{cin>>mark;sum=sum+mark;}
}
printf("%d %d\n",cnt,sum/(n-cnt));
return 0;
}
寒假培训第一天就是这么些题了,把每道题AC还是挺有成就感的。
那么第一篇博客就到这里了。