概述
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:UsersWangWeikaiAppDataRoamingTyporatypora-user-imagesimage-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<<s_bool<<endl;//输出为1
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<iostream>
#include <ctime>
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<iostream>
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<<"元素个数:"<<sizeof(arr)/sizeof(arr[0])<<endl;//获取元素个数 cout<<"数组首地址为:"<<int(arr)<<endl; cout<<"数组首元素地址为:"<<&(arr[0])<<endl;
-
冒泡排序:
- 比较相邻的元素,如果第一个大于第二个,就交换他们俩;
- 对每一对相邻的元素做相同的工作,执行完毕找到第一个最大值;
- 重复以上步骤,每次比较次数-1,直到不需要比较
#include <iostream>
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<<i <<" "<< arr[i] << endl;
}
for (int j = (len_s - 1); j >= 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= " <<a<< endl; cout << "*p= " << *p << endl;
-
指针所占内存空间:32位系统占4字节,64位系统占8字节;
-
空指针:指针白能量指向内存中编号为0的空间
- 用途:初始化指针变量
- 注意:空指针指向的内存是不可以访问的
- 野指针:指向非法的内存空间
-
const修饰指针
-
三种情况:
-
const修饰指针–常量指针
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 <iostream> #include<string> 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<iostream> #include<string> 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<<"请输入您要删除的联系人"<<endl; string name; cin >> 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<<"查无此人"<<endl; } system("pause"); system("cls"); } //清空联系人 void cleanPerson(Addressbooks* abs) { abs->m_size = 0; cout<<"通讯录已清空"<<endl; system("pause"); system("cls"); } int main() { //创建通讯录结构体变量 Addressbooks abs; //初始化通讯录中当前人员个数 abs.m_size = 0; while (true) { showMenu(); int select = 0; cin >> 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++学习笔记(1):基础入门篇的全部内容,希望文章能够帮你解决C++学习笔记(1):基础入门篇所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复