程序设计基础(第二版)练习题集合

在这里插入图片描述
前言
此文章主要收集了程序设计基础C语言(第二版)中的练习题,其中有些题目会有我的个人思路和解析,如果感兴趣,可以来看看。
在这里插入图片描述

两数求和

输入两个整数,求解并输出它们的和

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	int a, b;
	scanf("%d %d", &a, &b);
	printf("%d\n", a + b);
	return 0;
}

摄氏华氏温度转换

假如用C表示摄氏温度,F表示华氏温度,则有:F=Cx9/5+32.输入一个数表示摄氏温度,根据该公式编程求对应的华氏温度。结果保留一位小数

int main()
{
	float c = 0.0;//先创建一个浮点型的变量,这样整型和浮点型的摄氏度都可以输入了
	scanf("%f", &c);//记得要用%f接收浮点型变量
	float f = c * 1.8 + 32;
	printf("%.1f\n", f);
	return 0;
}

输入三位数的个位、十位、百位

简单版本

int main()
{
	int n = 0;
	int arr[3] = { 0 };//创建一个数组存放个位、十位、百位
	scanf("%d", &n);
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		arr[2 - i] = n % 10;//用取模的方式得到每一位
		n = n / 10;//n取完模后记得更新
	}
	//打印个位、十位、百位
	for (i = 0; i < 3; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;

}

但是此版本的作用范围太小,只能针对于三位数的打印,所以我们能不能将其优化为任何位数都能打印它的各个位呢?

优化版本

int GetDigit(int n)
{
	if (n > 9)
		return GetDigit(n / 10) + 1;//递归法得到位数长度
	else
		return 1;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int digit = GetDigit(n);//创建一个函数得到该数字的位数
	int k = digit;
	int i = 0;
	int res = 0;
	for (i = 0; i < digit; i++,k--)
	{
		res = n / (pow(10,k-1));//从个位开始,得到每一位的数
		printf("%d ", res);
		n = n - res * pow(10, k-1);//得到位数后记得将n更新
	}
	return 0;
}

效果展示👇🏻👇🏻👇🏻
在这里插入图片描述

求存款到期利息

输入存款金额money,存期year和年利率rate,根据下列公式计算;
interest=moneyx(1+rate)^year-money
输出时保留两位小数

int main()
{
	int a, b;
	float c;
	printf("Enter money,year and rate:");
	scanf("%d %d %f",&a,&b,&c);
	float interest = a * pow((1 + c), b) - a;
	printf("interest=%.2f\n", interest);
	return 0;

}

记得头文件要加上<math.h>

求三角形面积

做这道题,我们首先要确保我们输入的3边值,能够满足构成一个三角形,所以,在之前,我们需要构建一个函数判断是否满足,若不满足,则重新输入值

int Judge(int a, int b, int c)//判断是否满足构成一个三角形
{
	if (a + b > c && a + c > b && b + c > a)
		return 0;
	else
		return 1;
}
int main()
{
	int a, b, c;
	printf("请输入三个整数:");
	scanf("%d %d %d", &a, &b, &c);
	while (Judge(a,b,c))//判断是否满足构成一个三角形
	{
		printf("\n");
		printf("请重新输入合法的值:");
		scanf("%d %d %d", &a, &b, &c);
	 }
	int s = (a + b + c) / 2;
	float S = pow( s*(s - a)*(s - b)*(s - c), 0.5);
	printf("S=%.3f", S);
	return 0;
}

输入一个4位正整数,将其加密后输出

加密方法:将该数每位上的数字加9,然后除以10取余,所得结果作为该位上的新数字,最后将千位数和十位数互换,百位数和个位数互换,组成加密后的新4位数

