牛客网编程初学者入门训练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 Δ=b2−4ac 的三种情况计算并输出方程的根。
输入描述:
多组输入,一行,包含三个浮点数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,但是几乎查不到,只找到一篇有关的思考:
从中我们得知,在判断中,-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语句,可以叠在一起,看起来舒服很多也方便很多。