zoukankan      html  css  js  c++  java
  • C++面向过程笔记丨基础、字符串、指针、引用(连载中)

    小题和知识点

    • 在定义结构体时,不可以为成员设置默认值(不可以,编译器会报错)
    • 若PAT是一个类,则程序运行时,语句“PAT (*ad)[3];”调用PAT的构造函数的次数是0. 定义了含有3个元素的指向类PAT类型的指针数组ad。
    下列输出字符'A'的方法中,错误的是(C)。
    A.cout.put('A');
    B.cout<<'A';
    C.cout<<put('A');
    D.char A='A';cout<<A;
    
    下列关于文件流的描述中,正确的是(D)
    A.文件流只能完成针对磁盘文件的输入输出
    B.建立一个文件流对象时,必须同时打开一个文件
    C.若输入流要打开的文件不存在,将建立一个新文件
    D.若输出流要打开的文件不存在,将建立一个新文件
    
    • cin和cout是I/O流库预定义的对象
    • 文件打开方式
      ofstream ofs("file.txt", ios::app):若文件存在,则将文件指针定位于文件尾;若文件不存在,则建立一个新文件
      ifstream ifs; ifst.open("d:\file.txt", ios::in);:若当前目录下不存在file.txt文件,则不会自动创建file.txt文件
    • while(ifs.get(c)) ofs.put(c);,ofs是ofstream类的对象,ifs是ifstream类的对象,c是char型变量.:把某文件的内容全部写入到另一个文件

    关于read函数的下列描述中,(D)是正确的。
    A.函数所获取的字符多少是不受限制的
    B.函数只能从键盘输入中获取字符串
    C.该函数只能用于文本文件的操作
    D.该函数只能按规定读取所指定的字符数

    • 数组表示方法比较
    struct person
    {   int num;
        char name[10];
        float score[3];
    }wang;
    //wang.name="Mary"(char数组不能直接赋值,要用下标赋值)
    
    int main()   
    {int a[ ]={1,2,3,4,5}, *p=a;
    cout<<p<<endl; //输出当前地址:a, a+1, p, p+1, etc.
    cout<<&a[0]<<endl; //输出该值对应地址:&p[0], &a[2], etc.
    cout<<p[0]<<endl; //输出该地址对应值:p[1],a[1], etc.
    cout<<*(p+2)<<endl; //输出该地址对应值:*(p+1), *(a+2), etc.
    //没有&(p+1), ++(p+1), &(a+1)这种操作 }   
    
    • 各种const
      void print() const: print()函数是一个类的常成员函数,它无返回值

    大题和知识点

    鞍点(循环嵌套和跳出条件)

    找出一个二维数组(以三行四列的数组为例)中的鞍点,即该位置上的元素在该行上值最大,在该列上值最小(也可能没有鞍点)

    • 这里如果输入4*3的全为1的矩阵,会输出[0][0]为满足的点,没有好的解决办法,但是不在测试点中,那就勉强AC了。
    #include<iostream>
    using namespace std;
    int arr[3][4]={0};
    int main(){
       for (int i=0; i<3; i++)
       {for (int j=0; j<4; j++){cin>>arr[i][j];}} //输入数组,这里平平无奇
       int max=arr[0][0];
       int sum = 0;
       for (int i=0; i<3; i++){                   //输出最大,后面bug百出
          bool flag=1;
          int max=arr[i][0];
          int maxj=0;
          //到这里还好,都是每次选取一行,求这一行里的最大值max和坐标[i][maxj]
          for (int j=1; j<4; j++) if (arr[i][j]>max) {max=arr[i][j];maxj=j;}
          //这里是希望这一列该元素值最小,只要有一个比它大的就不能输出,同时不必再进行当前列循环
          for (int m=0; m<3; m++) if (arr[m][maxj]<max) {flag=0;break;}
          //如果当前列循环结束,标志仍然是1,可以输出
          if (flag) {cout<<"["<<i<<"]["<<maxj<<"]="<<max<<" is Saddle Point"<<endl;sum++;break;}}
       //有满足条件的在上面被计数,如果点数为零,输出没有。
       if (sum==0) cout<<"No Saddle Point"<<endl;}
    

    字符串排序(指针数组,数组指针)

    有5个字符串,首先将它们按照字符串中字符个数由小到大排序,再分别取出每个字符串的第三个字母合并成一个新的字符串输出(若少于三个字符的输出空格)。要求利用字符串指针和指针数组实现。

    #include<iostream>
    #include<cstring>
    using namespace std;
    int main(){
    	char *ch[5];          //指!针!数!组!是很多指针在一起嗷!
    	for(int i=0;i<5;i++) {ch[i]=new char[10]; cin >> ch[i];}
    	for(int i=0;i<4;i++)  //冒!泡!排!序!. o 0 O 〇 ⚪
    		for(int j=0;j<5-i-1;j++){
    			if(strlen(ch[j])>strlen(ch[j+1]))
    			{char *temp=ch[j];ch[j]=ch[j+1];ch[j+1]=temp;}}
    	for(int i=0;i<5;i++)cout << ch[i] << " ";
    	cout << endl << "concatenate string:";
    	for(int i=0;i<5;i++){
    		if(strlen(ch[i])<3)cout << " ";
    		else cout << ch[i][2];
    		delete ch[i];}}
    

    数组指针(也称行指针)

    定义int (*p)[n];
    ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也就是说执行p+1时,p要跨过n个整型数据的长度。如要将二维数组赋给一指针:
    int a[3][4];int (*p)[4];p=a;p++;
    该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
    所以数组指针也称指向一维数组的指针,亦称行指针。

    指针数组

    定义 int *p[n];
    []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。此数组每一个元素都是一个指针。
    如要将二维数组赋给一指针数组:
    int *p[3];int a[3][4];p++;for(i=0;i<3;i++)p[i]=a[i];
    这里int *p[3]表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]所以要分别赋值。其实写作int* p[3]更好,便于理解。

    构造函数调用顺序

    #include <iostream>
    using namespace std;
    class B1{ //基类B1,构造函数有参数
          int b1;
          public:B1(int i) {b1=i;cout<<"constructing B1 "<<b1<<endl;}};
    class B2{ //基类B2,构造函数有参数
          int b2;
          public:B2(int j) {b2=j;cout<<"constructing B2 "<<b2<<endl;   }};
    class B3{ //基类B3,构造函数无参数
          public:B3(){cout<<"constructing B3 *"<<endl;}};
    class C: public B2, public B1, public B3 {
          public:	//派生类的公有成员
          C(int a, int b, int c, int d): B1(a),memberB2(d),memberB1(c),B2(b)
                                          {cout<<"constructing C"<<endl;}
          private: //派生类的私有对象成员
          B1 memberB1; B2 memberB2; B3 memberB3;};
    int main(){C obj(1,2,3,4);}
    
    1. 先继承基类按声明顺序
    2. 再自己的private中声明顺序
    3. 最后声明{}中的输出
  • 相关阅读:
    BOM
    no response from Graphic Screen Painter Exiting
    Windows Mobile 中模拟按键
    C# 获取汉字拼音首字母
    Web Service介绍
    .net/c#中栈和堆的区别及代码在栈和堆中的执行流程详解
    使用JSON加速AJAX(By Sean Kelly)
    Sql字符串操作函数
    一个简单AJAX注册示例
    .Net平台开发的技术规范与实践精华总结
  • 原文地址:https://www.cnblogs.com/hujunyao37201/p/14170711.html
Copyright © 2011-2022 走看看