int main()
{
	int n = 0;
	printf("Enter a number:");
	scanf("%d", &n);
	int arr[4] = { 0 };
	int i = 0;
	int digit = 0,res=0;

	for (i = 1; i >= 0; i--)
	{
		digit = n % 10;//得到该位上的数字
		res = ((digit + 9) % 10) ;
		arr[i] = res;
		n = n / 10;//记得将n更新
	}
	for (i = 3; i >=2 ; i--)
	{
		digit = n % 10;//得到该位上的数字
		res = ((digit + 9) % 10) ;
		arr[i] = res;
		n = n / 10;//记得将n更新
	}
	printf("The encrypted number is ");
	for (i = 0; i < 4; i++)
	{
		printf("%d", arr[i]);
	}
	return 0;
}

输出下一秒

该题会有这几种情况
1.下一秒,秒位没有满60,不进1,正常打印
2.下一秒,秒位满60,秒位变00,分位进1,进行打印
3.下一秒,秒位满60,分位满60,分位变00,时位进1,进行打印
4.下一秒,秒位满60,分位满60,时位满24,此时打印00:00:00
此时需要用if语句将这些情况执行
如何解决高位补0问题?
我们也可以运用到If语句
当我们对时位、分位、秒位的数字都确定完之后
我们对于数值小于10的位,进行单独补0
注:我们还要再判断输入的数值是否合法(时位在0~24,分位在0 ~60,秒位在0 ~60)

代码如下👇🏻👇🏻👇🏻

int main()
{
	int a, b, c;
	while (1)//可以无限输入
	{
	again:
		printf("请输入当前时间:");
		scanf("%d:%d:%d", &a, &b, &c);
		if (a < 0 || a>23 || b < 0 || b>60 || c < 0 || c>60)
		{
			printf("输入值不合理,请重新输入\a\n");
			goto again;
		}
		//接下来要对a,b,c进行改造
		if (c + 1 == 60)
		{
			c = 0;//秒位变为0
			b += 1;//分位加1
			if (b == 60)//如果分位加1后也满60
			{
				b = 0;
				a += 1;//时位加1
				if (a == 24)
				{
					a = 0;
				}
			}

		}
		else
			c += 1;
		//改造完之后,进入正式打印环节,要从时位开始打印
		if (a < 10)
			printf("下一秒时间为:%02d:", a);
		else
			printf("下一秒时间为:%d:", a);
		if (b < 10)
			printf("%02d:", b);
		else
			printf("%d:", b);
		if (c < 10)
			printf("%02d\n", c);
		else
			printf("%d\n", c);
	}

	return 0;
}

效果如下👇🏻👇🏻👇🏻
在这里插入图片描述

时钟指针角度

我们易知,在时钟中,小时之间的间隔角度为30度,分钟之间间隔角度为6度(本题只需要精确到分钟间隔即可)
知道这些之后
我们可以以12点为起点,计算某时/分针的角度,如3时,它的角度就是90度。
我们分别计算出时针和分针的角度之后,求得二者角度之差即可求得结果
但是这里的结果有两种情况
1.结果<=180度,这种情况,直接打印结果就行
2.结果>180度,这种情况,我们只要将360度-结果就可以得到此时时分针角度之差
3.结果<0度,这种情况,我们将结果取负就可以得到正数差值。但这只是一般作法,我们可以用三目操作符直接取出其中的最大值和最小值进行相减
注意:
我们还要注意在分针处于0分和59分之间时,时针也有偏移角度,那么我们如何计算出这个偏移角度呢?
我们只要求得分针此时的分钟占60分钟的百分比,将这个百分比x30度就是偏移角度

代码如下👇🏻👇🏻👇🏻

int main()
{
	int a, b;
	float angle_a,angle_b;
	again:
	printf("请输入小时和分钟:");
	scanf("%d:%d", &a, &b);
	if (a < 0 || a>23 || b < 0 || a>59)
	{
		printf("输入值不合理,请重新输入\a\n");
		goto again;
	}
	if (a > 12)//我们需要将小时中大于12的转化为12小时制表达
		a -= 12;
	float proportion_b = b / 60.0;
	 angle_a = a * 30.0+ proportion_b*30.0;
	 angle_b = b * 6.0;
	float max = angle_a > angle_b ? angle_a : angle_b;
	float min = angle_a < angle_b ? angle_a : angle_b;
	float minus = max - min;
	if (minus <= 180)
	{
		printf("角度差为:%.3f\n", minus);
	}
	else
	{
		printf("角度差为:%.3f\n", 360.0-minus);

	}
	return 0;
}

