C++学习笔记(1):基础入门篇

C++基础部分

  • 本文为视频学习笔记
  • 学习的视频为B站上**黑马程序员-**的视频黑马程序员匠心之作|C++教程从0到1入门编程,学习编程不再难
  • 该视频链接为https://www.bilibili.com/video/av41559729/?p=84,推荐前往学习;
  • 侵删;

1 C++入门

1.1 注释

  • 单行注释: // 后面的内容
  • 多行注释:“/* */”包裹的内容

1.2 变量

  • 使用十六进制地址表示变量内容放入内存的位置

  • 变量的存在是为了方便管理内存空间

  • 变量创建:

    //数据类型 变量名 = 变量初始值;
    int a = 10;
    

1.3 常量

  • 作用:记录程序中不可更改的数据

  • 定义常量:

    • 宏常量: #define,通常在文件上方定义

      //#define 常量名 常量值
      #define Day 7
      
    • const修饰的变量:在变量前加关键字const,修饰该变量为常量,不可修改,可在函数内定义

      //const 数据类型 变量名=常量值
      const int weekday =2
      
  • 关键字

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IhGBOmTP-1583504234957)(C:\Users\WangWeikai\AppData\Roaming\Typora\typora-user-images\image-20200229215957721.png)]

  • 标识符命名

    • 不能是关键字
    • 只能由字母、数字、下划线组成
    • 首字母只能是下划线或是字母
    • 区分大小写
  • 命名要求:

    • 见名知义

1.4 数据类型

  • 数据类型的作用是给变量分配合适的内存空间

  • sizeof关键字:统计数据类型所占内存的大小;语法: sizeof(数据类型/变量)

  • 转义字符

    \n换行
    \\反斜杠   \t制表符    
    
1.4.1 整型
  • 整型的类型: short(2 Bytes) ;int(4);long(windows:4,Linux:4或8);long long(8)
1.4.2 浮点型
  • float 单精度 4字节 7位有效数字;double 双精度 8 字节 16~16位有效数字

  • 默认情况下,输出一个小数会只显示出6位有效数字

    float num1=2.345f;//一般在数字后面加上f表示是float类型的小数    
    
  • 科学计数法:

    float f2=3e2;//3*10^2
    float f2=3e-2;//3*10^(-2)
    
1.4.3 字符型
  • 用于显示单个字符,1字节,将对应ASCII码放入存储单元
  • 语法: char ch=‘s’;//单引号,内括一个字符,
  • a-97;A-65
1.4.4 字符串型
  • 用于显示字符串

  • 语法:

    char str[]="shdg";//增加了[]和“”包含多个字符
    //C++风格,需包含String的头文件
    String ="sdhhdh";
    
1.4.5 布尔型bool
  • 只有两个值:true false

  • 一个字节

  • bool s_bool=true;
    cout<

1.5数据输入

  • 关键词:cin

  • cin>>变量;//变量需要提前定义
    

1.6 运算符

  • 整数与整数相除结果为整数;两数相除只要其中一个为浮点型,结果就为浮点型;

  • %取模(取余)运算;两个小数不可以做取模运算;两者必须有一个整数;

  • ++a与a++的区别:++a是先进行加1计算再进行其他运算,a++是先运算后加1

  • +=;-+;*=;/=;%=;相当于a=a+2的形式

  • 比较运算符:==;!=;<;>;<=;>=

  • 逻辑运算符:根据表达式的值返回真值或假值

    !非;&&与;||或

1.7 程序流程结构

1.7.1 if语句
  • 单行格式

    if(条件语句){语句}
    
  • 多行格式

    if (条件语句){
        语句1
    }
    else{
        语句2
    }
    
  • 多条件if语句

    if(条件1){
        语句1
    }else if(条件2){
        语句2
    }else{
        语句3
    }嵌套if 语句:在if语句中,嵌套if语句
    
