cpp primer 习题代码(更新)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cpp primer 习题代码(更新)相关的知识,希望对你有一定的参考价值。

  1 3.1
  2  
  3 #include <iostream>
  4 using  std::cin;
  5 using std::cout;
  6 using std::endl;
  7 int main()
  8 {
  9     int base,exponent;
 10     long result=1;
 11     cout<<"Enter base and exponent:"<<endl;
 12     cin>>base>>exponent;
 13     if(exponent<0)
 14     {
 15         cout<<"Exponent can‘t be smaller than 0"<<endl;
 16         return -1;
 17     }
 18     else
 19     {
 20         for(int cnt=1;cnt<=exponent;++cnt)
 21         {
 22             result*=base;
 23         }
 24     }
 25     cout<<base<<" raised to the power of "<<exponent<<":"<<result<<endl;
 26     //cout << "Hello world!" << endl;
 27     return 0;
 28 }
 29 3.5
 30 //读入一行
 31 #include<iostream>
 32 using namespace std;
 33 int main()
 34 {
 35     string word;
 36     while(getline(cin,word))
 37     {
 38         cout<<word<<endl;
 39     }
 40     return 0;
 41 }
 42 //读入单词
 43 #include<iostream>
 44 using namespace std;
 45 int main()
 46 {
 47     string word;
 48     while(cin>>word)
 49     {
 50         cout<<word<<endl;
 51     }
 52     return 0;
 53 }
 54 3.8
 55 #include<iostream>
 56 using namespace std;
 57 int main()
 58 {
 59 string result_str,str;
 60 cin>>result_str;
 61 while(cin>>str)
 62     result_str=result_str+" "+str;
 63 cout<<result_str<<endl;
 64     return 0;
 65 }
 66 3.10
 67 #include<iostream>
 68 using namespace std;
 69 int main()
 70 {
 71 bool has_punct=false;
 72 string s,result_str;
 73 cout<<"Enter a String:"<<endl;
 74 getline(cin,s);
 75 for(string::size_type index=0;index!=s.size();++index)
 76 {
 77     if(ispunct(s[index]))
 78     {
 79         has_punct=true;
 80     }
 81     else
 82     {
 83         result_str+=s[index];
 84     }
 85 }
 86     if(has_punct)
 87         cout<<"Result:"<<result_str<<endl;
 88     else
 89     {
 90         cout<<"No punctuation character in the string"<<endl;
 91                 return -1;
 92     }
 93 return 0;
 94 }
 95 3.13
 96 #include<iostream>
 97 #include<vector>
 98 using namespace std;
 99 int main()
