文章目录
零、头文件(其实是预编译命令,头文件是尖括号里面的词):
#include<bits/stdc++.h>//流氓的万能头
#include<iostream>//标准输入/输出库
#include<cmath>//数学函数库,可以用square、abs、
#include <cstdio>
#include <fstream>
#include <algorithm>//函数的、、、
#include <cstring>//拿来处理char字符串的
#include<climits>//INT_MAX;INT_MIN找到最大值最小值
//stl:
#include <deque>
#include <vector>//向量
#include <queue>//队列
#include <string>//string
#include <cstring>
#include <map>
#include <stack>//栈
#include <set>
注意,可以用尖括号或双引号(如"user"),双引号用于个人编写库,预编译器会优先到用户的目录中寻找相应文件,找不到再去系统标准库中找。
一、输入输出
scanf输入
scanf("格式",&变量1,&变量2...&变量n);
记得加&&&&&&&&&&&&&&&&&&&&&&&&&&&&&!!!!!!!!!!!!!!
printf输出
printf("内容与格式",变量1,变量2...,变量n);
%c 字符
%d 带符号整数
%i 带符号整数,可以自动把8进制和16进制转化成10进制,%d不行
%e 科学计数法, 使用小写"e"
%E 科学计数法, 使用大写"E"
%f 浮点数
%g 使用%e或%f中较短的一个
%G 使用%E或%f中较短的一个
%o 八进制
%s 一串字符
%u 无符号整数
%x 无符号十六进制数, 用小写字母
%X 无符号十六进制数, 用大写字母
%p 一个指针
%n 参数应该是一个指向一个整数的指针
指向的是字符数放置的位置
%% 一个’%'符号
好的文章 :https://blog.csdn.net/jisuanji198509/article/details/80466546?ops_request_misc=&request_id=&biz_id=102&utm_term=printf&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-80466546.nonecase&spm=1018.2226.3001.4187
printf(12.6%f,a);
//至少输出12位,保留6位小数
- 精度修饰符 %e, %E和 %f,精度修饰符让你指定想要的小数位数
单精度浮点数用f,双精度浮点数用lf(printf可混用,但scanf不能混用) - 用%g和 %G, 精度修饰符决定显示的有效数的位数最大值.
- 用%s,精度修饰符简单的表示一个最大的最大长度, 以补充句点前的最小字段长度.
- 所有的printf()的输出都是右对齐的,除非你在%符号后放置了负号.
(版权声明:本文为CSDN博主「xm0420」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xm0420/article/details/111561602)
四舍五入
- 可以用printf,可能有坑(?)
- 人工四舍五入
a = int (a+0.5);
cout<<fixed<<setprecision()<<endl;
是四舍六入保留最后一位小数位为偶数(2.35到2.4,2.25到2.5),但是影响一直持续;cout<<setprecision()<<endl;
括号里写有效数字;用cout.unset(?真的没查到?)来消除影响- 查库函数(见博客 关于floor,ceil,round )
其他
- 复制粘贴比较保险
- scanf输入多位数小数
- 输入的一串东西以回车结束,回车表示输入结束,输入的内容先放到缓冲区,在cin时读取,看的是缓冲区有没有东西,没有东西才等你输入
二、位运算
对二进制数逐位进行操作
位与 &
位或 |
异或 ^ :相同为0,相异为1
取反 ~ :1变0,0变1
左移 << :数位+1,相当于乘2,2n写作1<<n
右移 >> :数位-1,相当于除以2
三、分支
if
就不详细写了吧
switch:
switch(表达式){
case 常量表达式1:语句1;break;
case 常量表达式2:语句2;break;
case 常量表达式3:语句3;break;
case 常量表达式n:语句n;break;
default:语句n+1;//都匹配不上时
//default可以不写,否则直接跳出
//枚举类型用数字和名字都可以
//case后面必须是常量,是数字,不可以是变量
//一般都要加break吧??减少时间?
}
四、循环
1、for
//求i[n] = 1-n*i[n-1]?
#include<iostream>
using namespace std;
const double e = 2.71828;
double x;
int main(){
x = 1/e;
cout<<x<<endl;
for(int i=1;i<=20;i++){
x = 1-(i*x);
cout<<x<<endl;
}
//unstable algorithm初始的小扰动(截断误差)经过n!的倍数,误差会迅速放大
//stable algorithm 先估计一个i[N],如先算i[20],然后i[n-1] = (1-i[n])*1/n;
//减少误差了!估计的i[20]用计算器按出来。
return 0;
}
2、while(cin>>value)
用control+Z,输入了^Z表示输入结束!!!
#include<iostream>
using namespace std;
int x,ans=0;
int main(){
while(cin>>x){//终止时按ctrl+Z,出现^Z,表示终止输入
ans++;
}
cout<<ans<<endl;
return 0;
}
如果用户怕输错,用文件输入 ifstream和ofstream吧???忘了……
面向用户的程序设计(
3、do……while
确保进行一次循环,然后判断条件为true才继续
do{
cin>>n;
}while(n<=0);//输入正整数
例子:弦截法求零点,如果函数的变化幅度很大,用弦截比二分快
4、常用语句
break
跳出整个循环;
while(1){
if() break;
}
不是跳出if时跳出循环啦
continue
跳出当前循环,进行下一次
五、数组
- 赋初值用
{1,2,3,4,5};
叫做初始化表,如果短于数组长度,后面的都为0. - 有初始化表的数组可以不填数组规模
a[] = {1,2,3,4,5};
自动设置. - 数组名字存的是数组的起始地址(16进制)
- 如果你是一维的,a是地址;如果是二维,a[0],a[1]…是地址
- 如果使用了没有定义的数组下标,计算机会跑到对应位置去把数据读过来或者把别的变量的值冲掉(
六、字符串
字符串所需的存储空间比实际的字符串长度大1!
char ch[ ] = { ‘H’, ’e’, ’l’, ’l’, ’o’, ’,’,
’w’, ’o’, ’r’, ’l’, ’d’, ’\0’};
char ch[ ] = {”Hello,world”};
char ch [ ] = ”Hello,world”;//空间是12,有\0占了一个字节空间
- 不包含任何字符的字符串叫空字符串
“”
- 含一个空格的字符串
“ ”
- 空字符
‘ ’
(?是吗)
输入
cin&cout
-
如定义了一个字符数组ch。要输入一个字符串放在ch中,可直接用
cin >> ch;
-
要输出ch的内容。可直接用
cout << ch;
-
注意:
cin输入是以空格、回车或Tab键作为结束符。因此无法输入包含空白字符的字符串。
在用cin输入时,要注意输入的字符串的长度不能超过数组的长度。因此,最好在输出的提示信息中告知允许的最长字符串长度。 -
如果字符串后面多了很多怪的字符,说明 \0 没放好
char s[10- = "1234";
cout<<s; //output:1234
s[2] = \0;
cout<<s;//output:12
s[4] = 5;
cout<<s; //output:12345@^%%*^(*
从终端接受一个包含任意字符的字符串:
- cin.get(字符数组,长度,结束字符) 结束字符默认为回车,如果默认的话可以不写第三个参数。如:
cin.get(s, 80, ‘.’)
- cin.getline(字符数组,长度,结束字符)
- 遇到输入结束符或输入字符数为(长度-1)时结束(留一个给\0)
区别:cin.get将结束字符留在输入流中,而cin.getline将结束字符从输入流中删除
自学:实验指导的实验7,老师在canvas上面发的文件
字符串相关函数
是string库里面的函数,注意:
- 小心空间爆掉,如果你要copy或者cat连接
- 不建议把strlen()写在for语句里面,不然每次都要调用这个函数,效率低
- 不允许用strlen()的话可以直接ch[i]!=\0
- compare用的是ASCII,大写在小写前面(意思是大写的码比小写的码小吗),不可以直接关系运算符比较(比的是首地址啊),要用strcmp。
七、函数
自带的库里面的函数(不完全包括如下,真的很不完全):
toupper(ch);//变大写
tolower(ch);//变小写
用户自定义的函数:
-
关于
return 0;
如果黑框运行结果最后面不是 before return value 0 就有可能哪里错了 -
把函数写在main的后面时,在main前面要加声明,声明是一般函数的第一行不要后面花括号再加semicolon(semicolon——请python小孩别骂了嘤嘤嘤嘤嘤嘤)
-
一个函数在调用的时候现场开空间,用完了再把空间释放掉,注意管理内存!!!开全局还是开局部?
-
使用函数的时候括号里面是实参,函数主体第一行括号里面声明的是形参,形参怎么变不改变实参的值,哪怕他们俩名字真的一样,但如果不是全局变量大概是没问题的。
-
如果把数组作为参数:智能的 C++语言规定,数组作为参数传递时,传递的是数组元素的首地址。(地址作为形参)如 list 的首地址为1000,在函数中形参数组的首地址也为1000。因此在函数中对形参数组的修改就是对数组list的修改。(为了防止时间和空间的浪费,,c++选择只在函数里面新开一个存数组起始地址的空间,实在是太智能辣)注意实参在main里面写的时候就写数组名,形参在函数里面声明的时候是数组名加空的方括号,如
array[]
,说明是一个数组(否则会认为是一个参数变量而不匹配的),但是其实是只传递一个地址。数组作为参数的point在于:传递的地址没有改,但可以改变地址里面存放的内容,但是如果你在函数里面把你的形参地址改掉了,那么一样的下标不会对应以前那个空间了(因为相当于地址发生改变了)!!eg:a++;
//把a数组的空间加1,事实上是使a到达下一个空间,具体对int的a是把地址+4(一个int) -
字符数组也算数组……只是字符数组自带了终止符,你输出也不需要for到判断终止
-
二维数组的第一维可以省略,而第二维不可省略
-
C++在声明函数原型时,可以为一个或多个参数指定缺省值。调用此函数时,若缺省某一参数,C++自动以缺省值作为此参数的值。如:
int special(int x=2, float y=1.5)
调用时可用:
special(5,3.2) //x=5; y=3.2
special(6) //x=6; y=1.5
special( ) //x=2; y=1.5
注意:
缺省参数无论有几个,都必须放在参数序列的最后,
例如:Int SaveName (char *first, Char second=””,char *third=””, char *fouth=””);
在函数调用时,若某个参数省略,则其后的参数皆应省略而取其缺省值. -
codeblocks中常用函数+缺省值,在同一个project里面,如果该cpp文件里面没有这个f,也可以调用但要在前面声明,不同cpp里面的缺省值可以设置的不一样(但是不知道具体怎么办)
内联函数(在正常函数前面加inline)
把被调函数的代码直接嵌到主调函数里面,提高效率,省去了函数的乱七八糟前面后面的操作,但是缺点是容易出错
在比较简单的函数可以内联,代码长和出现循环一般不内联
重载函数(chongzai)
允许函数名相同,但是函数类型或参数个数或参数类型不同
提高函数的易用性
函数模板
函数模板:你干的事
模板函数:计算机干的事
为了解决多种数据类型同种计算方法的事情,免得你多写(
template <class T>
T power(T base, int exponent)
{
T result=base;
if (exponent==0) return (T)1;
if (exponent<0) return (T)0;
while(--exponent) result*=base;
return result;
}
//<class T>表示T是一种类型,而此类型将在调用此函数时才给予。
int main()
{
int i=power(5,4);
long long int l=power((long long int )1000,3);
double d=power(1e5,2);
cout<<"i="<<i<<endl;
cout<<"l="<<l<<endl;
cout<<"d="<<d<<endl;
return 0;
}
- 如果试图基于一个不支持模板内部所使用操作的类型实例化一个模板,会导致编译错误,如用string算3次方
- 用到的时候才会生成对应类型的模板函数
- 如果输入的数据类型不一样,不能强制转换,程序会混乱的;修改方法:人为强制转化,在写代码的时候就加进去,如
maxnum((double)4,4.2)
或者maxnum<double>(4,4.2)
很复杂的数据类型变化:
最后一行错了,是<double,int,double>
第六个,使用普通函数的时候强制类型转换成ASCII码
附:coding技巧
逻辑表达式是左结合的
把可能得出判断的条件放在左边,可以减少运算量
问号冒号表达式:(条件)?表达式1:表达式2
如果真则是1,假则2
逗号表达式
用于for循环里面的初始化,可以在一个分号里面做很多个操作,是依次往后执行的
虽然一般不这么用呜呜呜呜呜
i++和++i
i++是先操作再++;++i是先++再操作.