(C++ Primer Plus课后编程练习第6章参考代码)

声明:

作者入门小白,将学习过程中的代码做一些分享,仅供大家参考,欢迎大家交流指正。全部编译运行过,水平有限,不喜勿喷。

环境:

Windows 7操作系统,Dev C++ 5.11,TDM-GCC 4.9.2 64-bit Release

1.编写一个小程序,读取键盘输入,知道遇到@符号为止,并回显输入(数字除外),同时将大写字符转换为小写,将小写字符转换为大写(别忘了cctype函数系列)。

代码:

#include <iostream>
#include <cctype>     //使用isdigit()、toupper()等需包含此头文件using namespace std;int main()
{cout << "Please input characters:" << endl;char ch;while( (ch=cin.get()) && ch!='@' )       //遇到@符号退出{if( islower(ch) )        //小写转换为大写cout << (char)toupper(ch);else if( isupper(ch) )     //大写转换为小写cout << (char)tolower(ch);else if( isdigit(ch) )     //数字不显示continue;else                //其他字符原样输出cout << ch;}cout << "\nBye" << endl;  //程序结束提示语return 0;
}

结果:

2.编写一个程序最多将10个donation值读入到一个double数组中(如果愿意,也可以使用模板类array)。程序遇到非数字输入时结束输入,并报告这些数字的平均值以及数组中有多少个数字大于平均值。

代码:

#include <iostream>using namespace std;const int Max = 10;            //最多元素个数10个int main()
{cout << "Please input max 10 value:" << endl;double donation[Max] = {0.0};      //声明double数组并初始化double sum, average;            //sum为和,average为平均数int cnt, count;               //cnt为输入的有效元素的个数,count为大于平均数的元素个数sum = average = 0.0;      //初始化cnt = count = 0;for( int i=0; i<Max; i++ )         //最多读取10个数据{if( cin >> donation[i] )      //若成功以double格式读取,cin>>donation[i]将返回非0值{sum += donation[i];          //对有效元素求和cnt++;                   //统计有效元素个数cout << donation[i] << ",";     //输出成功读入的元素}else break;         //输入非数字时结束输入}cout << "\nsum: " << sum << endl;      //输出和if( cnt>0 )         //vnt作为除数,不能为0{average = sum/cnt;       //求平均值cout << "average: " << average << endl;for( int j=0; j<cnt; j++ )           //遍历有效元素{if( donation[j]>average )       //统计大于平均数的元素个数count++;}cout << "number of upper average: " << count << endl;}cout << "Done" << endl;        //结束语return 0;
}

结果:

3.编写一个菜单驱动程序的雏形。该程序显示一个提供4个选项的菜单–每个选项用一个字母标记,如果用户使用有效选项之外的字母进行响应,程序将提示用户输入一个有效的字母,直到用户这样做为止。该程序使用一条switch语句,根据用户的选择执行一个简单操作。

代码:

#include <iostream>
#include <cctype>using namespace std;int main()
{cout << "Please enter one of the following choices:\n"<< "c) carnivore      p) pianist\n"<< "t) tree            g) game\n";char ch;cin >> ch;while( ch!='c' && ch!='p' && ch!='t' && ch!='g' )       //直到输入正确的指令时结束循环{cout << "Please enter a c, p, t, or g: ";cin >> ch;}switch( ch )     //根据输入选择执行一个输出语句{case 'c': cout << "Tiger is carnivore.\n"; break;case 'p': cout << "Langlang is a pianist.\n"; break;case 't': cout << "A maple is tree.\n"; break;case 'g': cout << "LOL is a game.\n"; break;}cout << "Done" << endl;return 0;
}

结果:

4.加入Benevolent Orderof Programmer后,在BOP大会上,人们便可以通过加入者的真实姓名、头衔或秘密BOP姓名来了解他(她)。请编写一个程序,可以使用真实姓名、头衔、秘密姓名或成员偏好来列出成员。该程序创建一个由结构体组成的小型数组,并将其初始化为合适的值。另外,该程序使用一个循环,让用户在选项中进行选择。

代码:

