《C++编程思想》(第二版)第3章 C++中的C(笔记、习题及答案)(一)

来源:互联网 发布:小猪cms伪静态 编辑:程序博客网 时间:2024/05/24 02:13

一.总结本章的内容:

1.如果声明指针是void* ,它意味着任何类型的地址都可以间接引用那个指针(而如果声明int*,则只能对int型变量的地址间接引用那个指针)。一旦我们间接引用一个void*,就会丢失关于类型的信息。这意味着在使用前,必须转换为正确的类型。

2.Static变量使得局部变量的值在程序的整个生命期里仍然存在,其优点是在函数范围之外它是不可用的,所以不可能被轻易改变。

3.内部链接意味着只对正在编译的文件创建空间,外部连接意味着所有被编译过的文件创建一片单独的存储空间。

4.显示转换语法:

(1).static_cast:用于“良性”和“适度良性”转换,包括不用强制转换(例如自动类型转换);

(2).const_cast:对“const”和/或“volatile”进行转换;

(3).reinterpret_cast:转换为完全不同的意思。为了安全使用它,关键必须转换回原来的类型。转换成的类型一般只能用于位操作,否则就是为了其他隐秘的目的。这是所有转换中最危险的。

(4).dynamic_cast:用于类型安全的向下转换。

5.asm关键字:是一种转义机制,允许在C++程序中写汇编代码。在汇编程序代码中经常可以引用C++的变量,这意味着可以方便的和C++代码通信,且限定汇编代码只能用于必要的高效调整,或使用特殊的处理器指令。

6.想给程序传递命令行参数时,C和C++的函数main()有特殊的参数表,其形式如:int main(int argc, char* argv[]);

   argv[0]是程序本身的路径和名字。

7.复杂变量和函数定义:

(1).void *(*(*fp1)(int))[10];

      *fp1是一个指向函数的指针,该函数接受一个整型参数并返回一个指向含有10个void指针数组的指针。

(2).float (*(*fp2)(int,int,float))(int);

       *fp2是一个指向函数的指针,该函数接收三个参数(int、int和float)且返回一个指向函数的指针,该函数接受一个整型参数并返回一个float。

(3).typedef double (*(*(fp3)())[10])();

       fp3是一个指向函数的指针,该函数无参数,且返回一个含有10个指向函数指针数组的指针,这些函数不接受参数且返回double值。

(4).int (*(*f4())[10])();

       f4是一个返回指针的函数,该指针指向含有10个函数指针的数组,这些函数返回整型值。

二.和习题有关的函数:

     Ifthen.cpp

#include <iostream>using namespace std;int main(){int i;cout<<"type a number and 'Enter'"<<endl;cin>>i;if(i>5){cout<<"It's greater than 5"<<endl;}else{if(i<5){cout<<"It's less than 5"<<endl;}else{cout<<"It's equal to 5"<<endl;}}cout<<"type a number and 'Enter'"<<endl;cin>>i;if(i<10){if(i>5){cout<<"5<i<10"<<endl;}else{cout<<"i<=5"<<endl;}}else{cout<<"i>=10"<<endl;}return 0;}


Menu.cpp

#include <iostream>using namespace std;int main(){char c;while(true){cout<<"MAIN MENU:"<<endl;cout<<"l:left,r:right,q:quit->";cin>>c;if(c == 'q'){break;}if(c == 'l'){cout<<"LEFT MENU:"<<endl;cout<<"select a or b:";cin>>c;if(c == 'a'){cout<<"you choose 'a'"<<endl;continue;}if(c == 'b'){cout<<"you choose 'b'"<<endl;continue;}else{cout<<"you don't choose a or b"<<endl;continue;}}if(c == 'r'){cout<<"RIGHT MENU:"<<endl;cout<<"select c or d:";cin>>c;if(c == 'c'){cout<<"you choose 'c'"<<endl;continue;}if(c == 'd'){cout<<"you choose 'd'"<<endl;continue;}else{cout<<"you don't choose c or d"<<endl;continue;}}cout<<"you must type l or r or q!"<<endl;}cout<<"quitting menu..."<<endl;return 0;}


YourPets1.cpp

#include <iostream>using namespace std;int dog,cat,bird,fish;void f(int pet){cout<<"pet id number:"<<pet<<endl;}int main(){int i,j,k;}


YourPet2.cpp

