第二次上機考試報告
阿新 • • 發佈:2021-12-10
這次上機考試第一個問題主要是對迴圈不熟練
例如程式設計的第一題
7-1 最受歡迎的菜品 (20 分)某自助餐廳要求餐廳的客人在就餐後進行投票,選出一款最喜愛的菜品,每日營業結束後進行投票統計,選出投票數最多的菜品為最受歡迎的菜品。 請編寫一個程式幫助餐廳快速完成這個統計工作。
輸入格式:
第1行中給出一個正整數n(不超出1000),表示菜品的數量,每個菜品使用1~n進行編號。 第2行輸入若干以空格間隔的正整數,表示客人投出的最喜愛的菜品編號,以鍵盤結束符^Z或檔案結束符結束輸入。
輸出格式:
每行輸出一個最受歡迎的菜品編號和得票數。 菜品編號和得票數間隔1個空格。如果有並列的最受歡迎的菜品,則按編號從小到大的順序輸出每一個菜品,每個菜品佔一行。
輸入樣例:
10
6 8 5 8 9 3 6 6 8 2 1 4 7 2 8 3 8 9 6 3 8 10 6 6
結尾無空行
輸出樣例:
6 6
8 6
結尾無空行
這是我原來的程式碼:
沒有對輸出相同的菜品進行全部輸出,這個純屬當時大意了並且沒有及時的對錯誤進行編譯除錯 這是我修改後的程式碼:#include<bits/stdc++.h> using namespace std; int main() { int sum; scanf("%d",&sum); int c; int b[1000]; memset(b,0,sizeof(b)); int max=-1,maxi; while(scanf("%d",&c)!=EOF) { if(c>=1&&c<=10) { b[c]++; if(b[c]>max) { max=b[c]; maxi=c; } } } printf("%d %d",maxi,max); }
檢視程式碼
#include<bits/stdc++.h> using namespace std; int main() { int n; scanf("%d",&n); int i,a[1000]; for(i=0;i<n+1;i++) { a[i]=0; } while(scanf("%d",&i)!=EOF){ a[i]++; } int max=a[1]; for(i=1;i<n+1;i++){ if(max<a[i]){ max=a[i]; } } for(i=1;i<n+1;i++) { if(max==a[i]) printf("%d %d\n",i,a[i]); } return 0; }
輸入一個字串和一個非負整數,要求將字串迴圈左移次。
輸入格式:
輸入在第1行中給出一個不超過100個字元長度的、以回車結束的非空字串;第2行給出非負整數。
輸出格式:
在一行中輸出迴圈左移次後的字串。
輸入樣例:
Hello World!
2
結尾無空行
輸出樣例:
llo World!He
結尾無空行
我直接寫上我修改後的程式碼,因為我的錯誤是沒有對N大於字串長度的情況進行討論:
檢視程式碼
#include<bits/stdc++.h>
using namespace std;
int main()
{
char str[100];
int i=0,j;
while((str[i]=getchar())!='\n')
i++;
str[i]='\0';
int l=i;
char a[100];
int n;
scanf("%d",&n);
n%=l;
for(i=0;i<l;i++)
{
a[i]=str[i];
}
/* for(int j=0;j<l;j++)
{
if((j+n)>=l)
{
str[j]=str[j+n-l];
printf("str[%d]=str[%d]=%c\n",j,j+n-l,str[j+n-l]);
}
}*/
for(j=0;j<l;j++)
{
if((j+n)<l)
str[j]=str[j+n];
}
int m;
for(j=0;j<l;j++)
{
if((j+n)>=l)
{
m=j;
break;
}
}
for(int k=0;k<n;k++)
{
str[m]=a[k];
m++;
}
for(i=0;i<l;i++)
printf("%c",str[i]);
}
7-3 順時針矩陣 (30 分)
讀入20內正整數正整數n,輸出順時針分佈的矩陣。矩陣內容為1,2,。。。到n*n。
輸入格式:
每個例項包含一個20內正整數。
輸出格式:
順時針分佈的矩陣,每個資料佔4位。
輸入樣例:
7
結尾無空行
輸出樣例:
19 20 21 22 23 24 1
18 37 38 39 40 25 2
17 36 47 48 41 26 3
16 35 46 49 42 27 4
15 34 45 44 43 28 5
14 33 32 31 30 29 6
13 12 11 10 9 8 7
結尾無空行
上程式碼!檢視程式碼
#include<bits/stdc++.h>
using namespace std;
int main()
{
int dx[4]={1,0,-1,0};
int dy[4]={0,-1,0,1};
int n,i,j;
scanf("%d",&n);
int a[22][22];
for(i=0;i<=n+1;i++)
{
for(j=0;j<=n+1;j++)
a[i][j]=-1;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
a[i][j]=0;
}i=1,j=n;int d=0;
for(int k=1;k<=n*n;k++)
{
a[i][j]=k;
if(a[i+dx[d]][j+dy[d]]!=0)d=(++d)%4;
i=i+dx[d];
j=j+dy[d];
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<setw(4)<<a[i][j];
} printf("\n");
}
}
#include<stdio.h>
void Porder(int n);
int main()
{
int num;
scanf("%d",&num);
Porder(num);
return 0;
}
void Porder(int n){
if (
1分
) {
Porder (
1分
);
}
printf (
1分
) ;
}
如:輸入: 123輸出:
1
2
3
提示:每行數字後都有換行符。
遞迴這類問題最好畫一個圖來解決
這裡的%10在函式回溯返回時得到當前引數“個位”的, 以n = 123為例,我們看看函式的呼叫過程:
每一層代表一個函式,左側代表入棧,右側表示出棧,程式從main()函式開始,最後回到main函式。左側方塊上的n表示當前函式的引數n,往下依次/10,所以n為123,12,1。
正確答案應該為 :n>0 n/10 "%d\n",n
反思:學習遞迴時一定要弄明白函式的呼叫過程,特別是一些相對複雜的問題,例如輸出全排列,倒楊輝三角,九連環問題等。
接下來我將在以後的學習中更加深入的學習,不能只掌握表面,更要融會貫通。