C语言学习第四周

闰年判断 嵌套型选择结构 字符章节

1.用char来进行定义

 字符1和整数1的区别

 putchar函数

输入只要没有\n就是按顺序输入并输出

getchar函数

 相当于省去scanf函数,但是得通过getchar来输入

开关语句switch可以代替部分if语句

例题 

 

借用PTA的题目作例

7-1 两个数的简单计算器 (10 分)

本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加、减、乘、除或求余运算。题目保证输入和输出均不超过整型范围。

输入格式:

输入在一行中依次输入操作数1、运算符、操作数2,其间以1个空格分隔。操作数的数据类型为整型,且保证除法和求余的分母非零。

输出格式:

当运算符为+-*/%时,在一行输出相应的运算结果。若输入是非法符号(即除了加、减、乘、除和求余五种运算符以外的其他符号)则输出ERROR

输入样例1:

-7 / 2

输出样例1:

-3

输入样例2:

3 & 6

输出样例2:

ERROR
#include <stdio.h>

int main()
{
    int a,b;
    char c;
    scanf("%d %c %d",&a,&c,&b);
    switch(c)
    {
        case '+':printf("%d",a+b);break;
        case '-':printf("%d",a-b);break;
        case '*':printf("%d",a*b);break;
        case '/':printf("%d",a/b);break;
        case '%':printf("%d",a%b);break;
        default:printf("ERROR");break;
    }
    return 0;
}

break在switch中相当重要,若没打break会出现连续输出下面的直到default

7-2 成绩转换 (10 分)

本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:

  • 大于等于90分为A;
  • 小于90且大于等于80为B;
  • 小于80且大于等于70为C;
  • 小于70且大于等于60为D;
  • 小于60为E。

输入格式:

输入在一行中给出一个整数的百分制成绩。

输出格式:

在一行中输出对应的五分制成绩。

输入样例:

90

输出样例:

A
#include <stdio.h>

int main()
{
    int a,b;
    scanf("%d",&a);
    b=a/10;
    switch(b)
    {
        case 10:
        case 9:printf("A");break;
        case 8:printf("B");break;
        case 7:printf("C");break;
        case 6:printf("D");break;
        default:printf("E");break;
    }
    return 0;
}

这道题突破口在一个相除得到十位数的数字,还有考虑的情况不能少100和0

7-3 判断闰年 (10 分)

输入一个年份,判断其是否为闰年,若是闰年输出“yes”的信息,否则输出“no”的信息。

判断闰年的标准:能被4整除但不能被100整除,或者能被400整除的年份是闰年。

输入格式:

直接输入一个4位数年份,没有其它任何附加字符。

输出格式:

直接输出“yes”或“no”,没有其它任何附加字符。

输入样例:

1900

输出样例:

no

输入样例:

2000

输出样例:

yes

输入样例:

1904

输出样例:

yes

#include <stdio.h>

int main()
{
    int year;
    scanf("%d",&year);
    if (year%4==0){
        if (year%100==0)
		{
            if (year%400==0)
                printf("yes");
            else 
                printf("no");
        }
        else
            printf("yes");
    }
    else 
        printf("no");
    return 0;
}

课上讲的例题:闰年的判断

需要用到嵌套的if语句,其次需要考虑闰年的定义

7-4 计算油费 (15 分)

现在90号汽油6.95元/升、93号汽油7.44元/升、97号汽油7.93元/升。为吸引顾客,某自动加油站推出了“自助服务”和“协助服务”两个服务等级,分别可得到5%和3%的折扣。

本题要求编写程序,根据输入顾客的加油量a,汽油品种b(90、93或97)和服务类型c(m - 自助,e - 协助),计算并输出应付款。

输入格式:

输入在一行中给出两个整数和一个字符,分别表示顾客的加油量a,汽油品种b(90、93或97)和服务类型c(m - 自助,e - 协助)。

输出格式:

在一行中输出应付款额,保留小数点后2位。

输入样例:

40 97 m

输出样例:

301.34

 

#include <stdio.h>

