C语言之万年历和逻辑数字游戏

C语言的有趣之处就是可以实现更多的想法

通过C语言实现万年历的时候,从没有想过还可以这样做好像挺花哨的,看着网络上那些大牛实现的飞机大战,感觉自己和他们差距好像挺远的,而对于万年历的话也因为自己学习的不够它看起来不够完美,但我觉得这好像也挺不错的哈哈,毕竟还是得自信!

万年历

也是一次在CSDN上看到别人使用C语言在编写万年历,就想着为什么自己不尝试一番就有了这个万年历的生成,从对于年月日输出的规划,以及如何能够定义定义自己输入的是每一年的那一个月,星期几,还专门了解了一些内容,之后顺利的完成了这份万年历,希望记录下自己的每一个脚印吧,并且帮助到那些和我一起学习的朋友,也可以一起交流。

**主函数**
int main(){
	int year = 0;
	int month = 0;
	printf("请输入您要查看的万年历年 月");
	scanf("%d%d", &year, &month);//输入想要查看的年和月
	LayOut(year, month);//打印出年月日万年历
	system("pause");
	return 0;
}

每次想要完成一个项目的时候,我总是会先在纸上画出大概的轮廓图,之后根据轮廓图来进行填充,将具体的内容补充完善;而如果没有纸的时候我也是尽可能地在大脑之中构思一个结构的大概,将所需要考虑的细节慢慢搭建起来,这可能也是很多人说道德自上向下的一种编程思维吧,所以我个人觉得学习C语言,更多的就是锻炼自己的编程思维。

**闰年的判断**
int Leap(int year){//判断是否是闰年
	if (year % 400 == 0){//能被400整除,则判断为闰年返回1
		return 1;
	}
	if (year % 4 == 0 && year % 100 != 0){//能被4整除,而不能被100整除的则为闰年返回1
		return 1;
	}
	return 0;

}
**计算在所需要输出年份之前的总天数有多少天,以190011日为星期一**
int DayCount(int year){//计算在所需要输出年份之前的总天数
	int count = 0;
	count = 365 * (year - 1900);//计算从1900年到所输入的年份之前总天数
	for (int i=1900; i < year; i++){
		if (Leap(i) == 1){//判断是否为闰年,一次闰年count总天数+1;
			count++;
		}
	}
	return count;
}
void LayOut(int year, int month){//计算所需要输出的月份对应的星期,并且进行顺序的打印
	int i;
	int n;
	int M[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
	int daysum = 0;
	daysum = DayCount(year);
	if (month <= 2){//若是2月,只需要增加1月的日子
		daysum += 31;
	}
	if (month > 2){//如果大于二月的话,先进行求闰年,若是闰年则加1;
		daysum += Leap(year);
		for (i = 0; i < month - 1; i++){
			daysum += M[i];
		}
	}
	n = (daysum % 7) + 1;//计算出星期几
	
	printf("日 一 二 三 四 五 六 \n");
	int count = 0;
	for (i = 0; i < n; i++){
		printf("   ");
		count+=1;
	}
	for (i = 1; i < M[month]; i++){
		printf("%-2d ", i);
		count += 1;
		if (count %7==0){
			printf("\n");
		}
	}
}

万年历
当初老以为万年历应该是个很困难的问题,没想到自己编写出来的时候挺顺利,除过对于星期几的问题不知道应该如何判断的时候查阅了资料外,其他都很顺利的进行了下去,完成的时候还挺开心的。
万年历源码链接

逻辑数字游戏

对于这个游戏也是无意中突然想到的,记得好像是以前看过的一个电影还是节目之中所出现的,让猜一个物品的价格,所以就想到了这么一个游戏来进行玩耍,编程路上也是需要快乐的不是吗?

**头文件+主函数**
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>

int main(){
	int i, j;
	int arr[4];//定义四个数的数组
	slashCard(arr);//采用时间戳随机生成四个数字
	int ans[4];//定义自己输入的四个数的数组
	for (i = 1; i <= 8; i++){//回答次数
		printf("第%d次输入:\n",i);
		for (j = 0; j < 4; j++)
		{
			scanf("%d", &ans[j]);//输入自己猜的四个数
		}
		if (judgeAns(ans, arr))//判断输入的四个数和需要猜测的四个数的比较
		{
			break;
		}
	}
	if (i == 9){
		printf("您的机会已用尽!\n");
		printf("正确答案为:\n");
		printArray(arr, 4);
	}
	else{
		printf("恭喜 您的挑战成功!");
	}

	system("pause");
	return 0;
	}

**生成随机的四个不重复的数**
void slashCard(int arr[]){
	srand((unsigned int)time(NULL));//定义时间戳
	int s;
	int str[10] = { 0123456789 };
	int i;
	for (i = 0; i < 4; i++){
		s = rand() % 10;//取0-9的数
		while (str[s] == -1){如果这个数字已经取过,则取下一位
			s++;
			if (s == 10){//如果取到第九位则加一位后等价于从0开始
				s = 0;
			}
		}
		arr[i] = str[s];//将取出来的值放入数组之中
		str[s] = -1;//将所取走的值置换为-1
	}
}

**打印函数**
void printArray(int arr[], int n)
{
	int i;
	for (i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}
	putchar('\n');
}

**判断函数**
int judgeAns(int ans[], int arr[]){
	int i, j;
	int countA=0;//代表存在且数值和数都对
	int countB=0;//代表存在这个数
	for (i = 1; i <= 4; i++){
		for (j = 1; j <= 4;j++){
			if (ans[i] == arr[j]){
				countB++;
				break;
			}
		}
	}
	for (i = 0; i < 4; i++){
			if (ans[i] == arr[i]){
				countA++;
			}
		
	}
	countB = countB - countA;//存在且位数对得话,则B减去A的可能
	printf("%dA%dB\n", countA, countB);
	if (countA == 4)
	{
		return 1;
	}
	return 0;
}

逻辑数字游戏源码
这就是整体的代码,对于源代码的话,也是会附在后面,也希望能够让更多的朋友学到这个东西。

发布了18 篇原创文章 · 获赞 12 · 访问量 959

猜你喜欢

转载自blog.csdn.net/Luckily0818/article/details/103635057