1

1、定义π的时候可以通过C库函数的acos()实现
(通常尽量用const关键字声明常数)

const double pi=acos(-1.0);

acos()函数的声明:

double acos(double x);

参数:

x——浮点值在区间[-1,+1]

返回值:

返回x的反余弦,在区间[0,π]弧度.

2、数据类型的范围

int            min  -2147483648
               max   2147483647               10^10
unsigned int   min   0
               max   4294967295               10^10
long long      min  -9223372036854775808 
               max   9223372036854775807      10^19

代码验证:

int main()
{
    int i=1;
    while(i>0)
    i++;

    cout<<"min   "<<i<<endl;
    cout<<"max   "<<i-1<<endl;
    return 0;
}

double型浮点数能精确到多少位小数:16位 (15~16)
float型浮点数能精确到多少位小数: 7位 (6~7)

代码验证:

double i = 1.0, j = 3.0;
    
printf("%.20lf\n",i/j);//超过一定位数就会开始产生错误数据

double存储最大字节数 : 8
double型浮点数最大正数值:1.7976931348623158e+308
(但是注意,初始化的数字位数过长,会导致编译器内部缓冲溢出)

代码验证:

int main(){
    double i=0.0000000000000001;
    for(;i>0;i+=0.0000000000000001){
        
    }
    printf("%.100lf\n%.100lf\n",i,i-1);
    return 0;
}

float 存储最大字节数 : 4
float 最小值: 1.175494E-38
float 最大值: 3.402823E+38
精度值: 6

代码验证:

#include <stdio.h>
#include <float.h>
 
int main()
{
   printf("float 存储最大字节数 : %lu \n", sizeof(float));
   printf("float 最小值: %E\n", FLT_MIN );
   printf("float 最大值: %E\n", FLT_MAX );
   printf("精度值: %d\n", FLT_DIG );
   
   return 0;
}

3、需注意的优先级

逻辑运算符优先级:!> && > ||  不过最好加括号咯    
按位与& > 按位异或^ > 按位或|

4、stdio是standard I/O的缩写 头文件只包含函数的声明和一些宏定义,真正的函数定义在库中,编译时用不上,链接时才会加入进去

5、floor()返回不超过x的最大整数 向下取整,直接去掉小数部分
floor(x+0.5)就可以实现四舍五入啦

6、测试程序运行时间:

printf("Time used = %.2lf\n", (double)clock()/CLOCKS_PER_SEC);//头文件<time.h>,以秒为单位

7、为了避免输入数据的时间影响测试结果,可以使用“管道”

在windows命令行下 执行 echo 20|abc 操作系统会自动把20输入,其中abc是程序名
linux下需要输入echo |./abc 因为默认情况下,当前目录不在可执行文件的搜索路径中

8、输入输出重定向


 freopen("in.txt","r",stdin); 
 freopen("out.txt","w",stdout); //在正式提交的时候要记得注释掉

Windows 下用fc命令进行文件比较 Linux下 diff

