# C++学习(计蒜客)

### 1. 斐波纳切数列

​Fn表示斐波那契数列的第n项，你能知道斐波那契数列中的任何一项吗？

``````#include <iostream>
using namespace std;
int Fibonacci(int pos);
int main(){
int pos;
cin >> pos;
int value;
value = Fibonacci(pos);
cout << value << endl;
return 0;
}
int Fibonacci(int pos){
if (pos == 0){
return 0;
}else if (pos == 1){
return 1;
}
else{
return Fibonacci(pos - 1) + Fibonacci(pos - 2);
}
}```

###2. 矩阵翻转

``````

# include <iostream>

using namespace std;
int main(){
int row,col,lrud;
cin >> row >> col >> lrud;
int arr[row][col];
//i不能到5
for (int i=0; i<row; i++){
for(int j=0; j<col; j++){
cin >> arr[i][j];
}
}
//左右翻转
if (lrud == 0){
for (int i1=0; i1<row; i1++){
for (int j1=col-1; j1>=0; j1--){
cout << arr[i1][j1] << " ";
}
cout << endl;
}
}else if(lrud == 1){ //上下翻转
for (int i1=row-1; i1>=0; i1--){
for (int j1=0; j1<col; j1++){
cout << arr[i1][j1] << " ";
}
cout << endl;
}
}
}

``````###3. 位操作
``````

# include<iostream>

using namespace std;
int main(){
int a;
cin>>a;
//hex指输出16进制数，oct是八进制数，dec是十进制，bin二进制
cout << hex << a << " " << ~a << endl;
return 0;
}```

### 4. cstdio库

`#include <cstdio>`引入C风格的输入和输出，scanf和printf比cout和cin要高效。

### 5. 指针

``````#include<iostream>
using namespace std;
int main(){
int a = 0, b = 0, *p, *p1, *p2;
cin >> a >> b;
p1 = &a;
p2 = &b;
if (a<b){
p = p1;
p1 = p2;
p2 = p;
}
cout << "a=" << a << ",b=" << b << endl;
cout << "max=" << *p1 << ",min=" << *p2 << endl;
return 0;
}```

``````

# include<iostream>

using namespace std;
void square(int *n){
*n = *n * *n;
}
int main(){
int num = 2;
cout<<"The original number is "<<num<<endl;
square(&num);
cout<<"The new value of number is "<<num<<endl;
return 0;
}```

### 6. 引用

``````#include<iostream>
using namespace std;
void square(int &n){
n = n * n;
}
int main(){
int num = 2;
cout<<"The original number is "<<num<<endl;
square(num);
cout<<"The new value of number is "<<num<<endl;
return 0;
}```
###7. 内存分区

`int *arr = new int[n];` new用于申请堆上空间的运算符，申请空间的最开始位置首地址，用前面声明的指针进行指向，从而可以像用数组一样用指针名使用这块空间。
``````

# include<iostream>

using namespace std;
int main(){
int i,n;
cin>>n;
int *arr= new int[n];

``````//以下代码对一个数组第一位进行了赋值
arr[0]=1;

//以下代码对一个长度为n的数组第二位开始依次做计算，并输出最后一个值结果
for(i=1;i<n;i++){
arr[i]=arr[i-1]+i;
}
cout<<arr[n-1];
//请在下一行释放内存空间
delete []arr;
arr = NULL;
return 0;
``````

}```
new来动态申请分配堆内存

``````int *p;
p = new int;
//或者申请的堆内存中直接包含值
int *p;
p = new int(100);```

``````

int *p;
p = new int[n];```

delete加指针名的形式进行释放，如果指针指向的空间是数组，那么需要在delete后加上[]进行标识。然后将arr指针数组指向NULL，使之成为空指针。

### 8. 链表

``````#include <iostream>
using namespace std;

struct List
{
int num;
List *next;
};

{
//在下面编写插入代码
List *node = NULL;
node = new List;
cin >> node->num;
node -> next = NULL;
List *q, *p;
return ;
}
while(q!=NULL){
if(node->num > q->num){
//大于的话，判断下一个
p = q;
q = q->next;
}else{
break;
}
}
p->next = node;
node->next = q;
}
{
//在下面编写删除代码
int num;
cin >> num;
List *p = NULL, *q = NULL;
if(p->num == num){
delete p;
return;
}
//如果删除的节点不是头节点
q = p->next;
while(q != NULL){
if(q->num == num){
p->next = q->next;
delete q;
return;
}
if(q->num > num){
return;
}
p = q;
q = q->next;
}
return ;
}
List *Create()
{
List *p = NULL;
List *q = NULL;
for ( int i = 0; i < 3; i++ ) {
p = new List;
p->num = i * 2;
if ( head == NULL ) {
}
else {
q->next = p;
}
q = p;
}

if ( head != NULL ) {
q->next = NULL;
}

}

{
while ( head != NULL ) {
if ( head != NULL ) {
cout << "->";
}
}
cout << endl;
}

