CSP、CCSP刷题笔记

函数

round(double x):四舍五入,返回double型

memcpy()数组复制函数

如果要从数组a复制k个元素到数组b,可以这样做:memcpy(b,a,sizeof(int)k)。当然,如果数组a和b都是浮点型的,复制时要写成“memcpy(b,a,sizeof(double)k)”。另外需要注意的是,使用memcpy函数要包含头文件string.h。如果需要把数组a全部复制到数组b中,可以写得简单一些:memcpy(b,a,sizeof(a))。

memset()__初始化数组

memset**是计算机中C/C++语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值,例如:memset(a, 0, sizeof(a));

sprintf()、sscanf()

//sscanf()支持正则表达式

//sprintf的作用是将一个格式化的字符串输出到一个目的字符串中,而printf是将一个格式化的字符串输出到屏幕。sprintf的第一个参数应该是目的字符串,因为C语言在进行字符串操作时不检查字符串的空间是否够大,所以可能会出现数组越界而导致程序崩溃的问题。
char str[80];
sprintf(str, "Pi 的值 = %f", M_PI);
puts(str);
//输出Pi 的值 = 3.141593

输入输出重定向

FILE * freopen ( const char * filename, const char * mode, FILE * stream );

filename: 要打开的文件名

mode: 文件打开的模式,和fopen中的模式(r/w)相同

stream: 文件指针,通常使用标准流文件(stdin/stdout/stderr)

返回值:成功,则返回一个path所指定文件的指针;失败,返回NULL。(一般可以不使用它的返回值) 

功能:实现重定向,把预定义的标准流文件定向到由path指定的文件中。标准流文件具体是指stdin、stdout和stderr。其中stdin是标准输入流,默认为键盘;stdout是标准输出流,默认为屏幕;stderr是标准错误流,一般把屏幕设为默认。通过调用freopen,就可以修改标准流文件的默认值,实现重定向。
    freopen("in.txt","r",stdin); //输入重定向,输入数据将从in.txt文件中读取
    freopen("out.txt","w",stdout); //输出重定向,输出数据将保存在out.txt文件中

字符数字转int

s[i] - '0'//减去‘0’即可

struct

//struct类比class.只是与类的区别在于默认访问权限为public,C++ 中关键字struct和class都是用来定义类的,二者除了默认访问限定符不同,其他所有方面都一样。
struct A{
};
struct A{
}a,b;
//以上第一种只是定义了一个类型为A的结构体名称.第二种同时也定义了结构体变量a,b.(类似定义类A的变量)
struct {
}a,b;
//缺省结构体,这样定义不能再定义其他类型的结构体


typedef struct node   
{
	int data;   //用于存放数据
	struct node  *next;    //这个就是连接部,用于寻找下一个结点
}Node,*Pnode; //如果我没理解错的话,*Pnode就是Node *的别名,专门用来创建指针,不用再多打一个*号;

//可以定义自己的指针变量,但不能在内部定义自己,因这样会循环定义

在这里插入图片描述

随机排序(vector)

//srand()函数是随机数发生器,设置种子,如果种子没有发生变化,则每次生成的随机数都是一样的
//通常可以利用系统时间来改变系统的种子值,即srand(time(NULL))或srand(time(0))
//time(0)的返回的是从1970 UTC Jan 1 00:00到当前时刻的 秒数 ,为unsigned int类型。故rand()运行间隔要大于一秒
srand((unsigned int)time(0));
//随机排序,shuffle为洗牌的意思
random_shuffle(vec.begin(),vec.end());

//rand()
//RAND_MAX 是 <stdlib.h> 中伪随机数生成函数 rand 所能返回的最大数值。
//这意味着,任何一次对 rand()的调用,都将得到一个 0~RAND_MAX 之间的伪随机数。
//若想返回0-1,则(double)rand()/RAND_MAX
rand()%10//返回[0-10)
rand()%100//返回[0-100)
rand()%1000//返回[0-1000)



一句话


没有用到循环条件中的变量就用while循环

标记的技巧,图形模拟题,对于图形重叠,可用标记

scanf函数有返回值?对,它返回的是成功输入的变量个数

C语言中没有对任意底数求对数的函数,必须使用换底公式, l o g a b = l o g e b l o g e a log_ab = \frac {log_eb} {log_ea}

printf不能输出string,要么printf与cout分开使用,要么使用c_str()函数(不推荐)


杂技


pragma warning(disable:****) //****为警告代码

size_t是标准C库中定义的,应为unsigned int,在64位系统中为 long unsigned int。

