四道oj题作业
获取每月有多少天
描述
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)表示打印两位小数
以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够
不吝赐教 在评论区或者私信指正 博主一定及时修正
那么大家下期再见咯