1. 程式人生 > 其它 >第二次上機考試報告

第二次上機考試報告

這次上機考試第一個問題主要是對迴圈不熟練

例如程式設計的第一題

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;
	
 } 
第二個問題呢是字串的移動: 7-2 字串迴圈左移 (20 分)

輸入一個字串和一個非負整數,要求將字串迴圈左移次。

輸入格式:

輸入在第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]);
	
}
一定要注意n%=l,這個不能省,不然題一直過不了,就是因為這個,導致了第三題完全沒時間做,所以對程式的除錯很重要,在接下來的練習中,我要加強這方面的練習。 接下來的這道題自己曾經打過,但是疏於練習,理解,所以沒能很快想出來:
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");
	}
}
要注意開頭的int dx[4]={1,0,-1,0};int dy[4]={0,-1,0,1}; 這兩個陣列分別控制的是陣列X,Y的移動,根據題意,先是Y不動,X加一,所以是1,0,接下來是X不動,Y減一,所以是0,-1,以此類推,還要注意的是要將陣列邊界的值賦值為-1,當一直移動到不為零時,就會改變方向,陣列元素始終自增 反思: 遇到這類陣列輸出的問題時一定不能慌,要冷靜分析,畢竟這些都是自己學過的內容,要將不會的問題化解為已有的知識。接下來還得多練習有關陣列輸出的題目 遞迴的問題: 看看我第一遍都寫了個啥
#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

反思:學習遞迴時一定要弄明白函式的呼叫過程,特別是一些相對複雜的問題,例如輸出全排列,倒楊輝三角,九連環問題等。

接下來我將在以後的學習中更加深入的學習,不能只掌握表面,更要融會貫通。