慕课网:C++ & 数据结构

时间:2023-07-14 23:19:42
慕课网:C++ & 数据结构

课程链接:james_yuan的课程

这部分太枯燥了,如果教材难度稍大,根本就学不下去,所以就先看看通俗的视频吧。

课程目录


1.C++远征之起航篇 - C++亮点尽在其中

2.C++远征之离港篇 - C++扫清通往面向对象的最后一道障碍

3.C++远征之封装篇(上) - 封装--面向对象的基石。

4.C++远征之封装篇(下)- 封装--面向对象三大特征之一

5.C++远征之继承篇 - 继承,面向对象三大特征之一

6.C++远征之多态篇 - 多态,C++的精华所在。

7.C++远征之模板篇 - 模板,站在巨人的肩膀上。

 

1.数据结构探险—队列篇 - 与现实最为贴近的数据结构-队列。

2.数据结构探险—栈篇 - 栈,先入后出(FILO)

3.数据结构探险之线性表篇 - 线性表的主体顺序表和链表

4.数据结构探险之树篇 - 树,将为你开启更精彩的数据结构大门

 

C++远征之起航篇


第1章 C++简介

    1-1 C++简介 (03:05)

贝尔实验室;C++之父;计算机语言排行:Java、C、object-C、C++、C#、PHP、Basic、Python

    1-2 练习

第2章 C++ IDE环境搭建

    2-1 C++ IDE环境搭建 (07:19)

IDE(编辑器、编译器、调试器、图形用户工具);visual studio 2013和visual assist X for visual studio

IDE使用:新建项目;新建文件;设置字体、字号;

新建项目--win32--win32控制台程序--空项目--右键源文件--新建C++文件

工具--选项--字体和颜色--16号--黑体

第3章 C++之初体验

    3-1 C++之初体验

第4章 C++语言新特性

    4-1 C++的新特性 (05:47)

新的数据类型;新的初始化方法;随用随定义

C语言中的数据类型:基本类型(int、char、float、double);构造类型(数组、struct、union、enum);指针;空类型void;

C++新增的bool(true、false)

C语言只有一种初始化方法(int x = 1024);C++中增加了直接初始化(int x(1024));

C语言必须在函数体开头定义所有变量

    4-2 练习
    4-3 C++的输入输出方式 (05:09)

C语言的输入输出:输入(输入设备--输入流--scanf--变量);输出(变量--printf--输出流--输出设备)

C++:用cin和cout代替相应的函数;好处:不关注占位符;不关注数据类型;不易出错;

    4-4 练习
    4-5 C++新特性以及输入输出演示 (06:54)

#include<iostream>
#include<stdlib.h>
using namespace std;
//提示用户输入整数;然后分别以8、10、16进制输出
//提示输入一个布尔值,以布尔形式输出
int main()
{ int x(0);
cout << "请输入一个整数:" << endl;
cin >> x;
cout << oct << x << endl << dec << x << endl << hex << x << endl; cout << "请输入一个布尔值:" << endl;
bool y = false;
cin >> y;
cout << boolalpha << y << endl;
return 0;
}

    4-6 C++之namespace (05:02)

命名空间就是为程序划片取名字;解决了命名冲突的问题;同时使用不同团队开发的程序

namespace定义命名空间;本程序内的所有变量和函数都在这个命名空间之内;

我错了,在一个文件内部也可以有多个命名空间,使用namespace就可以定义;类似于代码块的标记;

namespace A
{
int x = 0;
void f1();
void f2();
}
cout << A::x << endl;

    4-7 练习

    4-8 namespace演示 (10:09)

#include<stdlib.h>
#include<iostream>
using namespace std; namespace A
{
int x = 1;
void func()
{
cout << "A" << endl;
}
} namespace B
{
int x = 2;
void func()
{
cout << "B" << endl;
}
void func2()
{
cout << "BB" << endl;
}
} using namespace B;
int main()
{
cout << A::x << endl;
B::func();
func2();
system("pause");
return 0;
}

    4-9 章节练习

第5章 综合练习

    5-1 综合练习 (12:09)

//知识点:bool 命名空间 输入输出
//使用一个函数找出整型数组中的最大值和最小值
#include<stdlib.h>
#include<iostream>
using namespace std; namespace CompA
{
int getMaxOrMin(int *arr, int count, bool isMax)
{
int temp = arr[0];
for (int i = 1; i < count; i++)
{
if (isMax)
{
if (temp < arr[i])
{
temp = arr[i];
}
}
else
{
if (temp > arr[i])
{
temp = arr[i];
}
}
}
return temp;
}
} int main(void)
{
int arr1[4] = { 3, 5, 1, 7 };
bool isMax = true;
cout << CompA::getMaxOrMin(arr1, 4, isMax) << endl;
system("pause");
return 0;
}

 

