目录
一 问问题?
1,为什么要问问题?
在某些问题卡住的时候我们如果只靠自己去解决的话可能会出现这样几种情况:
- 进入某个牛角尖
- 某个技能点不会所以在有限的条件中写不出程序
- 某个技能记忆错误,导致程序无法实现理想中的功能
所以我们需要通过学习更多的代码知识和其他人的代码实现方式,去拓展自己的思路和视野,
同时也可以避免自己陷入无解的循环。
但问问题并不是无脑的获取答案
实际上,很多问题可能并没有超出你的能力范围,只是一些细枝末节的小问题,
而这样的问题在上网查过或者自己debug后会较快解决,
总之,遇到问题之后建议自己思考之后再去提问,
2,我可以问谁?
- 同学,建议同寝室的人一起去做题,互相帮忙debug,促进友谊,提高成绩
- 老师
- CSDN:这是一个国内比较知名的技术社区,其中也有很多关于C语言的技术文章、教程和博客,可以帮助你快速入门或提高自己的技能。CSDN - 专业开发者社区
- ChatGpt: 很智能,可以帮助解决很多问题,会给出详细的解析和代码
3,怎么问问题?
- 提供代码(对人和chatgpt提问时,报错时复制错误原因):光看图片可能改一个错就觉得完事了,发代码的话我是会跑一遍的
- 提问清晰:请尽可能清晰地描述您的问题
- 简明扼要:请尽量使用简单的语言和简洁的句子来表达您的问题
- 单一提问:请一个一个地问,而不是把所有问题放在一个问题中
- 不要提供敏感信息:请不要在您的问题中提供任何个人敏感信息
二 怎么查更快(浏览器内)?
Ctrl键+T新建标签页,输入问题,Enter键
选中要问的内容(不要太多),用鼠标拖拽到空白区域完成搜索
使用Alt+Tab切换到提问题的网页
三 一些刷题网址
为什么刷题?
做题可以帮助我们巩固基础知识,熟练掌握常用的算法和数据结构,并提升编程能力。
最主要的是,快,期末考试是90分钟完成五道题,那么我们要达到18分钟一道题的速度才可以全部完成
学校出题大概率是从现在的NENU.OJ上选题来做,如果在不久前就做过考试题,那么会答题答得非常快
!请重视现在的课堂测试,平时分不一定看你oj排名,但一定看你随堂测试的成绩
!!!不要抱着作弊的想法,期末考试用的是学校机房的电脑,教师电脑上能看到所有人的屏幕,没被抓到是运气好,平时测试作弊的话,在感受过轻易拿到高分后很难再刻苦刷题去提升实力,最后走上考场时啥也不会
1,牛客
特别推荐,这里有免费而且功能强大的调试
2,Acwing
推荐的原因是这里的题有视频讲解
3,力扣
面向c++程序员的,一开始使用起来可能会不习惯,但比较实用
这里有设计好的培训课程
每道题都有专门的题解讨论区
4,codeforce
全英文题面,在全球流行
如果大家去打的话,一开始去打dev4就行了
5,vjudge
可以来这里找到nenuACM的培训题
四 输入法
1,输入法
写c++程序的时候不建议使用中文输入法
因为有时按shift键后忘记按键,会切换中英文
(HTML就适合使用中文输入法因为基本不需要按shift键)
这里提供WIN11如何下载英文输入法的方法:
- 点进设置
- 进入时间和语言
- 进入语言和区域
- 在首选语言后选择添加语言
- 找到英语并添加
2,怎么关掉微软输入法
微软输入法是很多电脑自带的,但是功能很多时候并没有一些别的输入法强
我们在刚刚进入的语言和区域中可以找到中文,
点击省略号,然后点击语言选项
在键盘中可以在微软输入法后的省略号里选择删除
如果微软输入法这个流氓软件它又出来了,这时你还找不到它,就在已安装的键盘上选择添加键盘中的微软输入法然后再删除一遍(比较管用)
五 快捷键
1,切换页面
在浏览器中使用Ctrl + PgUp 为切换到上一页
(如果不好用,请按NumLk键以切换状态,
通常当第三个提示灯开启的时候,
我们使用九宫格输入数据,如1,2,3,4...,
当提示灯关闭的时候,我们使用九宫格所带来的方便按键,如Home,End,PgUp,PgDn)
在浏览器中使用Ctrl + PgDn 为切换到下一页
如果要切换一个窗口,请使用
Alt+Tab(下一个窗口)
Alt + Shift + Tab (上一个窗口)
(Tab 与 Shift + Tab 的作用通常是相反的,
这里介绍一个常用的代码技巧,
当你为把一大段内容放进某个大括号里后,你发现原有的缩进格式荡然无存,如果一行行敲又太麻烦了,请将要进行缩进的内容选中,按Tab,你会发现所有的代码一起往后退了一个Tab的距离
如果按Shift + Tab 那么代码会往前缩进一个Tab的距离
Tab的距离:...... .......(省略号中间的距离即为Tab长度)
空格的距离:.... ....
)
2,关闭
在浏览器中使用Ctrl + W关闭标签页
如果要关闭一个窗口,请使用Alt+F4
(如果不好用,请在按Fn的同时按Alt + F4
很多时候F打头的快捷键使用不了是因为笔记本将快捷键用在了别的地方比如调节亮度,
这个时候按住Fn或者按一下Fn后就可以使用快捷键了
)
3,全选复制粘贴
Ctrl+A全选
Ctrl + C复制
Crtl + V粘贴
(
在dev中,我们要复制某一行的内容可以使用Ctrl + E,
删除一行内容可以用Ctrl+D
)
4,截图
QQ截图:Ctrl + Shift + A
屏幕截图:win + Prtsc(如果不好用就按住Fn)
5,Home End
这两个代码可以帮助你快速将光标移动到一行的首部或末尾
(笔记本电脑在使用前需要确定是否关掉NumLock数字键盘锁定)
六 缩进
1,为什么缩进?
代码格式需要缩进是为了使代码更易于阅读和理解。
通过良好的缩进,代码结构更加清晰明了,容易分辨出代码块的嵌套关系,方便代码的调试和维护。
同时,缩进也可以避免一些错误,例如在条件语句或循环语句中,如果没有正确地缩进代码,可能会看不出不正确的代码执行顺序,最后得到不可预测的结果。
因此,好的代码风格需要正确并遵循一致的缩进规则。
2,怎么缩进?
将大括号内部的代码向→缩进
每一级缩进需要使用多个空格(一般是四个空格)
七 用C还是C++?
推荐用c++
首先,c++兼容c
也就是说,用c++去运行c的程序不会出一点问题
我们可以通过使用c++环境来节约书写头文件的时间(因为c++有一个万能头文件)
#include <bits/stdc++.h>
using namespace std;
int main(){
//我们几乎可以在这里使用任何一个函数而不去添加新的头文件
return 0;
}
同时,c++中有大量已经写好的函数
如:
-
string
类型:C++中提供了一个 string 类型,用于表示字符串,可以方便地进行字符串操作。例如:string str = "Hello, World!";
-
auto
关键字:C++11中增加了 auto 关键字,可以自动推导变量的类型。例如:auto num = 10;
-
vector
类型:C++中提供了一个 vector 类型,用于表示动态数组,可以方便地插入、删除、访问数组元素。例如:vector<int> nums = {1, 2, 3};
-
map
类型:C++中提供了一个 map 类型,用于表示关联数组(字典),可以方便地根据键(key)访问对应的值(value)。例如:map<string, int> dict;
-
unordered_map
类型:C++11中增加了一个 unordered_map 类型,与 map 类型类似,但是内部实现采用哈希表,具有更快的访问速度。例如:unordered_map<string, int> dict;
-
pair
类型:C++中提供了一个 pair 类型,用于表示一个键值对。例如:pair<string, int> p = make_pair("Alice", 20);
-
emplace
函数:C++11中增加了一个 emplace 函数,可以方便地在容器中插入元素。例如:vector<pair<string, int>> v; v.emplace_back("Bob", 30);
-
lambda
表达式:C++11中增加了 lambda 表达式,可以方便地定义一个匿名函数。例如:auto sum = [](int a, int b) { return a + b; };
-
unique_ptr
类型:C++11中增加了一个 unique_ptr 类型,用于管理动态分配的内存,可以避免内存泄露。例如:unique_ptr<int> p(new int(10));
-
shared_ptr
类型:C++11中增加了一个 shared_ptr 类型,与 unique_ptr 类型类似,但是可以共享同一个内存块,可以避免内存泄露和空指针问题。例如:shared_ptr<int> p = make_shared<int>(10);
九 初始化对象
初始化一个数组
在c中,我们经常会用一个变量去开辟一个数组的空间
但在c++不要这么做,会出问题
大可以const int N=一个够用的数
然后在函数外定义一个全局的数组
由于某种原因,这个数组的初始值会全部为0
memset
可以设置数组中的元素值
构造函数(c++)
我们在学Java的时候也学到了构造函数,那么什么是构造函数?
定义
建立一个对象时,通常最需要立即做的工作是初始化对象,如对数据成员赋初值
构造函数就是用来在创造对象时初始化对象,为对象数据成员赋初始值
用法
主要是用在结构体(struct)中
我们不妨稍后在结构体中说
十 结构体
为什么要用结构体?
我们在接收数据的时候,如果接收了一种对象的很多数据,如果分开设数组的话,
首先,我们可能会很乱,不记得哪个是哪个是常有的事情
再有,当我们要交换两个对象的时候,我们可能要将每一个数据都交换一下
但通过定义一个自定义的数据类型(结构体),我们可以同时访问和操作不同类型的数据成员(如整型、字符型、数组等)
也就可以方便地对其进行管理和处理。
定义结构体
//我们用c++去写一个结构体
struct stu{
int number;
int class;
int age;
char name[20];
char home[100];
};
//用我刚刚自定义的学生型变量定义一个数组
stu s[100]
//c语言中则需要
struct student s[100]
//c语言也可以使用typedef去节约掉struct
typedef struct student{
int number;
int class;
int age;
char name[20];
char home[100];
}stu;
c++的结构体可以放函数(套娃)
#include <bits/stdc++.h>
using namespace std;
//结构体的定义通常是在主函数外的
struct student{
int age;
//下面就是一个构造函数
student(int _age = 18){
age=_age;
}
};
int main(){
student qq = student();
student cc = student(19);
printf("%d\n",qq.age);
printf("%d\n",cc.age);
return 0;
}
十一函数重载
为什么要用函数重载?
- 因为我们接收的数据可能不同,这时,我们可以根据接收数据的不同对数据进行不同的处理
- 我们面向的对象可能并没有输入全部的信息
怎么使用函数重载?
使用方法很简单,只需要对同一个函数名设置不同的参数列表
示例:
int add(int a,int b){
return a+b;
}
int add(int a){
return a;
}
//参数列表看的是参数类型而不是参数的名称
//如果再加一个int add(int as)的函数就会出错
//我们可以设置参数的缺省值,当这个函数没有输入这个参数时我们使用缺省值来做这个函数的值
int minus(int a,int b=0){
return a-b;
}
int main(){
int a = add(0);
int aplusb = add(0,0);
}
十二C标准库常用函数
<cstring>
-
strlen()字符串长度
-
strcmp()字符串比较
-
strcpy()字符串拷贝
-
memset()暴力清空
memset(str,0,sizeof(str));
比for循环快,
对字符数组无所谓
但对整数数组只能赋值1
-
memcpy()暴力拷贝
等待更新