#include <iostream>using namespace std;const int strsize = 20;            //字符数组最大字符数
struct bop              //声明bop结构
{char fullname[strsize];        //full namechar title[strsize];     //job titlechar bopname[strsize];       //secret BOP nameint preference;                //0=fullname,1=title,2=bopname
};int main()
{bop people[5] =       //声明具有5个bop结构元素的数组并初始化{{"Wimp Macho", "", "", 0},{"Raki Rhodes", "Junior Programmer", "", 1},{"Celia Laiter", "", "MIPS", 2},{"Hoppy Hipman", "Analyst Trainee", "", 1},{"Pat Hand", "", "LOOPY", 2}};cout << "Benevolent Order of Programmers Report:\n"<< "a) display by name        b) display by title\n"<< "c) display by bopname d) display bby preference\n"<< "q) quit\n";cout << "Enter your choices: ";char ch;cin >> ch;while( ch!='q' )      //当输入字符‘q’时退出{switch( ch )      //分别按用户指定方式列出成员{    case 'a': for( int i=0; i<5; i++ ) cout << people[i].fullname << endl; break;case 'b': for( int i=0; i<5; i++ ) cout << people[i].title << endl; break;case 'c': for( int i=0; i<5; i++ ) cout << people[i].bopname << endl; break;case 'd':{for( int i=0; i<5; i++ )       //根据偏好列出成员{if( people[i].preference==0 )cout << people[i].fullname << endl;else if( people[i].preference==1 )cout << people[i].title << endl;else if( people[i].preference==2 )cout << people[i].bopname << endl;}}break;}cout << "Next choices: ";       //输入提示cin >> ch;}cout << "Bye!" << endl;            //结束语return 0;
}

结果:

5.在Neutronia王国,货币单位是tvarp,收入所得税的计算方式如下:5000tvarps不收税、5001—15000tvarps10%、15001—35000tvarps15%、35000tvarps以上20%。例如收入为38000tvarps时,所得税5000X0.00+10000X0.1+20000X0.15+3000X0.2,即4600tvarps。请编写一个程序,使用循环来要求用户输入收入,并报告所得税。当用户输入负数或者非数字时,循环将结束。

代码:

#include <iostream> using namespace std;const double rate1 = 0.1;     //各区间的税率
const double rate2 = 0.15;
const double rate3 = 0.2;int main()
{cout << "Please enter your income: ";double income;while( (cin>>income) && (income>=0) )     //当输入负数或者非数字时结束循环{cout << "Your income: " << income << endl;double tax = 0.0;      //总税额double buf = income;      //使用buf取代income进行操作,防止income被改变while( buf>5000 )      //不高于5000时不用交税{if( buf>=35001 )     //大于35000时{tax += (buf-35000.0) * rate3;      //税额=超出部分*税率buf -= (buf-35000.0);     //余下税额按buf=35000计算}else if( buf>=15001 && buf<=35000 )     //15001~35000{tax += (buf-15000.0) *rate2;buf -= (buf-15000.0);      //余下税额按buf=15000计算} else if( buf>=5001 && buf<=15000 )     //5001~15000{tax += (buf-5000.0) * rate1;buf -= (buf-5000.0);        //余下税额按buf=5000计算} }cout << fixed;       //使用定点小数表示法cout.precision(2);       //精确小数点后2位cout.setf(ios_base::showpoint);       //为整数时也显示小数点cout << "Your tax: " << tax << endl;cout << "Please enter your income: ";}cout << "Done!" << endl;        //结束语return 0;
}

结果:

6.编写一个程序,记录捐给“维护合法权益群体”的资金。该程序要求用户输入捐献者数目,然后要求用户输入每一个捐献者的姓名和款项。这些信息存储在一个动态分配的结构数组中。每个结构有两个成员:用来存储姓名的字符数组(或string对象)和用来存储款项的double成员。读取所有数据后,程序将显示所有捐款超过10000的捐款者的姓名及其捐款数额。该列表前应包含一个标题,指出下面的捐款者是重要捐款人(Grand Patrons)。然后程序列出其他捐款者,该列表以Patrons开头。如果某种类别没有捐款者,则程序将打印“none”。该程序只显示这两种类别而不进行排序。

代码:

#include <iostream> using namespace std;struct Donation            //声明Donation结构
{char name[20];     //姓名double money;       //捐款数额
};int main()
{cout << "Please input the number of people: ";int num = 0;cin >> num;           //获取捐献者数目cin.get();         //消除数字末尾的回车Donation *people = new Donation [num];      //动态分配结构数组cout << "Enter " << num << " people information:" << endl;for( int i=0; i<num; i++ )        //获取捐赠者信息{cout << "People " << i+1 << " name: ";cin.getline(people[i].name, 20);cout << "People " << i+1 << " money: ";cin >> people[i].money;cin.get();}cout << endl << "-------Grand Patrons:-------" << endl;int cnt = 0;       //Grand Patrons人数for( int i=0; i<num; i++ )       //输出Grand Patrons{if( people[i].money>=10000 ){cout << people[i].name << "\t\t" << people[i].money << endl;cnt++;}}if( cnt==0 )cout << "none\n";      //若无,输出nonecout << endl << "----------Patrons:----------" << endl;int count = 0;for( int i=0; i<num; i++ )        //输出Patrons{if( people[i].money<10000 ){cout << people[i].name << "\t\t" << people[i].money << endl;count++;}}if( count==0 )cout << "none\n";      //若无,输出nonedelete [] people;     //释放内存cout << "\nDone!" << endl;      //结束语return 0;
}

