考研複試-----C語言上機操作(一)
序:
本人今年參加研究生考試,為了練習所找到的歷年真題,和方便重新學習,寫此部落格,具體的學校我就不提了,感興趣的童鞋們可以聯絡我。好了,正式開始吧!
本系列操作試題總共分為四道題,每道題分為問題描述、問題思路和參考程式碼。希望大家能提出改進意見!
第一題:
1,問題描述
給你一個數n,使用遞迴求n!
2,問題思路
此題算是開胃小菜,解決的方式方法題目也都給出,需要整明白的就是①會求階乘。如:3!= 3*2*1。依次類推,既得n!= n*(n-1)*(n-2)....*2*1。②了結遞迴。程式呼叫自身的程式設計技巧稱為遞迴(recursion),一般來說,遞迴需要有邊界條件(必須有,否則將會導致無限迴圈)、遞迴前進段和遞迴返回段。
3,參考程式碼
/***************************** File name:recursion Author:zhangsan Version:1.0 Date:2018/3/18 Description:對一個數字n遞迴求n! *****************************/ #include "stdio.h" /***************************** *函式名: recursion_fun *作用:求n! *引數:n - 所求階乘的值 *返回值:n!的結果 *****************************/ int recursion_fun(int n){ if(n == 0) return 0; if(n == 1) return 1; //遞迴結束條件 else return n * recursion_fun( n-1 ); //自己呼叫自己 } //主函式 int main(){ int n,res; printf("請輸入遞迴數字:"); scanf("%d",&n); res = recursion_fun(n); //n! printf("\n %d! = %d",n,res); return 0; }
第二題:
1,問題描述
給你一個年份,還有一個數字n,以1月1日為第一天,然後你根據n的值來求出是幾月幾號。
2,問題思路
解決此題的關鍵是兩點,①判斷年份是瑞年還是平年。方法:年份能被4整除且不能被100整除,則為瑞年。年份能被400整除則為瑞年。②根據n怎麼求那月那日。具體的思想可以在程式碼中檢視。
3,參考程式碼
/***************************** File name:year-month-day Author:zhangsan Version:1.0 Date:2018/3/18 Description:給出年份和今年的第幾天n,算出今天是幾月幾日 *****************************/ #include "stdio.h" /***************************** *函式名: date_fun *作用:求出一年中的第n天是幾月幾號並輸出 *引數:n-一年的第幾天 year- 哪一年 *返回值:無 *****************************/ date_fun(int year,int n){ int i,month=0,day=0,count; count = n; //arr1陣列是平年月份的天數,arr2是瑞年月份的天數 int arr1[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; int arr2[12] = {31,29,31,30,31,30,31,31,30,31,30,31}; if((year % 4 == 0&& year % 100 != 0)||year % 400 == 0){ //判斷年的種類 for(i = 0;i < 12;i++){ //根據不同的年份呼叫不同的陣列 if(n > arr2[i]){ n -= arr2[i]; }else{ break; } } printf("\n%d年中的第%d天是%d月%d日。\n",year,count,i+1,n); }else{ for(i = 0;i < 12;i++){ if(n > arr1[i]){ n -= arr1[i]; }else{ break; } } printf("\n%d年中的第%d天是%d月%d日。\n",year,count,i+1,n); } } //主函式 int main(){ int year,n; printf("請輸入年份:year = "); scanf("%d",&year); printf("\n"); printf("請輸入天數:n = "); scanf("%d",&n); date_fun(year,n); //得出結果 return 0; }
第三題:
1,問題描述
給你一串數字,實現其排序,然後把排序後重復的數字只留下一個。如(3,5,5,2,1,4,6)--->(1,2,3,4,5,6)。
2,問題思路
這個問題的解題思路還是非常清晰的,有兩步,一是排序,二是去重。排序你就可以選擇你熟悉的一種,包括選擇排序、插入排序、希爾排序、快速排序、氣泡排序等,在此文中我們採取氣泡排序。而針對於去重,我們採取申請新的記憶體地址,對排序好的陣列進行對比,例用a[5]和其他前邊的五個數進行相比,如果沒有相同的,就證明此數是唯一的,便存入新的陣列,以達到刪選的目的。
3,參考程式碼
/*****************************
File name:remove_repeat
Author:zhangsan Version:1.0 Date:2018/3/19
Description:給一串數字,實現其排序,然後把排序後重復的數字只留下一個
*****************************/
#include "stdio.h"
/*****************************
*函式名: swap
*作用:交換兩個數的值
*引數:*i - 第一個數的地址 *j - 第二個數的地址
*返回值:無
*****************************/
swap(int *i, int *j){
int temp;
temp = *i;
*i = *j;
*j = temp;
}
/*****************************
*函式名: bubble_sort
*作用:氣泡排序
*引數:*a - 傳進來的排序陣列
*返回值:無
*****************************/
bubble_sort(int *a){
int i,j;
for( i = 0; i <10 - 1 ; i++){
for( j = 1; j < 10 - 1 -i; j++){
if(a[j] < a[j-1])
swap(&a[j],&a[j-1]);
}
}
}
/*****************************
*函式名: remove_repeat
*作用:移除陣列中的重複元素
*引數:*a - 傳進來的排序陣列
*返回值:無
*****************************/
remove_repeat(int *a){
int b[10],i,index = 1;
b[0] = a[0];
for( i = 1;i < 10 ;i++){
if(a[i] != a[i-1]){
b[index++] = a[i];
}
}
for( i = 0;i < index; i++){
printf("%d ",b[i]);
}
}
//主函式
int main(){
int a[10],i;
printf("請輸入10個數字(中間使用空格隔開):\n");
for( i = 0; i < 10; i++){
scanf("%d",&a[i]);
}
bubble_sort(a); //對原陣列進行排序
remove_repeat(a); //得出結果
return 0;
}
第四題:
1,問題描述
給你一個數n,然後使其成為一個n層的金字塔,其中金字塔上面一個數字比它下面兩個數字小。你的任務就是從最上面開始往下走,只能向下走相鄰的兩個數字,從第一層走到最下面一層,求出其最大值(金字塔的資料結構你要自己建,老師過來給你資料,你再在控制檯上輸)。 金子塔樣子:
3
4 5
4 6 6
7 12 13 8
2,問題思路
3,參考程式碼
#include "stdio.h"
#include "string.h"
#include "math.h"
#include "windows.h"
//第i層裡邊找,i-1最大下標的值為num
selectfun(int *a,int n,int i,int num){
Sleep(2000);
printf("\n----%d----\n",i);
printf("\n++++%d++++\n",num);
int res=0;
int temp;
i--;
int summary=0;
while(i!=0){
summary += i;
i--;
}
i++;
if(i==n){
printf("===%d====",a[summary+num]);
}else{
printf("%d",i);
printf("aa");
if(a[summary+num]>a[summary+num+1]){
res =summary+num;
}else{
res =summary+num+1;
}
temp = i+1;
printf("%d",temp);
selectfun(a,n,temp,res);
}
}
int main(){
int i=0,j=0;
int n=0,sum=0,count=0;
//主體
scanf("%d",&n);
while(n!=0){
count += n;
n--;
}
int a[count];
for(i=0;i<count;i++){
scanf("%d",&a[i]);
}
printf("\n");
for(i=0;i<count;i++){
printf("%d ",a[i]);
}
if(n==1){
printf("%d",a[0]);
}else{
selectfun(a,n,2,1);
}
return 0;
}
//nudui