03c_13day

03c_13day

===========================
2022-8-1
===========================

一.温故知新

    复合型数据类型
        结构体
        1.先定义结构体类型
            struct tag
            {
                //结构体成语的定义
            };
        2.再使用结构体类型定义结构体类型的变量\指针\数组
            数据类型		变量名	;
            struct tag		s		;
            struct tag *	p		;
            struct tag		arr	[成员个数]	;
        3.结构体类型的变量访问结构体的成员
            变量名 + . + 成员名
        结构体类型的指针访问结构体的成员
            指针名 + -> + 成员名
        4.通过sizeof运算符结算结构体大小
            结构体的大小相当于成员大小的和 + 字节对齐
        共用体
            共用体中的成员会共用同一块儿存储空间
            (使用一块儿存储空间管理不同类型的数据)
            1.先定义共用体类型
            union tag
            {
                共用体成员的定义;
            };
            2.大端格式和小端格式
            大端格式
            高字节的数据存放在低地址上
            低字节的数据存放在高地址上
            小端格式
            高字节的数据存放在高地址上
            低字节的数据存放在低地址上
            3.位域(位段/位字段)
            是编程语言(C语言)提供的操作位的方法
            -----------------------------------
            位带(bitband)

枚举

    enum是C语言的关键字
    枚举就是一个被命名的整型常数的集合
enum 枚举名
{
    标识符[=整型常数],
    标识符,
    ...
    标识符
};			//枚举定义之后需要加 ; 结尾
注意:
1.在定义枚举时.标识符与标识符之间要用 , 隔开而不是 ; 
2.在枚举中标识符可以和变量同名,如果同名变量会屏蔽标识符
    (尽量不要同名)
3.在定义枚举时,方括号的内容时缺省值,可以有也可以没有
    如果没有缺省值,标识符会按照0 1 2 3 4...的顺序进行表示
    如果有缺省值,则会从指定的整型常数开始按顺序进行表示
*/
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include <stdlib.h>

enum E
{
	a,
	b,
	c,
	d
};