binary_search(

大家都知道,二分查找是在排序后的基础上来对其进行查找操作。所以在使用bianry_search的时候,需要将要查找的容器进行排序。排序的必须是从小到大
binary_search(a,a+N,1);//从a-a[N]中查找1

memset():建议只给数组赋0或-1

memset是计算机中C/C++语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。
void *memset(void *s, int ch, size_t n);
函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法

0的补码全为0,-1的补码全为1,如果对数组赋其他值,则用fill函数




为啥开辟数组int a[1000000](大数组)放到main函数之前

全局变量在静态存储区分配内存,局部变量是在栈上分配内存空间的,这么大的数组放到栈上不溢出吗?
VC堆栈默认是1M,int a[1000000]的大小是4*1000000,将近4M,远远大于1M,编译连接的时候不会有问题,但运行是堆栈溢出,程序异常终止。

如果你真的需要在堆栈上使用这么大的数组,那么可以在工程选项链接属性里设置合适的堆栈大小。

全局变量在静态存储区分配内存,局部变量是在栈上分配内存空间的。(c语言程序在运行时会动态创建一个堆栈段,里面存放着调用栈,保存着函数的调用关系和局部变量。)如果数组太大,可能会造成栈溢出。

如果数组大小较大(大概10^6级别),则需要将其定义在主函数外面,否则会使程序异常退出,原因是函数内部申请的局部变量来自系统栈,允许申请的空间较小;而函数外部申请的全局变量来自静态存储区,允许申请的空间较大。例如下面的代码就把10^5大小的数组定义在了

系统栈(也叫核心栈、内核栈)是内存中属于操作系统 空间的一块区域,其主要用途为:
	(1)保存中断现场,对于嵌套中断,被中断程序的现场信息依次压入系统栈,中断返回时逆序弹出
	(2)保存操作系统子程序间相互调用的参数、返回值、返回点以及子程序(函数)的局部变量。
用户栈是用户进程空间中的一块区域,用于保存用户进程的子程序间相互调用的参数、返回值、返回点以及子程序(函数)的局部变量。


while(~scanf("%d %d",&a,&b)) = while(scanf("%d %d",&a,&b)!=EOF)

scanf函数返回成功读入的数据项数,读入数据时遇到了“文件结束”则返回EOF。
(EOF不是一个字符,它被定义为是int类型的一个负数-1。)
 ~是按位取反操作符,-1补码:1111 
 按位取反后为0000

EOF

在C语言中,EOF值为-1,在终端中,ctrl+z输入EOF,再按回车确认。

while(cin>>a)
在这里插入图片描述

count()

count(A[i],A[i]+105,true);//count为C++标准库自带函数,返回给定的迭代器所指区间内所有等于指定值的元素个数

i&1:判断一个数的奇偶

偶数二进制表达的末尾一定是0,
奇数二进制表达的末尾一定是1;
若i为奇数,i&1为1.若i为偶数,i&1为0.

sort()

//sort(start,end,排序方法)  start:起始地址 end:终止地址(亦可传入迭代器起始终止)可以对 浮点数,整数,字符,字符串,结构体进行排序
sort(v.begin(),v.end(),cmp);//按照自定义函数cmp进行排序,cmp函数返回值为bool类型
sort(str.begin(), str.end());//默认从小到大排序
sort(str.begin(), str.end(),greater<char>());//通过greater(仿函数)指定从大到小排序


bool compare(int a,int b){
		return a>b; //如果是从小到大,将">"变成“<”即可;
}

核心代码:
bool compare(T   a,T  b)    // T 为数据类型,根据具体的要传入的数据来求确定{       
  		if(   )  //先满足什么条件的先排序
           return  a>b; //按什么规则排序,此处按从大到小排序,
       else  if() //再排又满足什么条件的;
           return ......;
}

gets()、scanf()

gets来输入一行字符串(注意:gets识别换行符\n作为输入结束,因scanf完一个整
数后,如果要使用gets,需要先用getchar接收整数后的换行符),并将其存放于一维数组(或二维数组的一维)中;puts用来输出一行字符串,即将一维数组(或二维数组的一维)在界
面上输出,并紧跟一个换行。

指针减法
在这里插入图片描述


指针的引用
在这里插入图片描述在这里插入图片描述


函数内联

函数调用在执行时,首先要在栈中为形参和局部变量分配存储空间,然后还要将实参的值复制给形参,接下来还要将函数的返回地址(该地址指明了函数执行结束后,程序应该回到哪里继续执行)放入栈中,最后才跳转到函数内部执行。这个过程是要耗费时间的。

另外,函数执行 return 语句返回时,需要从栈中回收形参和局部变量占用的存储空间,然后从栈中取出返回地址,再跳转到该地址继续执行,这个过程也要耗费时间。

内联函数和普通函数的区别在于:当编译器处理调用内联函数的语句时,不会将该语句编译成函数调用的指令,而是直接将整个函数体的代码插人调用语句处,就像整个函数体在调用处被重写了一遍一样。
发布了27 篇原创文章 · 获赞 15 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_42306122/article/details/97620987
今日推荐