100 {
101     vector<int> ivec;
102     vector<int> sum;
103     int ival;
104     cout << "Enter numbers(Ctrl+Z to end):" << endl;
105     while(cin>>ival)
106             ivec.push_back(ival);
107             if(ivec.size()==0)
108             {
109                 cout<<"No elements"<<endl;
110             }
111     for (vector<int>::size_type index=0;index<ivec.size()-1;index=index+2)
112     {
113         if(ivec.size()%2!=0)
114         {
115             if(index<ivec.size()-1)
116             {
117                 sum.push_back(ivec[index]+ivec[index+1]);
118                 //sum.push_back(ivec[index]+ivec[ivec.size()-2-index]);
119             }
120         }
121         else
122         {
123              sum.push_back(ivec[index]+ivec[index+1]);
124                 // sum.push_back(ivec[index]+ivec[ivec.size()-1-index]);
125         }
126     }
127         if(ivec.size()%2!=0)
128         {
129             cout<<"Last element is not computed:"<<endl;
130         }
131         cout << "Sum of each pair of adjacent elements in the vector:"<<endl;
132         for (vector<int>::size_type index=0;index!=sum.size();++index)
133             {
134         cout<<sum[index]<<" ";
135             }
136         cout<<endl;
137 return 0;
138 }
139 3.14
140 #include<iostream>
141 #include<vector>
142 #include<string>
143 #include<cctype>
144 using namespace std;
145 int main()
146 {
147     cout<<"Enter some words:"<<endl;
148     vector <string> istr;
149     string iword;
150     while(cin>>iword)
151     istr.push_back(iword);
152     cout<<"After transformation:"<<endl;
153     for (vector<string>::size_type index=0;index<istr.size();++index)
154     {
155         for (string::size_type index2 = 0; index2 != istr[index].size(); ++index2)
156         {
157             istr[index][index2]=toupper(istr[index][index2]);
158         }
159         cout<<istr[index]<<"\t";
160         if((index%8==0)&&(index>0))
161         {
162             cout<<endl;
163         }
164     }
165     return 0;
166 }
167  
168 3.17
169 重做3.13
170 #include<iostream>
171 #include<vector>
172 using namespace std;
173 int main()
174 {
175     vector<int> ivec;
176     vector<int> sum;
177     int ival;
178     cout << "Enter numbers(Ctrl+Z to end):" << endl;
179     while(cin>>ival)
180     ivec.push_back(ival);
181     if(ivec.size()==0)
182     {
183         cout<<"No elements"<<endl;
184     }
185     for(vector<int>::iterator it=ivec.begin();it!=ivec.end()-1;it=it+2)
186     {
187         if(ivec.size()%2!=0)
188         {
189             if(it<ivec.end()-2)
190             {
191                 sum.push_back((*it)+*(it+1));
192             }
193         }
194         else
195         {
196              sum.push_back((*it)+*(it+1));
197         }
198     }
199         if(ivec.size()%2!=0)
200         {
201             cout<<"Last element is not computed:"<<endl;
202         }
203         cout << "Sum of each pair of adjacent elements in the vector:"<<endl;
204     for(vector<int>::iterator it2=sum.begin();it2!=sum.end();++it2)
205     {
206         cout<<*it2<<" ";
207     }
208         cout<<endl;
209 return 0;
210 }
211 重做3.14
212 #include<iostream>
213 #include<vector>
214 #include<string>
215 #include<cctype>
216 using namespace std;
217 int main()
218 {
219     cout<<"Enter some words:"<<endl;
220     vector <string> istr;
221     string iword;
222     while(cin>>iword)
223     istr.push_back(iword);
224     cout<<"After transformation:"<<endl;
225     for(vector<string>::iterator it=istr.begin();it!=istr.end();++it)
226     {
227         for(string::iterator it2=(*it).begin();it2!=(*it).end();++it2)
228         {
229             *it2=toupper(*it2);
230         }
231         cout<<*it<<"\t";
232         if((it-istr.begin())%8==0&&it>istr.begin())
233         {
234             cout<<endl;
235         }
236     }
237     return 0;
238 }
239  
240 3.18
241 #include<iostream>
242 #include<vector>
243 using namespace std;
244 int main()
245 {
246 vector<int> ivec(10,42);
247 for (vector<int>::iterator it=ivec.begin();it!=ivec.end();++it)
248 {
249      *it=*it*2;
250 }
251 for (vector<int>::iterator it=ivec.begin();it!=ivec.end();++it)
252 {
253      cout<<*it<<"\t";
254 }
255     return 0;
256 }
257  
258 4.15 解释指针和引用的主要区别。
259 使用引用(reference)和指针(pointer)都可间接访问另一个值,但它们之间存在两个重要区别:
260 (1)引用总是指向某个确定对象(事实上,引用就是该对象的别名),定义引用时没有进行初始化会出现编译错误;
261 (2) 赋值行为上存在差异:给引用赋值修改的是该引用所关联的对象的值,而不是使该引用与另一个对象关联。引用一经初始化,就始终指向同一个特定对象。给指针赋值修改的是指针对象本身,也就是使该指针指向另一对象,指针在不同时刻可指向不同的对象(只要保证类型匹配)。
262  
263 4.25 C风格字符串比较
264 #include<iostream>
265 #include<string>
266 #include<cstring>
267 using namespace std;
268 int main()
269 {
270     const int str_size=80;
271     char *str1,*str2;
272     str1=new char[str_size];
273     str2=new char[str_size];
274     if(str1==NULL||str2==NULL)
275     {
276         cout<<"No enough Memory"<<endl;
277         return -1;
278     }
279     cout<<"Enter two strings:"<<endl;
280     cin>>str1>>str2;
281     int result;
282     result=strcmp(str1,str2);
283     if(result>0)
284     cout << "\"" << str1 << "\"" << " is bigger than "<< "\"" << str2 << "\"" << endl;
285     else if (result < 0)
286     cout << "\"" << str2 << "\"" << " is bigger than "<< "\"" << str1 << "\"" << endl;
287     else
288     cout << "They are equal" << endl;
289     delete[] str1;
290     delete[] str2;
291     return 0;
292 }
293 4.29
294 (a) 这两段程序的功能是:执行一个循环次数为1000000 的循环,在该循环的循环体中:创建一个新字符串,将一个已存在的字符串复制给新字符串,然后比较两个字符串,最后释放新字符串。
295 #include<iostream>
296 #include<string>
297 #include<cstring>
298 using namespace std;
299 int main()
300 {
301      const char *pc = "a very long literal string";
302      const size_t len = strlen(pc +1);      // space to
303      for (size_t ix = 0; ix != 1000000; ++ix) {
304                  char *pc2 = new char[len + 1]; // allocate the space
305                  strcpy(pc2, pc);               // do the copy
306                  if (strcmp(pc2, pc))           // use the new string
307                      ;   // do nothing
308                  delete [] pc2;                 // free the memory
309           }
310          string str("a very long literal string");
311              // performance test on string allocation and copy
312      for (int ix = 0; ix != 1000000; ++ix) {
313                  string str2 = str; // do the copy, automatically allocated
314                  if (str != str2)           // use the new string
315                        ;  // do nothing
316           }
317     return 0;
318 }
319 4.30 字符串连接(Cstring style)
320 #include <cstring>
321 int main()
322 {
323 const char *cp1 = "Mary and Linda ";
324 const char *cp2 = "are firends.";
325 size_t len = strlen(cp1) + strlen(cp2);
326 char *result_str = new char[len+1];
327 strcpy(result_str, cp1);
328 strcat(result_str, cp2);
329 delete [] result_str;
330 return 0;
331 }
332 (C++ string style)
333 #include <string>
334 using namespace std;
335 int main()
336 {
337 const string str1("Mary and Linda ");
338 const string str2("are firends.");
339 string result_str;
340 result_str = str1;
341 result_str += str2;
342 return 0;
343 }
344 4.31 输入字符串到string,截断将string.c_str()copy到c风格字符串
345 #include <iostream>
346 #include <string>
347 #include <cstring>
348 using namespace std;
349 int main()
350 {
351     string in_str;// 用于读入字符串的string 对象
352     const size_t str_size = 10;
353     char result_str[str_size+1];// 读入字符串
354     cout << "Enter a string(<=" << str_size<< " characters):" << endl;
355     cin >> in_str;// 计算需复制的字符的数目
356     size_t len = strlen(in_str.c_str());
357     if (len > str_size)
358     {
359         len = str_size;
360         cout << "String is longer than " << str_size<< " characters and is stored only "
361         << str_size << " characters!" << endl;
362     }
363     // 复制len 个字符至字符数组result_str
364     strncpy(result_str, in_str.c_str(), len);
365     // 在末尾加上一个空字符(null 字符)
366     result_str[len+1] = \0;
367     return 0;
368 }
369 4.32&4.33
370 //int数组赋值给vector<int>
371 #include <iostream>
372 #include <vector>
373 using namespace std;
374 int main()
375 {
376     const size_t arr_size = 8;
377     int int_arr[arr_size];// 输入数组元素
378     cout << "Enter " << arr_size << " numbers:" << endl;
379     for (size_t ix = 0; ix != arr_size; ++ix)
380     cin >> int_arr[ix];// 用int 型数组初始化vector 对象
381     vector<int> ivec(int_arr, int_arr + arr_size);
382     return 0;
383 }
384 //vector<int>赋值给int数组
385 #include <iostream>
386 #include <vector>
387 using namespace std;
388 int main()
389 {
390     vector<int> ivec;
391     int ival;// 输入vector 元素
392     cout << "Enter numbers: (Ctrl+Z to end)" << endl;
393     while (cin >> ival)
394         ivec.push_back(ival);// 创建数组
395     int *parr = new int[ivec.size()];// 复制元素
396     size_t ix = 0;
397     for (vector<int>::iterator iter = ivec.begin();iter != ivec.end(); ++iter, ++ix)
398         parr[ix] = *iter;// 释放数组
399     delete [] parr;
400     return 0;
401 }
402 4.34&4.35
403 #include <iostream>
404 #include <string>
405 #include <cstring>
406 #include <vector>
407 using namespace std;
408 int main()
409 {
410     vector<string> ivec;
411     string str;
412     cout<<"Enter strings:"<<endl;
413     while(cin>>str)
414         ivec.push_back(str);
415     char **s2ptr=new char*[ivec.size()];
416     size_t ix=0;
417     for (vector<string>::iterator it=ivec.begin();it!=ivec.end();++it,++ix)
418     {
419         char *strptr=new char[(*it).size()+1];
420         strcpy(strptr,(*it).c_str());
421         s2ptr[ix]=strptr;
422       //  *s2ptr=strptr;
423       //  s2ptr=s2ptr+1;
424     }
425     cout << "Content of character arrays:" << endl;
426     for (ix =0; ix != ivec.size(); ++ix)
427     cout << *(s2ptr+ix) << endl;
428     // 释放各个字符数组
429     for (ix =0; ix != ivec.size(); ++ix)
430     delete [] s2ptr[ix];
431     // 释放字符指针数组
432     delete [] s2ptr;
433     return 0;
434 }
435  
436 8.3  流状态的查询和控制 ( 在保证程序的可靠性时经常遇到的问题 )
437  
438 C和C++的标准里从来没有定义过 fflush(stdin)。也许有人会说:“可是我用 fflush(stdin) 解决了这个问题,你怎么能说是错的呢?”的确,某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能(linux 下的 gcc 就不支持),因为标准中根本没有定义 fflush(stdin)。MSDN 文档里也清楚地写着fflush on input stream is an extension to the C standard(fflush 操作输入流是对 C 标准的扩充)。当然,如果你毫不在乎程序的移植性,用 fflush(stdin) 也没什么大问题。以下是 C99 对 fflush 函数的定义:
439  
440 /*
441 * 流状态的查询和控制
442 * 2010-3-26 wcdj
443 */
444 #include <iostream>
445 #include <stdexcept>
446 #include "stdio.h"
447 using namespace std;
448 void way1_cleario();
449 void way2_cleario();
450 int main()
451 {
以上是关于cpp primer 习题代码(更新)的主要内容,如果未能解决你的问题,请参考以下文章

C Primer Plus 第六版—— 6.16 编程练习题(附代码)

C++Primer第五版——习题答案详解

C Primer plus 第二章复习题及其编程题

dogs.cpp_程序清单1.1_C源代码的例子(《C Primer Plus》_P17)

c primer plus--C控制语句:循环(第6章)--习题

节习题答案(不定时更新)