结果:

7.编写一个程序,它每次读取一个单词,直到用户只输入q。然后,该程序指出有多少个单词以元音打头,有多少单词以辅音打头,还有多少单词不属于这两类。为此,方法之一是使用isalpha()来区分以字母和其他字符打头的单词,然后对于通过了isalpha()测试的单词,使用if或switch语句来确定哪些以元音打头。

代码:

#include <iostream>
#include <cstring>        //使用strcpy()需包含此头文件
#include <cctype>     //使用isalpha()需包含此头文件using namespace std;int main()
{int vowels = 0;           //元音字母开头的单词数int consonants = 0;        //辅音字母开头的单词数int others = 0;            //其他开头的单词数cout << "Enter words (q to quit):" << endl;char str[20];            //一个单词最长20个字母组成int cnt = 0;            //单词总数cin >> str;while( strcmp(str, "q") )      //输入q时退出{if( !isalpha(str[0]) )     //若不是字母开头,则为其他字符开头others++;else{switch( str[0] )   //开头字母若是元音,则vowels++{                  //其他皆是辅音,则consonants++case 'a':case 'e':case 'i':case 'o':case 'u':case 'A':case 'E':case 'I': case 'O':case 'U': vowels++; break;default : consonants++; break;}}cnt++;         //单词总数cnt++cin >> str;}cout << vowels << " words beginning with vowels\n";cout << consonants << " words beginning with consonants\n";cout << others << " others\n";cout << cnt << " words\n";cout << "\nDone!" << endl;return 0;
}

结果:

8.编写一个程序,它打开一个文件文件,逐个字符地读取该文件,直到到达文件末尾,然后指出该文件中包含多少个字符。

代码:

#include <iostream>
#include <fstream>            //文件操作需包含此头文件
#include <cstdlib>            //使用exit()需包含此头文件using namespace std;int main()
{ifstream infile;           //声明infile对象infile.open("in.txt");            //将infile对象与in.txt相关联if( !infile.is_open() )            //若未成功打开则输出提示语{                             //该文件应与源程序在同一路径下cout << "Read Fail!\n";exit(EXIT_FAILURE);} char ch;int cnt = 0;           //统计字符个数ch = infile.get();         //获取字符个数(包括空格、换行符等)while( infile.good() )     //若成功获取到字符,则继续读取下一字符{                            //若不成功,则退出循环cout << ch;cnt++;ch = infile.get();     //若获取单词个数,将ch=infile.get()改为}                           //cin >> infileif( infile.eof() )         //若不成功原因是到达文件末尾,输出提示语cout << endl << "File end!";infile.close();           //关闭文件cout << endl << cnt << " characters ." << endl;return 0;
}

结果:

9.完成练习6,但从文件中读取所需的信息。该文件的第一项应为捐款人数,余下的内容应为成对的行。在每一对中,第一行为捐款人姓名,第二行为捐款数额。

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>using namespace std;struct Donation         //声明Donation结构
{char name[20];     //姓名double money;       //捐款数额
};int main()
{ifstream infile;infile.open("in.txt");if( !infile.is_open() ){cout << "Read Fail!\n";exit(EXIT_FAILURE);}int num;infile >> num;while( !infile.good() );cout << "Success! num: " << num << endl;infile.get();           //读取换行符 Donation *people = new Donation [num];char str[50];int dig;int i = 0; infile.getline( str, 50 );          //获取字符串 while( infile.good() && (i<num) )        //成功读取且个数不超过人数 {strcpy( people[i].name, str );      //将读取到的字符串复制到对应结构体的name中 infile >> dig;                   //获取数字 people[i].money = dig;          //将读取到的数字复制到对应结构体的money中 infile.get();                  //读取数字结尾的换行符i++;                          //下标i递增 infile.getline( str, 50 );      //获取字符串 }if( infile.eof() )cout << "\nFile end!\n";     //到达文件末尾时提示 cout << endl << "-------Grand Patrons:-------" << endl;int cnt = 0;        //Grand Patrons人数for( int j=0; j<num; j++ )       //输出Grand Patrons{if( people[j].money>=10000 ){cout << people[j].name << "\t\t" << people[j].money << endl;cnt++;}}if( cnt==0 )cout << "none\n";      //若无,输出nonecout << endl << "----------Patrons:----------" << endl;int count = 0;for( int j=0; j<num; j++ )        //输出Patrons{if( people[j].money<10000 ){cout << people[j].name << "\t\t" << people[j].money << endl;count++;}}if( count==0 )cout << "none\n";      //若无,输出noneinfile.close();               //关闭文件 delete [] people;            //释放内存cout << "\nDone!" << endl;      //结束语return 0;
}

