牛客网编程初学者入门训练5

BC47 判断是不是字母

描述

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

输入描述:

多组输入,每一行输入一个字符。

输出描述:

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

示例1

输入:

A
6

输出:

A is an alphabet.
6 is not an alphabet.

内心想法:

这道题并没啥特别的,只要用一个 isalpha() 函数就可以了,要记一下头文件。但这道题偶然发现了多组输入时的特性,本来一直觉得 while(cin>>a) 语句是一个死循环,但其实有两种退出方法,一种当然就是输入不属于a规定的数据类型的数据,例如定义了a是int a 然后输入A ,就会退出;二是输入 ctrl + Z ,也会退出,注意空格和enter是会被忽略的,还是属于等待输入状态。while() 的括号中可以输入不止一个数据,如while(cin>>a>>b)

此题代码实现如下:

#include<iostream>
#include<ctype.h>
using namespace std;
int main()
{
    char a;
    while(cin>>a)
    {
        if(isalpha(a))
        {
            cout<<a<<" is an alphabet."<<endl;
        }
        else
        {
            cout<<a<<" is not an alphabet."<<endl;
        }
    }
}

BC48 字母大小写转换

描述

KiKi想完成字母大小写转换,有一个字符,判断它是否为大写字母,如果是,将它转换成小写字母;反之则转换为大写字母。

输入描述:

多组输入,每一行输入一个字母。

输出描述:

针对每组输入,输出单独占一行,输出字母的对应形式。

示例1

输入:

a
A
Z

输出:

A
a
z

内心想法:

最开始想到的就是用 isupper() 和 toupper() 函数,但本来以为 toupper() 函数直接输出的就是字母,没想到是ASCII码,所以要转换一下,代码实现如下:

#include<iostream>
#include<ctype.h>
using namespace std;
int main()
{
    char ch;
    while(cin>>ch)
    {
        if(isupper(ch))
        {
            putchar(tolower(ch));
            cout<<endl;
        }
        else
        {
            putchar(toupper(ch));
            cout<<endl;
        }
    }
}

其中第11行这种也可以写成(char)tolower(ch); ,注意不要忘记换行。

BC53 计算一元二次方程

描述

从键盘输入a, b, c的值,编程计算并输出一元二次方程 a x 2 + b x + c = 0 ax^2+bx+c=0 ax2+bx+c=0 的根,当a = 0时,输出“Not quadratic equation”,当a ≠ 0时,根据 Δ = b 2 − 4 a c Δ=b^2-4ac Δ=b24ac 的三种情况计算并输出方程的根。

输入描述:

多组输入,一行,包含三个浮点数a, b, c,以一个空格分隔,表示一元二次方程 a x 2 + b x + c = 0 ax^2+bx+c=0 ax2+bx+c=0 的系数。

输出描述:

针对每组输入,输出一行,输出一元二次方程 a x 2 + b x + c = 0 ax^2+bx+c=0 ax2+bx+c=0 的根的情况。

如果a = 0,输出“Not quadratic equation”;

如果a ≠ 0,分三种情况:

Δ = 0,则两个实根相等,输出形式为: x1=x2=…

Δ > 0,则两个实根不等,输出形式为: x1=…;x2=… ,其中x1 <= x2。

Δ < 0,则有两个虚根,则输出: x1= 实部 - 虚部 i;x2= 实部 + 虚部 i ,即x1的虚部系数小于等于x2的虚部系数,实部为0时不可省略。实部= − b / ( 2 a ) -b / (2a) b/(2a),虚部= s q r t ( − Δ ) / ( 2 a ) sqrt(-Δ) / (2a) sqrt(Δ)/(2a)

所有实数部分要求精确到小数点后2位,数字、符号之间没有空格。

示例1

输入:

2.0 7.0 1.0

输出:

x1=-3.35;x2=-0.15

示例2

输入:

0.0 3.0 3.0

输出:

Not quadratic equation

示例3

输入:

1 2 1

输出:

x1=x2=-1.00

示例4

输入:

2 2 5

输出:

x1=-0.50-1.50i;x2=-0.50+1.50i

示例5

输入:

1 0 1

输出:

x1=0.00-1.00i;x2=0.00+1.00i

内心想法:

虽然看起来有点烦,但是主要分好情况就可以了,其他的比较一般,然而就在我觉得没有问题交上去的时候却发现,预期输出是x1=x2=0.00 的情况,却输出x1=x2=-0.00 ,这是个很有意思的bug,但是几乎查不到,只找到一篇有关的思考:

关于 C++中 -0和0的思考(包括变量内存的查看)

从中我们得知,在判断中,-0和0是相等的,但是在输出时是不一样的,以后注意即可。

代码实现如下:

#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int main()
{
    double a, b, c;
    while (cin >> a >> b >> c)
    {
        if (a == 0)
        {
            cout << "Not quadratic equation" << endl;
        }
        else
        {
            cout << setprecision(2) << fixed;
            if (b * b - 4 * a * c == 0)
            {
                cout << "x1=x2=" << ((-b / (2 * a)==0)?0.00:(-b / (2 * a))) << endl;
            }
            else if (b * b - 4 * a * c > 0)
            {
                cout << "x1=" << (-b - pow((b * b - 4 * a * c), 0.5)) / (2 * a) << ";x2=" << (-b + pow((b * b - 4 * a * c), 0.5)) / (2 * a) << endl;
            }
            else
            {
                cout << "x1=" << -b / (2 * a) << "-" << sqrt(-b * b + 4 * a * c) / (2 * a) << "i;x2=" << -b / (2 * a) << "+" << sqrt(-b * b + 4 * a * c) / (2 * a) << "i" << endl;
            }
        }
    }
}

BC54 获得月份天数

描述

KiKi想获得某年某月有多少天,请帮他编程实现。输入年份和月份,计算这一年这个月有多少天。

输入描述:

多组输入,一行有两个整数,分别表示年份和月份,用空格分隔。

输出描述:

针对每组输入,输出为一行,一个整数,表示这一年这个月有多少天。

示例1

输入:

2008 2

输出:

29

内心想法:

这题没啥特别的,但是一点小技巧可以简洁很多,要不然可能是很冗杂重复的if···else语句。代码实现如下:

#include<iostream>
using namespace std;
int main()
{
    int dayOfFeb = 0;
    int year,month;
    while(cin>>year>>month)
    {
        if(year % 4 == 0)
        {
            dayOfFeb = 29;
        }
        else
        {
            dayOfFeb = 28;
        }
        switch(month)
        {
            case 2:
                cout<<dayOfFeb<<endl;
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                cout<<"30"<<endl;
                break;
            default:
                cout<<"31"<<endl;
                break;
        }
    }
}

可以看到,不必要每个case都重复一次cout语句,可以叠在一起,看起来舒服很多也方便很多。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Lum0s!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值