int main()
{
    int a,b;
    float d,e,money;
    char c;
    scanf("%d %d %c",&a,&b,&c);
    if (b==90){
    	e=6.95;
	}
	else if (b==93){
		e=7.44;
	}
	else if (b==97){
		e=7.93;
	}
    switch (c)
    {
        case 'm':d=0.95;break;
        case 'e':d=0.97;break;
    }
    money=a*e*d;
    printf("%.2f",money);
    return 0;
}

油价的计算需要将每一个的对应的值代入

7-5 判断字符或数字 (15 分)

键盘输入一个字符,要求判断是否为数字字符,如果是’a’~’z’或’A’~’Z’,则输出“character”,如果是‘0’~‘9’,则输出“digit”,如果都不是,则输出“ERROR”。

输入格式:

键盘输入一个字符。

输出格式:

如果是字母,则输出“character”,如果是数字,则输出“digit”,如果都不是,则输出“ERROR”。

输入样例:

A

输出样例:

在这里给出相应的输出。例如:

character
#include <stdio.h>

int main()
{
    char letter;
    letter=getchar();
    if (letter>='a'&&letter<='z'||letter>='A'&&letter<='Z'){
        printf("character");
    }
    else if (letter>='0'&&letter<='9'){
        printf("digit");
    }
    else {
        printf("ERROR");
    }
    return 0;
}

这里是有关ASCII码的情况,通过范围判断它的范畴(当然用数字去表示也可以)

7-6 计算天数 (15 分)

本题要求编写程序计算某年某月某日是该年中的第几天。

输入格式:

输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。

输出格式:

在一行输出日期是该年中的第几天。

输入样例1:

2009/03/02

输出样例1:

61

输入样例2:

2000/03/02

输出样例2:

62
#include <stdio.h>

int main()
{
    int year,month,day,all;
    scanf("%d/%d/%d",&year,&month,&day);
    if (year%4==0&&year%100!=0||year%400==0){
        switch(month)
        {
            case 1:all=day;break;
            case 2:all=day+31;break;
            case 3:all=day+29+31;break;
            case 4:all=day+31+29+31;break;
            case 5:all=day+30+31+29+31;break;
            case 6:all=day+31+30+31+29+31;break;
            case 7:all=day+30+31+30+31+29+31;break;
            case 8:all=day+31+30+31+30+31+29+31;break;
            case 9:all=day+31+31+30+31+30+31+29+31;break;
            case 10:all=day+30+31+31+30+31+30+31+29+31;break;
            case 11:all=day+31+30+31+31+30+31+30+31+29+31;break;
            case 12:all=day+30+31+30+31+31+30+31+30+31+29+31;break;
        }
        printf("%d",all);
    }
    else {
	
        switch(month)
        {
            case 1:all=day;break;
            case 2:all=day+31;break;
            case 3:all=day+28+31;break;
            case 4:all=day+31+28+31;break;
            case 5:all=day+30+31+28+31;break;
            case 6:all=day+31+30+31+28+31;break;
            case 7:all=day+30+31+30+31+28+31;break;
            case 8:all=day+31+30+31+30+31+28+31;break;
            case 9:all=day+31+31+30+31+30+31+28+31;break;
            case 10:all=day+30+31+31+30+31+30+31+28+31;break;
            case 11:all=day+31+30+31+31+30+31+30+31+28+31;break;
            case 12:all=day+30+31+30+31+31+30+31+30+31+28+31;break;
        }
        printf("%d",all);
    }
    return 0;
}

这个当时做的时候没什么想法,后面参考csdn大佬的做法,但是缺点就是有点费时费力。、

7-7 整数的分类处理 (20 分)

给定 N 个正整数,要求你从中得到下列三种计算结果:

  • A1 = 能被 3 整除的最大整数
  • A2 = 存在整数 K 使之可以表示为 3K+1 的整数的个数
  • A3 = 存在整数 K 使之可以表示为 3K+2 的所有整数的平均值(精确到小数点后 1 位)

输入格式:

输入首先在第一行给出一个正整数 N,随后一行给出 N 个正整数。所有数字都不超过 100,同行数字以空格分隔。

输出格式:

在一行中顺序输出 A1、A2、A3的值,其间以 1 个空格分隔。如果某个数字不存在,则对应输出NONE

输入样例 1:

8
5 8 7 6 9 1 3 10

输出样例 1:

9 3 6.5

输入样例 2:

8
15 18 7 6 9 1 3 10

输出样例 2:

18 3 NONE

#include <stdio.h>

int main()
{
    int N,n,i,t,k,o,b;
    float j=0;
    scanf("%d",&N);
    int a[N];
    for (n=0;n<N;n++)
        scanf("%d",&a[n]);                              /*先给一个输入的程序*/
  
    for(n=0;n<N-1;n++)
        for(i=0;i<N-n-1;i++)
        {
            if(a[i]<a[i+1])
            {
                t=a[i];
                a[i]=a[i+1];
                a[i+1]=t;                               /*这里是一个排序,设置从大到小对后面方便一点*/
            }
        }
    k=0;                                                /*赋值给k 0作为初值*/
    
    
    for (n=0;n<N;n++)
	{
        if(a[n]%3==0){
            printf("%d",a[n]);
            k=1;                                        /*如果满足被3整除就赋值给k 1*/
            break;
        }
    }
    
	if (k==0){                                          /*如果不满足就输出NONE*/
        printf("NONE");
    }
    
    
    o=0;
    j=0;
    b=0;
    
    for (n=0;n<N;n++)
	{
        if (a[n]%3==1){
            o++;                                        /*对除3余1的数进行一个加法求总数有几个*/
        }
        if (a[n]%3==2){
            j+=a[n];                                    /*对除3余2的数进行累加求总和*/
            b++;
        }
    }
    if(o==0)
        printf(" NONE");
    else
        printf(" %d",o);
    if(b==0)
        printf(" NONE");
    else
        printf(" %.1f",j/b);
    return 0;
}

首先是需要反复输入的函数,其次使用排序会好算一点

7-8 抓老鼠啊~亏了还是赚了? (20 分)

某地老鼠成灾,现悬赏抓老鼠,每抓到一只奖励10元,于是开始跟老鼠斗智斗勇:每天在墙角可选择以下三个操作:放置一个带有一块奶酪的捕鼠夹(T),或者放置一块奶酪(C),或者什么也不放(X)。捕鼠夹可重复利用,不计成本,奶酪每块3元。
聪明的老鼠呢?它们每天可能会派出一只老鼠到墙角,看看墙角有啥:

  • 若什么也没有(X),老鼠们就不高兴了(Unhappy),会有长达一天(也就是第二天)的不高兴期。在不高兴期间,不派出老鼠。不高兴期结束之后,派出老鼠。
  • 若有捕鼠夹(T),这只老鼠被引诱吃掉奶酪并被打死(Dead),老鼠们会有长达两天(也就是第二和第三天)的伤心期。在伤心期间,不派出老鼠。伤心期结束之后,派出老鼠。在这种情况下,抓到1只老鼠可获得奖励10元,但同时也耗费了一块奶酪。注意,如果某一天放置了捕鼠夹但老鼠没有出现,则没有耗费奶酪。
  • 若有奶酪(C),老鼠吃了奶酪会很开心(Happy!),会有长达两天(第二和第三天)的兴奋期。在兴奋期间,即使叠加了不高兴或者伤心,也必定派出老鼠。在这种情况下,没抓到老鼠,而且耗费了一块奶酪。注意,如果某一天放置了奶酪但老鼠没有出现,则奶酪可以下次再用,没有耗费。

现在给你连续几天的操作序列,且已知第一天肯定会派出老鼠,请判断老鼠每天的状态,并计算盈利。

输入格式:

输入在一行中给出连续的由CTX组成的不超过70个字符的字符串,以$结束。字符串中每个字符表示这一天的操作( 即X:什么都不放;T:放捕鼠夹;C:放奶酪)。题目保证至少有一天的操作输入。

输出格式:

要求在第一行输出连续的字符串,与输入相对应,给出老鼠的状态:

  • ! 表示派出老鼠吃到奶酪
  • D 表示派出老鼠被打死
  • U 表示派出老鼠无所获
  • - 表示没有派出老鼠

第二行则应输出一个整数表示盈利。(如果有亏损,则是负数)

输入样例1:

TXXXXC$

输出样例1:

D--U-! 
4

输入样例2:

CTTCCX$

输出样例2:

!DD--U 
11

这道题还没思考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛定谔的猫695

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值