四道oj题作业

发布于:2022-12-22 ⋅ 阅读:(532) ⋅ 点赞:(0)

获取每月有多少天

描述
KiKi想获得某年某月有多少天,请帮他编程实现。输入年份和月份,计算这一年这个月有多少天。
输入描述:
多组输入,一行有两个整数,分别表示年份和月份,用空格分隔。
输出描述:
针对每组输入,输出为一行,一个整数,表示这一年这个月有多少天。

题目分析

每个月份的天数分别是

31 天的: 1,3,5,7,8,10,12

30 天的: 4,6,9,11

其中而二月份在闰年有29天 在非闰年有28天

那这样我们就很清楚了

我们可以先写一个函数判断是不是闰年

然后按照上面的数据判断并且返回天数就好了

我们首先写一个函数判断是闰年还是非闰年

代码如下

int judge_year(int x)
{
	if ((x%4==0 && x%100 !=0)||(x%400==0))
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

好啦 第一步任务完成

下一步 我们创建两个变量 本别是year 和 mouth

再按照我们上面写的天数给它们设计返回值

代码如下

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int judge_year(int x)
{
	if ((x%4==0 && x%100 !=0)||(x%400==0))
	{
		return 1;
	}
	else
	{
		return 0;
	}
}




int main()
{
	int year = 0;
	int mouth = 0;
	while (scanf("%d %d", &year,&mouth)!=EOF)
	{
		switch (mouth)
		{
		case 1:
			printf("%d", 31);
			break;
		case 2:
			if (judge_year(year) == 1)
				printf("%d", 29);
			else
			{
				printf("%d", 28);
			}
			break;
		case 3:
			printf("%d", 31);
			break;
		case 4:
			printf("%d", 30);
			break;
		case 5:
			printf("%d", 31);
			break;
		case 6:
			printf("%d", 30);
			break;
		case 7:
			printf("%d", 31);
			break;
		case 8:
			printf("%d", 31);
			break;
		case 9:
			printf("%d", 30);
			break;
		case 10:
			printf("%d", 31);
			break;
		case 11:
			printf("%d", 30);
			break;
		case 12:
			printf("%d", 31);
			break;
		}
        printf("\n");
	}
	return 0;
}

博主写这段代码的时候遇到了一个难点 就是不知道如何设计一个恰到好处的循环 (使用while(1)的话时间会溢出)

实际上呢 这个知识点再博主刚刚学习c语言的时候就涉及到了

使用这一行代码就可以轻松解决

while (scanf("%d %d", &year,&mouth)!=EOF)

既解决了输入的问题 又解决了循环的问题 所以说还是要多多练习 这样才能融汇贯通

复习地址

判断一个数是不是字母

描述
KiKi想判断输入的字符是不是字母,请帮他编程实现。

输入描述:
多组输入,每一行输入一个字符。
输出描述:
针对每组输入,输出单独占一行,判断输入字符是否为字母,输出内容详见输出样例。

这道题在前面的博客中又讲解 这里不再赘述

复习地址

转换大小写

知识点
大写字母转化成小写字母只需要加上32

核心代码如下

 if (ch >= 'A' && ch <= 'Z')
                printf("%c\n", ch + 32);
 if (ch >= 'a' && ch <= 'z')
                printf("%c\n", ch - 32);

这里需要注意的是输入字符的区别

这里还需要注意的有两个点

1 输入字符的时候使用getchar()
记得要用括号
例如

 while ((ch=getchar()) != EOF)

如果这里没有加上括号的话就会没有结果

2 虽然getchair()一次只能拿一个字符 缓存区没有被清空 但是实际上拿到下一个字符的时候并不会执行语句
所以这一道oj题 也可以不清空内存

完整代码如下

int main()
{
    char ch;
    while ((ch=getchar()) != EOF)
    {
        char tmp;
        while ((tmp=getchar())!='\n')
        {
            ;
        }
        {
            if (ch >= 'A' && ch <= 'Z')
                printf("%c\n", ch + 32);
            if (ch >= 'a' && ch <= 'z')
                printf("%c\n", ch - 32);
        }
    }
   
 
    return 0;
}

网购

描述
KiKi非常喜欢网购,在一家店铺他看中了一件衣服,他了解到,如果今天是“双11”(11月11日)则这件衣服打7折,“双12” (12月12日)则这件衣服打8折,如果有优惠券可以额外减50元(优惠券只能在双11或双12使用),求KiKi最终所花的钱数。

数据范围:衣服价格满足 1 \le val \le 100000 \1≤val≤100000
输入描述:
一行,四个数字,第一个数表示小明看中的衣服价格,第二和第三个整数分别表示当天的月份、当天的日期、第四个整数表示是否有优惠券(有优惠券用1表示,无优惠券用0表示)。 注:输入日期保证只有“双11”和“双12”。
输出描述:
一行,小明实际花的钱数(保留两位小数)。(提示:不要指望商家倒找你钱)

这个题目没什么难度 按照题目条件嵌套 if就可以

#include<stdio.h>
int main()
{
	// 定义所有的变量
	float price;
	int day = 0;
	int month = 0;
	int flag = 0;
	float cash = 0.00f;
	//获取所有的变量
    //scanf("%.2f &d %d %d",&prise,&mouth,&day,&flag);
	scanf("%f %d %d %d", &price, &month, &day, &flag);
	if (month==11&&day==11)
	{
		cash = 0.7 * price;
		if (flag==1)
		{
			cash -=50;
			if (cash<=0)
			{
				cash = 0;
			}
		}
	}
	if (month == 12 && day == 12)
	{
		cash = 0.8 * price;
		if (flag == 1)
		{
			cash -= 50;
			if (cash <= 0)
			{
				cash = 0;
			}
		}
	}
	if ((month != 12 && day != 12) && (month != 11 && day != 11))
	{
		cash = price;
	}
	printf("%.2f\n", cash);
	return 0;
}

这里唯一需要注意的点就是浮点数的使用

取值的时候使用scanf(%f)

打印的使用print(%.2f)表示打印两位小数

以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够

不吝赐教 在评论区或者私信指正 博主一定及时修正

那么大家下期再见咯