结果:

C++ Primer Plus课后编程练习第6章参考代码相关推荐

  1. C prime plus 第六版 课后编程练习 第7章

    C prime plus 第六版 课后编程练习 第7章 7.12.1 编写一个程序读取输入,读到#字符停止,然后报告读取的空格数.换行符数和所有其他字符的数量. 7.12.2.编写一个程序读取输入,读 ...

  2. C prime plus 第六版 课后编程练习 第4章

    本人编程小白,正在奋力自学C语言.内容如有错误,欢迎交流. 电子版C primer plus 第6版 中文文字版下载地址 下载地址 以下为课后练习. 使用编译器 vs 2013 . 如使用其他编译器, ...

  3. 《C++ primer plus》第四单元课后编程答案参考

    <C++ primer plus>第四单元的课后编程 详细答案可参考C++ primer plus课后编程答案参考 1.cpp #include<iostream> using ...

  4. C++Primer Plus笔记——第四章 复合类型及课后编程练习答案

    目录 本章小结 程序清单 课后编程习题答案 本章小结 本章主要论述了数组.指针和引用.在C + +语言中,它们是相互交织在一起的,对其中一个概念的理解有助于对其他槪念的理解.       数组是一个由 ...

  5. 【C Primer Plus第二章课后编程题】

    [C Primer Plus第二章课后编程题] 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.1 #include <stdio.h> int main (void) ...

  6. C++ Primer Plus第四章课后编程

    C++ Primer Plus第四章课后编程 4.12 复习题* 4.13 编程练习* 三句话,希望读者可以先看* 4.12 复习题* #include<iostream> #includ ...

  7. C++ Primer Plus 第六版 所有章节课后编程练习答案

    我的独立博客地址:www.blog4jimmy.com,欢迎大家关注 下面的是C++ Primer Plus 第六版所有章节的课后编程练习的答案,都是博主自己写的,有不对的地方请大家留言指出讨论讨论 ...

  8. C Primer Plus 学习打卡之第二章(含课后编程答案)

    知识概要 本章主要介绍了C程序的主要构成,学习了printf()函数,教了我们怎么编写一个简单的程序.本章所要求的简程序需要头文件,main()函数,自定义函数,以及声明变量.注释.printf()函 ...

  9. C++ Primer Plus P31 编程练习(调用一个用户自定义的函数(以光年值为参数,并返回对应天文单位的值)——中职

    C++ Primer Plus P31 编程练习 第六题 编写一个程序,其main()调用一个用户自定义的函数(以光年值为参数,并返回对应天文单位的值).该程序按下面格式要求输入光年值,并显示结果: ...

最新文章

  1. 三十三、分治算法---汉诺塔问题
  2. 设计模式(一)-单例模式
  3. Go中的Map实现机制
  4. css3图片垂直居中
  5. 推荐算法在招聘商业化场景中的应用实践
  6. 维特比算法(Viterbi Algorithm)
  7. jq json格式化工具
  8. 前端优秀框架jQuery weui推荐
  9. zzulioj题库题解(持续更新中.......)
  10. bat 一键清理系统垃圾的修改
  11. C语言编程练习----山东理工大学ACM平台实验一A--I题解
  12. Cadence学习笔记-第二章-瞬态仿真
  13. 2010年6月 工作 计划 发奋图钱 再接再厉
  14. 将xml文件转ass格式文件
  15. 好难过!八年深漂,搞Android开发要价50万,面了六家公司,竟一个offer都没拿到!
  16. 中国RFID市场规模及结构浅析
  17. 学人工智能需要哪些准备?AI基础技能
  18. C# SolidWorks 二次开发 API --- 2018版 中文翻译 ModelDocExtension 方法
  19. 金武士ups电源故障情况类型分析及维修
  20. 稀疏默克尔树(Sparse Merkle Tree)

热门文章

  1. python牛顿法算立方根_立方根求解(牛顿迭代法)
  2. 搭积木java,Jimu:像搭积木一样DIY原生Android App
  3. ruoyi-vue集成积木报表
  4. JVM2:垃圾收集器与内存分配策略
  5. Springboot 服务端为App集成支付宝支付
  6. Android手机做电脑摄像头
  7. solr 6.1.0 的配置及简单使用
  8. Centos7 出现xxx不在sudoers文件中的解决方案
  9. bilibili 哔哩哔哩 2018秋招试题
  10. java中IO流体系以及常用实现类