#include <iostream>using namespace std;int dog,cat,bird,fish;void f(int pet){cout<<"pet id number:"<<pet<<endl;}int main(){int i,j,k;cout<<"f():"<<(long)&f<<endl;cout<<"dog:"<<(long)&dog<<endl;cout<<"cat:"<<(long)&cat<<endl;cout<<"bird:"<<(long)&bird<<endl;cout<<"fish:"<<(long)&fish<<endl;cout<<"i:"<<(long)&i<<endl;cout<<"j:"<<(long)&j<<endl;cout<<"k:"<<(long)&k<<endl;return 0;} 


Static.cpp

#include <iostream>using namespace std;void func(){static int i = 0;cout<<"i = "<<++i<<endl;}int main(){for(int x = 0;x < 10;x++){func();}return 0;}


FileStatic.cpp

#include <iostream>using namespace std;static int fs;int main(){fs = 1;}


FileStatic2.cpp

#include <iostream>using namespace std;extern int fs;int main(){fs = 100;}


Boolean.cpp

#include <iostream>using namespace std;int main(){int i,j;cout<<"Enter an integer:";cin>>i;cout<<"Enter another integer:";cin>>j;cout<<"i<j is"<<(i<j)<<endl;cout<<"i>=j is"<<(i>=j)<<endl;cout<<"i<=j is"<<(i<=j)<<endl;cout<<"i==j is"<<(i==j)<<endl;cout<<"i!=j is"<<(i!=j)<<endl;cout<<"i&&j is"<<(i&&j)<<endl;cout<<"i||j is"<<(i||j)<<endl;cout<<"(i<10)&&(j<10) is"<<((i<10)&&(j<10))<<endl;return 0;}


Bitwise.cpp

#include <iostream>using namespace std;#define PR(STR,EXPR) \cout<<STR; printBinary(EXPR); cout<<endl;int main(){unsigned int getval;unsigned char a,b;cout<<"Enter a number between 0 and 255:"<<endl;cin>>getval;a = getval;PR("a in binary:",a);cout<<"Enter a number between 0 and 255:"<<endl;cin>>getval;b = getval;PR("b in binary:",b);PR("a | b = ",a|b);PR("a & b = ",a&b);PR("a ^ b = ",a^b);PR("~a = ",~a);PR("~b = ",~b);unsigned char c = 0x5A;PR("c in binary: ",c);a |= c;PR("a |= c ;a =  ",a);b &= c;PR("b &= c ;b =  ",b);b ^= a;PR("b ^= a ;b =  ",b);return 0;}

Rotation.cpp

#include <iostream>using namespace std;unsigned char rol(unsigned char val){int highbit;if(val & 0x80){highbit = 1;}else{highbit = 0;}val<<=1;val |= highbit;return val;}unsigned char ror(unsigned char val){int lowbit;if(val & 1){lowbit = 1;}else{lowbit = 0;}val>>=1;val |= (lowbit<<7);return val;}


Union.cpp

#include <iostream>using namespace std;union Packed{char i;short j;int k;long l;float f;double d;};int main(){cout<<"aizeof(Packed) = "<<sizeof(Packed)<<endl;Packed x;x.i = 'c';cout<<x.i<<endl;x.d = 3.14159;cout<<x.d<<endl;return 0;}


StructArray.cpp

#include <iostream>using namespace std;typedef struct{int i,j,k;}ThreeDpoint;int main(){ThreeDpoint p[10];for(int i = 0;i < 10;i++){p[i].i = i+1;p[i].j = i+2;p[i].k = i+3;}return 0;}


ArrayAddresses.cpp

#include <iostream>using namespace std;int main(){int a[10];cout<<"sizeof(int) = "<<sizeof(int)<<endl;for(int i = 0;i < 10;i++){cout<<"&a["<<i<<"]="<<(long)&a[i]<<endl;}return 0;}


ArgsToInts.cpp

#include <iostream>#include <cstdlib>using namespace std;int main(int argc, char* argv[]){for(int  i = 1;i < argc;i++){cout<<atoi(argv[i])<<endl;}}


PointerIncrement2.cpp

#include <iostream>using namespace std;typedef struct{char c;short s;int i;long l;float f;double d;long double ld;}Primitives;int main(){Primitives p[10];Primitives* pp = p;cout<<"sizeof(Primitives) = "<<sizeof(Primitives)<<endl;cout<<"pp = "<<(long)pp<<endl;pp++;cout<<"pp = "<<(long)pp<<endl;return 0;}


PointerArithmetic.cpp

