以下所有代码为了偷懒都使用了万能头文件#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;
}
结束啦!!!!!!