球的反弹高度

球第m次落地时经过的全部路程
其实可以将其划分为m段
第一次落地时,经过路程只有下落的路程
但是到了第二次落地第三次落地之后,每段所经历的路程包括上下两路程
所以这里我们需要将这两种情况分开

int main()
{
	while (1)
	{
		float n;
		int m;
		printf("请输入n、m值:");
		scanf("%f %d", &n, &m);
		int i = 0;
		float sum = n;//我们先将第一次落地经历的路程存入
		n *= 0.25;
		for (i = 0; i < m - 1; i++)
		{
			sum += 2 * n;//每次落地所经历的路程
			n *= 0.25;//记得将n更新

		}
		printf("总路程:%.2f\n", sum);
		printf("第%d次反弹高度:%.2f\n", m, n);
	}


	return 0;
}

效果如下👇🏻👇🏻👇🏻
在这里插入图片描述

统计字符个数

#include <string.h>
int main()
{
	int n = 0,len=0,i;
	char arr[100] = {0};//初始化一个一维数组存放我们要输入的字符串
	char* p = arr;
	again:
	printf("你所要输入的字符长度和字符串,格式为,长度:字符串\n");
	printf("请输入:");
	scanf("%d:%[^\n]", &len,arr);//%[^\n]只读取到\n才停止,只有这样,才能输入空格进去
	arr[len] = '\0';//在此终止
	printf("字符串长度为:%d\n", strlen(arr));
	if (*(p+len+1) !=0|| *(p + len-1) == 0)//当字符串长度不符合时
	{
		printf("你所输入的字符串长度不一致,请重新输入\a");
		goto again;
	}
	int letter=0,blank=0,digit=0,other=0;
	while (*p != '\0')
	{
		if (*p >= '0' && *p <= '9')
			digit++;
		if((*p>='A'&&*p<='Z')||(*p >= 'a' && *p <= 'z'))
			letter++;
		if (*p == ' ')
			blank++;
		if (*p != ' ' &&( (*p < '0') || (*p > '9'&&*p<'A')||(*p>'Z' && *p<'a')||*p>'z'))
			other++;
		p++;
	}
	printf("letter=%d,blank=%d,digit=%d,other=%d\n", letter, blank, digit, other);
	

	return 0;
}

在这里插入图片描述
在这里插入图片描述

最大公约数和最小公倍数

int get_cv(int a, int b)
{
	int max = a > b ? a : b;
	int min = a < b ? a : b;
	int i = 0, tmp=0;
	for (i = 1; i <= min; i++)
	{
		if (min % i == 0 && max % i == 0)
		{
			tmp = i;
		}
	}
	
	return tmp;
}
int get_cm(int a, int b)
{
	int max = a > b ? a : b;
	int min = a < b ? a : b;
	int tmp = min;
	while (1)
	{
		if (tmp % min == 0 && (tmp % max == 0))
			break;
		tmp++;
	 }
	return tmp;
}
int main()
{
	int a, b;
	printf("请输入两个整数:");
	scanf("%d %d", &a, &b);
	int res1 = get_cv(a, b);
	int res2 = get_cm(a, b);
	
	printf("最大公约数为:%d\n", res1);
	printf("最大公倍数为:%d\n", res2);

	return 0;
}

在这里插入图片描述

换钱的交易

int main()
{
	int tm = 100000;
	int n = 0;
	int i = 0;
	float res =0.1f ;
	float sum1 = 0.0;
	int  sum2 = 0;//sum1为富翁给的钱,sum2为陌生人给的钱
	printf("请输入还钱交易天数:");
	scanf("%d", &n);
	for (i = 1; i <= n; i++)
	{
		sum1 += res;
		res *= 2;
		if (i < 4)
			sum2 += tm;
	}
	printf("富翁给的钱:%.0f\n", sum1);
	printf("陌生人给的钱:%d\n", sum2);

	return 0;
}