有一种方法在本机测试时用文件重定向,但是一旦提交到比赛就自动删除的重定向语句(只需要删除#difine LOCAL)

#define LOCAL//只有定义了符号LOCAL,才能编译里面两条语句
int main()
{
    #ifdef LOCAL
     freopen("in.txt","r",stdin); 
     freopen("out.txt","w",stdout);
    #endif
}
#include <fstream>
using namespace std;
ifstream fin("test.in");
ofstream fout("test.out");
int main()
{
    int a,b;
    while(fin>>a>>b)
    fout<<a+b<<"\n";
    return 0;
}

//如果想要标准输入,只需要把fin和fout的声明语句去掉
//然后加上这两行:#define fin cin
             #define fout cout
//用输入输出流时,标准输入流cin比文件流fin慢很多

更好的方法是在编译选项中定义LOCAL而不是在程序中,这样在提交的时候就不用删除了.
(实施方法留待补充)

若比赛要求用文件输入输出,但禁用重定向方式,解决方法:

int main(){    
    FILE *fin,*fout;
    fin=fopen("data.in","rb");
    fout=fopen("data.out","wb");
    ...
    fscanf(fin,"%d",&x);
    fprintf(fout,"%d\n",x);
    fclose(fin);
    fclose(fout);
    return 0;
    }   

注意:如果想把fopen版的程序改成读写标准输入输出,只需赋值:

fin=stdin;
fout=stdout;

不需调用fopen和fclose.

重定向:写起来简单自然,但是不能同时读写文件和标准输入输出
fopen:虽然繁琐,但是灵活性较大(eg:可以反复打开并读写文件)
!还有一个条件编译 待了解和熟悉掌握!!!

9、while循环时最好是判断一下scanf()的返回值.

10、注意数组放在main()函数外才能开的很大,放在里面的时候稍微过大就会异常退出

11、要把数组a复制k个元素到数组b:

memcpy(b,a,sizeof(int)*k);//头文件string.h
memcpy(b,a,sizeof(a));//a中元素全部复制

12、scanf("%s",s);会读入一个不含空格、TAB、回车符的字符串//char s[maxn]

strchr(s,'a');//在一个字符串中查找单个字符
sprintf(buf,"%d%d%d%d%d",a,b,c,d,e);//输出到字符串buf,注意保证buf有足够空间

strlen(s)可以返回字符串s中结束标记之前的字符个数 strcpy(a,b),strcmp(a,b),strcat(a,b)
13、用typedef定义结构体

typedef struct {    doublex,y;    }Point;

14、指针问题

int *a;//声明的变量a 是指向int型变量的指针;
a=&b;//把变量b的地址存放在指针a中
//(*a)表示a指向的变量
//注意指针如果没有赋初值,你不知道它指向哪里,如果它指向系统区,不可被写入,程序可能会崩溃

计算左闭右开区间内元素和:(关于数组作为参数传递问题)两种sum重要写法

//方法一:
int sum(int *begin,int *end)
{
    int n=end-begin;//数组形式传递的其实是数组首地址
    int ans=0;
    for(int i=0;i<n;i++)
    ans+=begin[i];

    return ans;
}
//方法二:
int sum(int *begin,int *end)
{
    int *p=begin;//注意定义指针时一定要记得给它赋初值
    int ans=0;

    for(int *p=begin;p!=end;p++)
    ans+=*p;

    return ans;
}

15、读取一整行的方法:

//方法一:
string  line;
getline(cin,line);
//方法二:
char str[maxn];
cin.getline(str,maxn);//读入char数组
//cin.getline第三个参数表示间隔符,默认为换行符'\n'。读入不需要考虑最后的换行符。
//方法三:
char buf[maxn];//读取不超过maxn-1个字符
fgets(buf,maxn,fin);//可以使用它兄弟gets()但是不推荐
//方法四:
char str[1024];
int i=0;
while((str[i]=getchar())!='\n')
    i++;
getchar();
//说明:这样一个一个读也可以,也会把开头的空格读进来。最后也需要考虑换行符,使用getchar()读处理。
//方法五:
char str[1024];
scanf("%[^\n]",&str);
getchar();

scanf函数也可完成这样的功能,而且还更强大。这里主要介绍一个参数,%[ ],这个参数的意义是读入一个字符集合。[ ]是个集合的标志,因此%[ ]特指读入此集合所限定的那些字符,比如%[A-Z]是输入大写字母,一旦遇到不在此集合的字符便停止。如果集合的第一个字符是"^",这说明读取不在"^"后面集合的字符,既遇到"^"后面集合的字符便停止。注意此时读入的字符串是可以含有空格的,而且会把开头的空格也读进来。
注意:如果要循环的多次从屏幕上读取一行的话,就要在读取一行后,在用%c读取一个字符,将输入缓冲区中的换行符给读出来。否则的话,在下一次读取一行的时候,第一个就遇到'n',匹配不成功就直接返回了。这里可以用scanf()或者getchar()函数读取换行符。

16、结构体的一种赋值方式(我平常比较少用)

template <typename T>
Struct Point{
    T x,y;
Point(T x=0,T y=0):x(x),y(y){};
};

17、


Pickpikaa
10 声望1 粉丝