C++ primer Plus(第六版)第六章 分支和逻辑 编程答案

// 第六章.cpp : 定义控制台应用程序的入口点。
//

// 
//
#include "stdafx.h"
#include <iostream>//预编译,使用iostream文件在编译前替代这行代码
#include <array>
#include <string>
#include <iomanip>

const int SIZE = 101;

using namespace std;//将使用std命名空间中的定义
/* 编写一个程序,读取键盘输入,直到遇到@符号为止,并回显输入(数字除外),
    同时将大写字符转换为小写,将小写字符转换为大写(别忘了cctype函数系列)。*/
void Xiti1()//
{
	char duru;
	while (cin>>duru&&'@'!=duru)
	{
		if (islower(duru))
		{
			duru=toupper(duru);
			cout << duru;
		}
		else if(isupper(duru))
		{
			duru=tolower(duru);
			cout << duru;
		}

	}

	return;
}
/* 编写一个程序,最多将10个donation值读入到一个double数组中(如果您愿意,也可以使用模板类array)。
    程序遇到非数字输入时将结束输入,并报告这些数字的平均值以及数组中有多少个数字大于平均值。*/
void Xiti2()//
{
	const int SIZE=10;
	double donation[SIZE];
	double sum=0;
	double avg = 0;
	int i=0;
	int j = 0;
	int jishu=0;
	cout << "请输入数字,最多10个,按非数字退出\n";
	while (i<SIZE&&cin>>donation[i])
	{
		sum = sum + donation[i];
		
		i++;
	}
	avg = sum / i;
	for ( j = 0; j < i; j++)
	{
		if (donation[j]>avg)
		{
			jishu++;
		}
	}
	cout << "一共输入" << i << "个数据,平均值为:" << avg << "其中有" << jishu << "个数据大于平局值。\n";
	return;
}
/*编写一个菜单驱动程序的雏形。该程序显示一个提供4个选项的菜单————每一个选项用一个字母标记。
   如果用户使用有效选项之外的字母进行响应,程序将提示用户输入一个有效的字母,直到用户这样做为止。
   然后,该程序使用一条switch语句,根据用户的选择执行一个简单的操作。
   该程序的运行情况如下:
   Please enter one of the following choices:
   c) carnivore                p) pianist
   t) tree                     g) game
*/
void Xiti3()//简述:
{
	cout << "Please enter one of the following choices:\n";
	cout << "c)carnivore\t\tp)pianist\nt)tree\t\t\tg)game\n";
	char shuru;
	while (cin>>shuru&&'@'!=shuru)
	{
		switch (shuru)
		{
		case 'c':
			cout << "选择的是carnivore\n";
			break;
		case 'p':
			cout << "选择的是pianist\n";
			break;
		case 't':
			cout << "选择的是tree\n";
			break;
		case 'g':
			cout << "选择的是game\n";
			break;
		default:
			cout << "输入不合法\n";
			break;
		}
		cout << "Please enter one of the following choices:\n";
		cout << "c)carnivore\t\tp)pianist\nt)tree\t\t\tg)game\n";
	}
	
	return;
}
/*.加入Benevolent Order of Programmer后,在BOP大会上,人们可通过加入者的真实姓名、头衔或秘密BOP来了解他(她)。
    请编写一个程序,可以使用真实姓名、头衔、秘密姓名或成员preference(书中翻译为偏好,个人认为应该翻译为优先权)来      列出成员。编写该程序时,请使用下面的结构:
    //Benevolent Order of Programmers name structure
    struct bop{
        char fullname[strsize];
        char title[strsize];
        char bopname[strsize];
        int preference;        // 0 = fullname, 1 = title, 2 = bopname
    };
    该程序创建一个由上述结构组成的小型数组,并将其初始化为适当的值。
    另外,该程序是用一个循环,让用户在下面的选项中进行选择:
    a. display by name            b. display by title
    c. display by bopname         d. display by preference
    q. quit
    注意,“display by preference”,并不意味着显示成员的preference,而是意味着根据成员的preference来列出成员。
    例如:如果preference为1,则选择d将显示程序员的头衔。该程序运行情况如下:
Benevolent Order of Programmers Report
a. display by name            b. display by title
c. display by bopname         d. display by preference
q. quit
Enter your choice: a
Wimp Macho
Raki Rhodes
Celia Laiter
Hoppy Hipman
Pat Hand
Next choice: d
Wimp Macho
Junior Programmer
MIPS
Analyst Trainee
LOOPY
Next choice: q
Bye!    

*/
const int strsize = 30;
const int num=5;
struct bop
{
	char fullname[strsize];
	char title[strsize];
	char bopname[strsize];
	int prefernce;//0=fullname,1=title,2=bopname
};
void Xiti4()//
{
	bop programmer[num] = 
	{
		{ "wang hua","zongjian","flower",0},
		{ "xu hai","zongjingli","sun",1 },
		{ "cheng cheng","dongshi","lli",2 },
		{ "liu jian","zhuren","sisi",1 },
		{ "wenjie","fuzong","hah",0 }
	};
	cout << "Benevolent Order of Programmers Report\n";
	cout << "a.display by name\t\tb.display by title\nc.display by bopname\t\td.display by preference\nq.quit\n";
	cout << "Enter your choice:";
	char choose;
	int i;
	while (cin>>choose&&'q'!=choose)
	{
		switch (choose)
		{
		case 'a':
		{
			for ( i = 0; i < num; i++)
			{
				cout << programmer[i].fullname << endl;
			}
		}break;
		case 'b':
		{
			for (i = 0; i < num; i++)
			{
				cout << programmer[i].title << endl;
			}
		}break;
		case 'c':
		{
			for (i = 0; i < num; i++)
			{
				cout << programmer[i].bopname << endl;
			}
		}break;
		case 'd':
		{
			for (i = 0; i < num; i++)
			{
				switch (programmer[i].prefernce)
				{
				case 0:
				{
					cout << programmer[i].fullname << endl;
				}break;
				case 1:
				{
					cout << programmer[i].title << endl;
				}break;
				case 2:
				{
					cout << programmer[i].bopname << endl;
				}break;

				default:
					break;
				}
				
			}
		}break;
		default:cout << "输入不合法,请输入abcdq";
			break;
		}



		cout << "Next choice:";
	}
	cout << "Bye!\n";

	return;
}
/*.在Neutronia王国,货币单位是tvarp,收入所得税的计算方式如下:
   5000 tvarp:不收税
   5001~15000 tvarps: 10%
   15001~35000 tvarps: 15%
   35000 tvarps以上: 20%
	  */
