C++Primer Plus 编程练习_第四章
#pragma once #ifndef CHAPTER4_H_ #define CHAPTER4_H_ #include <iostream> #include <string> #include <array> using namespace std; //1&2 struct memberInfo1; class Exercise1 { private: public: void inputInfo1(); void outpuInfo1(); void inputInfo2(); //该函数将输入读入到一个大型的临时数组中,然后使用new[]创建一个刚好能够存储该输入字符串 //的内存块,并返回一个指向内存块的指针。对于读取大量字符串的程序,这种方法可以节省大量内存 char *getString(); }; //3. class Exercise3 { private: public: void inputInfo(); void outputInfo(char *pf, char *pl); char *getString(); }; //4. class Exercise4 { private: string firstName_; string lastname_; public: void inputInfo(); void outputInfo(); }; //5. struct CandyBar { string brand; float weight; int calorie; }; class Exercise5 { private: public: CandyBar candyBar; CandyBar setSnack(string brand, float weight, int calorie); }; //6. class Exercise6 { private: public: CandyBar setSnack(string brand, float weight, int calorie); }; //7. struct pizza { string brand; float diameter; float weight; }; class Exercise7 { private: int size_; public: void setSize(int size); pizza recordInfo(string brand, float diameter, float weight); }; //8. class Exercise8 { private: int size_; public: void setSize(int size); pizza* recordInfo(float diameter, string brand, float weight); }; //9. class Exercise9 { private: public: CandyBar *setSnack(string brand, float weight, int calorie); }; //10. class Exercise10 { private: array<float,3> arr; int time_; public: void recordDistance(int count); void showInfo(); }; #endif // !CHAPTER4_H_
#include "stdafx.h" #include "chapter4.h" //1&2 struct memberInfo1 { string firtsName; string lastName; char grade; int age; }; memberInfo1 m1; void Exercise1::inputInfo1() { cout << "请输入您的姓氏:"; cin >> m1.firtsName; cout << "请输入您的名字:"; cin >> m1.lastName; cout << "请输入您的等级:"; cin >> m1.grade; cout << "请输入您的年龄:"; cin >> m1.age; } void Exercise1::outpuInfo1() { cout << "姓:" << m1.firtsName << endl; cout << "名:" << m1.lastName << endl; cout << "等级:" << m1.grade << endl; cout << "年龄:" << m1.age << endl; } void Exercise1::inputInfo2() { cout << "请输入您的姓氏:"; char *pfirstName; pfirstName = getString(); cout << "请输入您的名字:"; char *plastName; plastName = getString(); cout << "请输入您的等级:"; char grade; cin >> grade; cout << "请输入您的年龄:"; int age; cin >> age; cin.get(); cout << "姓:" << pfirstName << " 字符长度为:" << strlen(pfirstName) << endl; //cout<<指针 直接输出指针指向的内存中的值 cout << "名:" << plastName << " 字符长度为:" << strlen(plastName) << endl; cout << "等级:" << grade << endl; cout << "年龄:" << age << endl; delete[] pfirstName; delete[] plastName; } char * Exercise1::getString() { char temp[80]; cin >> temp; char *pn = new char[strlen(temp) + 1]; //字符数组表示字符串需在最后留1位用于放换行符"\n"。strlen()返回的长度不包括换行符。 strcpy_s(pn, strlen(temp) + 1, temp); //将字符temp的值复制一份存到pn指针指向的新内存中。 return pn; }//函数运行结束后将自动释放掉temp的内存。记得delate掉pn指针指向的内存。 //3. void Exercise3::inputInfo() { cout << "请输入您的姓氏:"; char *pfirstName; pfirstName = getString(); cout << "请输入您的名字:"; char *plastName; plastName = getString(); outputInfo(pfirstName, plastName); delete[] pfirstName; delete[] plastName; } void Exercise3::outputInfo(char *pf, char *pl) { cout << "姓名:" << pf << "," << pl << endl; } char * Exercise3::getString() { char temp[80]; cin >> temp; char *pn = new char[strlen(temp) + 1]; strcpy_s(pn, strlen(temp) + 1, temp); return pn; } //4. void Exercise4::inputInfo() { cout << "请输入您的姓氏:"; cin >> firstName_; cout << "请输入您的名字:"; cin >> lastname_; } void Exercise4::outputInfo() { cout << "姓名:" << firstName_ << ", " << lastname_ << endl; } //5. CandyBar Exercise5::setSnack(string brand, float weight, int calorie) { CandyBar snak = { brand, weight, calorie }; return snak; } //6. CandyBar Exercise6::setSnack(string brand, float weight, int calorie) { CandyBar snak = { brand, weight, calorie }; return snak; } //7. void Exercise7::setSize(int size) { size_ = size; } pizza Exercise7::recordInfo(string brand, float diameter, float weight) { pizza piz = {}; piz.brand = brand; piz.diameter = diameter; piz.weight = weight; return piz; } //8. void Exercise8::setSize(int size) { size_ = size; } pizza* Exercise8::recordInfo(float diameter, string brand, float weight) { pizza *ppizza = new pizza{ brand,diameter,weight }; return ppizza; } //9. CandyBar* Exercise9::setSnack(string brand, float weight, int calorie) { CandyBar *pc = new CandyBar{ brand, weight, calorie }; return pc; } //10. void Exercise10::recordDistance(int time) { time_ = time; for (int i = 0; i < time_; i++) { cout << "请输入第" << i + 1 << "次40码跑的成绩:"; cin >> arr[i]; } } void Exercise10::showInfo() { float total = 0; cout << "共跑了" << time_ << "次" << endl; for (int i = 0; i < time_; i++) { total += arr[i]; } cout << "平均成绩为:" << total / time_ << endl; }
// C++Primer Plus 习题_第四章.cpp: 定义控制台应用程序的入口点。 //-------------------------------复习题----------------------------------------- //1.如何声明下述数据? //a.actor是由30个char组成的数组。 //b.betsie是由100个short组成的数组。 //c.chuck是由13个float组成的数组。 //d.dipsea是由64个long double组成的数组。 //答案:a.char actor[30]; // b.short betsie[100]; // c.float chuck[13]; // d.long double dispasea[64]; //2.使用模板类array而不是数组来完成问题1. //答案:include<array>; // using namespace std; // array<char 30> actor; // array<short 100>betsie; // array<float 13>chuck; // array<long double 64>dispasea; //3.声明包含5个元素的int数组,并将它初始化为前5个正奇数。 //答案:int oddly[5] = {1, 3, 5, 7, 9}; //4.编写一条语句,将问题3中数组的第一个元素和最后一个元素的和赋值给变量even。 //答案:int sum = oddly[0] + oddly[4]; //5.编写一条语句,显示float数组ideas中第二个元素的值。 //答案:cout << ideas[1] << endl; //6.声明一个char数组,并将其初始化为字符串"cheeseburger"。 //答案:char lunch[13] = "cheeseburger"; 或者 char lunch[] = "cheeseburger"; //7.声明一个string对象,并将其初始化为字符串"Waldorf Salad"。 //答案:include<string>; // using namespace; // string name = "Waldorf Salad"; //8.设计一个描述鱼的结构声明。结构中应当包括品种、重量(整数,单位盎司)和长度(英寸,包括小数)。 //答案:struct Fish // { // char kind; // int weight; // float length; // }; //9.声明一个问题8中定义的结构的变量,并对它进行初始化。 //答案:Fish fish = {"weever", 2, 12.5}; //10.用enum定义一个名为Response的类型,它包含Yes、No和Maybe等枚举量,其中Yes的值为1,No为0,Maybe为2。 //答案:enum Response // { // No, // Yes, // Maybe // }; //11.假设ted是一个double变量,请声明一个指向ted的指针,并使用该指针来显示ted的值。 //答案:double *pd = &ted; // cout << *pd << "\n"; //12.假设treacle是一个包含10个元素的float数组,请声明一个指向treacle的第一个元素的指针,并使用该指针来显示数组的第一个元素的最后一个元素。 //答案:float *pf = treacle; 或者 float *pf = &treacle[0]; //数组就是指针 或者指向数组第一个元素的地址。 // cout << pf[0] << " " << pf[9] << endl; 或者 cout << *pf << " " << *(pf + 9); //13.编写一段代码,要求用户输入一个正整数,然后创建一个动态的int数组,其中包含元素数目等于用户输入的值。首先使用new来完成这项任务,再使用vector对象来完成这项任务。 //答案: //方法一: //unsigned int size; //cout << "请输入一个元素数目:"; //cin << size; //int * dyn = new int [size]; //vector<int> dv(size); //14.下面的代码是否有效?如果有效,它将打印出什么结果? //cout << (int *) "Home of the jolly bytes"; //答案:是的,它是有效的。表达式"home of the jolly bytes"是一个字符串常量,因此它将判定为字符串开始的地址。cout对象将char地址解释为打印字符串,但类型转换(int *)将地址转换为 //int指针,然后作为地址被打印。总之,该语句打印字符串的地址,只要int类型足够宽,能够存储该地址。 //15.编写一段代码,给问题8中描述的结构动态分配内存,再读取该结构成员的值。 //答案:Fish fish = new Fish{"weever", 2, 12.5}; // string name = fish.kind; //或者用指针 // fish *p = new Fish{"weever", 2, 12.5}; // cout << "种类为:" << p-> kind; //16.程序清单4.6指出混合输入数字和一行字符串时存储的问题。如果将下列的代码: //cin.getline(address,80); //替换为: //cin>>address; //将对程序的运行带来什么影响? //答:使用cin>>address 将使得程序跳过空白,直到找到给空白字符为止。然后它将读取字符,直到再次遇到空白为止。因此,它将跳过数字输入的换行符,从未避免这种问题。另一方面,它值读取 //一个单词,而不是整行。 //17.声明一个vector对象和一个对象,它们都包含10个string对象。指出所需的头文件,但不要使用using。使用const来指定要包含的string对象数。 //答: #include <string> // #include <vector> // #include <array> // const int Str_num {10}; //或者 const int = 10; // .... // std:vector<std:string> vstr(Str_num); // std:array<std:string,Str_num> astr; //-------------------------------编程练习----------------------------------------- //1.编写一个C++程序,如下述输出示例所示的那样请求并显示信息: // What is your first name? Betty Sue // What is your last name? Yewe // What letter grade do you deserve? B // What is your age? 22 // Name:Yewe,Betty Sue // Grade:C // Age:22 //注意:改程序应该接受的名字包含多个单词。另外,程序将向下调整成绩,即向上调一个字母。假设用户请求A、B或C,所以不必担心D和F之间的空档。 //2.修改程序清单4.4,使用C++ string类而不是char数组。 //3.编写一个程序,它要求用户首先输入其名,然后输入其姓:然后程序使用一个逗号和空格将姓和名组合起来,并存储和显示组合结果。请使用char数组 //和头文件cstring中的函数。下面是该程序运行时的情形: // Enter your first name: Flip // Enter your last name: Fleming // Here's the informarion in a single string: Fleming, Flip //4.编写一个程序,它要求用户首先输入其名,再输入其姓:然后程序使用一个逗号和空格将姓和名组合起来,并存储和显示组合结果。请使用string对象 //和头文件string中的函数。下面是该程序运行时的情形: // Enter your first name: Flip // Enter your last name: Fleming // Here's the information in a single string: Fleming, Flip //5.结构CandyBar包含3个成员,第一个成员存储了糖块的品牌:第二个成员存储糖块的重量(可以有小数);第三个成员存储了糖块的卡路里含量(整数)。 //编写一个程序,声明这个结构,创建一个名为snack的CandyBar变量,并将其成员分别初始化为"Mocha Munch"、2.3和350.初始化应在声明snack时进行。最后, //程序显示snack变量的内容。 //6.结构CandyBar包含3个成员,如编程练习5所示。请编写一个程序。创建一个包含三个元素的CandyBar数组。并将它们初始化为所选的值。然后显示每个结构 //的内容。 //7.William Wingate 从事披萨饼分析服务。对于每个披萨饼,他都需要记录下列信息: // 披萨饼公司的名称,可以有多个单词组成。 // 披萨饼的直径。 // 披萨饼的重量。 //请设计一个能够存储这些信息的结构,并编写一个使用这种结构变量的程序。程序将请求用户输入上述信息,然后显示这些信息。请使用cin(或它的方法)和cout。 //8.完成编程练习7,但使用new来为结构分配内存,而不是声明结构变量。另外,让程序在请求输入披萨饼公司名称之前输入披萨饼的直径。 //9.完成编程练习6,但使用new来动态分配数组,而不是声明一个包含3个元素的CandyBar数组。 //10.编写一个程序,让用户输入三次40码跑的成绩(如果您愿意,也可以让用户输入40米跑的成绩),并显示次数和平均值。请使用一个array对象来存储数据 //(如果编译器不支持array类,请使用数组)。 #include "stdafx.h" #include "chapter4.h" int main() { //1&2 cout << "第一题" << endl; Exercise1 ex1; ex1.inputInfo1(); ex1.outpuInfo1(); cout << "第二题" << endl; ex1.inputInfo2(); //3. cout << "第三题" << endl; Exercise3 ex3; ex3.inputInfo(); //4. cout << "第四题" << endl; Exercise4 ex4; ex4.inputInfo(); ex4.outputInfo(); //5. cout << "第五题" << endl; Exercise5 ex5; ex5.candyBar = ex5.setSnack("Mocha Munch",2.3,350); cout << "品牌:" << ex5.candyBar.brand << " " << "重量:" << ex5.candyBar.weight << " " << "卡路里:" << ex5.candyBar.calorie <<endl; //6. cout << "第六题" << endl; Exercise6 ex6; CandyBar * c[3]; c[0] = &(ex6.setSnack("Mocha Munch", 2.3, 350)); c[1] = &(ex6.setSnack("uimodle", 2.0, 200)); c[2] = &(ex6.setSnack("lebin", 3.5, 180)); for (int i = 0; i < 3; i++) { cout << "品牌" << i << ":" << c[i]->brand << " " << "重量:" << c[i]->weight << " " << "卡路里:" << c[i]->calorie << endl; } //7. cout << "第七题" << endl; Exercise7 ex7; int const size = 3; ex7.setSize(size); pizza pizzzaa[size]; for (int i = 0; i < size; i++) { string brand; float diameter; float weight; cout << "披萨" << i + 1 << "名称:"; cin >> brand; cout << "披萨" << i + 1 << "直径:"; cin >> diameter; cout << "披萨" << i + 1 << "重量:"; cin >> weight; pizzzaa[i] = ex7.recordInfo(brand, diameter, weight); } cout << "显示所有输入信息:" << endl; for (int i = 0; i < size; i++) { cout << i + 1 << ":" << pizzzaa[i].brand << "---" << pizzzaa[i].diameter << "---" << pizzzaa[i].weight <<endl; } //8. cout << "第八题" << endl; Exercise8 ex8; int const size2 = 3; ex8.setSize(size2); pizza *ppizzz[size2] = {}; for (int i = 0; i < size2; i++) { float diameter; string brand; float weight; cout << "披萨" << i + 1 << "直径:"; cin >> diameter; cout << "披萨" << i + 1 << "名称:"; cin >> brand; cout << "披萨" << i + 1 << "重量:"; cin >> weight; ppizzz[i] = ex8.recordInfo( diameter, brand, weight); } cout << "显示所有输入信息:" << endl; for (int i = 0; i < size2; i++) { cout << i + 1 << ": " << ppizzz[i]->brand << "---" << ppizzz[i]->diameter << "---" << ppizzz[i]->weight << endl; delete ppizzz[i]; //基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的; //但是对于类对象数组,只能用 delete[]。对于 new 的单个对象,只能用 delete 不能用 delete[] 回收空间。 //new 和 delete、new[] 和 delete[] 对应使用。 } //9. cout << "第九题" << endl; Exercise9 ex9; CandyBar * c2[3]; c2[0] = ex9.setSnack("Mocha Munch", 2.3, 350); c2[1] = ex9.setSnack("uimodle", 2.0, 200); c2[2] = ex9.setSnack("lebin", 3.5, 180); for (int i = 0; i < 3; i++) { cout << "品牌" << i+1 << ":" << c2[i]->brand << " " << "重量:" << c2[i]->weight << " " << "卡路里:" << c2[i]->calorie << endl; delete c2[i]; } //10. cout << "第十题" << endl; Exercise10 ex10; ex10.recordDistance(3); ex10.showInfo(); return 0; }