在这里插入图片描述

兑换钱币

对于该类问题
其实属于可能性问题
在这里,2分钱最多会被分配n/2个,5分钱最多会被分配为n/5个
所以我们可以从分配数量最少时,开始从头遍历所有可能的分配个数

int main()
{
	int n = 0;
	while (1)
	{
		int count = 0;
		again:
		printf("请输入金额:");
		scanf("%d", &n);
		if (n > 0)
		{
			int tmp1 = n;
			int two_num = n / 2, five_num = n / 5;//2分和5分能分配的最大个数
			int i = 0, j = 0;

			for (i = 0; i <= five_num; i++)
			{
				n = tmp1 - 5 * i;//每次分配完后还剩下多少钱
				int tmp2 = n;
				for (j = 0; j <= two_num; j++)
				{
					n = tmp2 - 2 * j;//每次分配完后还剩下多少钱
					if (n >= 0)//当5分钱和2分钱都分配完之后,剩下的钱如果还能大于0,剩下就用1分来补齐
						count++;
				}
			}
	
		}
		else if (n == 0)
		{
			count = 0;
		}
		else
		{
			printf("你输入的金额不合理,请重新输入,\a");
			goto again;
		}
		
		printf("分配方案共有:%d\n", count);
	}
	return 0;
}

效果如下👇🏻👇🏻👇🏻
在这里插入图片描述

同构数

正整数 n 若是它的平方数的尾部,则称 n 为同构数。
例如:5的平方数是25,而且 25 的尾部是 5 ,所以 5 就是一个同构数。
由此,其实我们可以知道,判断一个数是否为同构数,有两种情况:

  • 下界存在一个同构数
  • 上界存在一个同构数
  • 或上下都有

只要满足这三种情况之一,我们就可以判断这个数为同构数

int judge(int x)
{
	int unit = x % 10;//对x进行取模
	int x_sqrt = pow(x, 0.5);//取开根号是因为x的下界中的元素开平方最大不能超过x,所以只要遍历到x_sqrt即可
	int i = 0,n=1;
	//先判断下界是否有x的同构数
	for (i = 0; i <= x_sqrt; i++)
	{
		int res_unit = i % 10;//求出i的模
		int res = pow(i, 2);//i平方
		if (res == x && i == unit)//此时满足了x下界当中,存在同构数的条件
		{
			return 1;
		}
		
	}
	//此时再判断上界是否有x的同构数
	int x_up = pow(x, 2);
	int x_up_unit = x_up % 10;
	if (x_up_unit == x)
	{
		return 1;
	}
	else
		return 0;
}
int main()
{
	int n, m;
	while (1)
	{
		printf("\n");
		printf("请输入两个整数:");
		scanf("%d %d", &n, &m);
		int i = 0;
		int count = 0;
		printf("在%d到%d之间同构数有:", n, m);
		for (i = n; i <= m; i++)
		{
			if (judge(i))
			{
				printf("%d ", i);
				count++;

			}
		}
		
		if (count == 0)
			printf("No Answer\a");
	}
	return 0;
}

效果如下👇🏻👇🏻👇🏻
在这里插入图片描述

sinx的近似计算公式

在这里插入图片描述

对于这种已经给出公式的题目,我们只要按照其中的公式找猫画虎即可。
根据公式,我们可以求出第n项的数值
所以,我们可以单独创建一个函数来求得第n项的值
然后,如果我们要求前4项的和,只需要分别用该函数求出每一项的值然后相加即可。