void Xiti5()//
{
	cout << "输入一个数\n";
	double money;
	double shui;
	while (cin>>money)
	{
		if (money<=5000)
		{
			shui = 0;
		}
		else if (money<=15000)
		{
			shui = (money-5000)*0.1;
		}
		else if (money<=35000)
		{
			shui = 10000 * 0.1 + (money - 15000)*0.15;
		}
		else
		{
			shui= 10000 * 0.1 + 20000*0.15+ (money - 35000)*0.2;
		}
		cout << "所得税为:" << shui << endl;
	}
	return;
}
/* 编写一个程序,记录捐助给“维护合法权益团体”的资金。该程序要求用户输入捐献者的数目,
   然后要求用户输入每一个捐献者的姓名和款项。这些信息被存储在一个动态分配的数组里。
   每一个结构有两个成员:用来存储姓名的字符数组(或string对象)和用来存储款项的double成员。
   读取所有数据后,程序将显示所有捐款超过10000的捐款者的姓名即捐款数额。
   该列表应包含一个标题,指出下面的捐款者是重要捐款人(Grand Patrons)。
   然后,程序将列出其他的捐款者,该列表要以Patrons开头。
   如果某种类别没有捐献者,则程序打印单词“none”。
   给程序只显示这两种类别,而不进行排序。
。*/

struct monney
{
	char name[30];
	double zijin;
};
void Xiti6()//简述:
{
	cout << "捐献者数目:";
	int num,i,j=0,m=0;
	cin >> num;
	cin.get();
	monney *juankuan = new monney[num];
	for ( i = 0; i < num; i++)
	{
		cout << "输入第"<<i+1<<"个人的名字:";
		cin.getline(juankuan[i].name,30);
		cout << "输入捐款金额:";
		cin >> juankuan[i].zijin;
		cin.get();
	}
	cout << "Grand Patrons:\n";
	for ( i = 0; i < num; i++)
	{
		if (juankuan[i].zijin>10000)
		{
			cout << setw(30) << setiosflags(ios::left) <<juankuan[i].name << "\t" << juankuan[i].zijin << endl;
			j++;
		}
	}
	if (j=0)
	{
		cout << "None.\n";
	}
	cout << "Patrons:\n";
	for (i = 0; i < num; i++)
	{
		if (juankuan[i].zijin<=10000)
		{
			cout << setw(30) <<setiosflags(ios::left)<< juankuan[i].name << "\t" << juankuan[i].zijin << endl;
			m++;
		}
	}
	if (m= 0)
	{
		cout << "None.\n";
	}
	return;
}
/*编写一个程序,每次读取一个单词,直到用户只输入q。然后,给程序指出有多少个单词以元音打头。
    有多少个单词以辅音打头,还有多少个单词不属于这两类。
    为此,方法之一是,使用isalpha()来区分以字母和其他字符打头的单词,
    然后对于通过了isalpha()测试的单词,使用if或switch语句来确定哪些以元音打头。
    该程序运行情况如下:
Enter words (q to quit):
The 12 awesome oxen ambles
quietly across 15 meters of lawn. q
5 words beginning with vowels
4 words beginning with consonants
2 others

			   */

