文章目录
- 第一章 C++编程基础
-
- 第二章 面向过程的编程风格
-
第一章 C++编程基础
1.4
/*********************************************************************
说明:试着扩充这个程序的内容:(1)要求用户同时输入名字(first name)和姓氏(last name),
(2)修改输出结果,同时打印出姓氏和名字。
*********************************************************************/
#include
#include
using namespace std;
int main() {
string user_name;
cout << "输入名字:\n";
cin >> user_name;
cout << "\n你好," << user_name;
return 0;
}
1.5
/*********************************************************************
说明:编写一个程序,能够询问用户的姓名,并读取用户所输入的内容。请确保用户输入的名称长度大
于两个字符。如果用户的确输入了有效名称,就响应一些信息。请以两种方式实现:第一种使用
C-style字符串,第二种使用string对象。
*********************************************************************/
#include
#include
#include
using namespace std;
//使用string对象
int main() {
string usr_name;
cout << "Please enter your name:" << endl;
cin >> usr_name;
switch (usr_name.size()) {
case 0:
cout << "Fail,No Name.";
break;
case 1:
cout << "Fail,Onlu A 1-character name.";
break;
default :
cout << "Hello," << usr_name << endl;
}
return 0;
}
1.6
/*********************************************************************
说明:编写一个程序,从标准输入设备读取一串整数,并将读入的整数依次放到array及
vector,然后遍历这两种容器,求取数值总和。将总和及平均值输出至标准输出设备
*********************************************************************/
#include
#include
using namespace std;
// 使用array实现
//int main() {
// const int array_size = 128;
// int ia[array_size];
//
// int ival, icnt = 0; // ival用于暂存输入,icnt表示输入数据量
// int sum = 0;
// cout << "Please Enter Some Numbers:" << endl;
//
// while (cin >> ival && icnt < array_size) {
// ia[icnt++] = ival;
// }
//
// for (int i = 0; i < icnt; i++) {
// sum += ia[i];
// }
// int average = sum / icnt;
// cout << "Sum of " << icnt
// << " elements: " << sum
// << ". Average: " << average << endl;
// return 0;
//}
//使用vector实现
int main() {
const int array_size = 128;
vectoria; //无需在初始化的时候就确实大小
int ival = 0; // ival用于暂存输入
int sum = 0;
cout << "Please Enter Some Numbers:" << endl;
while (cin >> ival && ia.size() < array_size) {
ia.push_back(ival);
}
for (int i = 0; i < ia.size(); i++) {
sum += ia[i];
}
int average = sum / ia.size();
cout << "Sum of " << ia.size()
<< " elements: " << sum
<< ". Average: " << average << endl;
return 0;
}
1.7
/*********************************************************************
说明:使用你最趁手的编辑工具,输入两行(或更多)文字并存盘。然后编写一个程序,打开该文本文
件,将其中每个字都读取到一个vector对象中。遍历该vector,将内容显示到cout。
然后利用泛型算法sort(),对所有文字排序:
#include
sort( container.beginer(), container.end() );
再将排序后的结果输出到另一个文件。
*********************************************************************/
#include
#include
#include
#include
#include
using namespace std;
int main() {
vectoristr;
ifstream infile("ex1.7Read.txt");
if (!infile) {
cerr << "Fail infile!\n";
} else {
string word;
while (infile >> word) {
istr.push_back(word);
}
}
// 排序
sort(istr.begin(), istr.end());
ofstream outfile("ex1.7Write.txt", ios_base::app);
if (!outfile)
cerr << "Fail outfile!\n";
else
for (int i = 0; i < istr.size(); i++) {
outfile << istr[i] << " ";
}
outfile << endl;
return 0;
}
1.8
/*********************************************************************
说明:switch语句让我们得以根据用户答错的次数提供不同的安慰语句。请以array储存四种
不同的字符串信息,并以用户答错次数作为array的索引值,以此方式来显示安慰语句。
*********************************************************************/
#include
using namespace std;
const char *msg_to_usr( int num_tries ) {
const int rsp_cnt = 5;
static const char *usr_msgs[ rsp_cnt ] = {
"Go on, make a guess. ",
"Oops! Nice guess but not quite it.",
"Hmm, Sorry. Wrong a second time.",
"Ah, this is harder than it looks, no?",
"It must be getting pretty frustrating by now!"
};
if ( num_tries < 0 ) {
num_tries = 0;
} else if ( num_tries >= rsp_cnt ) {
num_tries = rsp_cnt - 1;
}
return usr_msgs[ num_tries ];
}
int main() {
cout << msg_to_usr(3) << endl;
return 0;
}
第二章 面向过程的编程风格
2.1
/*********************************************************************
说明: 先前的main()只让用户输入一个位置值,然后便结束程序。如果用户想取得两个甚至更多元素值,
他必须执行这个程序两次或多次。请改写main(),使它允许用户不断输入位置值,直到用户希望
停止为止。
*********************************************************************/
#include
using namespace std;
bool fibon_elem(int, int &);
int main() {
int pos, elem;
char ch;
bool more = true;
while (more) {
cout << "请输入一个位置:" ;
cin >> pos;
if (fibon_elem(pos, elem)) {
cout << "此位置:" << pos
<< "的值是:" << elem << endl;
} else {
cout << "error";
}
cout << "是否还要继续(Y/N)?" << endl;
cin >> ch;
if (ch != 'y' && ch != 'Y') {
more = false;
}
}
return 0;
}
bool fibon_elem(int pos, int &elem) {
// 检查位置值是否合理
if (pos <= 0 || pos > 1024) {
elem = 0;
return false;
}
// 位置值为1和2时,elem的值为1
int val = 1;
int n_1 = 1, n_2 = 1;
switch (pos) {
default:
case 2:
cout << "1 ";
case 1:
cout << "1 ";
}
for (int i = 3; i <= pos; i++) {
val = n_2 + n_1;
n_2 = n_1;
n_1 = val;
cout << val << (!(i % 10) ? "\n\t" : " ");
}
elem = val;
return true;
}
2.2
/*********************************************************************
说明:Pentagonal数列的求值公式是 Pn=ni*(3r-1) /2,借此产生1,5,12,22,35等元素值。
试定义一个函数,利用上述公式,将产生的元素置人用户传入的 vector 之中,元素数目由用户指定。
请检查元素数目的有效性(译注:太大则可能引发overflow问题).接下来撰写第二个函数,能够将所接获的 vector 的所有元素一-一印出。
此函数的第二参数接受一个字符串,表示储存于vector 内的数列的类型。最后再写一个main( ),测试上述两个函数。
*********************************************************************/
#include
#include
#include
using namespace std;
bool calc_elems(vector &vec, int pos);
void display_elems(vector vec, ostream &os = cout);
int main() {
vector pent;
// 检查上面声明的两个函数
if ( calc_elems( pent, 0 ))
display_elems( pent );
if ( calc_elems( pent, 8 ))
display_elems( pent );
ofstream ofil("ex2.2.txt");
if ( calc_elems( pent, 14 ))
display_elems( pent, ofil);
if ( calc_elems( pent, 138 ))
display_elems( pent );
return 0;
}
bool calc_elems(vector &vec, int pos) {
if (pos <= 0 || pos > 64) {
cerr << "Sorry. Invaild position:" << pos << endl;
return false;
}
for (int ix = vec.size() + 1; ix <= pos; ++ix) {
vec.push_back((ix * (3 * ix - 1)) / 2);
};
return true;
};
void display_elems(vector vec, ostream &os) {
os << "\nPentagonal Numeric Series\n\t";
for (int ix = 0; ix < vec.size(); ++ix)
os << vec[ix] << ' ';
os << endl;
};
2.3
/*********************************************************************
说明:将练习2.2的Pentagonal数列求值函数拆分为两个函数,其中之一为inline,用来检验元素个数
是否合理。如果的确合理,而且尚未被计算,便执行第二个函数,执行实际的求值工作。
*********************************************************************/
#include
#include
#include
using namespace std;
inline bool calc_elems(vector &vec, int pos);
extern void really_calc_elems(vector &vec, int pos);
void display_elems(vector vec, ostream &os = cout);
int main() {
vector pent;
// 检查上面声明的两个函数
if ( calc_elems( pent, 0 ))
display_elems( pent );
if ( calc_elems( pent, 8 ))
display_elems( pent );
ofstream ofil("ex2.3.txt");
if ( calc_elems( pent, 14 ))
display_elems( pent, ofil);
if ( calc_elems( pent, 138 ))
display_elems( pent );
return 0;
}
bool calc_elems(vector &vec, int pos) {
if (pos <= 0 || pos > 64) {
cerr << "Sorry. Invaild position:" << pos << endl;
return false;
}
if ( vec.size() < pos) {
really_calc_elems( vec, pos);
}
return true;
};
void really_calc_elems(vector &vec, int pos) {
for (int ix = vec.size() + 1; ix <= pos; ++ix) {
vec.push_back((ix * (3 * ix - 1)) / 2);
};
}
void display_elems(vector vec, ostream &os) {
os << "\nPentagonal Numeric Series\n\t";
for (int ix = 0; ix < vec.size(); ++ix)
os << vec[ix] << ' ';
os << endl;
};
2.4
/*********************************************************************
说明:写一个函数,以局部静态(local static)的vector存储 Pentagonal数列元素。
此函数返回一个const 指针,指向该vector。
如果 vector 的容量小于指定的元素数目,就扩充 vector的容量。接下来再实现第二个函数,接受一个位置值并返回该位置上的元素。最后,撰写main ()测试这些函数。
*********************************************************************/
#include
#include
#include
using namespace std;
inline bool check_validity(int pos);
const vector *initelems(int pos);
void display_elems(vector vec, ostream &os = cout);
bool get_elems(int pos, int &elem);
int main() {
int elem;
// 检查上面声明的两个函数
if ( get_elems( 0, elem ))
cout << "element 1 is " << elem << '\n';
for (int i = 1; i <= 10; ++i ) {
if ( get_elems( i, elem ))
cout << "element " << i << "\tis " << elem << '\n';
}
return 0;
}
bool check_validity(int pos) {
return (pos <= 0 || pos > 64) ? false : true;
}
const vector *initelems(int pos) {
static vector elems;
if (check_validity(pos) || pos > elems.size()) {
for (int ix = elems.size() + 1; ix <= pos; ++ix) {
elems.push_back((ix * (3 * ix - 1)) / 2);
};
}
return &elems;
}
bool get_elems(int pos, int &elem) {
if ( !check_validity( pos )) {
cout << "Sorry. Invalid position: " << pos << endl;
elem = 0;
return false;
};
const vector *elems = initelems(pos);
elem = (*elems)[pos - 1];
return true;
}
void display_elems(vector vec, ostream &os) {
os << "\nPentagonal Numeric Series\n\t";
for (int ix = 0; ix < vec.size(); ++ix)
os << vec[ix] << ' ';
os << endl;
};
2.5
/*********************************************************************
说明:实现一个重载的max (〉函数,让它接受以下参数:
(a)两个整数;
(b)两个浮点数;
(c)两个字符串:
(d)一个整数vector;
(e)一个浮点数vector:
(f)一个字符串 vector;
(g)一个整数数组,以及一个表示数组大小的整数值:
(h)一个浮点数数组,以及一个表示数组大小的整数值:
(i)-个字符串数组,以及一个表示数组大小的整数值.
最后,撰写main()测试这些函数。
*********************************************************************/
#include
#include
#include
#include
using namespace std;
inline int max (int a, int b);
inline float max (float a, float b);
inline string max (const string &a, const string &b);
inline int max (const vector &vec);
inline float max ( const vector &vec );
inline string max ( const vector &vec );
inline string max ( const string &a, const string &b );
inline int max ( const int *parray, int size );
inline float max( const float *parray, int size );
inline string max ( const string *parray, int size );
int main() {
string sarray[] = { "we", "were", "her", "pride", "of", "ten" };
vector svec( sarray, sarray + 6 );
int iarray[] = { 12, 70, 2, 169, 1, 5, 29 };
vector ivec( iarray, iarray + 7 );
float farray[] = { 2.5, 24.8, 18.7, 4.1, 23.9 };
vector fvec( farray, farray + 5 );
int imax = max( max( ivec ), max( iarray, 7 ));
float fmax = max( max( fvec ), max( farray, 5 ));
string smax = max( max( svec ), max( sarray, 6 ));
cout << "imax should be 169 -- found: " << imax << '\n'
<< "fmax should be 24.8 -- found: " << fmax << '\n'
<< "smax should be were -- found: " << smax << '\n';
return 0;
}
int max (int a, int b) {
return (a > b) ? a : b;
}
float max (float a, float b) {
return (a > b) ? a : b;
}
string max ( const string &a, const string &b ) {
return a > b ? a : b;
}
int max ( const vector &vec ) {
return *max_element( vec.begin(), vec.end() );
}
float max ( const vector &vec ) {
return *max_element( vec.begin(), vec.end() );
}
string max ( const vector &vec ) {
return *max_element( vec.begin(), vec.end() );
}
int max ( const int *parray, int size ) {
return *max_element( parray, parray + size );
}
float max( const float *parray, int size ) {
return *max_element( parray, parray + size );
}
string max ( const string *parray, int size ) {
return *max_element( parray, parray + size );
}
2.6
/*********************************************************************
说明:以template 重新完成练习2.5,并对main(〉函数做适度的修改.
*********************************************************************/
#include
#include
#include
#include
using namespace std;
template
inline Type mymax(Type t1, Type t2) {
return (t1 > t2) ? t1 : t2;
}
template
inline elemType mymax(const vector &vec) {
return *max_element( vec.begin(), vec.end() );
}
template
inline arrayType mymax(const arrayType *parray, int size) {
return *max_element( parray, parray + size );
}
int main() {
string sarray[] = { "we", "were", "her", "pride", "of", "ten" };
vector svec( sarray, sarray + 6 );
int iarray[] = { 12, 70, 2, 169, 1, 5, 29 };
vector ivec( iarray, iarray + 7 );
float farray[] = { 2.5, 24.8, 18.7, 4.1, 23.9 };
vector fvec( farray, farray + 5 );
int imax = mymax( mymax( ivec ), mymax( iarray, 7 ));
float fmax = mymax( mymax( fvec ), mymax( farray, 5 ));
string smax = mymax( mymax( svec ), mymax( sarray, 6 ));
cout << "imax should be 169 -- found: " << imax << '\n'
<< "fmax should be 24.8 -- found: " << fmax << '\n'
<< "smax should be were -- found: " << smax << '\n';
return 0;
}