C程序设计--案例(2015年江苏大学程序设计考研试题 -- 编程题)

版权声明:本文由 Micheal 超 博客 创作,转载请附带链接,有问题欢迎交流。 https://blog.csdn.net/qq_42887760/article/details/84504286

题目(总):

在这里插入图片描述

解答(答案为博主自已所写,并非最优代码,仅供参考)

第一题

  • 题目

求斐波那契数列前20项

  • 参考代码(答案并非最优代码,仅供参考)
#include<stdio.h>
#include<stdlib.h>

int func(int n);
int main(){
	int sum=0;
	FILE *fp;
	if((fp=fopen("fab.txt","w"))==NULL){
		printf("不能打开此文件");
		exit(0);//需要头文件#include<stdlib.h>
	}
	for(int i=1;i<=20;i++){
		sum+=func(i);
		fprintf(fp,"%5d",func(i));
		if(i%5==0)//每5个元素,输出一个回车(以下4种方法都可以)
			//fputc('\n',fp);//相对于putchar()函数
			//fputc(10,fp);//相对于putchar()函数;'\n'的ASCII码值为10
			//fprintf(fp,"\n");//相对于printf()函数
			fputs("\n",fp);//相对于puts()函数
	}
	printf("斐波那契数列的前20项之和为%d\n",sum);
	fclose(fp);//关闭输出文件
	return 0;
}
int func(int n){
	if(n==1||n==2)
		return 1;
	else if(n>2)
		return func(n-1)+func(n-2);
	else{}
}
  • 代码说明
    关于斐波那契数列的求解方法有很多种,本题由于题目限定,只能用递归函数实现,否则还可以用其他方式实现斐波那契数列问题。例如推荐文章中的方法。
    推荐参考:
  1. https://blog.csdn.net/cheng900716lihai/article/details/51596296
  • 运行结果
    在这里插入图片描述
    在这里插入图片描述

第二题

  • 题目

辆卡车违反了 交通规则,撞人后逃逸。现场有三人目击该事件,但都没有记住车号,只记住车号的一些特征。甲说:车号的前两位数字是相同的;乙说:车号的后两位数字是相同的,但与前两位不同;丙是位数学家,他说:4位的车号正好是一个整数的平方。请根据以上线索编程协助警方找出车号,以便尽快破案,抓住交通肇事犯。

  • 参考代码(答案并非最优代码,仅供参考)
#include<stdio.h>
#include<math.h>

int func(int a);
int main(){
	int i,j;
	int result,t;//int型能表示 -32768~32767 之间的整数
	for(i=0;i<10;i++){
		for(j=0;j<10;j++){
			result=i*1000+i*100+j*10+j;
			t=func(result);//函数返回开方后的数据
			if(t)
				printf("%d= %d*%d \n",result,t,t);
		}
	}
	return 0;
}
int func(int a){
	double temp=a;
	if(sqrt(temp)==floor(sqrt(temp)))//开方取整=开方
		return sqrt(temp);
	else 
		return 0;
}
  • 代码说明
    该程序在判断一个数是否是某个数的平方时,采用的是判断 “ 开方取整=开方 ” 的方法:下面介绍几个函数(包含在#include<math.h>头文件中)
    double sqrt(double x):计算 x \sqrt{x}的值 (使用时确保 x ≥0 )
    double floor(double x):计算不大于x的最大整数(如:floor(5.0)=5.0; floor(5.1)=5.0; floor(5.9)=5.0);
    另外,程序的解题方法有很多,也为读者推荐几个其他解法。
    推荐参考:
  1. https://blog.csdn.net/qq_26974599/article/details/81634383
  • 运行结果

在这里插入图片描述

第三题

  • 题目

输入一个日期:startdate(年月日)和天数(days>=1),输出字该输入日期days天的日期enddate(即enddate=startdate+days)要求输入和输出的年份为四位整数,并确保得到有效的输入数据。同时需要考虑跨年和闰年等情况,闰年用自定义函数计算,日期自定义结构体描述。

  • 参考代码(答案并非最优代码,仅供参考)
#include<stdio.h>
#include<math.h>

bool isLeapyear(int year);
bool isRight(int year,int month,int day);
int getday(int year,int month);

struct date{
	int year;
	int month;
	int day;
};

int main(){
	struct date startdate,enddate;
	int days;
	do{
		printf("请输入一个日期:");
		scanf("%d %d %d",&startdate.year,&startdate.month,&startdate.day);
	}while(!isRight(startdate.year,startdate.month,startdate.day));
	printf("请输入days:");
	scanf("%d",&days);

	enddate.year=startdate.year;
	enddate.month=startdate.month;
	enddate.day=startdate.day+days;
	while(!isRight(enddate.year,enddate.month,enddate.day)){
		enddate.day=abs(enddate.day-getday(enddate.year,enddate.month));//最后一次必定是负数,故取绝对值
		enddate.month++;
		if(enddate.month>12){
			enddate.year++;
			enddate.month=1;
		}
	}
	
	printf("(year-month-day):%d-%d-%d\n",enddate.year,enddate.month,enddate.day);

	return 0;
}

int getday(int year,int month){//根据年份、月份,返回天数
	switch(month){
		case 1:case 3:case 5:case 7:case 8:case 10:case 12:
			return 31;
			break;
		case 4:case 6:case 9:case 11:
			return 30;
			break;
		case 2:
			if(isLeapyear(year))
				return 29;
			else
				return 28;
			break;
		default:
			return 0;
			break;
	}
}

bool isRight(int year,int month,int day){//判断日期的合法性函数
	bool flag=false;
	if(year>=1000 && year<9999){//判断年份
		if(month>=1 && month<=12){//判断月份
			switch(month){//根据月份判断日期正确性
				case 1:case 3:case 5:case 7:case 8:case 10:case 12:
					if(day>=1 && day<=31)
						flag=true;
					break;
				case 4:case 6:case 9:case 11:
					if(day>=1 && day<=30)
						flag=true;
					break;
				case 2:
					if(isLeapyear(year))
						if(day>=1 && day<=29)
							flag=true;
						else{}
					else
						if(day>=1 && day<=28)
							flag=true;
						else{}
					break;
			}//结束switch()
		}
	}
	return flag;
}
bool isLeapyear(int year){
	return year%400==0||year%4==0&&year%100!=0;
}
  • 代码说明
    其中:对于 getday(int year,int month) 函数 还可以采用如下写法;
int getday(int year,int month){//根据年份、月份,返回天数
	int month_day[12]={31,28,31,30,31,30,31,31,30,31,30,31};
	int leapyear_month_day[12]={31,29,31,30,31,30,31,31,30,31,30,31};
	if(isLeapyear(year))
		return leapyear_month_day[month-1];
	else 
		return month_day[month-1];
}

/*
int getday(int year,int month){//根据年份、月份,返回天数
	switch(month){
		case 1:case 3:case 5:case 7:case 8:case 10:case 12:
			return 31;
			break;
		case 4:case 6:case 9:case 11:
			return 30;
			break;
		case 2:
			if(isLeapyear(year))
				return 29;
			else
				return 28;
			break;
		default:
			return 0;
			break;
	}
}
*/

方法有很多种,也可以参考:

  1. https://blog.csdn.net/UJS_GROUP2016/article/details/78680879
  2. https://blog.csdn.net/jiahuiaijiafeng/article/details/82989128
  • 运行结果
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42887760/article/details/84504286
今日推荐