int main() {
Create();
return 0;
}```
###9. 单链表部分逆置

``````

# include <iostream>

using namespace std;

struct List
{
int num;
List *next;
};

void reverse(int begin, int end, List *&head)
{
//在这个函数中编写你的代码
if(end <= begin || begin < 0 || end > 9){
return;
}
if(begin == 0){
List *qian = p;
List *kai = p;
List *hou = NULL;
p = p->next;
for(int i=1;i<=end;i++){
hou = p;
p = p->next;
//开始转换
hou->next = qian;
qian = hou;
if(i == end){
kai->next = p;
}
}
}else{
//记录begin前面的指针，begin的指针，end处的，end后面的
//算法思想就是将链表指针逆过来
//q 开始的前一个节点指针
List *q = NULL;
//qian 是两个节点进行逆序时第一个节点指针
//kai 是开始位置节点指针
//hou是逆序时候第二个节点指针
List *qian=NULL, *hou=NULL, *kai=NULL;
for(int i=0;i<=end;i++){
if(i == begin - 1){
q = p;
qian = p;
p = p -> next;
}else if (i >= begin){
if (i == begin){
kai = p;
}
hou = p;
p = p->next;
//这里进行两个节点之间的逆序
hou -> next = qian;
qian = hou;
if(i == end){
if(q == NULL){
}else{
//这里处理结束时候与链表其它位置交接的地方
q->next = hou;
kai->next = p;
}
}
}else{
p = p->next;
}
}
}
}

List *Create()
{
List *p = NULL;
List *q = NULL;
for ( int i = 0; i < 10; i++ ) {
p = new List;
p->num = i * 2;
if ( head == NULL ) {
}
else {
q->next = p;
}
q = p;
}

``````if ( head != NULL ) {
q->next = NULL;
}

``````

}

{
while ( head != NULL ) {
if ( head != NULL ) {
cout << "->";
}
}
cout << endl;
}

int main() {
Create();
int begin, end;
cin >> begin >> end;
return 0;
}```

### 10. 单链表是否有环？

n存在四种情形：
①为-1，代表该结点的指针域指向NULL，输入结束；
②指向该结点之前的结点，如第3个结点的指针域指向n = 2的结点；
③指向自己，如第3个结点的指针域指向n = 3的结点；
④指向其直接后继结点，如第3个结点的指针域指向n = 4的结点，不能指向n = 5的结点。

1 2
2 3
3 -1

``````#include <iostream>
#include <vector>
using namespace std;

struct List{
int num;
int flag;
List *next;
};

//建立头指针

int main(){
//建立输入动态数组
vector<int> data;
vector<int> pos;
vector<List *> point;
int m, n;
while(cin >> m >> n){
data.push_back(m);
pos.push_back(n);
}
for(int i=0;i<pos.size();i++){
List *node = NULL;
node = new List;
node->num = data[i];
node->flag = 0;
point.push_back(node);
}
//建立链表
for(int j=0;j<pos.size();j++){
if(pos[j] != -1){
point[j]->next = point[pos[j]-1];
}else{
point[j]->next = NULL;
}
}
//遍历链表
int loop = 0;
List *p;
while(p){
if(p->flag != 1){
cout << p->num << "->";
p->flag = 1;
}else{
loop = 1;
break;
}
p = p->next;
}
cout << endl;
if(loop == 1){
cout << "true" << endl;
}else{
cout << "false" << endl;
}
}```
###11. 面向对象Object Oriented Programming

C++对于类内的成员提供了三种访问权限，public，protected,private表示公有，保护和私有。
- public

- private

- protected

通过对成员访问的控制，信息被封存在了一个可控的地方，可以设定一些安全的途径，获得和修改一些信息，这就是面向对象的一个特性，封装
``````

# include<iostream>

using namespace std;
class Student{
private:
int id;
int age;
public:
int getID(){return id;}
int getAge(){return age;}
//先进行声明,函数比较复杂，定义在类的外面
void setID(int newID);
void setAge(int newAge);
};
void Student::setID(int newID){
id = newID;
}
void Student::setAge(int newAge){
age = newAge<100?newAge:99;
}
int main(){
Student tom;
tom.setID(1);
tom.setAge(16);
cout<<tom.getID()<<" "<<tom.getAge();
return 0;
}```

### 推荐阅读更多精彩内容

• 题目类型 a.C++与C差异（1-18） 1.C和C++中struct有什么区别？ C没有Protection行为...
阿面a阅读 7,451评论 0 10
• 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
尤汐Yogy阅读 9,261评论 1 51
• 一、基本数据类型 注释 单行注释：// 区域注释：/* */ 文档注释：/** */ 数值 对于byte类型而言...
龙猫小爷阅读 4,124评论 0 16
• Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
Miley_MOJIE阅读 3,469评论 0 11
• 元素属性async 可选。只对外部脚本有效。表示应该立即下载脚本，但不应妨碍页面中的其他操作，比如下载其它资源或等...
zz张哲阅读 140评论 0 0