第一单元
第一课-初识C++
1、计算机发展史
第一台计算机,于1946年在美国诞生,占地172平方米 ,名称叫做 ENIAC。
2、C基本框架以及输出
基本框架
每个C程序都必不可少的代码!
#include<iostream>
using namespace std;
int main() {
}
Ps:万能头文件:
#include<bits/stdc++.h>
//好处:不需要打其他头文件 、简单
//坏处:空间需求多,容易MLE,容易会有函数冲突
[图片]
[图片]
[图片]
[图片]
请注意,C++程序必须先编译后运行,生成对应的cpp和exe文件!
输出:cout
[图片]
换行:endl(end of line)
cout<<endl;
3、变量输入
·变量就是一个盒子,在计算机中用来存储数据的地方,但是一定要先定义。
定义方式:数据类型 + 变量名称
类型可以有很多,比如整数(int),小数(double),字符(char)·······
命名有规则:只能有大小写字母、数字、下划线(_)。
详细如下:
[图片]
注意,还有一个特殊符号!!!(不能放到变量名中,比如:%,+,-,/,?,!·······)
4、算术运算符
常见的加减乘除等操作,就是算数运算符!
新学习!取余、模运算符:%,能够得到一个式子中,被除数和除数之后的 余数。
[图片]
作业:
1、熟读笔记
2、系统作业
第二课-基本运算
1、变量【升级】
整数
基本:int
超长整型:long long
无符号超长整型:unsigned long long
[图片]
浮点数
单精度:float
双精度:double
[图片]
实例代码:
#include <iostream>
using namespace std;
int main() {
long long a, b;//长整型
// unsigned long long a,b//无符号超长整型
// double a,b;//双精度浮点型,可存小数
cin >> a >> b;
long long c = a + b;
cout << c;
return 0;
}
2、特殊格式化输出
int a;----printf("%d",a);
double b;-----printf("%.2lf",b);//保留两位小数
long long c; _____printf("%lld",c);
[图片]
3、除法和取余
[图片]
[图片]
4、类型转换
[图片]
第三课-分支(一)
1、关系运算符&布尔变量
[图片]
bool b;//只存 真(true:1) 和 假 (false:0)
[图片]
2、流程图
[图片]
3、单分支
[图片]
#include<iostream>
using namespace std;
int main(){
int a;
cin>>a;
//单分支判断:if
if(a>90){//如果···那么···
cout<<"买computer!";
}
}
4、双分支
[图片]
5、三目运算符
[图片]
#include <iostream>
using namespace std;
int main(){
int n;
cin >> n ;
/请输入代码/
//如果是奇数则输出 odd
//否则输出 even
// if(n%2==1){
// cout<<"odd";
// }else{
// cout<<"even";
// }
}
第四课-分支(二)
特殊的:如果想要表达,两个及两个以上的判断,请将表达式用“&&”连接
if(80>n>=60) ×
if(80>n&&n>=60) √
//单分支
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
if(n>=80){
cout<<"A";
}
if(80>n&&n>=60){
cout<<"B";
}
if(60>n){
cout<<"C";
}
}
//Tian
1、多分支 (if - else if -else)
·if-else if-else语句
这是一种常用的多分支结构,它可以依据一系列条件进行判断,一旦某个条件为真,就执行对应的代码块,要是所有条件都不满足,就执行else里的代码块。
[图片]
实例代码:
#include <iostream>
using namespace std;
int main() {
//输入一个数,对应的输出星期几?
int n;
cin>>n;
if(n1){//shi山代码 虽shi但是 是 对
cout<<"星期一";
}else if(n2){
cout<<"星期二";
}else if(n3){
cout<<"星期三";
}else if(n4){
cout<<"星期四";
}else if(n5){
cout<<"星期五";
}else if(n6){
cout<<"星期六";
}else if(n==7){
cout<<"星期日";
}else{
cout<<"非法日期";
}
return 0;
}
2、多分支(switch-case)
·switch语句也是一种多分支结构,它依据一个表达式的值来选择执行哪个代码块。switch语句适用于对一个变量的多个固定值进行判断的场景。
[图片]
实例代码:
#include<iostream>
using namespace std;
int main() {
int n;
cin >> n;
switch (n) {
case 1:
cout << "weekday" << endl;
break;
case 2:
cout << "weekday" << endl;
break;
case 3:
cout << "weekday" << endl;
break;
case 4:
cout << "weekday" << endl;
break;
case 5:
cout << "weekday" << endl;
break;
case 6:
cout << "weekend" << endl;
break;
case 7:cout << "weekend" << endl;break;
default:
cout << "input error!" << endl;
}
return 0;
}
//Tian
特别注意!!
[图片]
3、字符变量
[图片]
第五课-分支(三)
1、分支嵌套
[图片]
#include<iostream>
using namespace std;
int main(){
int c,m;
cin>>c>>m;
if(c>=90){//表达式 1
if(m>=90){//表达式 2
cout<<"yes";
}else{//在表示式 2 不成立后执行
cout<<"no";
}
}else{//表示式 1 不成立后执行
cout<<"no";
}
}
//Tian
[图片]
[图片]
[图片]
2、逻辑运算符
2.1 逻辑运算符与- &&
[图片]
[图片]
//逻辑运算符 &&--[and] “并且”:全真才真,否则为假
if(c>=90 && m>=90){
cout<<"yes";
}else{
cout<<"no";
}
[图片]
2.2 逻辑运算符或- ||
[图片]
[图片]
//逻辑运算或 ||--[or] “或者”:全假才假,否则为真
if(c>=90 && m>=90||c+m >=185){
cout<<"yes";
}else{
cout<<"no";
}
2.3 逻辑运算符非 - !
[图片]
[图片]
//逻辑运算非 ! “非”:真变假 假变真
if(!(c>=90 && m>=90||c+m >=185)){
cout<<"no";
}else{
cout<<"yes";
}
3、闰年判断
[图片]
[图片]
第六课-循环(一)
1、运算符
1.1、自增自减运算符
[图片]
注意:前缀和后缀的区别
i、前缀是,优先进行自增赋值,再进行拿去执行语句。
i、后缀是,先拿去执行语句,再进行自增赋值。
[图片]
#include<iostream>
using namespace std;
int main(){
int i=3;
//i++、++i、--i、i--:自增自减
cout<<3*(2*(i--))<<endl; //18
}
//Tian
1.2 复合运算符
[图片]
#include<iostream>
using namespace std;
int main(){
int i=3;
//复合运算
int j*=i; // int j = j*i;
int x+=i; // int x = x+i;
int y/=i; // int y = y/i;
int sum+=i; // int sum = sum + i;
return 0;
}
//Tian
2、for循环
循环就是指,反复做某事, 如果明确知道重复的次数,我们可以使用for循环来实现。
[图片]
#include<iostream>
using namespace std;
int main(){
// 如果明确知道重复的次数,我们可以使用for循环来实现
// for(①初始值; ②结束条件; ④条件改变){
// ③循环体;
// }
}
//Tian
注意事项:
一、for循环里边,一定要用分号隔开。
二、for循环里边可以空着,写成for(; ;)表示一个死循环【不会结束的循环】
三、要注意正向和反向遍历,对应变量改变是增加还是减少
四、for循环是明确知道循环次数
第七课-循环(二)
1、while循环
在不明确循环次数,但是清楚循环结束条件时,推荐使用while循环
[图片]
#include<iostream>
using namespace std;
int main(){
//while语法
int i=1;//①开始
while(i<=4){//②结束
}
//Tian
数位分离
[图片]
注意:
如果是要输出末位,那应该时 M %10;
然后删除末位,是M / 10.
#include<iostream>
using namespace std;
int main(){
int m;
cin>>m;
int sum=0;
while(m!=0){//数位 分离
int n = m%10;//求 末位
sum = sum + n;//sum+=n
m = m/10; // 去 末位
}
cout<<sum;
}
//Tian
2、do-while循环
do-while循环是,会先执行一次重复的事情,然后再去while里边的条件,根据判断结果,再进行重复。
[图片]
#include<iostream>
using namespace std;
int main() {
int n = 5;
do {
cout<<"Yes";
} while(n>10);
//即使 n=5,没有大于10,但是还是会先实行一次 cout<<"YES";
}
//Tian
第八课-循环(三)
1、break和 continue
1.1 break
break就是终止!直接KO掉当前的循环啦,循环拜拜~
[图片]
[图片]
解释:当i==4满足时,就直接执行break,我们的循环直接结束啦!不用再执行后边的 ”4 5 6 7 8 9 ···“
1.2 continue
continue 是继续的意思,虽然也能结束循环,但是只能结束最近的一层,后边还是会继续执行剩下的循环语句。
[图片]
[图片]
解释:当i == 4时,执行continue,不直接结束当前所有循环,只是结束i为4的那一次循环噢,那次循环后边的代码就不管啦~
2、循环的具体运用-经典例题
2.1 循环读入n个数
[图片]
2.2 你是奇数
[图片]
参考代码:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
int a;
cin >> a;
if (a % 2==1) {//满足不被二整除,说明是奇数!
cout << a << " ";
}
}
return 0;
}
2.3 三倍
[图片]
参考代码:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
if (i % 3 == 0) {//满足三的倍数
cout << i << " ";
}
}
return 0;
}
2.4★ 求最大值
[图片]
【思路分析】
1. 需要一个变量可以是 n 来存储输入的正整数
2. 可以将数据成一个一个进来,进来时和一个最大值记录的数据进行比较,如果比最大值还大,更新最大值
3. 最大值的初始设定应该 <= 输入的数字最小值,这样才能确保第一个数字会被作为最大值
参考代码:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int maxn = 0; // 保存最大值数据
for (int i = 1; i <= n; i++) {
int a;
cin >> a;
if (a > maxn) { // 只有刚才输入的数字比最大值大才更新
maxn = a;
}
}
cout << maxn;
return 0;
}
特殊的,求最小值:
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
int mini = 5051;
for(int i=1;i<=n;i++){
int a;
cin>>a;
if(mini > a){
mini = a;
}
}
cout<<mini;
}
//Tian
第九课-数组(一)
1、数组与常量
1.1 数组
·数组是用于存在一组相同类型的数据的。
数组的定义和变量定义类似,有三个部分;
定义方式:数据类型 + 数组名称 + 数组空间【通常使用常量表示】
例如: int a[10];
[图片]
数组初始化:
[图片]
#include<iostream>
using namespace std;
int main(){
int a[5]={5,3,4,2,1};
//初始化方式一:使用{}完成数据填入
// ps:此时的[]中可以不填长度,根据初始化个数来声明空间
// 此时的[]中要填入长度,不然不明确空间大小。
}
//Tian
1.2 常量
常量,就是定义的时候,直接确定好的量,不能再进行更改,否则会报错!
[图片]
[图片]
#include<iostream>
using namespace std;
const int m = 100;
//一般会放在主函数之外,确定m的数值
int main(){
// 然后可以使用常量m来声明数组的空间,会更安全
int a[m];
}
//Tian
2、数组运用
2.1 访问
·数组中会是一个下标对应一个元素值,会使用下标来访问对应数组中的某个位置的元素;例如 a[2] = 5,表示下标为 2 的数组空间中存放着元素值 为 5。
[图片]
[图片]
2.2 遍历
·遍历:不重不漏的访问每一个元素。【for循环】
例如,一个数组名称为 a,有10个空间,正确的遍历,应该是,从下标为 0 的到 下标为 9的元素值,就是10个;
注意!会结合到for循环进行遍历,因为可以看出,起点是0,终点 为 9,每次累加 1;
#include<iostream>
using namespace std;
int main(){
// 遍历:不重复不漏掉地访问每一个元素---
// for 循环实现
for(int i=0;i<10;i++){//注意是i小于 10,最后会到 a[9]
cout<<a[i]<<" ";
}
return 0;
}
//Tian
3、注意事项
3.1 全局数组&&局部数组
[图片]
[图片]
3.2 数组越界 - “RE”
[图片]
[图片]
如果超出了 数组可以存储的范围,即为 越界,为了避免越界,我们通常会多开一些空间。
第十课-数组(二)
本节课主要针对数组中的注意事项做说明:
1. 数组中存储元素的类型必须相同。
2. 数组中元素的下标默认是从 0 开始的。
3. 数组大小在定义后是确定不变的。
4. 在C++中,数组可以进行部分初始化。未初始化的元素将被自动初始化为0。
5. 全局数组定义后,未初始化的元素会被自动赋值为 0。局部数组定义后,未初始化的元素会被自动赋值为随机值。
[图片]
第十一课-综合复习
[图片]
第二单元
第十三课-for循环的运用
[图片]
第十四课- 一维数组的应用(一)
[图片]
第十五课-一维数组的运用(二)
[图片]
第十六 + 十七课-字符和字符串
#include<iostream>
using namespace std;
int main(){
//检验字符的ASCLL
char sc = 'C';
cout<<(int)sc;
}
//Tian
#include<iostream>
using namespace std;
int main(){
//检验字符的ASCLL
char sc = 'C';
cout<<(int)sc;
}
//Tian
#include<iostream>
using namespace std;
int main(){
//将一个整数,ASCLL码转换成字符
char sc = 101;
cout<<sc;
}
//Tian
字符变量,char c;
是用来存储每一个字符的;
ASCLL码 ,是用于表示每一个字符在电脑中表示的整数 0 - 127
[图片]
常见:
[图片]
如何判断字符类型?
使用对应的ASCLL码值或者 是 直接比较
if(c>='A' && c<='Z'){
cout<<"大写";
}else if(c>='a'&&c<='z'){
cout<<"小写";
}else if(c>='0'&&c<='9'){
cout<<"数字";
}else{
cout<<"other";
}
请问,如何实现大小写互转?
A = 65
a = 97
'a' - 'A' = 32;差值是 32
让大写转成小写 --- +32
让小写转成大写 --- -32
#include<iostream>
using namespace std;
int main(){
//将一个字符串,拆解成用空格隔开的字符 并输出
//输入:HLSSCS 输出:H L S S C S
string s;
cin>>s; // getline(cin,s);//带空格的输入
int l = s.size();//获取长度
for(int i=0;i<l;i++){
cout<<s[i]<<" ";
}
}
//Tian
第十八课-进制转换
进制:只是表述数字的一种规则,常见有 十进制(D)、八进制(O)、二进制(B)、十六进制(H)····
[图片]
特别需要注意:
十六进制中,超过了9,我们要用英文字母表示,A(10)、B(11)、C(12)、D(13)、E(14)、F(15)、10(16)······
十进制转任意N进制,使用“短除法”:除N取余、逆序排列
注意:如果有小数,短乘法、循环乘N、顺序取整数、直到小数部分为 0.
0.25(10)---->0.01(2)
0.25 * 2 = 0.5 ----- 0
0.5 * 2 = 1.0 ------- 1
[图片]
任意 N 进制转十进制:按权展开相加法:
[图片]
例子:
二 【1101.001】 ————> 十【13.125】
1101.001(2)二进制
①先算整数 : 按照位数上的值,乘上对应的次方值 注意,位数越高,次方值越大
1101
1 * 2^0 + 0 * 2^1 + 1 * 2^2 + 1 * 2^3 = 1 + 0 + 4 + 8 = 13
②再算小数 :按照位数上的值,乘上对应的次方值 注意,位数越低,次方值越小
0.001 = 0.125
0 * 2^(-1) + 0 * 2^(-2) + 1 * 2^(-3) = 0 + 0 + 0.125 = 0.125
特别的 :1 * 2^(-3) = 1 / 2^3 = 1 / 8 = 0.125
③最后相加
13+ 0.125 = 13.125(10) 十进制
第十九课-循环嵌套(一)
分支嵌套:分支里边套分支
int n = 1;
if(n>=10){
cout<<"大于10";
if(n<=20){
cout<<"大于10,小于等于20";
}
}
注意!
if(!x) x没有值
等价于 if(x==false)
if(x) x有值
等价于 if(x==true)
false 代表 0
true 代表 非0
循环嵌套就是指:循环内部完全包含了另一个循环。
[图片]
循环嵌套:循环里边(完全包含)套循环,常见操作:
1、画图形【用符号画正方形】
2、计算
3、遍历、常见二维数组
例一:画图形
[图片]
#include<iostream>
using namespace std;
int main(){
//画一个n行m列的用 * 号表示的正方形
/*
* * *
* * *
* * *
/
//shi山
// cout<<""<<endl;
// cout<<""<<endl;
// cout<<"**"<<endl;
// 双重for循环嵌套来实现两个维度【行、列】的图形
//3行3列
int n=3,m=3;
for(int i=1;i<=n;i++){//外循环:行
for(int j=1;j<=m;j++){//内循环:列、行中的具体元素
cout<<"*";
}
cout<<endl;//执行完内循环之后再换行
}
return 0;
}
//Tian
例二:
跟着我一起说:“1,2,3,4,5...”,再来一遍!“1,2,3,4,5...”。
请输出 n 次 1~m。
提示
每行所有的内容应一致。
输入格式
两个整数 n(≤20),m(≤10)。
输出格式
详见样例输出。
样例组
输入#1
3 3
输出#1
1 2 3
1 2 3
1 2 3
输入#2
5 6
输出#2
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
#include<iostream>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){//一共有n行
for(int j=1;j<=m;j++){//每行输出1-m的数字
cout<<j<<" ";//j可以从1数到m
}
cout<<endl;
}
return 0;
}
//Tian
[图片]
[图片]
[图片]
第二十课-循环嵌套(二)
[图片]
第二十一+二十二-二维数组
[图片]
[图片]
前提: 单一变量-存储一个数据
1、一维数组:多个相同类型的变量
定义
int a[10];
char c[10];
double b[10];
初始化
int a1[5]={1,2,3,4,5};
输入,n个数据到数组b中:
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>b[i];
}
遍历,使用for,通过下标来实现访问每一个元素
for(int i=1;i<=n;i++){
b[i] += 3;
if(b[i]%2==1)
cout<<b[i]<<" ";
}
2、二维数组:就是由多个一维数组构成!
int a1[5] = {1,2,3,4,5};
需求:
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
可以看成是多个一维数组进行输出,那么就有一个特殊结构:二维数组!!!
第三单元
第二十五课-函数定义
//函数三要素:
//功能: 实现 从 n 加到 m ,得到结果
//参数: n 、 m
//返回值:累加器的结果
[图片]
第二十六课-函数的参数传递方式
#include<iostream>
using namespace std;
//定义最小值函数
int Min(int a,int b,int c){//这里的 abc 都是形参
int ans = a;
if(ans > b) ans = b;
if(ans > c) ans = c;
a = 9999999;
return ans;
}
int main(){
int a,b,c;
cin>>a>>b>>c;// 3 4 5
// int ans = Min(a,b,c);
// cout<<ans;
cout<<Min(a,b,c)<<endl;//调用 ,这里大写字母ABC就是实参
cout<<a<<" "<<b<<" "<<c;//不会改变原来的值 a ->3
return 0;
}
//Tian
#include<iostream>
using namespace std;
//定义最小值函数
int Min(int& a,int& b,int& c){//这里的 abc 都是形参 ,在功能上,他就是另外一个实参
int ans = a;
if(ans > b) ans = b;
if(ans > c) ans = c;
a = 9999999;
return ans;
}
int main(){
int a,b,c;
cin>>a>>b>>c;// 3 4 5
// int ans = Min(a,b,c);
// cout<<ans;
cout<<Min(a,b,c)<<endl;//调用 ,这里大写字母ABC就是实参
cout<<a<<" "<<b<<" "<<c;//会改变原来的值 a ->3 ->999999
return 0;
}
//Tian
[图片]
[图片]
[图片]
第二十七课-数学函数
[图片]
#include<iostream>
#include<cmath>
//#include<bits/stdc++.h> 万能头
using namespace std;
int main(){
int a=2;
// cout<<aaaaaaa*a<<endl;
cout<<pow(a,8)<<endl; //256
// printf("%.2f",sqrt(n));//保留两位小数
}
//Tian
第二十八-位运算
已知电脑中存储数据是用二进制码
二进制码有三类划分:原、反、补;
猜一猜:是用哪个码来进行数据计算的?
原码:
正数,就是二进制本身
负数,就是二进制本身外,最高符号位为 1(补齐8进制考虑)
反码:
正数,就是等于原码
负数,在原码的基础上,除了符号位以外,其他均取反
补码:
正数,就是等于反码
负数,在反码的基础上,最低位 +1
位运算:先把两个数转换成二进制位,然后,进行运算
按位与 &:全为1 才是1 否则是 0
按位或 |:有1则1,否则是 0
按位异或 ^: 相同为0,不同为1
按位取反 ~: 所有二进制位均取反,因此可以得出规律:~x = -(x+1)
·右移>>: 二进制全体往右边挪,缩小 2^n;
低位丢弃,高位补零
·左移<<: 二进制全体往左边挪,扩大 2^n;
高位丢弃,低位补零
[图片]
·与&: 全为1,才是1
·或|: 有1就1
·异或^: 相同为0,否则为1
·取反~: 全部取反
·右移>>: 二进制全体往右边挪,缩小 2^n;
·左移<<: 二进制全体往左边挪,扩大 2^n;
注:一个数m,如果先右移n位,再左移n位,不一定等于本身m
第三十课-计数排序
[图片]
桶排序、计数排序:
①桶标记思想【装】
②遍历 【查】
任务:
输入
5
1 3 3 2 4
输出:
1 2 3 3 4
1、使用一个辅助数组【桶数组】to,用记录数量:某个数出现的次数
【第i个下标对应的元素值是待排序数组a中等于 i 的元素的个数】
to:
下标 i: to[0] to[1] to[2] to[3] to[4]
i元素值: 0 1 1 2 1
2、 第一层for遍历,需要找到桶的范围(1~ma:升)/ (ma~1:降);找到对应桶中的元素值
第二层for根据元素值,输出对应的下标i的次数:
注意 :
1、适用于-待排序 元素值 不会特别大 的情况
2、适用于-有元素范围,并且有重复元素的情况
3、虽然说是排序,但是计数排序,不需要进行比较
4、计数排序,不可以处理负数排序 -【不能有负数下标】
5、辅助数组to,存储的是对应下标元素的个数
[图片]
#include<iostream>
using namespace std;
int a[110],to[1000];//全局默认为 0
int main(){
int n,ma = 0;//ma就是要存储 最大数
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];// -->int x,cin>>x;
ma = max(ma,a[i]); //--->ma = max(ma,x);
to[a[i]];//桶标记 -->to[x];
}
}
//Tian
例题:【排序】【入门】有趣的桶排序_信奥算法入门_官方-ACGO题库
第三十一课-sort排序(一)
[图片]
[图片]
[图片]
[图片]
[图片]
[图片]
#include<iostream>
#include<algorithm> // 算 法
using namespace std;
int arr[10010],n,a,b,c;
//比较函数 :说明是降序 x > y;
bool cmp(int x,int y){
return x>y;
}
int main(){
cin>>n>>a>>b>>c;
}