C语言第二页笔记

31.数组大小必须是整数常量,不可以是变量。
32.冒泡排序的本质在于交换,即每次通过交换的方式把当前剩余元素的最大值移动到一端,而当
剩余元素减少为0时,排序结束。
33.现有一个数组a,其中有5个元素,分别为a[0]=3、a[1]=4、a[2]=1、a[3]=5、a[4]=2,要求
把它们按从小到大的顺序排列。
第一趟
(1)a[0]与a[1]比较,此时序列为{
    
    3,4,1,5,2}
(2)a[1]与a[2]比较,此时序列为{
    
    3,1,4,5,2}
(3)a[2]与a[3]比较,此时序列为{
    
    3,1,4,5,2}
(4)a[3]与a[4]比较,此时序列为{
    
    3,1,4,2,5}
第二趟
(1)a[0]与a[1]比较,此时序列为{
    
    1,3,4,2,5}
(2)a[1]与a[2]比较,此时序列为{
    
    1,3,4,2,5}
(3)a[2]与a[3]比较,此时序列为{
    
    1,3,2,4,5}
第三趟
(1)a[0]与a[1]比较,此时序列为{
    
    1,3,2,4,5}
(2)a[1]与a[2]比较,此时序列为{
    
    1,2,3,4,5}
第四趟
(1)a[0]与a[1]比较,此时序列为{
    
    1,2,3,4,5}
代码:
for(int i=1;i<=4;i++)
	{
    
    
		for(int j=0;j<5-i;j++){
    
    
			if(a[j]>a[j+1]){
    
    
				int temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
			}
		}
	}
34.如果数组大小较大(大概10^6级别),则需要将其定义在主函数外面,否则会使程序异常退出,
原因是函数内部申请的局部变量来自系统栈,允许申请的空间较小;而函数外部申请的全局变量来
自静态存储区,允许申请的空间较大。
35.一般来说,给数组中每一个元素赋相同的值有两种方法:memset函数和fill函数。memset函
数的格式为:memset(数组名,值,sizeof(数组名));使用此函数时需要在程序开头添加
string.h头文件。此函数使用的是按字节赋值,即对每个字节赋同样的值,这样组成int型的4个
字节就会被赋成相同的值。
36.gets用来输入一行字符串(gets识别换行符\n作为输入结束),并将其存放在数组中;puts用
来输出一行字符串,即将数组在界面上输出,并紧跟一个换行。
37.在一维字符数组(或二维字符数组的第二维)的末尾都有一个空字符\0,以表示存放的字符串的
结尾。空字符\0在使用gets或scanf输入字符串时会自动添加在输入的字符串后面,并占用一个字
符位,而puts与printf就是通过识别\0作为字符串的结尾来输出的。所以在定义字符数组长度的
时候一定要记得比实际存储字符串的长度至少多1.
38.strlen()函数可以得到字符数组中的第一个\0前的字符的个数,其格式如下:strlen(字符数
组).
39.strcmp函数返回两个字符串大小的比较结果,比较原则是按字典序,其格式如下:strcmp(字
符数组1,字符数组2).例如”a”的字典序小于”b”、”aaaa”的字典序小于”aab”.strcmp的返回结果
如下:
(1)如果字符数组1<字符数组2,则返回一个负整数
(2)如果字符数组==字符数组2,则返回0
(3)如果字符数组1>字符数组2,则返回一个正整数
40.strcpy函数可以把一个字符串复制给另一个字符串,其格式如下:strcpy(字符数组1,字符
数组2).是把字符数组2复制给字符数组1,这里的复制包括了结束符\041.strcat()可以把一个字符串接到另一个字符串后面,其格式如下:strcat(字符数组1,字符数
组2).是把字符数组2接到字符数组1后面。
42.sscanf可以理解为string+scanf,sprintf则可以理解为string+printf.假设定义了一个
char数组str[100],如下所示:sscanf(str,%d”,&n);sprintf(str,%d”,n);
#include <stdio.h>
int main()
{
    
    
	int n;
	char str[100]="123";
	sscanf(str,"%d",&n);
	printf("%d\n",n);
	return 0;
 } 
#include <stdio.h>
int main()
{
    
    
	int n=233;
	char str[100];
	sprintf(str,"%d",n);
	printf("%s\n",str);
	return 0;
}
43.对于计算机来说,main函数返回0的意义在于告知系统程序正常终止。
44.数组作为参数时,在函数中对数组元素的修改就等同于是对原数组元素的修改。
45.递归是函数自己调用自己的过程。
46.只要在变量前面加上&,就表示变量的地址。而计算机就是通过地址找到某个变量的。
47.指针是一个unsigned类型的整数。指针变量用来存放指针(或者可以理解成地址),它在某种数
据类型后星号*来表示这是一个指针变量。
48.给指针变量赋值的方式一般是把变量的地址取出来,然后赋给对应类型的指针变量。
49.p+1是指p所指的int型变量的下一个int型变量的下一个int型变量地址。指针变量支持自增和
自减操作。
50.在C语言中,数组名称也作为数组得到首地址使用。
51.两个int型的指针相减,等价于在求两个指针之间相差了几个int.
52.指针类型也可以作为函数参数的类型,这时视为把变量的地址传入函数。如果在函数中对这个
地址中的元素进行改变,原先的数据就会确实地被改变。
53.只有在获取地址的情况下对元素进行操作,才能真正地修改变量。
54.不管是否使用引用,函数的参数名和实际传入的参数名可以不同。引用并不是取地址的意思。
55.结构体里面能定义除了自己本身之外的任何数据类型。虽然不能定义自己本身,但可以定义自
身类型的指针变量。
56.构造函数是用来初始化结构体的一种函数,它定义在结构体。构造函数的一个特点是它不需要
写返回类型,且函数名与结构体名相同。
57.如果自己重新定义了构造函数,则不能不经初始化就定义结构体变量。
58.eps取10^-8是一个合适的数字。
59.浮点数的比较
const double eps=1e-8;
const double Pi=acos(-1.0);
#define Equ(a,b) ((fass((a)-(b)))<(eps))
#define More(a,b) (((a)-(b))>(eps))
#define Less(a,b) (((a)-(b))<(-eps))
#define MoreEqu(a.b) (((a)-(b))>(-eps))
#define LessEqu(a,b) (((a)-(b))<(eps))
60.多点测试
(1)while...EOF型。如果题目没有给定输入得到结束条件,那么就默认读取到文件末尾。scanf
函数的返回值为其成功读入的参数的个数。正常的控制台中的输入一般是不会失败的,只有在读取
文件时到达文件末尾导致的无法读取现象,才会产生读入失败。这个时候,scanf函数会返回-1而
不是0,且C语言中使用EOF来代表-1.while(scanf(%d”,&n)!=EOF){
    
    }
(2)While...break型。
(3)While(T--)型。

猜你喜欢

转载自blog.csdn.net/SeNiLS/article/details/114107597