C++远征之离港篇

第1章 离港总动员

    1-1 离港总动员 (02:11)

面向对象:抽象、封装、继承、多态;

指针 VS 引用;#define VS const;函数默认值 & 函数重载;

内存管理;堆;出来混迟早是要还的;

第2章 C++语言引用

    2-1 引用 (08:12)

外号、别名;不能只有别名;基本数据类型的引用;引用在定义时,创建并初始化(必须在创建时初始化);

int &b = a;

结构体类型的引用;

typedef struct
{
int x;
int y;
}Coor; int main()
{
Coor c1;
Coor &c = c1;
}

指针类型的引用(难点): 格式:类型 *& 指针引用名 = 指针;

int a = 10;
int *p = &a;
int *&q = p;

引用作函数参数:

//使用指针交换两个数
void fun(int *a, int *b)
{
int tmp = *a; *a = *b; *b = c;
}
int x = 10, y = 20;
fun(&x, &y);
//使用引用交换两个数
void fun(int &a, int &b)
{
int tmp = a; a = b; b = tmp;
}
int x = 10, y = 20;
fun(x, y);

    2-2 引用代码演示 (06:59)

#include<iostream>
using namespace std;
int main()
{
int a = 0;
int &b = a;
b = 10;
cout << a << endl;
a = 20;
cout << b << endl;
return 0;
}
#include<iostream>
using namespace std; typedef struct
{
int x;
int y;
}Xin; int main()
{
Xin xin;
Xin &a = xin;
a.x = 10;
a.y = 20;
cout << xin.x << " " << xin.y << endl;
return 0;
}
#include<iostream>
using namespace std;
int main()
{
int a = 0;
int *p = &a;
int *&q = p;
*q = 10;
cout << a << endl;
return 0;
}
#include<iostream>
using namespace std;
void func(int &a, int &b); int main()
{
int x(10), y(20);
cout << "Before: x = " << x << ", y = " << y << endl;
func(x, y);
cout << "After: x = " << x << ", y = " << y << endl;
return 0;
} void func(int &a, int &b)
{
int tmp = a; a = b; b = tmp;
}

    2-3 练习

    2-4 单元巩固

第3章 C++语言const关键字

    3-1 const (08:39)

const与基本数据类型;

const int x = 3;

const与指针类型; (规则很简单:const了谁,谁就不能改变了)

const int *p = NULL;
int const *p = NULL;
int *const p = NULL;
const int * const p = NULL;
int const * const p = NULL;

const与引用

int x = 3;
const int &y = x;
x = 10;//right
y = 20;//wrong
//examples
const int x = 3; x = 5; //wrong
int x = 3; const int y = x; y = 5; //wrong
int x = 3; const int *y = &x; *y = 5;//wrong
//examples
int x = 3, z = 4; int * const y = &x; y = &z; //wrong
const int x = 3; const int &y = x; y = 5;//wrong
const int x = 3; int *y = &x; //wrong
int x = 3; const int *y = &x; //right

    3-2 const代码演示 (10:05)

const int x = 3;
x = 5;//wrong
#define X 3 //C的形式,不建议使用,因为不会检查错误
int const *p = &x;
const int *p = &x;
*p = 5;//wrong
x = 5;//right **
int x = 3;
int y = 5;
int *const p = &x;//p can't change
p = &y;//wrong
*p = 10;//right
int const &z = x;
z = 10;//wrong
void func(const int &a, const int &b)
{
//can't change a and b
}

    3-3 练习

指针指向const修饰的变量时,应该是const int const *p = &a;

      3-4 单元巩固

第4章 C++函数新亮点

    4-1 函数特性 (11:32)

函数参数的默认值; (声明的时候必须写上参数默认值; 定义的时候则不用写); 没有实参时就使用默认值

//有默认参数值的参数必须在参数表的最右端
void func(int i, int j = 5, int k = 10);

函数重载: 在相同作用域下;用同一名字定义多个函数; 不同函数之间的参数个数和参数类型必须不同;

int getMax(int x, int y, int z);
double getMax(double x, double y);
//内部机密:重新生成函数
getMax_int_int_int()
getMax_double_double()

内联函数(inline)(编译时将函数体代码和实参代替函数调用语句,省去了进入和返回的步骤; 节省了大量时间); (编译时代码展开)  

