【笔记】- C/C++中的一点点笔记(注意的点)

C/C++中的一点点笔记(注意的点)

数据类型

  1. 两个整数相除 得到的还是整数;
    只要有一个浮点数,结果就是浮点数
    例如:
3 / 2 = 1;
3.0 / 2 = 1.5;

输入、输出的使用

  1. scanf("%d",&a); //不要忘了&;
  2. scanf ("%d",&arr[b]);千万不要写成 scanf (" %d ",&arr[b]); 就是在%d前后多了一个空格 这样的结果不同;
  3. 输入写的是while(gets(arr)) 而不是while(gets(arr) != EOF)
  4. 数据多的时候不能用cin cout
  5. scanf 函数的格式字符串中,“%s”表示要输入的是一个字符串。要注意, 用 scanf 输入字符串时,输入的字符串中不能有空格,否则被读入的就是空格前面的那部分。
  6. 如果想要将将用户输入的包含一个甚至多个空格的一整行,都当作一个字符串读入,则应使用gets();

格式控制符

  1. %s 用于字符串 %c用于单个字符
  2. double的输入用%lf输出用%f
  3. long 输入输出用%ld long long 输入输出用%lld
  4. %d 要输出一个整数
  5. %c 要输出一个字符
  6. %s 要输出一个字符串
  7. %x 要输出一个十六进制整数
  8. %u 要输出一个无符号整数(正整数)
  9. %f 要输出一个浮点数。

循环语句

  1. while循环
	while (a) {
	}
//要防止死循环   大括号里面要有表达式去改变小括号内的表达式返回值;
  1. for循环
	for(   ;     ;   )     { 

	}
//第一个语句  用来初始化  一开始执行一遍;
//第二个语句  用来判断是否继续循环   相当于while判断;
//第三个语句  每次循环结束会执行一遍   一般用来改变第二个语句的真假;
  1. 递归循环区别在于,循环是执行一段代码,仅仅参数不同;递归要调用到自己。
    打个比方:
    循环就像在同一个地方打转;递归是一层一层进入,再原路返回,虽然每一层都一样。
  2. 递归要注意一次过程

数组

  1. 用到数组的 一般要处理多次的数据就需要存起来 像排序这类的
  2. 不能用数组的不要用 会出错
  3. 数组元素的下标,可以是任何整数,可以是负数,也可以大于数组的元素个数。
    那么,a[-2]是什么含义呢?如果 数组 a 的起始地址是 n,那么 a[-2]就代表位于地址 n + (-2) * size(int) 处的一个 int 型变量。这样是不安全的。
    要访问的数组元素并不在数组的存储空间内,这种现象就叫“数组越界”。
    除非有特殊的目的,一般我们不会写出象 an[-2] = 5 这样明显越界的语句。但是我们经 常会用含有变量的表达式作为数组元素的下标使用。该表达式的值有可能会变成负数,或大 于等于数组的长度。这就会导致数组越界。

一维数组

  1. 类型名 数组名[元素个数];
    其中“元素个数”必须是常数或常量表达式,不能是变量,而且其值必须是正整数。元素个数也称作“数组的长度”。
  2. T array[ N ]; //此处 T 可以是任何类型名,如 char,double,int 等。N 是一个正整数,
    //或值为正整数的常量表达式 那么,我们就定义了一个数组,这个数组的名字是 array。array 数组里有 N 个元素, 每个元素都是一个类型为 T 的变量。这 N 个元素在内存里是一个挨一个连续存放的。array 数组占用了一片连续的、大小总共为 N × sizeof(T)字节的存储空间。
    下标如为小数时,编译器将自动去尾取整。

二维数组

  1. T array[N][M]; // 此处 T 可以是任何类型名,如 char , double, int 等。M、N 都是 //正整数,或值为正整数的常量表达式 那么,我们就定义了一个二维数组,这个数组的名字是 array。array 数组里有 N×M 个元素,每个元素都是一个类型为 T 的变量。这 N×M 个元素在内存里是一个挨一个连续存 放的。array 数组占用了一片连续的、大小总共为 N×M×sizeof(T)字节的存储空间。

函数

  1. int min(int x, int y); // 返回值类型为 int,有两个整型参数,函数名为 min
  2. double calculate( int a, double b); // 返回值类型为 double,有一个整型参数,一个 double 型参数,函数名为 calculate
  3. char judge(void); // 返回值类型为 char,没有参数,函数名为 judge
  4. void doit(int times); // 返回值类型为 void,表示不返回任何值,有一个整型参数,函数名为 doit

局部变量和全局变量

  1. 如果某局部变量和某个全局变量的名字一样,那么在该局部变量的作用域中,起作用的是局部变量,全局变量不起作用。