int main(int argc, char *argv[])
{
	printf("a = %d\n", a);
	printf("b = %d\n", b);
	printf("c = %d\n", c);
	printf("d = %d\n", d);
	
	//a = 9527;枚举的标识符不是变量,不能做赋值运算

	printf("a = %d\n", a);

	return 0;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <stdlib.h>

enum E
{
	a,
	b,
	c,
	d
};

int main(int argc, char *argv[])
{
	int a = 9527;
	printf("a = %d\n", a);
	printf("b = %d\n", b);
	printf("c = %d\n", c);
	printf("d = %d\n", d);
	
	//a = 9527;枚举的标识符不是变量,不能做赋值运算

	printf("a = %d\n", a);

	return 0;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <stdlib.h>

enum E
{
	a,
	b = 100,
	c,
	d
};

int main(int argc, char *argv[])
{
	//int a = 9527;
	printf("a = %d\n", a);
	printf("b = %d\n", b);
	printf("c = %d\n", c);
	printf("d = %d\n", d);
	
	//a = 9527;枚举的标识符不是变量,不能做赋值运算

	printf("a = %d\n", a);

	return 0;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include <stdio.h>
#include <stdlib.h>

enum E{MIN, MAX = 10};

int main(int argc, char *argv[])
{
	int i = 0;

	for(i = MIN; i < MAX; i++)
	{
		printf("i = %d\n", i);
	}

	return 0;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdlib.h>

enum E{MODE_0, MODE_1, MODE_2, MODE_3};

int main(int argc, char *argv[])
{
	int mode = 0;

	scanf("%d", &mode);

	switch(mode)
	{
		case MODE_0 : printf("菜鸟难度!\n"); break;
		case MODE_1 : printf("普通难度!\n"); break;
		case MODE_2 : printf("地狱难度!\n"); break;
		case MODE_3 : printf("中国男足难度!\n"); break;
	}

	return 0;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>
#include <stdlib.h>

struct GPIO
{
	unsigned char PA0 : 2;
	unsigned char PA1 : 2;
	unsigned char PA2 : 2;
	unsigned char PA3 : 2;
	unsigned char PA4 : 2;
	unsigned char PA5 : 2;
	unsigned char PA6 : 2;
	unsigned char PA7 : 2;
	unsigned char PA8 : 2;
	unsigned char PA9 : 2;
	unsigned char PA10: 2;
	unsigned char PA11: 2;
	unsigned char PA12: 2;
	unsigned char PA13: 2;
	unsigned char PA14: 2;
	unsigned char PA15: 2;
};

enum mode
{
	INPUT,
	OUTPUT,
	AF,
	AN
};

int main(int argc, char *argv[])
{
	struct GPIO P;

	P.PA0 = OUTPUT;

	P.PA10 = AF;

	return 0;
}
    预处理
        条件编译
    #ifndef	__ADD_H
    #define __ADD_H
    除了在.h文件中加入,防止头文件被重复包含以外
    在.c文件中也可以使用
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
#if 0
	printf("Hello World!\n");
#else
	printf("你好,中国!\n");
#endif
	return 0;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <stdlib.h>

#define SUB

int main(int argc, char *argv[])
{
	int a = 13, b = 7;
	int sum = 0;

#ifndef ADD
	sum = a + b;
#else
	sum = a - b;
#endif
	printf("sum = %d\n", sum);

	return 0;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdlib.h>

#define STM32F103CBT6

int main(int argc, char *argv[])
{
	int PIN = 0;
#if defined (STM32F103RBT6)
	PIN = 64;
#elif defined (STM32F103CBT6)
	PIN = 32;
#endif
	printf("PIN = %d\n", PIN);

	return 0;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <stdlib.h>

#define FLAG 2

int main(int argc, char *argv[])
{
	int a = 13, b = 7;
	int sum = 0;

#if FLAG==0
	sum = a + b;
#elif FLAG==1
	sum = a - b;
#elif FLAG==2
	sum = a * b;
#elif FLAG==3
	sum = a / b;
#else
	sum = a % b;
#endif

	printf("sum = %d\n", sum);
	
	return 0;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include <stdio.h>
#include <stdlib.h>

#define PAI 3.14

int main(int argc, char *argv[])
{
	printf("PAI = %f\n", PAI);

	return 0;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdlib.h>

#define ARRSIZE 10

int main(int argc, char *argv[])
{
	int arr[ARRSIZE];
	int i = 0;

	for(i = 0; i < ARRSIZE; i++)
	{

	}

	return 0;
}
    面试题
    定义一个宏,计算一年(平年)有多少秒
    
    定义一个宏,比较两个值的最大值

    3.定义一个宏,完成两个变量值的交换

    注意 : 在写宏函数的时候一定要加小括号,代表是一个整体
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include <stdio.h>
#include <stdlib.h>

#define SEC_OF_YEAR (365*24*60*60)

int main(int argc, char *argv[])
{
	printf("SEC_OF_YEAR = %d\n", SEC_OF_YEAR);

	return 0;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>

#define MUL(A,B) (A)*(B)
//MUL(A,B)		A*B
//MUL(2+3,3+4)	2+3*3+4 = 15
int mul(int a, int b)
{
	return a * b;
}

int main(int argc, char *argv[])
{
	int a = 13, b = 7;

	printf("MUL = %d\n", MUL(2+3, 3+4));//a+b
	printf("mul = %d\n", mul(2+3, 3+4));//a+b

	return 0;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>

#define MAX(A,B) A>B?A:B
//a++ > b++ ? a++ : b ++

int max(int a, int b)
{
	return a > b ? a : b;
}

int main(int argc, char *argv[])
{
	int a = 13, b = 7;

	printf("MAX = %d\n", MAX(a++, b++));
	a = 13;
	b = 7;
	printf("max = %d\n", max(a++, b++));

	return 0;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdlib.h>

//#define SWAP(A,B) {typeof(A)tmp; tmp=A; A=B; B=tmp;}
//#define SWAP(A,B) {(A)=(A)+(B);(B)=(A)-(B);(A)=(A)-(B);}
#define SWAP(A,B) {(A)^=(B);(B)^=(A);(A)^=(B);}

int main(int argc, char *argv[])
{
	int a = 13, b = 7;

	printf("a = %d b = %d\n", a, b);
	SWAP(a,b);
	printf("a = %d b = %d\n", a, b);

	return 0;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
	printf("__DATE__ = %s\n", __DATE__);
	printf("__TIME__ = %s\n", __TIME__);
	printf("__FILE__ = %s\n", __FILE__);
	printf("__LINE__ = %d\n", __LINE__);
	printf("__FUNCTION__ = %s\n", __FUNCTION__);

	return 0;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
	int a = 3, b = 4, c = 5;

	if((a + b > c) && \
		(a + c > b) && \
		(b + c > a))
	{
		printf("可以构成三角形!\n");
	}

	return 0;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include <stdio.h>
#include <stdlib.h>

#define PRINT_STR(n) #n

int main(int argc, char *argv[])
{
	printf("PRINT_STR = %s\n", PRINT_STR(12+34));

	return 0;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <stdlib.h>

#define INT_VAR(n) var##n

int main(int argc, char *argv[])
{
	int var1 = 100;
	int var2 = 200;
	int var3 = 300;
	int var4 = 400;
	int var5 = 500;

	printf("VAR = %d\n", INT_VAR(2));//var2
	printf("VAR = %d\n", INT_VAR(5));//var5

	return 0;
}