int get_fac(int n)
{
	int i = 0;
	int res = 1;
	for (i = n; i >= 1; i--)
	{
		res *= i;
	}
	return res;
}
double get_num(double x, int n)
{
	//在公式中唯一难点就是求2n-1的阶乘
	//但其实我们只要再创建一个函数实现求n的阶乘功能即可
	int ret = get_fac(2 * n - 1);//get_fac函数求(2n-1)的阶乘
	double sympol = pow(-1, (double)n - 1);//(-1)^(n-1)
	double x_n = pow(x, (double)2 * n - 1);//x^(2n-1)
	double res = (sympol * x_n) / ret;
	return res;

}
int main()
{
	int n = 0;//正整数n
	double x = 0.0;
	printf("请输入弧度x和正整数n:");
	scanf("%lf %d", &x, &n);
	int i = 0;
	double sum = 0.0;
	for (i = 1; i <=n; i++)
	{
		double res = get_num(x, i);//创建一个函数得到第n个数的值为多少
		sum += res;
	}
	printf("sinx=%.8f\n", sum);

	return 0;
}

在此道题中,我们为了保证数据的准确性和一致性,应该将浮点型变量用double来设置
效果如下👇🏻👇🏻👇🏻
在这里插入图片描述

整数出现次数

#include <stdlib.h>
int judge(int a, int* p, int sz)
{
	int count = 0;
	while (sz)
	{
		if (a == *p)
		{
			count++;
		}
		p++;
		sz--;
	 }
	if (count == 1)
		return 1;//也就是说只出现过一次
	else
		return 0;
}
int change(const void* p1, const void* p2)
{
	return (*(int*)p1 - *(int*)p2);
}
int main()
{
	int n;
	printf("请输入你要输入整数的个数:");
	scanf("%d", &n);
	int i = 0,j=0;
	int arr1[30] = { 0 };//输入整数数组
	int arr2[30] = { 0 };//这个数组存放第一次出现的数字
	int arr3[30] = { 0 };//这个数组存放第一次出现数字的重复次数
    int count = 0;
	int arr2_len = 0;
	int tmp = 0;
	printf("请输入%d个整数:", n);
	for (i = 0; i < n; i++)
	{
		scanf("%d", &arr1[i]);//输入整数
	}
	//接下来要存放第一次出现的数字
	for (i = 0; i < n; i++)
	{
	   //此时我们要创建一个函数判断这个数字在之前,是否已经出现过了
		if (judge(arr1[i], arr1, i + 1))
		{
			arr2[j] = arr1[i];//存放到新数组中去
			j++;
			arr2_len++;
		}
		
	}
	//我们存放新数组后,还要再给这个新数组整顿一下,给其排序(升序)
	qsort(arr2, arr2_len, sizeof(arr2[0]), change);//进行升序排序
	//此时要开始为其计数了,看看重复了几次
	for (i = 0; i < arr2_len; i++)
	{
		for (j = 0,count=0; j < n; j++)
		{
			if (arr2[i] == arr1[j])
			{
				count++;
			}
		}
		arr3[i] = count;
	}
	//此时准备工作结束后,我们就要进行分行打印了
	//首先我们用挑战赛法得到最多的次数
	for (i = 0; i < arr2_len; i++)
	{
		
		if (arr3[i] > tmp)
			tmp = arr3[i];
	}
	//此时我们遍历整个arr3,若发现等于最大数次的值,将其打印出来
	for (i = 0; i < arr2_len; i++)
	{
		if (tmp==arr3[i])
		{
			printf("%2d %d\n", arr2[i], arr3[i]);

		}
	}

	return 0;
}

效果如下👇🏻👇🏻👇🏻
在这里插入图片描述

求两个整数的交集

int change(const void* p1, const void* p2)
{
	return (*(int*)p2 - *(int*)p1);
}
int main()
{
	int arr1[30] = { 0 };
	int arr2[30] = { 0 };
	int arr3[30] = { 0 };
	int a, b;
	int i = 0,j=0,k=0;
	int sz_arr3 = 0;
	printf("请输入第一整数组的个数:");
	scanf("%d", &a);
	for (i = 0; i < a; i++)
	{
		scanf("%d", &arr1[i]);
	}
	printf("请输入第二整数组的个数:");
	scanf("%d", &b);
	for (i = 0; i < b; i++)
	{
		scanf("%d", &arr2[i]);
	}
	//此时开始判断是否有交集元素
	for (i = 0; i < a; i++)
	{
		for (j = 0; j < b; j++)
		{
			if (arr1[i] == arr2[j])
			{
				arr3[k] = arr1[i];
				k++;
				sz_arr3++;
			}
		}
	 }
	//接下来进行降序排序
	qsort(arr3, sz_arr3, sizeof(arr3[0]), change);
	for (i = 0; i < sz_arr3; i++)
	{
		printf("%d ", arr3[i]);
	}

	return 0;
}

