三小时速成C++(B站我头发还多还能学)笔记

以下所有代码为了偷懒都使用了万能头文件#include<bits/stdc++.h>大家可以边看课边配合着看,重点看看代码的注释!!!!

 lesson 1 变量和输入输出

#include<bits/stdc++.h>
using namespace std;
int main(){
	int a;
	a=10;
	float bb=3.14;
	char c='w';//单个字符用单引号 
	string d="ce#don";//字符串用双引号 
	bool e=true;//布尔类型 
	cout<<"a="<<a<<endl<<bb<<c<<d<<e;
	return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main(){
	string a="50";
	string b="100";
	int aa=stoi(a);//把字符串类型转化为整型 
	int bb=stoi(b);
	string aaa=to_string(aa);//将整型转化为字符串类型 
	string bbb=to_string(bb);
	cout<<aa+bb<<endl;
	cout<<aaa+bbb<<endl;
	return 0; 
}

上面这段代码devc++可能报错,(error: 'stoi' was not declared in this scope)

!!解决方法是打开Devc++ ->工具 –> 编译选项 –> 代码生成/优化 –> 代码生成 -> 语言标准 –> 选择GUI C++11就可以了

#include<bits/stdc++.h>
using namespace std;
int main(){
	const int a=10;//表示只读不可修改 
	cout<<a<<endl;
	return 0; 
}
#include<bits/stdc++.h>
using namespace std;
int main(){
	auto a=10;//可以代替任何的类型 
	auto b="cneauiob";
	auto c=true;
	cout<<a<<endl;
	return 0; 
}

以上代码中一般定义变量类型时不会用auto!(以后for循环可能会用上

#include<bits/stdc++.h>
using namespace std;
int main(){
	int a=10;
	float b=3;
	float c=a/b;
    printf("%.1f",c);//保留一位小数
	cout<<c<<endl;//会保留五位小数
	return 0; 
}

以上代码中要注意,如果定义a,b都为int,那么无论c定义为什么类型,c输出都为int型;要想让c输出为float型,则ab中也许有一个以上为float型。

#include<bits/stdc++.h>
using namespace std;
int main(){
	int a=10;
	int b=3;
	int c=a%b;
	cout<<c<<endl;
	return 0; 
}
#include<bits/stdc++.h>
using namespace std;
int main(){
	char a='a';
	char b=a+1;//字符的运算ASCII码
	cout<<b<<endl;
	return 0; 
}
#include<bits/stdc++.h>
using namespace std;
int main(){
	int a;
    float b;
	cin>>a>>b;//输入不需要endl,只需用空格或回车分隔开
	cout<<"a是"<<a<<endl<<"b的结果是"<<b<<endl;
	return 0; 
}

 作业:输出三个数字的平均数,并保留两位小数;按顺序输出两个字符串。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int A,B,C;
    string D="ab",E="cd";
    cin>>A>>B>>C>>D>>E;
    float F=(A+B+C)/3.0;
    printf("%.2f\n",F);
    cout<<D+E<<endl;
	return 0; 
}

lesson 2 循环和判断语句

#include<bits/stdc++.h>
using namespace std;
int main(){
    int score;
    cin>>score;
    if(score>100){
    	cout<<"输入异常"<<endl;
	}
	else if(score==100){//两个等于号才是判断语句,一个是赋值语句
		cout<<"满分";
	}
	else if(score>=80){//不需要再判断是否小于100
		cout<<"优秀"; 
	}
	else if(score>=60){
		cout<<"及格";
	}
	else{
		cout<<"不及格";
	}
	return 0; 
}
#include<bits/stdc++.h>
using namespace std;
int main(){
    int score;
    cin>>score;
    if(score>=60&&score<=80){
    	cout<<"及格";//且
	}
	else if(score<0||score>100){
		cout<<"异常";//或
	}
	else if(score!=100){
		cout<<"没有满分";//非
	}
	return 0; 
}
#include<bits/stdc++.h>
using namespace std;
int main(){
    int a=1;
    int n;
    cin>>n;
    while(a<=n){
    	cout<<a<<" ";
    	a++;;
	}
	return 0; 
}
#include<bits/stdc++.h>
using namespace std;
int main(){
    int a,b;
    while(cin>>a>>b){
    	if(a==-1&&b==-1){
    		break;//只是跳出循环 
		}
    	cout<<a+b<<endl;
	}
	return 0; 
}
//可以用ctrl+c来终止代码
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    int i=1;
    float sum=0;
    while(i<=n){
    	float p;
    	cin>>p;
    	sum+=p;
    	i++;//不加这步 会死循环 
	}
	cout<<sum/n<<endl;
	return 0; 
}