指针

  1. 如果定义:
    T * p ; // T 可以是任何类型的名字,比如 int, double ,char 等等。下文中碰到的 //“T ”也都是这个意思 那么变量 p 就是一个“指针变量”(简称 “指针”),p 的类型是 T *,表达式“ * p” 的类型是 T。而通过表达式“ * p”,我们就可以读写从地址 p 开始的 sizeof(T)个字节。 通俗地说,就是可以认为,“ * p”,这个表达式,等价于存放在地址 p 处的一个 T 类型的变量。表达示 “ * p”中的“ * ”,被称作“间接引用运算符”。
  2. 需要记住的是,不论 T 表示什么类型,sizeof(T *)的值都是 4。也就是说,所有指针变量,不论它是什么类型的,其占用的空间都是 4 个字节。
  3. 指针通常用法是:将一个 T 类型的变量 x 的地址,赋值给一个类型为 T * 的指 针 p(俗称“让 p 指向 x”),此后表达式“* p”即代表 p 所指向的变量(即 x),通过“* p” 就能读取或修改变量 x 的值。
    例如这样:
char ch1 = ’A’;  // (1) 
char * pc = &ch1; // (2) 使得 pc 指向变量 ch1 
* pc = ’B’;   // (3) 执行效果是使得 ch1 = ’B’ 
char ch2 = * pc; // (4) 执行效果是使得 ch2 = ch1 
pc = & ch2;   // (5) 使得 pc 指向变量 ch2。 
			  //  同一指针在不同时刻可以指向不同变量 
* pc = ’D’;   // 语句 6,执行效果是使得 ch2 = ’D’ 
  1. 总结一般的规律,如果定义: T ** p; // 此处 T 可以是任何类型名 那么 p 就被称作“指针的指针”。p 这个指针,其类型是 T ** ,而表达式“* p”的类 型是 T * ,“* p”表示一个类型为 T * 的指针。 同理,int *** p; int **** p; int ***** p ; 等,不论中间有多少个“*”,都是合法的定义。

不知道放在那里了,就放在这里叭

  1. 回车也是字符;
  2. <1> 用辗转相除法求最大公约数
    算法描述:
    m对n求余为a, 若a不等于0
    则 m <- n, n <- a, 继续求余
    否则 n 为最大公约数
    <2> 最小公倍数 = 两个数的积 / 最大公约数 ;
  3. 有问题可以尝试着把用到的数据都输出一遍 看看哪里和预期的不一样 就知道哪里出错了
  4. 注意空格,换行问题 有些时候空格只能在两个数之间,不是一个数后面带一个空格。
  5. 输入之后不显示数,可能是声明不对,类似int long
  6. 数据不超过32位整数,就是可以使用int类型进行存储的另一种说法。
  7. 一个汉字占用两个字节
  8. 一个字母或者数以占用一字节。
  9. getchar()可以吸收掉回车符
  10. 题目没说明的一般就char arr[1005]
  11. 贪心算法即每一步都选择局部最优来实现整体最优。
  12. 注意斐波那契数列的变形问题
  13. 该设成整数的就设成整数(例如在循环里i,j的数据类型要声明为整数类型)。
  14. 在编程竞赛中,我们常见一个头文件:
    #include <bits/stdc++.h>
      发现它是部分C++中支持的一个几乎万能的头文件,包含所有的可用到的C++库函数,如<istream>/<ostream>/<stack>/<queue>.
    在编程竞赛中,使用这个头文件是一个好的想法,特别是当你在选择头文件时想减少时间,我们更加专注于找到算法解决问题而不是软件工程。而从软件工程的视角,我们最好最小化包含头文件,如果你包含了一些你可能不会用到的头文件,就会增加不必要的编译时间和程序大小。
    bits/stdc++的缺点
    bits/stdc++.h 不是GNU C++库的标准头文件,所以如果你在一些编译器(除了GCC)上编译你的代码,可能会失败,比如MSVC没有这个头文件。
    使用它会包含很多不必要的东西,并且会增加编译时间
    这个头文件不是C++标准的一部分,所以是不可移植的,应该尽量避免。
    尽管标准中有一些通用的头文件,但还是应该避免使用它来代替特定的头文件,因为编译器在每次编译转换单元时都实际地读取并解析每个包含的头文件(包括递归包含的头文件)。
    bits/stdc++的优点
    在比赛中,使用这个文件是一个好主意,当你想减少时间浪费在做选择的时候;特别是当你的排名对时间很敏感的时候。
    这还减少了编写所有必要头文件的所有杂务。
    你不必为使用的每个函数都记住GNU c++的所有STL。
  15. 使用C++语言编程时如果在OJ上显示error C2679: 二进制“>>”: 没有找到接受“std::string”类型的右操作数的运算符,那么就将头文件加上或改成#include <string>
  16. 计算机中,数值一律用补码表示和存储的。
发布了34 篇原创文章 · 获赞 2 · 访问量 878

猜你喜欢

转载自blog.csdn.net/Kapo1/article/details/104089192
今日推荐