置顶 关于我们
C++笔记(更新中...)
Very2 发表于1980-03-01 浏览18411 评论0
/*1.分析已知与未知 2.数据定义
3.输入 4.算法实现 5.输出*/
#include<bits/stdc++.h> //万能头
using namespace std; //命名空间
int main() { //主函数
cout<<"授课笔记完整版";
return 0;
}
一、基本数据类型
int a1=6,a2=int(6.9999); //整型
long long l=6666666666; //长整型
float f=3.14; //单精度
double d=3.1415926; //双精度
char c1='A',c2=char(90); //字符类型
bool b1=false,b2=true; //true真 false假
二、变量的定义与使用
int _2a; //字母、数字、下划线
数字不能开头;不能用关键字;
变量的作用域:
循环中定义的变量,只能在循环中用
三、运算符
//算术运算 加减乘除 整除 求余(模)
a+b;a-b;a*b;a/b;a%b;
//逻辑运算 与或非
与(有0则0,无0才1)
或(有1则1,无1才0)
a&&b;a||b;!a;
//关系运算 大于、小于、等于...
a>b;a<b;a==b;a>=b;a<=b;a!=b;
//自增自减
a++;b--;
i++;先用后加;
++i;先加后用;
//三目运算 A?B:C
//if(A) {B} else{C}
四、基本语句
int a; double b; char c;
//输入输出语句
cin>>a>>b>>c;//>>向右是输入
scanf("%d %f %c",&a,&b,&c);
//格式串 d十进制整数,f浮点数,c字符
cout<<a<<b<<c;//<<向左是输出
cout<<fixed<<setprecision(2)<<b;
printf("%d %.2f %c",a,b,c);
// %.2f 代表保留2位小数
//分支语句:条件"不重复 且 不遗漏"
if...else...
if...else if...
switch(整数){
case 1: 语句;break;
case 2: 语句;break;
default: 语句;
}
从冒号:开始向下执行,遇break跳出
//循环语句 for while do...while
循环三要素:条件、初始/步长、循环体
for(初始i=1;条件i<n;步长i++){
循环体 s++;
}
初始
while(条件){
循环体;
步长;
}
初始
do{
循环体;
步长;
} while(条件)
break; 跳出本层循环
continue; 跳过本次循环
打表法解题:
表头列出关键变量,纵向变量变化过程)
五、数组:一维/二维/字符数组
1.定义(初始化) 下标从0开始
类型 数组名[长度] ={元素1,元素2...}
类型 数组名[行长][列长] ={元素1,元素2...}
int a[5]={2,4,6,8,10};
int b[5][5]={{1,2,3,4,5},{6,7,8},{}}
char c[5]={'l','w','l','$'}
2.引用
数组名[下标]
数组名[行号][列号]
a[0]=666;
b[0][0]=888;
b[1][3]=9;
c[0]='w';
3.场景
循环输入/输出 数组每个元素
//一维数组:一层循环
for(int i=1;i<=5;i++){
cin>>a[i];
cout<<a[i]<<" ";
}
//二维数组:二层循环
for(int i=1;i<=5;i++){
for(int j=1;j<=5;j++){
cin>>a[i][j];
cout<<a[i][j]<<" ";
}
}
六、字符数组 与 字符串类
1. 定义(初始化)
1)字符数组 写法:
char c[20]="Hello World "; //字符串 赋值
cin.getline(字符串名,长度);//输入含空格字符串
cin.getline(c,5);
2)字符串类 写法:
string c="Hello"; //字符串 赋值 默认尾部加'\0'
getline(cin,字符串名);//输入含空格字符串
getline(cin,c);
2.相关函数与操作
1)字符数组 函数:
char c1[20]="hello",c2[20]="World";
strcat(c1,c2);//拼接concatenate
strcpy(c1,c2);//复制copy
strcmp(c1,c2);//比较compare
strlen(c1);//字符串长度length
strlwr(c1);//转小写 low 非标准库函数
strupr(c1);//转大写 up 非标准库函数
2)字符串类 操作
string s1,s2;
s1=s1;//赋值
s1+=s2;//拼接
s1==s2;s1!=s2;//判断是否相等
s1<s2;//判断大小
s1.empty();//是否为空
s.length() / s.size() 返回字符串长度
s.substr(pos, len) 截取子串(从 pos 开始 len 个字符)
s.find(str) 查找子串位置,未找到返回 string::npos
s.insert(pos, str) 在 pos 位置插入字符串
s.erase(pos, len) 从 pos 开始删除 len 个字符
s.replace(pos, len, str) 替换从 pos 开始的 len 个字符为 str
七、函数
(一)标准函数:
abs() 求绝对值 abs(-4) 返回4
sqrt() 开平方根
max() 求最大值 max(5,6); //返回6
min() 求最小值
ceil() 向上取整
floor() 向下取整
(二)自定义函数:
1.函数的定义:
返回类型 函数名(参数列表){
函数体 //执行语句
}
int add(int a,int b){
return a+b;
}
2.声明与引用;
函数名(参数列表);
传值/传址;
作用域
八、结构体与sort排序
1.定义(初始化)
struct 结构体类型名{
类型 要素1名;
类型 要素2名;
...
};
struct stu{
int num;
char male;
};
stu j;
2.引用 变量名.要素名
j.num=666;
3.场景
与sort排序结合运用
4.sort排序
sort(数组起始下标,数组结束下标+1,自定义排序规则)
bool cmp(int a,int b){
return a<b;
}
int a[6]={3,1,4,2,7,8};
sort(a+0,a+5+1,cmp);
九、指针(变量)
1. 定义(初始化)
类型名 *变量名
int *p=NULL;
int a;
p=&a; //&取地址
*p=20; //*取值
2.引用
3.场景(数组、字符串、函数...)
设有数组 a,指向 a 的指针变量为 pa,
则有以下关系:
pa、a、&a[0]均指向同一单元
指针与字符串:
const char* s = "program";
for (int i = 0; i < 7; i++)
cout << *(s + i);
十、进制转换
(一)R进制>十进制:按权展开求和
位高权重
一个数的负数次幂=该数的正数次幂的倒数
任何数的零次幂=1
pow(x,y)=x的y次幂
(1101)2 = (13)10
(二)十进制>R进制:整数(取余倒序)
异或
进制(满几进位)
十一、算法:自然语言、流程图、伪代码
赋值:箭头
十二、队列
1.定义:只能一端插入另一端删除的线性表
2.特点:先进先出
3. STL:
声明:queue<数据类型>队名,
例如:queue<int>q
相关函数:
q.push(); 添加元素
q.front(); 获取队首元素
q.pop(); 删除队首元素
q.size(); 获取元素个数
q.empty(); 判断队列为空
优先队列:
priority_queue<数据类型> q; //声明一个用来存某数据类型的优先队列,名字叫q
相关函数(其他同队列):
q.top(); 获取队首元素,队列用的是q.front();
priority_queue<int>q; //默认是大的先出来
priority_queue<int,vector<int>,less<int> >q1; //大的先出来
priority_queue<int,vector<int>,greater<int> >q2; //小的先出来
4.自己写:(详见后附)
十三、栈
1.定义:只能一端插入或删除的线性表
2.特点:先进后出
3. STL:
声明:stack<数据类型>栈名,
例如:stack<int>s
相关函数:
s.push(); 元素入栈
s.top(); 获取栈顶元素
s.pop(); 删除栈顶元素
s.size(); 获取元素个数
s.empty(); 判断栈为空
4.自己写: (详见后附)
十四、顺序表
//顺序表基本运算算法
#include <stdio.h>
#include <malloc.h>
#define MaxSize 50
typedef int ElemType;
typedef struct
{ ElemType data[MaxSize]; //存放顺序表元素
int length; //存放顺序表的长度
} SqList; //顺序表的类型
void CreateList(SqList *&L,ElemType a[],int n)
//建立顺序表
{
L=(SqList *)malloc(sizeof(SqList));
for (int i=0;i<n;i++)
L->data[i]=a[i];
L->length=n;
}
void InitList(SqList *&L)
{
L=(SqList *)malloc(sizeof(SqList)); //分配存放线性表的空间
L->length=0;
}
void DestroyList(SqList *&L)
{
free(L);
}
bool ListEmpty(SqList *L)
{
return(L->length==0);
}
int ListLength(SqList *L)
{
return(L->length);
}
void DispList(SqList *L)
{
for (int i=0;i<L->length;i++)
printf("%d ",L->data[i]);
printf("\n");
}
bool GetElem(SqList *L,int i,ElemType &e)
{
if (i<1 || i>L->length)
return false;
e=L->data[i-1];
return true;
}
int LocateElem(SqList *L, ElemType e)
{
int i=0;
while (i<L->length && L->data[i]!=e) i++;
if (i>=L->length)
return 0;
else
return i+1;
}
bool ListInsert(SqList *&L,int i,ElemType e)
{
int j;
if (i<1 || i>L->length+1 || L->length==MaxSize)
return false;
i--; //将顺序表位序转化为elem下标
for (j=L->length;j>i;j--) //将data[i]及后面元素后移一个位置
L->data[j]=L->data[j-1];
L->data[i]=e;
L->length++; //顺序表长度增1
return true;
}
bool ListDelete(SqList *&L,int i,ElemType &e)
{
int j;
if (i<1 || i>L->length)
return false;
i--; //将顺序表位序转化为elem下标
e=L->data[i];
for (j=i;j<L->length-1;j++) //将data[i]之后的元素前移一个位置
L->data[j]=L->data[j+1];
L->length--; //顺序表长度减1
return true;
}
十五、二分法
使用前提:有序性
核心代码:
mid=l+(r-l)/2; //取中点值
r=mid-1; //向左半找
l=mid+1; //向右半找
典型题目:
二分查找:P2249
二分答案:
P1873 砍树
P2440 木材加工
P1577 切绳子
P1102 A-B数对
P1824 进击的奶牛
P1182 数列分段 Section II
置顶 关于我们
GESP真题
Very2 发表于2026-09-19 浏览260 评论0
2026年9月 真题:
关于我们
CSP-J初赛复习资料与2026真题
Very2 发表于2026-09-12 浏览250 评论0
张子祺
2021_cap_j
张子祺 发表于2026-09-05 浏览264 评论0
1.不属于面向对象程序设计语言的是C语言
2.与计算机领域最相关的奖项是图灵奖
3.目前主流的计算机储存数据最终都是转换成二进制数据进行储存。
4.以比较作为基本运算,在 N 个数中找出最大数,最坏情况下所需要的最少的比较次数为n-1次
5.栈:后进先出;只能先弹出栈顶元素;自己推(
6.对于有 n个顶点、m 条边的无向连通图 (m>n),需要删掉m−n+1条边才能使其成为一棵树
7..n进制转十进制:第a位=数值*n的a-1次方
关于我们
2022_csp_j
张子祺 发表于2026-09-05 浏览749 评论0
1.面向对象特性不含输出
2..栈:后进先出;只能先弹出栈顶元素;自己推(
3.指针是指向变量的地址
4.数组大小固定,链表大小可动态调整
5.栈:后进先出;只能先弹出栈顶元素;自己推(
6.
7.哈夫曼树:直接画树;
8.完全二叉树左边节点=父节点*2,右=父节点*2+1;
9.有向连通图:用邻接矩阵至少有n个非零元素
10.可以用栈实现队列;
队列常常被用于广度优先搜索算法。 栈的访问原则后进先出,队列的访问原则是先进先出。
关于我们
csp-j 2023
张子祺 发表于2026-08-29 浏览398 评论0
1. 创建常量(不能更改的变量):const
2. N进制+N进制:先加再转十进制
关于我们
2024_csp_j 1~15
张子祺 发表于2026-08-29 浏览281 评论0
1.int 数据类型负数:奇数 正数:偶数
2.n进制转十进制:第a位=数值*n的a-1次方
3(a-1)*(b-1)*c*(a+b+c-组数)(最大值)
4.滚木;
5.MB=1024kb KB=1024B B=8 b
MB=1024KB=1024*1024B=1024*1024*8b
6.基本数据类型:可直接用于定义变量
7循环语句:for;while;do-while
关于我们
NOI报名
Very2 发表于2026-08-25 浏览274 评论0
关于我们
洛谷p1043
李澄瑞 发表于2026-08-22 浏览285 评论0
#include<iostream>
using namespace std;
long long a[1001],x[1001],n,m,max1,min1=1000000000000000;
//x为一开始读入的数据,a为便于计算一段之和的前缀和
long long f[101][101][11],f1[101][101][11];
//f数组存最大值,f1数组存最小值
int main(){
cin>>n>>m;
for (int i=1;i<=100;i++)
for (int j=1;j<=100;j++)
for (int k=1;k<=10;k++)
f1[i][j][k]=10000000000;
//先给f1数组赋上巨大的值,便于计算之和的最小值
for (int i=1;i<=n;i++)
{
cin>>x[i];//读入
a[i]+=a[i-1]+x[i];//前缀和
}
//化环为链
for (int i=n+1;i<=n*2;i++) a[i]+=a[i-1]+x[i-n];//前缀和
for (int i=1;i<=n*2;i++)
for (int j=1;j<=n*2;j++)
{
f[i][j][1]=(a[j]-a[i-1]+100000000000)%10;//前缀和求一段数的和
f1[i][j][1]=(a[j]-a[i-1]+100000000000)%10;//前缀和求一段数的和
//因为输入有负数,所以a[j]可能会小于a[i-1],所以我们给他加上巨大值
}
//赋初始值
for (int i=1;i<=n*2;i++)//枚举开始的数字位置
{
for (int j=i+1;j<=n*2;j++)//枚举结束的数字位置
{
for (int l=2;l<=m;l++)//枚举分段的数量
{
for (int k=i;k<j;k++)//枚举中间数的位置
{
f[i][j][l]=max(f[i][j][l],f[i][k][l-1]*f[k+1][j][1]);//动态规划转移方程
f1[i][j][l]=min(f1[i][j][l],f1[i][k][l-1]*f1[k+1][j][1]);//动态规划转移方程
}
}
}
}
for (int i=1;i<=n;i++)
{
max1=max(max1,f[i][i+n-1][m]);//求一段的最大值
min1=min(min1,f1[i][i+n-1][m]);//求一段的最小值
}
cout<<min1<<endl<<max1<<endl;//输出
return 0;
}张子祺
塔防小游戏
张子祺 发表于2026-08-20 浏览268 评论0
汤达友
0820 比比拉布
汤达友 发表于2026-08-20 浏览284 评论0
#include <bits/stdc++.h>
using namespace std;int main(){
sudstr(a,n) //从下标 a取 n个字符
find() //查找子串(从左)
replace(a,n,str) //把从 a起 n个字符替换
insert(a,str) //在下标 a处插入
append(str)//在末尾追加
'A'=65,'a'=97,'0'=48 //ASCLL码
tolower(c) //大写转小写
toupper(c) //小写转大写
//'a'-'A'=32
if(c>='a' && c<='z') //小写
if(c>='A' && c<='Z') //大写
if(c>='0' && c<='9') //数字
//判断字符类型
return 0;} 李澄瑞
mixly遥控风扇
李澄瑞 发表于2026-08-19 浏览281 评论0
#include <IRremote.h>
const int IR_RECV_PIN = A0;
const int FAN_PIN_A2 = A2;
const int FAN_PIN_A3 = A3;
IRrecv irrecv(IR_RECV_PIN);
decode_results results;
bool fanState = false;
// 你的按键码 FFA25D
const unsigned long TARGET_KEY = 0xFFA25D;
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn();
pinMode(FAN_PIN_A2, OUTPUT);
pinMode(FAN_PIN_A3, OUTPUT);
digitalWrite(FAN_PIN_A2, LOW);
digitalWrite(FAN_PIN_A3, LOW);
}
void loop()
{
if (irrecv.decode(&results))
{
Serial.print("收到码值 HEX: ");
Serial.println(results.value, HEX);
// ✅过滤NEC长按重复码 0xFFFFFFFF,只有真正按键才执行
if(results.value != 0xFFFFFFFF)
{
if (results.value == TARGET_KEY)
{
fanState = !fanState;
if (fanState)
{
digitalWrite(FAN_PIN_A2, HIGH);
digitalWrite(FAN_PIN_A3, HIGH);
Serial.println("👉风扇开启 A2 A3 = HIGH");
}
else
{
digitalWrite(FAN_PIN_A2, LOW);
digitalWrite(FAN_PIN_A3, LOW);
Serial.println("👉风扇关闭 A2 A3 = LOW");
}
}
}
irrecv.resume();
}
}