//另一种写法

int main(){
    int n;
    cin>>n;
    int i=n;
    float sum=0;
    while(n--){
    	float p;
    	cin>>p;
    	sum+=p;
	}
	cout<<sum/i<<endl;
	return 0; 
}//while循环
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
    	cout<<i<<" ";
	}
	return 0; 
}//for循环
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    int i=10;
    for(;i<=n;i++){
    	if(i%2==0){
    		continue;//直接进入下一次for循环 
		}
    	cout<<i<<" ";
	}
	return 0; 
}
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    int i=1;
    for(;i<=n;i++){
    	cout<<i;
    	if(i==n){
    		break;
		}
		cout<<",";
	}//最后数字后不加,
	return 0; 
}
#include<bits/stdc++.h>
using namespace std;
int main(){
    int a=10;
    int b=a++;//先赋值再++ 
    int c=++a;//先++再赋值 
    cout<<b<<endl;
    cout<<c;
	return 0; 
}
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n=5;
    do{
    	cout<<"hello"<<endl;
	}while(--n);//--n输出五行,n--输出六行
	return 0; 
}//do while循环,先执行再判断

在while循环里,n--正常执行,--n会少执行一次;

在do-while循环里,n--多执行一次,--n正常执行。

作业

n为输入个数,分别累加,直到n为-1跳出

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    int a;
    while(cin>>n){
    	int sum=0;//在循环里面定义,否则会一直累加
    	if(n==-1){
    		break;
		}
		while(n--){
			cin>>a;
        	sum+=a;
		}
		cout<<sum<<endl;//输出要在循环里,否则直到n为-1时才会输出
	}
	return 0; 
}

用*打印边长为n的正方形(for)

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
    	for(int j=1;j<=n;j++){
    		cout<<"*";
		}
		cout<<endl;
	}

	return 0; 
}

打印空心正方形(for)

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
    	for(int j=1;j<=n;j++){
    		if(i==1||i==n||j==1||j==n){
    			cout<<"*";
			}
			else cout<<" ";
		}
		cout<<endl;
	}
	return 0; 
}

打印直角三角形倒三角(for)

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
    	for(int j=1;j<=n-i+1;j++){//正三角只需让j<=i即可
    		cout<<"*";	
		}
		cout<<endl;
	}
	return 0; 
}

用*打印边长为n的正方形(while)

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    int i=0;
    while(i<n){
    	int j=0;//j必须在循环里定义否则只会执行一行
    	while(j<n){
    		cout<<"*";
    		j++;//while循环时不要忘了自增
		}
		cout<<endl;
		i++;
    }
	return 0; 
}

 打印空心正方形(while)

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    int i=0;
    while(i<n){
    	int j=0;
    	while(j<n){
    		if(i==0||j==0||i==n-1||j==n-1){
    			cout<<"*";
			}
			else cout<<" ";
    		j++;
		}
		cout<<endl;
		i++;
    }
	return 0; 
}

lesson 3 字符串

#include<bits/stdc++.h>
using namespace std;
int main(){
    string s1="abcd";
    if(s1.empty()){//判断是否空 
    	cout<<"空";
	}
	else cout<<"非空";
	cout<<s1.size(); //字符串大小 
	cont<<s1[2]<<endl;//查找第三个字符,下标从0开始 
	return 0; 
}

字符串的查找:

#include<bits/stdc++.h>
using namespace std;
int main(){
    string s1="hello c++";
    int pos = s1.find("c++");
    if(pos==string::npos){//常量,表示为无效索引 
    	cout<<"no";
	}
	else{
		cout<<"yes";
	}
    cout<<pos<<endl;
	return 0; 
}

字符串的替换:

#include<bits/stdc++.h>
using namespace std;
int main(){
    string s1="hello c++";
    s1.replace(0,5,"hi");//替换函数,左闭右开型,即替换0到4 
    cout<<s1<<endl;
	return 0; 
}

字符串的截取:如果要截取从1开始后面所有的,直接写substr(1)即可。

#include<bits/stdc++.h>
using namespace std;
int main(){
    string s1="hello c++";
    string s2;
    s2=s1.substr(0,5);//表示从0号索引位开始截取五个字符
    cout<<s2<<endl;
	return 0; 
}

字符串的输入:

#include<bits/stdc++.h>
using namespace std;
int main(){
    string s1;
    getline(cin,s1);//有空格不退出,只截断回车 
    cout<<s1<<endl;
	return 0; 
}

字符串的转化:

#include<bits/stdc++.h>
using namespace std;
int main(){
    string s1;
    while(getline(cin,s1)){
    	int score=0;
    	bool flag=true;
    	for(int i=0;i<s1.size();i++){
    		if(s1[i]=='A'){
    			score+=3;
			}
			else if(s1[i]=='B'){
				score+=2;
			}
			else if(s1[i]=='C'){
				score+=1;
			}
			else if(s1[i]==' '){
				continue;//继续执行即可 
			}
			else{
				cout<<"请检查你的输入!"<<endl;
				flag=false;
				break;//只会跳出for循环,while循环还在继续 
			}
		}
		if(flag==true){
		     cout<<"该学生的总分为:"<<score<<endl; //一直输出,直到输入为ctrl+c结束 	
		}
    }
	return 0; 
}

函数

求和

#include<bits/stdc++.h>
using namespace std;
int qiuhe(int a,int b){//形参
	int c=a+b;
	return c;
} 
int main(){
    int a=10,b=20;//实参
    int res=qiuhe(a,b);
    cout<<res;
	return 0; 
}

交换

#include<bits/stdc++.h>
using namespace std;
void jiaohuan(int &a,int &b){//不用返回值用void 
	int c;
	c=a;
	a=b;
	b=c;
	cout<<"形参:"<<endl<<a<<endl<<b<<endl;
} 
int main(){
    int a=10,b=20;
    jiaohuan(a,b);
    cout<<"实参:"<<endl<<a<<endl<<b;
	return 0; 
}
//函数里不加引用符号的结果形参实参不一样 
//形参:
//20
//10
//实参:
//10
//20

 输出大写首字母

版本一:返回a

#include<bits/stdc++.h>
using namespace std;
char daxie(char a){
	if(a>='a'&&a<='z'){
		a-=32;
	}
	return a;
}
int main(){
    int n;
    cin>>n;
    getchar();//吸收回车键 
    while(n--){
    	string s1;
    	string s2="";
    	getline(cin,s1);
    	s2+=daxie(s1[0]);
    	for(int i=1;i<s1.size()-1;i++){
    		if(s1[i]==' '&&s1[i+1]!=' '){	
    		    s2+=daxie(s1[i+1]);
    	    }
		}
		cout<<s2<<endl;
	}
	return 0; 
}

 版本2:直接引用

#include<bits/stdc++.h>
using namespace std;
void daxie(char &a){//引用后不需要返回值
	if(a>='a'&&a<='z'){
		a-=32;
	}
}
int main(){
    int n;
    cin>>n;
    getchar();//吸收回车键 
    while(n--){
    	string s1;
    	string s2="";
    	getline(cin,s1);
    	daxie(s1[0]);
    	s2+=s1[0];
    	for(int i=1;i<s1.size()-1;i++){
    		if(s1[i]==' '&&s1[i+1]!=' '){	
    		    daxie(s1[i+1]);
    		    s2+=s1[i+1];
    	    }
		}
		cout<<s2<<endl;
	}
	return 0; 
}

lesson 4  常用容器

数组遍历

#include<bits/stdc++.h>
using namespace std;
int main(){
    int arr[5]={1,2,3,4,5};//定义数组用花括号 
    arr[2]=100;//可直接修改 
    string brr[2]={"acds","d"};
    for(int i=0;i<5;i++){
    	cout<<arr[i]<<" ";
	}
	//倒序输出:
//    for(int i=4;i>=0;i--){
//    	cout<<arr[i]<<" ";
//	}	 
	//另一种输出方式 
//	for(auto i:arr){//让i访问arr中的元素 ,快速遍历方式 ,可以不知道数组大小 
//		cout<<i<<" ";
//	}
	return 0; 
}

vector遍历

#include<bits/stdc++.h>
using namespace std;
int main(){
    vector<int> vec={1,2,3,4};//相比于数组不需要知道其大小,并且可以使用size函数 
    for(int i=0;i<vec.size();i++){
    	cout<<vec[i]<<" ";
	}
	for(const auto p:vec){//const表示只读 
		cout<<p<<" ";
	}
	for(auto &p:vec){//真的需要改变要加&符号
	    if(p==3){
	    	p=300;
		} 
		cout<<p<<" ";
	}
	return 0; 
}