1.7.2 三目运算符: 判断? 表达式1:表达式2;
c=(a>b? a:b);
//返回的是变量可以继续赋值
(a>b? a:b)=10;
1.7.3 switch语句:
switch(表达式)
{
        case 结果1:执行语句;
            break;//不使用break则继续往下执行
        case 结果2:执行语句;
            break;
        ...
        default:执行语句;
            break;
}
1.7.4 while循环语句
while (循环条件){
    循环语句;
}//只要循环条件为真,就执行循环语句
do {
    循环语句
}while(条件)//先执行后判断
1.7.5 案例1:猜数游戏
#include
#include 
using namespace std;
int main() {
	//添加随机数种子,利用系统时间生成随机数,放置每次随机数都一样
	srand((unsigned int)time(NULL));
	//1、生成随机数
	int num = rand() % 100 + 1//生成0~99的随机数
	//2、玩家进行猜测
		int val = 0;
	cout << "请输入猜测数值:" << endl;
	cin >> val;
	//3、判断玩家的猜测
	if (val > num) {
		cout << "猜测数值过大" << endl;
	}
	else if (val < num) {
		cout << "猜测的数值过小" << endl;
	}
	else
	{
		cout << "恭喜你猜对了" << endl;
		break;
	}
	system("pause");
}
1.7.6 案例2:水仙花数
#include
using namespace std;
int main() {
	int num = 100;
	do {
		int a = 0;//个位
		int b = 0;//十位
		int c = 0;//百位
		a = num % 10;//获取个位
		b = num / 10 % 10;
		c = num / 100;
		if (a*a*a+b*b*b+c*c*c==num)
		{
			cout << num << endl;
		}	
		num++;
	} while (num < 1000);
	system("pause");
	return 0;
}

1.7.7 for循环语句

  • for (int i=0;i<10;i++){//起始条件;条件表达式;末尾循环体
    循环语句;
    }
    //循环条件内分号必须写,分号之间内容可以不写
    
  • continue:在循环语句中,跳过未完成的循环语句,执行下一个循环

1.8 数组

  • 数组:存放相同类型数据元素的集合

  • 特点:1、每个数据元素的类型相同;2、由连续的内存位置组成

  • 定义方式:

    //1、数据类型 数组名[数组长度];
    //2、数据类型 数组名[数组长度]={值1,值2,值3,...};
    //3、数据类型 数组名[]={值1,值2,...};
    
  • 一维数组名称的用途:1、可以统计整个内存中的长度 :sizeof(arr);2、获取数组在内存中的首地址

    int arr[5]={1,2,3,45,5};
    cout<<"元素个数:"<
  • 冒泡排序:

    • 比较相邻的元素,如果第一个大于第二个,就交换他们俩;
    • 对每一对相邻的元素做相同的工作,执行完毕找到第一个最大值;
    • 重复以上步骤,每次比较次数-1,直到不需要比较
#include 
using namespace std;
int main() {
	int arr[8] = {3,31,9,12,5,4,6,10 };
	int len_s = sizeof(arr) / sizeof(arr[0]);
	int len = len_s;
	int tempo;
	for (int i = 0; i <= (len_s - 1); i++) {
		cout << i << "	" << arr[i] << endl;
	}
	for (int i = 0; i <= (len - 1); i++) {
		tempo = arr[i];
		if (i < len-1) {
			arr[i] = arr[len-1];
			arr[len-1] = tempo;
			len--;
		}
	}
	for (int i = 0; i <= (len_s - 1); i++) {
		cout<= 1; j--) {
		for (int i = 0; i < j; i++) {
			tempo = arr[i];
			if (arr[i + 1] < arr[i]) {
				arr[i] = arr[i + 1];
				arr[i + 1] = tempo;
			}
	}
	}
	for (int i = 0; i <= (len_s - 1); i++) {
		cout << i << "	" << arr[i] << endl;
	}
	system("pause");
	return 0;
}
  • 二维数组

    • 定义:

      // 数据类型 数组名[行数][列数]
      int arr[2][3];
      //数据类型 数组名[行数][列数]={{数据1,数据2},{数据3,数据4}...};
      int arr1[2][3]={{1,2,3},{2,3,4}};
      //数据类型 数组名[行数][列数]={数据1,数据2,数据3,数据4...};自动区分
      int arr2[2][3]={1,2,3,2,3,4};
      //数据类型 数组名[][列数]={数据1,数据2,数据3,数据4...};自动区分,不能只写行不写列
      int arr3[][3]={1,2,3,2,3,4};
      
    • 二维数组数组名:

      • 查看所占用的内存空间;

        空间大小:sizeof()

      • 获取二维数组的首地址;arr–数组首地址;arr[0]–每行的首地址;

