C++PrimerPlus第六版_编程练习-第六章

sometext.txt 文件如下:

End of file reached
Input terminated by data mismatch
Input terminated for unknown reason
No data processed

  


contributions.txt
文件如下:
4
Sam Stone
2000
Freida Flass
100500
Tammy Tubbs
5000
Rich Raptor
55000

  

 


1
/********************************************************************* 2 程序名: 6.11 编程练习 3 1. 编写一个程序, 读取键盘输入, 直到遇到@符号为止, 并回显 4 输入(数字除外) , 同时将大写字符转换为小写, 将小写字符转换为大 5 写(别忘了cctype函数系列) 。 6 版权: 7 作者: 大野狼 8 日期: 2022/4/15-星期五 10:43:04 9 说明: 10 *********************************************************************/ 11 #include <iostream> 12 #include <cctype> 13 //const int Size 100; 14 int main(void) { 15 using namespace std; 16 char str1; 17 while((str1=cin.get())!='@') 18 { 19 if(isdigit(str1)) 20 continue; 21 else if(isupper(str1)) 22 cout<<char(tolower(str1)); 23 else if(islower(str1)) 24 cout<<char(toupper(str1)); 25 } 26 return 0; 27 }
 1 /*********************************************************************
 2     程序名: 2. 编写一个程序, 最多将10个donation值读入到一个double数组中
 3         (如果您愿意, 也可使用模板类array) 。 程序遇到非数字输入时将结束
 4         输入, 并报告这些数字的平均值以及数组中有多少个数字大于平均值。
 5     版权:
 6     作者: 大野狼
 7     日期: 2022/4/15-星期五 13:33:23
 8     说明:
 9 *********************************************************************/