void Xiti7()//
{
	cout << "Enter words (q to quit):\n";
	string str;
	int i=0,j=0,k=0;
	while (cin>>str&&"q"!=str)
	{
		if (isalpha(str[0]))
		{
			if (str[0] == 'a' || str[0] == 'e' || str[0] == 'i' || str[0] == 'o' || str[0] == 'u' || str[0] == 'A' || str[0] == 'E' || str[0] == 'I' || str[0] == 'O' || str[0] == 'U')
			{
				i++;
			}
			else j++;
		}
		else
		{
			k++;
		}

	}
	cout << i << "个元音\n";
	cout << j << "个辅音\n";
	cout << k << "个其他\n";
	return;
}
/* 编写一个程序,它打开一个文件,逐字符地读取该文件,直到达到文件末尾,然后指出该文件中包含多少字符。
*/
#include <fstream>
#include <cstdlib>
void Xiti8()//
{
	ifstream inFile;
	inFile.open("123.txt");//文件要放在cpp文件同目录下
	if (!inFile.is_open())
	{
		cout << "文件打开错误";
		exit(EXIT_FAILURE);
	}
	char ch;
	int n=0;
	while ((ch = inFile.get())!=EOF)
	{
		cout << ch;
		n += 1;
		
	}
	cout <<"一共"<< n<<"个字符.\n";
	inFile.close();	
	return;
}
/* 完成编程练习6,但从文件中读取所需的信息。该文件的第一项应为捐款人数,余下的内容应为成对的行。
   在每一对中,第一行为捐款人姓名。第二行为捐款数额。即该文件类似于下面:
   4
   Sam Stone
   2000
   Freida Flass
   100500
   Tammy Tubba
   5000
   Rich Raptor
   55000
。*/

void Xiti9()//
{
	cout << "导入文件的名字:\n";
	string wenjian;
	cin >> wenjian;
	ifstream inFile;
	inFile.open(wenjian);
	if (!inFile.is_open()) exit(EXIT_FAILURE);
	//cout << "捐献者数目:";
	int num, i, j = 0, m = 0;	
	inFile >> num;
	inFile.get();
	monney *juankuan = new monney[num];
	for (i = 0; i < num; i++)
	{
		//cout << "输入第" << i + 1 << "个人的名字:";
		inFile.getline(juankuan[i].name, 30);
		//cout << "输入捐款金额:";
		inFile >> juankuan[i].zijin;
		inFile.get();
	}
	cout << "文件信息如下:\n";
	for (i = 0; i < num; i++)
	{		
			cout << setw(30) << setiosflags(ios::left) << juankuan[i].name << "\t" << juankuan[i].zijin << endl;			
	}
	cout << "其中Grand Patrons:\n";
	for (i = 0; i < num; i++)
	{
		if (juankuan[i].zijin>10000)
		{
			cout << setw(30) << setiosflags(ios::left) << juankuan[i].name << "\t" << juankuan[i].zijin << endl;
			j++;
		}
	}
	if (j = 0)
	{
		cout << "None.\n";
	}
	cout << "Patrons:\n";
	for (i = 0; i < num; i++)
	{
		if (juankuan[i].zijin <= 10000)
		{
			cout << setw(30) << setiosflags(ios::left) << juankuan[i].name << "\t" << juankuan[i].zijin << endl;
			m++;
		}
	}
	if (m = 0)
	{
		cout << "None.\n";
	}
	return;
}
/*
	 */
void Xiti10()//
{
	

	return;
}
int main()
{
	int XitiNo = 1;//输入习题编号
	cout << "第四章编程练习答案:\n";

	cout << "请输入习题编号或按(0)退出:\n";
	cin >> XitiNo;
	while (XitiNo != 0)

	{
		if (cin)//输入合法则执行
		{

			if (XitiNo >= 0 && XitiNo <= 10)
			{
				switch (XitiNo)
				{
				case 0:
				{
					cout << "即将退出程序啦!\n";

				}break;
				case 1:
				{
					cout << "第" << XitiNo << "题如下:\n";
					Xiti1();

				}break;
				case 2:
				{
					cout << "第" << XitiNo << "题如下:\n";
					Xiti2();
				}break;
				case 3:
				{
					cout << "第" << XitiNo << "题如下:\n";
					Xiti3();

				}break;
				case 4:
				{
					cout << "第" << XitiNo << "题如下:\n";
					Xiti4();
				}break;
				case 5:
				{
					cout << "第" << XitiNo << "题如下:\n";
					Xiti5();
				}break;
				case 6:
				{
					cout << "第" << XitiNo << "题如下:\n";
					Xiti6();


				}break;
				case 7:
				{
					cout << "第" << XitiNo << "题如下:\n";
					Xiti7();
				}break;
				case 8:
				{
					cout << "第" << XitiNo << "题如下:\n";
					Xiti8();
				}break;
				case 9:
				{
					cout << "第" << XitiNo << "题如下:\n";
					Xiti9();
				}break;
				case 10:
				{
					cout << "第" << XitiNo << "题如下:\n";
					Xiti10();
				}break;
				default:
				{

					cout << "即将退出程序啦\n";
					XitiNo = 0;
				}
				break;
				}

				cout << "继续查看请输入习题编号或按(0)退出:\n";
				cin >> XitiNo;
			}
			else
			{
				cout << "没有这样的编号\n继续查看请输入习题编号或按(0)退出:\n";
				cin >> XitiNo;
			}

		}
		else//输入不合法则重新输入
		{
			XitiNo = 0;
		}
	}
	system("pause");//为了程序能够停下看看。
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

泽龙先生~~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值