迭代器遍历

#include<bits/stdc++.h>
using namespace std;
int main(){
    vector<int> vec={1,2,3,4};//相比于数组不需要知道其大小,并且可以使用size函数 
//    for(int i=0;i<vec.size();i++){
//    	cout<<vec[i]<<" ";
//	}
	for(vector<int>::iterator it=vec.begin();it!=vec.end();it++){
		//it从第一个地址开始访问,如果不等于最后一个地址则一直访问 
		cout<<*it<<" ";//将迭代器当作指针来看 ,要打印的是地址里的内容所以加* 
	}
	for(auto it=vec.begin();it!=vec.end();it++){//写成auto自动识别也可以 
		//it从第一个地址开始访问,如果不等于最后一个地址则一直访问 
		cout<<*it<<" ";//将迭代器当作指针来看 ,要打印的是地址里的内容所以加* 
	}	
	return 0; 
}

vector的插入删除与清空

#include<bits/stdc++.h>
using namespace std;
int main(){
    vector<int> vec={1,2,3,4};
//    vec.push_back(100);//即在末尾加上100 
    vec.insert(vec.begin()+1,100);//在首地址后面地址写上100 
    vec.pop_back();//删除最后一个 
    vec.erase(vec.begin());//删除第一个元素 
//    vec. clear();//表示清空所有元素 
	for(auto it=vec.begin();it!=vec.end();it++){
		
		cout<<*it<<" ";
	}	
	return 0; 
}

vector的应用

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
	cin>>n;
	int beifen=n;
	vector<float> vec;
	while(n--){
		float meter;
		cin>>meter;
		vec.push_back(meter);
	}//作存放
	float sum=0;
	for(auto p:vec){
		sum+=p;
	}
	float res1=sum/beifen;
	cout<<res1<<endl;
	int num=0;
	for(auto p:vec){
		if(p<res1){
			num+=1;
		}
	}
	cout<<num<<endl;
	return 0; 
}

用数组实现

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
	cin>>n;
	int beifen=n;
	float vec[n];//数组 
	vector<float> vec;
	while(n--){
		float meter;
		cin>>meter;
		vec[beifen-n-1]=meter; 
	}//作存放
	float sum=0;
	for(auto p:vec){
		sum+=p;
	}
	float res1=sum/beifen;
	cout<<res1<<endl;
	int num=0;
	for(auto p:vec){
		if(p<res1){
			num+=1;
		}
	}
	cout<<num<<endl;
	return 0; 
}

set的查找

#include<bits/stdc++.h>
using namespace std;
int main(){//查找某一个整数是否在集合中出现 
    set<int> ss={1,2,3,4,5};
    if(ss.find(100)!=ss.end()){//指向空的一个地址
    	cout<<"yes";
	} 
	else cout<<"no";
	return 0; 
}
//字符串的find返回的是索引,这里返回的是地址 

set的遍历

#include<bits/stdc++.h>
using namespace std;
int main(){
    set<int> ss={1,2,3,4,5};
    for(auto s:ss){
    	cout<<s<<" ";
	}
	return 0; 
}

set的插入与删除

set的两个特性:自动去重以及递增排序。

#include<bits/stdc++.h>
using namespace std;
int main(){
    set<int> ss={1,2,3,4,5};
    ss.insert(4);//set会自动去重 
    ss.insert(20);
    ss.insert(100);//set会递增排序 
    ss.erase(5);
    for(auto s:ss){
    	cout<<s<<" ";
	}
	return 0; 
}

unordered_set

#include<bits/stdc++.h>
using namespace std;
int main(){
    unordered_set<int> ss={1,2,3,4,5};//自动去重但不排序 
    ss.insert(4);
    ss.insert(20);
    ss.insert(100);
    ss.erase(5);
    for(auto s:ss){
    	cout<<s<<" ";
	}
	return 0; 
}
//set本质上是红黑树,插入删除查找时间复杂度都为o(logn) 
//unordered_set本质上是哈希表 o(1)

 unorderd_set的查找

#include<bits/stdc++.h>
using namespace std;
int main(){
    unordered_set<int> s;//自动去重但不排序 
    int n;
    cin>>n;
    while(n--){
    	int qq;
    	cin>>qq;
    	s.insert(qq);
	}
	int temp;
	cin>>temp;
	if(s.find(temp)!=s.end()){//表存在 
		cout<<"yes";
	}
	else cout<<"no";
	return 0; 
}

map