1.9 函数

  • 作用:将一段经常使用的代码封装起来。减少代码重复量;

  • 函数的定义:

    • 返回值类型
    • 函数名
    • 参数列表
    • 函数体语句
    • return 表达式
    返回值类型 函数名 (参数列表){
        函数体语句;
        return 表达式;
    }        
    
  • 函数的调用

    函数名(参数1,参数2);
    
  • 参数传递(无指针时):形参,实参

    • 当调用函数的形参改变,实参并不会改变,传递的是值不是地址
    • 函数里的形参与实参的地址不同,不会互相影响
  • 函数的常见样式

    • 无参无返
    • 有参无返
    • 无参有返
    • 有参有返
  • 函数声明可以多次,但是定义只有一次

    • 定义函数在main函数之后,需要在main函数前先声明

    • 声明:

      返回值类型 函数名(参数列表);
      
  • 函数的分文件编写:让代码结构更加清晰

    • 四个步骤:
      • 1 创建后缀为.h的头文件
      • 2 创建后缀名为.cpp的源文件
      • 3 在头文件中写函数的声明
      • 4 在源文件中写函数的定义

1.10 指针

  • //1、定义指针
    	int a = 10;
    	//指针定义语法:数据类型 *指针变量名;
    	int* p;
    	//让指针记录变量a的地址
    	p = &a;
    	cout << "a的地址为:" << &a << endl;
    	cout << "指针p为:" << p << endl;
    	//使用指针
    	//指针前面加*代表解引用,找到指针指向的内存中的数据
    	*p = 1000;
    	cout << "a= " <const int* p;//常量指针
    //指针的指向可以修改但是指针的值不可以修改
    int b = 30;
    const int* p=&b;//常量指针
    //指针的指向可以修改但是指针的值不可以修改
    int a=20;
    p = &a;//不可以对*p进行赋值
    
  • const修饰常量 --指针常量

    int* const p1 = &b;//指针常量
    //指针的指向不可以改,指针指向的值可以改
    *p1 = 20;
    //p1=&a;错误
    
  • const既修饰指针,又修饰常量

  • const int* const p = &b;
    //指针指向的值和指向都不可以修改
    
  • 指针作为函数的参数

    int func1(int* a,int * b){
        ...
            return 0;
    }
    int main(){
        int a=23;
        int b=28;
        func1(&a,&b);//地址传递,实参数值改变
        return 0;
    }
    

    1.11 结构体

    • 属于用户自定义的数据类型,允许用户存储不同类型的数据类型;

    • 语法:

      struct 结构体名{结构体成员列表};
      
    • 通过结构体创建变量的方式:

      • struct结构体名 变量名
      • struct结构体名 变量名 ={成员1值,成员2值}
      • 定义结构体时顺便创建变量
    • 结构体数组

      • 作用:将自定义的结构体放入数组中方便维护

      • 语法:

        struct 结构体名 数组名[元素个数] ={{},{},{}}
        struct Student {
        	//成员列表
        	//姓名
        	string name;
        	//年龄
        	int age;
        	//分数
        	int score;
        };
        void jgtsz() {
        	//创建结构体数组
        	struct Student stuArray[8] =
        	{
        	{"张三",18,90},
        	{"李四",19,80},
        	{"王五",21,99},
        	};
        	//给结构体数组中元素赋值
        	stuArray[2].name = "赵六";
        	stuArray[2].age = 19;
        	stuArray[2].score = 100;
        	//遍历结构体数组
        	for (int i = 0; i < 3; i++) {
        		cout << "姓名:" << stuArray[i].name
        			<< "年龄: " << stuArray[i].age
        			<< "分数: " << stuArray[i].score << endl;
        	}
        
        }
        
    • 结构体指针

      //创建学生结构体变量
      	Student s = { "张三",18,90 };
      	//通过指针指向结构体变量
      	Student* p = &s;
      	//通过指针访问结构体变量中的数据
      	cout << " 姓名:" << p->name<<" 年龄: " 
      		<< p->age <<" 分数: "<< p->score << endl;
      
    • 结构体嵌套结构体

      //定义结构体
      struct Student {
      	//成员列表
      	//姓名
      	string name;
      	//年龄
      	int age;
      	//分数
      	int score;
      };
      //嵌套结构体
      struct teacher {
      	int id;
      	string name;
      	int age;
      	struct Student stu;//辅导的学生,使用已经定义好的结构体
      
      };
      //结构图嵌套
      	teacher t;
      	t.id = 100000;
      	t.name = "老张";
      	t.age = 50;
      	t.stu.name = "小王";//嵌套结构体的属性
      	t.stu.age = 20;
      	t.stu.score = 60;
      	cout << "老师姓名: " << t.name << " 老师编号: " << t.id << " 老师年龄: "
      		<< t.age << " 老师辅导学生的姓名: " << t.stu.name << " 学生年龄: "
      		<< t.stu.age << " 学生的考试成绩: " << t.stu.score << endl;
      
      
    • 结构体做函数参数

      void printStudent(struct Student s) {
      	cout << "子函数 姓名" << s.name << " 年龄 " << s.age << " 分数"
      		<< s.score << endl;
      }
      //地址传递
      void printStudent1(struct Student* s) {
      	//地址传递在函数体内修改结构体实参会发生改变
          //将函数中的形参改为指针,可以减少内存空间且不会赋值新的副本出来
      	cout << "子函数 姓名" << s->name << " 年龄 " << s->age << " 分数"
      		<< s->score << endl;
      }
      //创建学生结构体变量
      Student s = { "张三",18,90 };
      printStudent(s);
      printStudent1(&s);
      
      
    • 结构体内使用const使用结构

      void printStudent1(const struct Student* s) {
          //一旦有修改的操作就会报错
      	cout << "子函数 姓名" << s->name << " 年龄 " << s->age << " 分数"
      		<< s->score << endl;
      }
      
    • 结构体案例

      #include 
      #include
      using namespace std;
      struct student {
      	string sname;
      	int age;
      	int score;
      };
      struct teacher {
      	string name;
      	//学生数组
      	struct student stu[5];
      };
      void allocateSpace(struct teacher tArray[], int len) {
      	string nameSeed = "ABCDE";
      	//给老师赋值
      	for (int i = 0; i < len; i++) {
      		tArray[i].name = "Teacher_" ;
      		tArray[i].name += nameSeed[i];
      		//通过循环给每名老师所带的学生赋值
      		for (int j = 0; j < 5; j++) {
      			tArray[i].stu[j].sname = "student_" ;
      			tArray[i].stu[j].sname +=nameSeed[j];
      			tArray[i].stu[j].age = 19;
      			tArray[i].stu[j].score = 100;
      		}
      
      	}
      }
      //打印所有信息
      void printInfo(struct teacher tArray[], int len) {
      	for (int i = 0; i < len; i++) {
      		cout << "\t老师姓名: " << tArray[i].name << endl;
      		for (int j = 0; j < 5; j++) {
      			cout << "  学生姓名: " << tArray[i].stu[j].sname << endl;
      			cout << "  学生成绩: " << tArray[i].stu[j].score << endl;
      		}
      	}
      }
      int main() {
      	//创建3名老师的数组
      	struct teacher tArray[3];
      	//通过函数给3名老师的信息赋值,并给老师带的学生信息赋值
      	int len = sizeof(tArray) / sizeof(tArray[0]);
      	allocateSpace(tArray, len);
      	//打印所有信息
      	printInfo(tArray, len);
      	system("pause");
      	return 0;
      }
      
    • 案例:通讯录管理系统

      #include
      #include
      using namespace std;
      //联系人结构体
      struct person {
      	string name;//姓名
      	string  m_sex;//性别
      	int m_age;//年龄
      	string m_phone;//电话号码
      	string m_add;//地址
      };
      //通讯录地址
      struct Addressbooks {
      	//通讯录中保存的联系人数组
      	person personArray[100];
      	//通讯录中当前记录联系人个数
      	int m_size = 0;
      };
      void showMenu() {
      	//显示菜单信息
      	cout << "***********************" << endl;
      	cout << "*****1、添加联系人*****" << endl;
      	cout << "*****2、显示联系人*****" << endl;
      	cout << "*****3、删除联系人*****" << endl;
      	cout << "*****4、查找联系人*****" << endl;
      	cout << "*****5、修改联系人*****" << endl;
      	cout << "*****6、清空联系人*****" << endl;
      	cout << "*****0、退出通讯录*****" << endl;
      	cout << "***********************" << endl;
      }
      //1 添加联系人
      void addPeerson(Addressbooks* abs)
      {
      	//判断通讯录是否满了。如果满了就不再添加
      	if (abs->m_size == 100) {
      		cout << "通讯录已满。无法添加!" << endl;
      		return;
      	}
      	else {
      		//添加具体的联系人
      		//姓名
      		string name;
      		cout << "请输入姓名: " << endl;
      		cin >> name;
      		abs->personArray[abs->m_size].name = name;
      		//性别
      		string sex;
      		cout << "请输入性别(man or woman): " << endl;
      		cin >> sex;
      		abs->personArray[abs->m_size].m_sex = sex;
      		//年龄
      		int age;
      		cout << "请输入年龄: " << endl;
      		cin >> age;
      		abs->personArray[abs->m_size].m_age = age;
      		//电话号码
      		string pN;
      		cout << "请输入电话号码: " << endl;
      		cin >> pN;
      		abs->personArray[abs->m_size].m_phone = pN;
      		//地址
      		string addr;
      		cout << "请输入地址: " << endl;
      		cin >> addr;
      		abs->personArray[abs->m_size].m_add = addr;
      		abs->m_size++;
      		cout << "添加成功!" << endl;
      		system("pause");//按任意键继续
      		system("cls");
      	}
      
      }
      //2 显示联系人
      void showPerson(Addressbooks* abs) {
      	//判断通讯录中人数是否为0,如果为0,提示记录为空
      	//如果不为0,显示记录的联系人信息
      	if (abs->m_size==0){
      		cout << "当前记录为空" << endl;
      	}
      	else {
      		for (int i = 0; i < abs->m_size; i++) {
      			cout << "姓名: " << abs->personArray[i].name << " 性别: "
      				<< abs->personArray[i].m_sex << " 年龄: "
      				<< abs->personArray[i].m_age << " 电话号码: "
      				<< abs->personArray[i].m_phone << " 地址: "
      				<< abs->personArray[i].m_add << endl;
      		}
      	}
      	system("pause");
      	system("cls");
      }
      //删除联系人
      //检测联系人是否存在,如果存在,返回联系人所在数组的具体位置,不存在返回-1
      //传递的参数 通讯录,对比的姓名
      int isExist(Addressbooks* abs, string name) {
      	for (int i = 0; i < abs->m_size; i++) {
      		//找到用户输入的姓名
      		if (abs->personArray[i].name==name)
      		{
      			return i;//找到了返回联系人在数组中的位置
      		}
      	}
      	return -1;
      }
      //3 删除指定联系人
      void deletePerson(Addressbooks* abs)
      {
      	cout<<"请输入您要删除的联系人"<> name;
      	int ret =isExist(abs, name);
      	//ret=-1未查到
      	//ret!=-1查到了
      	if (ret != -1) {
      		//查到此人,要进行删除操作
      		for (int i = ret; i < abs->m_size; i++) {
      			//数据前移
      			abs->personArray[i] = abs->personArray[i + 1];
      
      		}
      		abs->m_size--;//更新通讯录中的人员数
      		cout << "删除成功!" << endl;
      	}
      	system("pause");
      	system("cls");
      }
      //查找联系人
      void findPerson(Addressbooks* abs) {
      	string pname;
      	cout<< "请输入您要查找的联系人: " << endl;
      	cin >> pname;
      	//判断指定的联系人是否存在通讯录中
      	int ret = isExist(abs, pname);
      	if (ret != -1) {//找到联系人
      		cout << "姓名: " << abs->personArray[ret].name << "\t";
      		cout << "性别: " << abs->personArray[ret].m_sex << "\t";
      		cout << "年龄: " << abs->personArray[ret].m_age << "\t";
      		cout << "电话: " << abs->personArray[ret].m_phone << "\t";
      		cout << "住址: " << abs->personArray[ret].m_add << "\t";
      	}
      	else //未找到联系人
      	{
      		cout << "查无此人" << endl;
      	}
      	system("pause");
      	system("cls"); 
      }
      //5 修改联系人
      void modifyPerson(Addressbooks* abs)
      {
      	cout << "请输入您要修改的联系人:" << endl;
      	string name;
      	cin >> name;
      	int ret =isExist(abs,name);
      	if (ret != -1)//找到指定联系人
      	{
      		cout << "姓名: " << abs->personArray[ret].name << "\t";
      		cout << "性别: " << abs->personArray[ret].m_sex << "\t";
      		cout << "年龄: " << abs->personArray[ret].m_age << "\t";
      		cout << "电话: " << abs->personArray[ret].m_phone << "\t";
      		cout << "住址: " << abs->personArray[ret].m_add << "\t" << endl;
      		cout << "请输入您要修改的选项的代码:\n name--1 /sex--2 /age--3 /phone--4 /address--5/all--6 " << endl;
      		int option;
      		cin >> option;
      		switch (option)
      		{
      		case 1:
      			//姓名
      			cout << "请输入姓名" << endl;
      			cin >> abs->personArray[ret].name;
      			break;
      		case 2:
      			//性别
      			cout << "请输入性别" << endl;
      			cin >> abs->personArray[ret].m_sex;
      			break;
      		case 3:
      			//年龄
      			cout << "请输入年龄" << endl;
      			cin >> abs->personArray[ret].m_age;
      			break;
      		case 4:
      			//电话号码
      			cout << "请输入电话号码" << endl;
      			cin >> abs->personArray[ret].m_phone;
      			break;
      		case 5:
      			//地址
      			cout << "请输入地址" << endl;
      			cin >> abs->personArray[ret].m_add;
      			break;
      		case 6:
      			//所有内容
      			//姓名
      			cout << "请输入姓名" << endl;
      			cin >> abs->personArray[ret].name;
      			//性别
      			cout << "请输入性别" << endl;
      			cin >> abs->personArray[ret].m_sex;
      			//年龄
      			cout << "请输入年龄" << endl;
      			cin >> abs->personArray[ret].m_age;
      			//电话号码
      			cout << "请输入电话号码" << endl;
      			cin >> abs->personArray[ret].m_phone;
      			//地址
      			cout << "请输入地址" << endl;
      			cin >> abs->personArray[ret].m_add;
      			break;
      		default:
      			cout << "输入的代码无效" << endl;
      			break;
      		}
      		
      	}
      	else {
      		cout<<"查无此人"<m_size = 0;
      	cout<<"通讯录已清空"<> select;
      		switch (select)
      		{
      		case 1://1、添加联系人
      			addPeerson(&abs);
      			break;
      		case 2://2、显示联系人
      			showPerson(&abs);
      			break;
      		case 3://3、删除联系人
      			deletePerson(&abs);
      			cout << "请输入删除联系人的姓名:" << endl;		
      			break;
      		case 4://4、查找联系人
      			findPerson(&abs);
      			break;
      		case 5://5、修改联系人
      			modifyPerson(&abs);
      			break;
      		case 6://6、清空联系人
      			cleanPerson(&abs);
      			break;
      		case 0://0、退出通讯录
      			cout << "**欢迎下次使用!**" << endl;
      			system("pause");
      			return 0;
      			break;
      		default:
      			break;
      		}
      	}
      }
      
      
  • 你可能感兴趣的:(学习,c++,编程语言)