10 #include <iostream>
11 #include <array> 
12 #include <cstdlib>          // support for exit()
13 int main(void) {
14     using namespace std;
15     const unsigned int SIZE = 10; //最大容量 
16     double total=0,avg=0;  //合计 平均值 
17     unsigned int count=0,lagNum=0;  //计数 
18 //    double donation[SIZE];  //方法1 数组容器
19     array<double, SIZE> donation;  //方法2 array模板容器 
20     cout<<"请依次输入10个数值,以空格或回车分隔(输入非数字时将结束输入):\n";
21     while(count<SIZE && (cin>>donation[count]))  //小于最大值,并且输入有效 
22     {
23         total += donation[count];
24         ++count; 
25     }
26     if(count>0) 
27         avg = total/count;
28     else
29         cout<<"没有有效的数据输入!",exit(EXIT_FAILURE); 
30     //判断大于平均值的数量
31     for(int i=0;i<count;++i)
32         (donation[i] > avg)?lagNum++:1==1; 
33     cout<<"共计:"<<count<<" 个数据。\n总计: "<<total<<" 平均值为: "<<avg;
34     cout<<"\n其中有 "<<lagNum<<" 个数据大于平均值。";
35     return 0;
36 }
 1 /*********************************************************************
 2     程序名: 3. 编写一个菜单驱动程序的雏形。 该程序显示一个提供4个选项的
 3         菜单——每个选项用一个字母标记。 如果用户使用有效选项之外的字母
 4         进行响应, 程序将提示用户输入一个有效的字母, 直到用户这样做为
 5         止。 然后, 该程序使用一条switch语句, 
 6         根据用户的选择执行一个简单操作。 该程序的运行情况如下:
 7     版权:
 8     作者: 大野狼
 9     日期: 2022/4/15-星期五 14:44:39
10     说明:
11 *********************************************************************/
12 #include <iostream>
13 #include <cstdlib> // exit()
14 int main(void) {
15     using namespace std;
16     char choice;  //选项 
17     bool flag = true;
18     cout<<"请选择菜单\n";
19     cout<<"****** 菜单 ******\n";
20     cout<<"A:奥迪        B:奔驰     \n";
21     cout<<"C:长城        D:大众     \n";
22     cout<<"Q:退出                   \n";
23     while(flag && cin>>choice)
24     {
25         switch(choice)
26         {
27         case 'a':
28         case 'A':
29             cout << "奥迪就是传说中的‘灯厂’" << endl;
30             break;    
31         case 'b':
32         case 'B':
33             cout << "奔驰是汽车的鼻祖" << endl;
34             break;
35         case 'c':
36         case 'C':
37             cout << "长城价廉物美" << endl;
38             break;
39         case 'd':
40         case 'D':
41             cout << "大众是德国品牌." << endl;
42             break;
43         case 'q':
44         case 'Q':
45             cout << "欢迎下次再来查询!" << endl;
46             flag = false;
47             break;
48 //            exit(EXIT_FAILURE);
49         default:
50             cout << "输入有误,请重新输入!" << endl;
51             cin.clear();     // reset input
52             while (cin.get() != '\n')
53                 continue; 
54         }
55     }
56     
57     return 0;
58 }
 1 /*********************************************************************
 2     程序名: 5. 在Neutronia王国, 货币单位是tvarp, 收入所得税的计算方式如下:
 3 5000 tvarps: 不收税
 4 5001~15000 tvarps: 10%
 5 15001~35000 tvarps: 15%
 6 35000 tvarps以上: 20%
 7 例如, 收入为38000 tvarps时, 所得税为5000 0.00 + 10000 0.10 +
 8 20000 0.15 + 3000 0.20, 即4600 tvarps。 请编写一个程序, 使用循环来
 9 要求用户输入收入, 并报告所得税。 当用户输入负数或非数字时, 循环将结束。
10     版权:
11     作者: 大野狼
12     日期: 2022/4/15-星期五 15:45:17
13     说明:
14 *********************************************************************/
15 #include <iostream>
16 using namespace std;
17 double calc(double inc);  //收入 返回税收 
18 int main(void) {
19     double income,tax;  //收入  税收
20     cout<<"请输入您的收入:(输入负数或非数字时退出):";
21     while((cin>>income) && (income >= 0))
22     {
23         tax = calc(income);
24         cout<<"您的收入为:"<<income<<"\n需要交税:"<<tax<<endl;
25         cout<<"再次输入您的收入:"; 
26     }
27     return 0;
28 }
29 
30 double calc(double inc)
31 {
32     double result = 0.0;
33     if(inc <= 5000)
34         result = 0.0;
35     else if(inc > 5000 && inc <= 15000)
36         result = (inc-5000) * 0.1;
37     else if(inc > 15000 && inc <= 35000)
38         result = 10000 * 0.1 + (inc-15000) * 0.15;
39     else if(inc > 35000)
40         result = 10000 * 0.1 + 20000 * 0.15 + (inc-35000) * 0.2;
41     else
42         result = 0.00;
43     return result;
44 }

 1 /*********************************************************************
 2     程序名: 6. 编写一个程序, 记录捐助给“维护合法权利团体”的资金。 该程
 3         序要求用户输入捐献者数目, 然后要求用户输入每一个捐献者的姓名和
 4         款项。 这些信息被储存在一个动态分配的结构数组中。 每个结构有两个
 5         成员: 用来储存姓名的字符数组(或string对象) 和用来存储款项的
 6         double成员。 读取所有的数据后, 程序将显示所有捐款超过10000的捐
 7         款者的姓名及其捐款数额。 该列表前应包含一个标题, 指出下面的捐款
 8         者是重要捐款人(Grand Patrons) 。 然后, 程序将列出其他的捐款者,
 9         该列表要以Patrons开头。 如果某种类别没有捐款者, 则程序将打印单
10         词“none”。 该程序只显示这两种类别, 而不进行排序。
11     版权:
12     作者: 大野狼 
13     日期: 2022/4/15-星期五 17:35:59
14     说明:
15 *********************************************************************/
16 #include <iostream>
17 #include <string>
18 struct donation{
19     std::string name;
20     double money;
21 };
22 int main(void) {
23     using namespace std;
24     int num;  // 捐助人数
25     cout<<"请输入捐助者的人数:";
26     cin>>num;
27     cin.get();
28     // 分配了空间
29     donation *strdon = new donation[num];   //全部捐款人 
30     donation *strdonl = new donation[num];  //重要捐款人 
31     donation *strdons = new donation[num];  //一般捐款人 
32 //    donation strdon[num];  //创建结构体数组
33 //    donation strdonl[num];  //>10000  Grand Patrons
34 //    donation strdons[num];  //Patrons
35     int l=0,s=0;
36     // 分批写入数据 
37     for(int i=0;i<num;++i)
38     {
39         cout<<"请输入第"<<i+1<<"个人员的信息\n姓名:";
40         getline(cin,strdon[i].name);
41         cout<<"捐助额:";
42         cin>> strdon[i].money;
43         cin.get();
44         if(strdon[i].money>10000)
45         {
46             strdonl[l].money = strdon[i].money;
47             strdonl[l].name    = strdon[i].name;
48             ++l;
49         }
50         else
51         {
52             strdons[s].money = strdon[i].money;
53             strdons[s].name    = strdon[i].name;
54             ++s;
55         }
56     }
57     // 输出信息 
58     cout<<"\n重要捐款人(Grand Patrons)\n";
59     if(l>0)
60     {
61         for(int i=0;i<l;++i)
62         cout<<strdonl[i].name<<" : "<<strdonl[i].money<<endl;
63     }
64     else
65         cout<<"none\n";
66         
67     cout<<"\n其他捐款人(Patrons)\n";
68     if(s>0)
69     {
70         for(int i=0;i<s;++i)
71         cout<<strdons[i].name<<" : "<<strdons[i].money<<endl;
72     }
73     else
74         cout<<"none\n";
75     // 释放空间
76     delete [] strdon; 
77     delete [] strdonl; 
78     delete [] strdons; 
79     return 0;
80 }

 


 1 /*********************************************************************
 2     程序名: 7. 编写一个程序, 它每次读取一个单词, 直到用户只输入q。 然
 3     后, 该程序指出有多少个单词以元音打头, 有多少个单词以辅音打头,
 4     还有多少个单词不属于这两类。 为此, 方法之一是, 使用isalpha( )来区
 5     分以字母和其他字符打头的单词, 然后对于通过了isalpha( )测试的单
 6     词, 使用if或switch语句来确定哪些以元音打头。 该程序的运行情况如
 7     下:
 8     版权:
 9     作者: 大野狼
10     日期: 2022/4/16-星期六 10:00:02
11     说明:
12 *********************************************************************/
13 #include <iostream>
14 #include <cstring> 
15 int main(void) {
16     using namespace std;
17     unsigned int y_word=0,f_word=0,n_word=0;  // 元音 辅音 其他 单词的数量 
18     char input[128];
19     cout<<"输入一段话,统计用户输入了多少个单词    (到q|Q为止) "<<endl;
20     while (cin >> input)
21     {
22         if (!(strcmp(input, "q")) || !(strcmp(input, "Q")))
23         {
24             break;
25         }
26         else
27         {
28             char temp = input[0];
29             if(isalpha(temp)) //如果首字符是字母则运行 
30             {
31                 switch(temp)
32                 {
33                     case 'a':
34                     case 'e':
35                     case 'i':
36                     case 'o':
37                     case 'u':
38                     case 'A':
39                     case 'E':
40                     case 'I':
41                     case 'O':
42                     case 'U':
43                         ++y_word;break;  //元音单词 
44                        default:
45                         ++f_word;
46                 } 
47             }
48             else  //非字母开头单词统计 
49             {
50                 ++n_word;
51             } 
52 
53         }        
54     }
55     cout << "元音 辅音 其他单词的数量分别是: " << y_word << "" << f_word << "" <<n_word << endl;
56     return 0;
57 }
 1 /*********************************************************************
 2     程序名: 8. 编写一个程序, 它打开一个文件文件, 逐个字符地读取该文
 3         件, 直到到达文件末尾, 然后指出该文件中包含多少个字符。
 4     版权:
 5     作者: 大野狼
 6     日期: 2022/4/16-星期六 10:52:36
 7     说明:
 8 *********************************************************************/
 9 #include <iostream>