区别于普通函数(调用时,找到入口,执行后,返回);

inline int max(int a, int b, int x);
int main()
{
int m = max(i,j,k);//直接使用
}

    4-2 函数特性代码演示 (07:51)

void func(int i, int j = 20, int k = 10);
void func(int i, int j, int k);
void func(double i, double j, double k);
inline max(int i, int j)

    4-3 练习

    4-4 单元巩固

第5章 C++内存管理

    5-1 内存管理 (06:31)

内存的本质就是资源; 由操作系统控制; 我们需要申请和归还;

内存的申请和释放 new 和 delete 运算符;

int *p = new int;
delete p;
int *arr = new int[10];
delete []arr;
//C
void *malloc(size_t * size);
void free(void *memblock);
//C++
new;
delete;
int *p = new int[1000];
if (NULL == p)
{
//fail
}
delete p;
p = NULL;
delete []p;
p = NULL;
/*
使用new申请内存,使用delete释放内存;
申请内存需要判断是否成功,释放内存需要设空指针;
new与delete配套使用;
*/

    5-2 内存管理代码演示 (04:06)

int *p = new int[20];
cout << *p << endl;

    5-3 练习

    5-4 单元巩固

 

C++远征之封装篇(上)

第1章 课程介绍

    1-1 课程简介 (02:57)

类和对象;

数据成员和成员函数;

构造函数和析构函数;

对象赋值和对象复制;

对象数组和对象指针;

this指针;

面向过程 -》 面向对象

第2章 类与对象初体验

    2-1 类和对象 (04:27)

一个存在的实体就是一个对象;同一类型的对象可以被抽象为一种类;

抽象化类时,我们一般只抽象出自己感兴趣的属性和方法,而不会全部列出(事实上也不存在全部);

封装,就是我们只向用户提供他们需要的东西,其他的都被封装在类里,不能被调用;

封装是通过访问限定符来实现的:public;protected;private;

class Dog
{
char name[20];
int age;
int type; void speak();
void run();
}

    2-2 类对象的定义 (11:56)

1.从栈中实例化(就是让编译器自动申请);2.从堆中实例化(手动申请);

class TV
{
public:
char name[20];
int type; void changeVol();
void power();
}
int main(void)
{
TV tv;
TV tv[20];
return 0;
}
class TV
{
public:
char name[20];
int type; void changeVol();
void power();
}
int main(void)
{
TV *p = new TV();
TV *q = new TV[20];
delete p;
delete []q;
return 0;
}

对象成员的访问;栈(.);堆(->);

数组:p[i]->type;

//zhan
int main(void)
{
TV tv;
tv.type = 0;
tv.changeVol();
return 0;
}
//dui
int main(void)
{
TV *p = new TV();
p->type = 0;
p->changeVol();
delete p;
p = NULL;
return 0;
}
int main(void)
{
TV *p = new TV[5];
for(int i = 0; i < 5; i++)
{
p[i]->type = 0;
p[i]->changeVol();
}
delete []p;
p = NULL;
return 0;
}
#include<iostream>
using namespace std; class Coordinate
{
public:
int x, y;
void printX()
{
cout << x << endl;
}
void printY()
{
cout << y << endl;
}
}; int main(void)
{
Coordinate coor;
coor.x = 10;
coor.y = 20;
coor.printX();
coor.printY(); coordinate *p = new Coordinate();
if(NULL == p)
{
return 0;
}
p->x = 100;
p->y = 200;
p->printX();
p->printY();
delete p;
p = NULL; return 0;
}

    2-3 练习

第3章 初始字符串类型

    3-1 初始String (13:51)

int double char float bool等常用且简单; char[]操作却很繁琐和复杂,需要使用strlen, strcat, strcpy, strcmp, strncpy, strncmp, strstr等字符数组函数来操作;

为此引入字符类:string

#include<iostream>
#include<string>
using namespace std;
int main(void)
{
string name = "lizhixin";
string hobby("football");
cout << name << hobby << endl;
return 0;
}

string的初始化方法:

string s1;
string s2("ABC");
string s3(s2);
string s4(n, 'c');
//other usage
s.empty();
s.size();
s[n];
s1+s2;
s1=s2;
v1 == v2;
v1 != v2;
string s1 = "hello";
string s2("World");
string s3 = s1 + s2;
string s4 = "hello" + s2;
string s5 = "hello" + s2 + "world";
string s6 = "hello" + "world";//wrong
/*
1.提示用户输入姓名;
2.接受用户输入;
3.然后向用户问好,hello XXX;
4.告诉用户名字长度;
5.告诉用户名字首字母;
6.如果用户输入回车,这告诉用户输入为空;
7.如果用户输入的是imooc,告诉用户是管理员;
*/
#include<iostream>
#include<string>
using namespace std; int main(void)
{
string name;
cout << "Please input your name:";
getline(cin, name);
if (name.empty())
{
cout << "input is null..."
return 0;
}
if(name == "imooc")
{
cout << "you are a admin." << endl;
}
cout << "hello " << name << endl;
cout << "your name length: " << name.size() << endl;
cout << "your name's first letter is: " << name[0] << endl;
return 0;
}

    3-2 单元巩固

第4章 属性封装的艺术

    4-1 初始封装 (05:30)

面向对象的基本思想:数据成员需要被封装;只用成员函数操纵数据成员;这样可以防止对数据成员的随意更改;而函数则可以控制;

    4-2 属性封装代码演示 (09:47)

一般讲public写在前面;private写在后面;

class Student
{
public:
void setName(string _name)
{
m_strName = _name;
}
string getName()
{
return m_strName;
}
void setGender(string _gender)
{
m_strGender = _gender;
}
string getGender()
{
return m_strGender;
}
int getScore()
{
return m_intScore;
}
void initSore()
{
m_iScore = 0;
}
void study(int _score)
{
m_iScore += _score;
}
private:
string m_strName;
string m_strGender;
int m_intScore;
} int main(void)
{
Student stu;
stu.initScore();
stu
return 0;
}

    4-3 单元巩固

第5章 精彩的类外定义

    5-1 类外定义 (05:56)

类内定义与内联函数;(类内定义的函数优先编译为内联函数)

类外定义:同文件类外定义;分文件类外定义;(一般都是分文件定义)

class Car
{
public:
void run();
void stop();
void changeSpeed();
};
void Car::run(){}
void Car::stop(){}
void Car::changeSpeed(){}
//Car.h
class Car
{
public:
void run();
void stop();
void changeSpeed();
};
//Car.cpp
#include "Car.h"
void Car::run(){}
void Car::stop(){}
void Car::changeSpeed(){}

    5-2 类外定义代码演示 (11:28)

    5-3 练习

第6章 对象的生离死别

    6-1 构造函数讲解 (08:26)

对象结构:

内存分区:栈区;堆区;全局区;常量区;代码区;

//栈区
int x = 0; int *p = NULL;
//堆区
int *p = new int[20];
//全局区
//常量区
string str = "hello";
//代码区

对象的初始化(对象必须进行初始化):有且仅有一次;根据条件初始化;(这就是构造函数要干的事)

构造函数在对象实例化时被自动调用;

构造函数与类同名;

构造函数可以重载;

在没有定义构造函数时,编译器会自动生成一个构造函数;

    6-2 构造函数代码演示 (09:34)

    6-3 练习

    6-4 构造函数初始化列表 (05:28)

默认构造函数;

构造函数初始化列表;1.先于构造函数执行;2.只能用于构造函数;3.可以同时初始化多个数据成员;

初始化列表的核心作用:

Student():m_strName("Jim"),m_iAge(10){}

    6-5 初始化列表编码 (09:22)

    6-6 练习

    6-7 拷贝构造函数 (05:04)

拷贝构造函数的参数是确定的,不能重载

Student(const Student& stu){}

    6-8 拷贝构造函数代码演示 (03:57)

    6-9 练习

    6-10 析构函数 (05:08)

 

    6-11 析构函数代码演示 (06:09)

    6-12 练习

第7章 课程总结

    7-1 总结 (04:32)

    7-2 综合练习

 

 

数据结构探险—队列篇

第1章 课程简介

    1-1 课程简介 (02:13)

数据结构=数据集合+数据间的关系;都是前人总结出来的模型;站在巨人的肩膀上;

本课程:数据结构的原理;C++实现;

第2章 队列原理

    2-1 队列 (07:37)

先入先出的数学模型(FIFO);排队买票;队头,对尾;

普通队列;要么浪费内存,后来者往后排;要么浪费时间,所有元素前移;

环形队列;课程重点讲解

队列实例:营业厅的排号系统--自动排号机

第3章 队列结构的面向对象设计

    3-1 面向对象的队列设计 (10:43)

第4章 环形队列代码实现

    4-1 环形队列实现上 (12:23)

    4-2 环形队列实现下 (16:52)

    4-3 环形队列检测 (10:18)

第5章 升华与应用

    5-1 队列的实际应用 (14:04)