#include<bits/stdc++.h>
using namespace std;
int main(){
    map<string,int> mm;
    mm["aaa"]=10;
    mm["bbb"]=15;
    for(auto pp:mm){
    	cout<<pp.first<<" "<<pp.second<<endl;
	}
	return 0; 
}

map同样会自动增序:

#include<bits/stdc++.h>
using namespace std;
int main(){
    map<int,int> mm;//<k,value>
    mm[100]=10;
    mm[20]=15;
    mm[400]=15;//自动增序 
    for(auto pp:mm){
    	cout<<pp.first<<" "<<pp.second<<endl;
	}
	return 0; 
}

unordered_map则为无序输出

#include<bits/stdc++.h>
using namespace std;
int main(){
    unordered_map<int,int> mm;//<k,value>
    mm[100]=10;
    mm[20]=15;
    mm[400]=15;//自动增序 
    for(auto pp:mm){
    	cout<<pp.first<<" "<<pp.second<<endl;
	}
	return 0; 
}

查找字符串中出现最多的字符以及其出现次数:

#include<bits/stdc++.h>
using namespace std;
int main(){
    unordered_map<char,int> mm;//<k,value>
    string ss;
    getline(cin,ss);
    for(int i=0;i<ss.size();++i){
    	if(ss[i]==' '){
    		continue;
		}
    	if(mm.find(ss[i])==mm.end()){
    		mm[ss[i]]=1;
		}
		else{
			mm[ss[i]]+=1;
		}
	}
	int minval=-1;
	char reskey='a';
	for(auto pp:mm){
		if(pp.second>minval){
			minval=pp.second;
			reskey=pp.first;
		}
	}
	cout<<reskey<<endl; 
	cout<<minval;
	return 0; 
}

lesson 5 结构体和指针

结构体即为自己可以去定义的数据类型。

结构体的使用方法:

#include<bits/stdc++.h>
using namespace std;
struct Student{
	int age;
	string name;
	float score;
};
int main(){
    Student  s={19,"jye",333};//初始化 
    cout<<s.name;
	return 0; 
}

指针的使用

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a=10;
    int *p=&a;
    cout<<*p<<endl;
	return 0; 
}

静态分配与动态分配

#include<bits/stdc++.h>
using namespace std;
int main(){
	//int a;//静态分配空间 
	//a=10; 
    int *p=new int;//动态分配 ,如果不加new int则会任意分配空间,运行结果为空 
    *p=10; 
    cout<<*p<<endl;
    delete p;//使用动态分配后要释放内存 
	return 0; 
}

返回数组中的元素

#include<bits/stdc++.h>
using namespace std;
int main(){
	int a[4]={2,1,3,4};
	cout<<*(a+1);//返回的是第二个元素 
	
//	//也可以
//	int *p=a;//左右两边都是地址
//	cout<<*p;//返回第一个元素 
    delete []a;
	return 0; 
}

数组的动态分配

#include<bits/stdc++.h>
using namespace std;
int main(){
	int *a=new int[5];
	*(a+1)=10;
	*a=5;
	cout<<*(a+1);
    delete []a;//要记得释放数组
	return 0; 
}

结构体指针

#include<bits/stdc++.h>
using namespace std;
struct Student{
	int age;
	string name;
	float score;
};
int main(){
	Student *p=new Student;//可以理解为加了new才会有内存空间,不加就没有内存空间 
	p->age=18;
	cout<<p->age;
	return 0; 
}

链表结构体

#include<bits/stdc++.h>
using namespace std;
struct ListNode{
	int val;
	ListNode *next;//指向下一节点的指针 
};
int main(){
	ListNode *l=new ListNode;//创建链表头节点 
	l->val=0;
	l->next=nullptr;
	return 0; 
}

链表的创建插入及遍历

#include<bits/stdc++.h>
using namespace std;
struct ListNode{
	int val;
	ListNode *next;//指向下一节点的指针 
};
int main(){
	int n;
	cin>>n;
	ListNode *head=new ListNode;//创建链表头节点 
	ListNode *p=head;
	head->val=0;
	head->next=nullptr;//空指针 
	while(n--){
		int res;
		cin>>res;
		ListNode *newnode=new ListNode;
     	newnode->val=res;
    	newnode->next=nullptr;
    	head->next=newnode;
    	head=head->next;//头插 
	}
	while(p->next!=nullptr){
		cout<<p->next->val<<" ";
		p=p->next;//遍历 
	}
	return 0; 
}

结束啦!!!!!!

  • 18
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值