在这里插入图片描述

字符串分隔

//字符串分隔
//思路:字符串str中,我们在输入完之后,我们要做的事情就是知道哪些字母被非字母的字符分隔了
//知道后,我们才开始输入第二行tok的字符,因为第二行其实就是个摆设,比如我们知道第一行字母一共被分隔了n个,那么我们第二行只要输入n个字符就好了
//所以我们该如何知道在哪里开始分隔呢
//我们可以用指针去遍历字符串
//当我们遇到第一个字母时,直到遇到非字母的,我们进行计数+1,说明该处被分隔了
//然后接下来我们又要继续遍历下去,又要遇到一个字母(前提条件),直到又遇到非字母,再进行计数+1,直到全部遍历完
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int judge(const char* p)
{
	if ((*p >= 'A' && *p <= 'Z') || *p >= 'a' && *p <= 'z')
		return 1;
	else
		return 0;
}
int main()
{
	char arr1[30] = { 0 };
	char arr2[30] = { 0 };
	int n = 0;
	int i = 0;
	printf("请输入字符串str:");
	scanf("%[^\n]", arr1);//%[^\n]这样空格才能输入进去
	//printf("请输入你要输入的字符数:");
	//scanf("%d", &n);
	while (getchar() != '\n')
	{
		;
	}
	/*for (i = 0; i < n; i++)
	{
		scanf("%c", &arr1[i]);
	}*/
	char* p = arr1;
	int count = 0;
	while (*p != '\0')
	{
		//我们需要创建一个函数判断是不是字母
		if (judge(p - 1) == 1 && judge(p) == 0)
		{
			count++;
		}
		p++;

}
	//由此我们知道了第二行该打多少个字符
	printf("请输入tok字符(字符数为%d):", count);
	p = arr1;//此时要将p的地址更新一下;
	//输入第二行的字符
	//while (getchar() != '\n')
	//{
	//	;
	//}
	for (i = 0; i < count; i++)
	{
		scanf("%c", &arr2[i]);
	}

	//此时开始正式打印
	while (*p != '\0')
	{
		if (judge(p))
		{
			printf("%c", *p);
		}
		if (judge(p - 1) == 1 && judge(p) == 0)
		{
			printf("\n");
		}
		p++;
	}

	return 0;
}

效果如下👇🏻👇🏻👇🏻
在这里插入图片描述

