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. 最后声明{}中的输出
posted @ 2020-12-21 23:12  胡椒椒椒(弃用勿联系)  阅读(454)  评论(0编辑  收藏  举报