6.编写一个程序,记录捐助给“维护合法权利团体”的资金。
该程序要求用户输入捐献者数目,然后要求用户输入每一个捐献者的姓名和款项。
这些信息被储存在一个动态分配的结构数组中。
每个结构有两个成员:用来储存姓名的字符数组(或string对象)和用来存储款项的 double 成员。
读取所有的数据后,程序将显示所有捐款超过10000的捐款者的姓名及其捐款数额。
该列表前应包含一个标题,指出下面的捐款者是重要捐款人(Grand Patrons)。
然后,程序将列出其他的捐款者,该列表要以Patrons 开头。
如果某种类别没有捐款者,则程序将打印单词“none”。
该程序只显示这两种类别,而不进行排序。
#pragma region 第五章练习6
/*
*/
#if 1
#include<iostream>
#include <array>
#include<string>
using namespace std;
struct people
{
string name;
unsigned rmb;
};
int main() {
unsigned cntpeople;
cout << "请输入捐款人的数量:";
cin >> cntpeople;
people* peop = new people[cntpeople];
for (unsigned i = 0; i < cntpeople; i++)
{
cout << "输入捐赠者#" << i<<"姓名:";
//cin >> peop[i].name;
char ch = cin.get();
//cout<<"cin.get获取到的十进制数是:"<<(int)ch<<endl;
getline(cin, peop[i].name);
cout << "输入捐赠者#" << i<<"金额:";
cin >> peop[i].rmb;
}
unsigned peopa = 0,peopb = 0;
cout << "重要捐赠者:"<<endl;
for (unsigned i = 0; i < cntpeople; i++)
{
if (peop[i].rmb >= 10000)
{
peopa = 1;
cout << peop[i].name << "\t";
cout << peop[i].rmb << endl;
}
}
if (!peopa)
{
cout << "NONE" << endl;
}
cout << "普通捐赠者:"<<endl;
for (unsigned i = 0; i < cntpeople; i++)
{
if (peop[i].rmb < 10000)
{
peopb = 1;
cout << peop[i].name << "\t";
cout << peop[i].rmb << endl;
}
}
if (!peopb)
{
cout << "NONE" << endl;
}
return 0;
}
delete[] peop;
#endif
#pragma endregion
注意事项:
对于cin输入,有空格的时候,这里处理是有点问题的,这里改用getline()函数,但是使用getline()
函数之前需要把队列中的回车换行清除掉,用cin.get()下面我们cin.get()方法获取到的是具体的啥内容
如图
获取到的是十进制的10 .查询ASCII表得知
10 是换行键
综上所述;cin输入捐赠人数量的时候,按回车,队列中会添加一个换行符号,这里需要主要使用的时候,一定要主要,特别是使用getline的时候,getline碰到换行符就终止的,所以不清楚掉队列缓冲区的换行符,getline()不能正常接受输入
最后一点