计算星期

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//计算星期
//思路:我们首先要先输入年月日
//在这里,我们已知1980年1.1号是星期二,当我们输入了年份的时候,我们首先要先对1980年到所输入年份之间所有年份进行遍历判断闰年和平年
//我们这么做的目的是为了最后求出它们之间的天数差,年之间的天数差求出来后
//还有月和日的
//而且对于月和日的输入我们也有要求,月不能超过12,日不能超过当月的天数
//我们知道平年的2月是28天,闰年2月是29天。
//4月、6月、9月、11月各是30天。
//1月、3月、5月、7月、8月、10月、12月各是31天。
int judge(int n)
{
	if ((n % 100 == 0 && n % 400 == 0) || (n % 4 == 0 && n % 100 != 0))
		return 1;
	else
		return 0;
}
int judge_day(int a,int b,int c)
{
	if (b == 1 || b == 3 || b == 5 || b == 7 || b == 8 || b == 10 || b == 12)
	{
		if (c <=31&&c>0)
			return 1;
		else
			return 0;

	}
	if (b == 4 || b == 6 || b == 9 || b == 11 )
	{
		if (c<=30&&c>0)
			return 1;
		else
			return 0;

	}
	if (b == 2&&judge(a)==1)//2月为29时
	{
		if (c <=29 && c > 0)
			return 1;
		else
			return 0;
	}
	if (b == 2 && judge(a) == 0)//二月为28时
	{
		if (c <= 28 && c > 0)
			return 1;
		else
			return 0;
	}
}
int ret_mon(int b,int a)
{
	if (b == 1 || b == 3 || b == 5 || b == 7 || b == 8 || b == 10 || b == 12)
	{
	
		return 31;
	}
	if (b == 4 || b == 6 || b == 9 || b == 11)
	{
		return 30;
	}
	if (b == 2 && judge(a) == 1)//2月为29时
	{
		return 29;
	}
	if (b == 2 && judge(a) == 0)//二月为28时
	{
		return 28;
	}
}
int count_day(int n,int a,int b, int c)
{
	int i = 0;
	int res = 0;
	int sum = 0;
	if (n == 1800)//如果为1800年,只需要返回月日的天数
	{
		//此时需要再创建一个函数返回月份的天数
		if (b == 1)
		{
			return c;
		  }
		else
		{
			for (i = 1; i <b; i++)
			{
				res = ret_mon(i, n);
				sum += res;
			}
			return sum + c;
		}
	}
	if (n > 1800)
	{
		//if (judge(a) == 1)//为闰年时
		//{
		//	return 365 ;//1801年,返回年的天数是1800年闰年的天数,366
		//}
		if (judge(n) == 0 && judge(n - 1) == 1)
		{
			return 366;
		}
		else
		{
			return 365 ;
		}
	}
}

void print_week(int n,int a,int b,int c)
{
	if (n % 7 == 0)
		printf("%d年%d月%d日为:Tuesday\n",a,b,c);
	if (n % 7 == 1)
		printf("%d年%d月%d日为:Wednesday\n", a, b, c);
	if (n % 7 == 2)
		printf("%d年%d月%d日为:Thursday\n", a, b, c);
	if (n % 7 == 3)
		printf("%d年%d月%d日为:Friday\n", a, b, c);
	if (n % 7 == 4)
		printf("%d年%d月%d日为:Saturday\n", a, b, c);
	if (n % 7 == 5)
		printf("%d年%d月%d日为:Sunday\n", a, b, c);
	if (n % 7 == 6)
		printf("%d年%d月%d日为:Monday\n", a, b, c);
}
int main()
{
	
	while (1)
	{
		int a, b, c;//分别为年,月,日
		int sum = 0;//与1980年1月1号之间相差天数
		int i = 0;
		int day_sum = 0;
		int ret = 0,res=0, sum1 = 0, sum2 = 0;
	again:
		printf("请输入年-月-日:");
		scanf("%d-%d-%d", &a, &b, &c);
		//判断年月份是否输入合理
		if (a < 1800 || a>3000 || b < 1 || b>12)
		{
			printf("您输入的日期不合理,请重新输入\a\n");
			goto again;
		}
		//确定年月份合理后,判断日是否合理,我们需要创建一个函数判断闰年和平年
		if (judge_day(a, b, c) == 0)
		{
			printf("您输入的日期不合理,请重新输入\a\n");
			goto again;
		}
		//在将所有的输入值合理之后,我们要开始计算该年月份与1980年1月1号之间相差多少天了
		//我们通过创建循环遍历得到每一年的天数
		if (a == 1800)//只需要算月日
		{
			for (i = 1; i < b; i++)
			{
				res = ret_mon(i,a);
				sum1 += res;
			}
			day_sum = sum1 + c;
		}
		else
		{
			res = 0, sum1 = 0;
			for (i = 1; i < b; i++)//先算出月天
			{
				res = ret_mon(i, a);
				sum1 += res;
			}
			for (i = 1801; i <= a; i++)//再算出年天
			{
				ret = count_day(i, a, b, c);
				sum2 += ret;
			}
			day_sum = sum1 + sum2 + c;
		}
		//现在再创建一个函数判断星期并打印
		print_week(day_sum, a, b, c);
		
}
	

	return 0;
}

效果如下👇🏻👇🏻👇🏻😃😃😃
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值