考研复试-----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;
c语言用递归函数求n的阶乘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;
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,参考代码
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论