#include <iostream>using namespace std;#define P(EX) cout<<#EX<<":"<<EX<<endl;int main(){int a[10];for(int i = 0;i < 10;i++){a[i] = i;}int* ip = a;P(*ip);P(*++ip);P(*(ip+5));int* ip2 = ip+5;P(*ip2);P(*(ip2-4));P(*--ip2);P(ip2-ip);return 0;}


三.习题及答案


//: S03:Prototypes.h//  Declares various functionsvoid f(int);int g(float);float h(char);char k(void);  // same as char k()///:~//: S03:Prototypes.cpp {O}// Implements functions declared in Prototypes.h#include <iostream>using namespace std;void f(int i) {  cout << "f(" << i << ") returning void\n";}int g(float x) {  cout << "g(" << x << ") returning int\n";  return 0;}float h(char c) {  cout << "h(" << c << ") returning float\n";  return 1.5;}char k(void) {   // same as char k()  cout << "k() returning char\n";  return 'a';}

#include "Prototypes.h"int main() {  f(1);  g(1.5);  h('c');  k();}




方法一:

#include <iostream>#include <cmath>    // for sqrt()using namespace std;int main() {  const int MAX = 100;  // Print 2 as a prime:  cout << "2 ";  for (int i = 3; i <= MAX; i += 2)   {    float val = i; // Produce float value    int mid = static_cast<int>(sqrt(val));    int j;    for (j = 3; j <= mid; j += 2){      if (i % j == 0)  {        break;  }}    if (j > mid){      cout << i << ' ';}  }  cout << endl;  return 0;}

方法二:

#include <iostream>#include <cmath>    // for sqrt()using namespace std;#define MAX 100int main() {  cout<<"2";  for (int i = 3; i < MAX+1; i+=2)   {    for (int j = 3; j <= sqrt(i); j += 2){if (i % j == 0){break;}}if (j > sqrt(i)){cout << i << ' ';}  }  cout << endl;  return 0;}



#include <iostream>#include <string>#include <cstdio>int main() {    using namespace std;    string word;    for (;;) {        int code;        cin >> word;        if (word == "exit" | word == "return")            break;        // Map words:        if (word == "a" || word == "an" || word == "the")            code = 0;        else if (word == "after" || word == "before" ||                 word == "beside" || word == "by" ||                 word == "for" || word == "from" ||                 word == "in" || word == "into" ||                 word == "of" || word == "to")            code = 1;        else if (word == "if" || word == "else")            code = 2;        else if (word == "who" || word == "what" ||                 word == "when" || word == "where" ||                 word == "why")            code = 3;        else            code = 4;        // Print code description:        switch (code) {        case 0:            puts("article");            break;        case 1:            puts("preposition");            break;        case 2:            puts("conditional");            break;        case 3:            puts ("interrogative");            break;        default:            puts("unmapped word");            break;        }    }    return 0;} 



#include <iostream>using namespace std;int main(){char c;while(true){cout<<"MAIN MENU:"<<endl;cout<<"l:left,r:right,q:quit->";cin>>c;switch(c){case 'q':{break;}case 'l':{cout<<"LEFT MENU:"<<endl;cout<<"select a or b:";cin>>c;switch(c){case 'a':{cout<<"you choose 'a'"<<endl;continue;}case 'b':{cout<<"you choose 'b'"<<endl;continue;}default:{cout<<"you don't choose a or b"<<endl;continue;}}}case 'r':{cout<<"RIGHT MENU:"<<endl;cout<<"select c or d:";cin>>c;switch(c){case 'c':{cout<<"you choose 'c'"<<endl;continue;}case'd':{cout<<"you choose 'd'"<<endl;continue;}default:{cout<<"you don't choose c or d"<<endl;continue;}}}}cout<<"you must type l or r or q!"<<endl;}cout<<"quitting menu..."<<endl;return 0;}



#include <iostream>using namespace std;int main(){int X=1,Y=2,Z=3;cout<<"A = "<<X+Y-2/2+Z<<endl;cout<<"A = "<<X+(Y-2)/(2+Z)<<endl;return 0;}



#include <iostream>using namespace std;int dog;char cat;float bird;double fish;void f(int pet){cout<<"pet id number:"<<pet<<endl;}int main(){int i,j,k;cout<<"f():"<<(long)&f<<endl;cout<<"dog:"<<(long)&dog<<endl;cout<<"cat:"<<(long)&cat<<endl;cout<<"bird:"<<(long)&bird<<endl;cout<<"fish:"<<(long)&fish<<endl;cout<<"i:"<<(long)&i<<endl;cout<<"j:"<<(long)&j<<endl;cout<<"k:"<<(long)&k<<endl;return 0;} 

结果表示:


2 0