慕课网: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)

原文地址:https://www.cnblogs.com/leezx/p/5682009.html