10 #include <fstream>          // file I/O support
11 #include <cstdlib>          // support for exit()
12 const int SIZE = 60;
13 int main()
14 {
15     using namespace std;
16 //    cout << "Enter name of data file: ";
17 //    char filename[SIZE];
18 //    cin.getline(filename, SIZE);
19     char filename[] = "sometext.txt";
20     ifstream inFile;        // 建立输出对象 
21 
22     inFile.open(filename);  // 建立连接 
23     if (!inFile.is_open())  // 判断是否路径有效 
24     {
25         cout << "无法打开文件: " << filename << endl;
26         cout << "程序终止!\n";
27         exit(EXIT_FAILURE);
28     }
29     char str;  //跳过非打印字符   每个字符 
30 //    char str[SIZE];  //跳过非打印字符  每个单词 
31     int count = 0;          // 记数
32 
33     inFile >> str;        // 获取第一个元素 
34     while (inFile.good())   // while input good and not at EOF
35                             //当输入良好且不在EOF时
36     {
37         ++count;            // 自增
38         inFile >> str;    // 获取下一个元素 
39     }
40     if (inFile.eof())
41         cout << "已到达文件结尾.\n";
42     else if (inFile.fail())
43         cout << "输入因数据不匹配而终止.\n";
44     else
45         cout << "输入因未知原因终止.\n";
46     cout<<"*****************************\n";
47     if (count == 0)
48         cout << "没有数据处理.\n";
49     else
50     {
51         cout << "共计读取字符: " << count << endl;
52     }
53     inFile.close();         // 关闭文件对象 
54     return 0;
55 }

 

 1 /*********************************************************************
 2     程序名: 完成编程练习6, 但从文件中读取所需的信息。 该文件的第一项
 3     应为捐款人数, 余下的内容应为成对的行。 在每一对中, 第一行为捐款
 4     人姓名, 第二行为捐款数额。 即该文件类似于下面:
 5     版权:
 6     作者: 大野狼
 7     日期: 2022/4/16-星期六 13:33:14
 8     说明:
 9 *********************************************************************/
