6.11 编程练习
1、编写一个程序,读取键盘输入,直到遇到@符号为止,并回显输入(数字除外),同时将大写字符转换为小写字符,将小写字符转换为大写字符(别忘了cctype系列函数)
程序如下:
#include<iostream>
#include<cctype>
int main()
{
using namespace std;
char ch;
while((ch=cin.get())!='@')
{
if(isalpha(ch))
{
if(isupper(ch))
cout<<(char) tolower(ch);
else
cout<<(char) toupper(ch);
}
}
system("pause");
return 0;
}
测试结果是正确的,在这道题中,循环判断条件应该为(ch=cin.get())!=’@’。
一开始编写的语句为ch=cin.get()!=’@’,缺少括号之后结果不能满足题目要求。
因为赋值运算的优先级低于比较语句,因此该语句先比较输入与‘@’字符,然后将结果赋给ch,因此当输入不等于‘@’时,ch的值总为1;当输入等于‘@’时才会推出循环。但是程序没有输出。
2、编写一个程序,最多将10个donation值读入到一个double数组中。程序遇到非数字输入时将结束输入,并报告这些数字的平均值以及数组中有多少个数字大于平均值。
程序如下:
#include <iostream>
int main()
{
using namespace std;
int i;
double sum=0;
int num=0;
double donation[10];
for(i=0;i<10;i++)
{
cout<<"Enter one number of donations: ";
cin>>donation[i];
if(cin.fail())
break;
else
{
sum+=donation[i];
num++;
}
}
cout<<"The average number is: "<<sum/num<<endl;
int a_num=0;
for(i=0;i<num;i++)
if(donation[i]>sum/num)
a_num++;
cout<<"There are "<<a_num<<" numbers lager then average."<<endl;
system("pause");
return 0;
}
在这里碰到了两个点百度了才解决掉的问题:
1、怎么判断输入不是数字
2、怎么在debug时保持窗口,使便于观察运行结果
对于第一个问题,使用cin.fail()判断输入非数字。
这里回忆一下输入类型不匹配的问题。在cin对象中,变量类型与输入类型不匹配时,将出现4中情况:
(1)n值保持不变;
(2)不匹配的输入将被留在输入队列中;
(3)cin中的一个错误标记被设置;
(4)对cin方法的调用将返回false(如果被转换为bool类型)
关于EOF,检测文件尾(EOF),检测到EOF后,则cin将两位(eofbit和failbit)都设置为1.可以通过成员函数eof()、fail()分别查看两位是否被设置。注意它们是在事后报告。
对于第二个问题,当程序输入不匹配时,原先使用的
cin.get();
cin.get();
return 0;
已经无法保持窗口。只能使用
system("pause");
保持窗口。
3、编写一个菜单驱动程序的雏形。改程序显示一个提供4个选项的菜单–每个选项用一个字母标记。如果用户使用邮箱选项之外的字母进行响应,程序将提示用户输入一个有效的字母,直到用户这样做为止。然后,改程序使用一条switch,根据用户的选择执行一个简单操作。改程序的运行情况如下:
程序如下:
#include<iostream>
#include<cctype>
int main()
{
using namespace std;
cout<<"Please enter one of the following chioces: "<<endl;
cout<<"c) carnivore\tp) pianist\nt) tree\t\tg) game"<<endl;
char ch;
while((ch=cin.get())!='c'&&ch!='p'&&ch!='t'&&ch!='g')
{
cout<<"Please enter a c, p, t, or g: ";
cin.ignore();
}
switch(ch)
{
case 'c': cout<<"C"<<endl; break;
case 'p': cout<<"P"<<endl; break;
case 't': cout<<"T"<<endl; break;
case 'g': cout<<"G"<<endl; break;
}
system("pause");
return 0;
}
在循环体中,如果缺少cin.ignore();,输入如果不是cptg中的字符,那么会在同一行输出
Please enter a c, p, t, or g:Please enter a c, p, t, or g:
关于cin.ignore();
cin.ignore(a,ch)方法是从输入流(cin)中提取字符,提取的字符被忽略(ignore),不被使用。每抛弃一个字符,它都要计数和比较字符:如果计数值达到a或者被抛弃的字符是ch,则cin.ignore()函数执行终止;否则,它继续等待。它的一个常用功能就是用来清除以回车结束的输入缓冲区的内容,消除上一次输入对下一次输入的影响。比如可以这么用:cin.ignore(1024,’\n’),通常把第一个参数设置得足够大,这样实际上总是只有第二个参数’\n’起作用,所以这一句就是把回车(包括回车)之前的所有字符从输入缓冲(流)中清除出去。
你不给参数,则默认参数为cin.ignore(1,EOF),即把EOF前的1个字符清掉,没有遇到EOF就清掉一个字符然后结束,就是这样啊,所以你每次都少一个字符.
5、计算收入所得税,要求:当用户输入负数或非数字时,循环结束。
编程如下:
#include<iostream>
#include<cmath>
int main()
{
using namespace std;
double salary,tax;
while(1)
{
cout<<"Please enter your salary: ";
cin>>salary;
if(cin.fail()||salary<1e-3)
break;
if(salary>35000)
tax=(salary-35000)*0.2+4000;
else if(salary>15000)
tax=(salary-15000)*0.15+1000;
else if(salary>5000)
tax=(salary-5000)*0.1;
else
tax=0;
cout<<"The tax is: "<<tax<<endl;
}
system("pause");
return 0;
}
这个没什么好说的了。。。本程序使用break推出死循环。因为如果把循环条件写在while()中,那么在while()前得有个初始输入语句,造成语句不必要的重复。