C++ Primer Plus 学习笔记(三)--编程练习6

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()前得有个初始输入语句,造成语句不必要的重复。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值