10 #include <iostream>
11 #include <string>
12 #include <fstream>          // file I/O support
13 #include <cstdlib>          // support for exit()
14 struct donation{
15     std::string name;
16     double money;
17 };
18 
19 int main(void) {
20     using namespace std;
21     int num;  // 捐助人数
22     string FileName = "contributions.txt" ;
23     ifstream inFile;
24     inFile.open(FileName.c_str());
25     inFile >> num;  // 读取第一行 人数 
26     inFile.get();
27     donation *strdon = new donation[num];   //全部捐款人 
28     donation *strdonl = new donation[num];  //重要捐款人 
29     donation *strdons = new donation[num];  //一般捐款人 
30 //    donation strdon[num];  //创建结构体数组
31 //    donation strdonl[num];  //>10000  Grand Patrons
32 //    donation strdons[num];  //Patrons
33     int l=0,s=0;
34     // 分批读取数据 
35     for(int i=0;i<num;++i)
36     {
37 //        cout<<"请输入第"<<i+1<<"个人员的信息\n姓名:";
38         getline(inFile,strdon[i].name);
39 //        cout<<"捐助额:";
40         inFile>> strdon[i].money;
41         inFile.get();
42         if(strdon[i].money>10000)
43         {
44             strdonl[l].money = strdon[i].money;
45             strdonl[l].name    = strdon[i].name;
46             ++l;
47         }
48         else
49         {
50             strdons[s].money = strdon[i].money;
51             strdons[s].name    = strdon[i].name;
52             ++s;
53         }
54     }
55     // 输出信息 
56     cout<<"\n重要捐款人(Grand Patrons)\n";
57     if(l>0)
58     {
59         for(int i=0;i<l;++i)
60         cout<<strdonl[i].name<<" : "<<strdonl[i].money<<endl;
61     }
62     else
63         cout<<"none\n";
64         
65     cout<<"\n其他捐款人(Patrons)\n";
66     if(s>0)
67     {
68         for(int i=0;i<s;++i)
69         cout<<strdons[i].name<<" : "<<strdons[i].money<<endl;
70     }
71     else
72         cout<<"none\n";
73         // 释放空间
74     delete [] strdon; 
75     delete [] strdonl; 
76     delete [] strdons; 
77     return 0;
78 }

 

posted @ 2022-04-16 11:32  王欣阳  阅读(113)  评论(0)    收藏  举报