第20讲 位运算 位段 枚举变量 大型程序开发
第20讲 位运算 位段 枚举变量 大型程序开发
例1:读程序功能? include void maino 位运算符,转换 成二进制再运算 <> short a b prnr("请肯输入一个十六进步x:n) scanf( %",&a) b=(a&0xFF0O)>38 rinf("result=% x"bY. 思考题:如何编写 个函数,求出一 int nth bi( int x int n)∥/求x的第n位 return( x &(int)pow(2, n))>>n
2 例1:读程序功能? #include void main() { short a,b; printf("请输入一个十六进制数:\n"); scanf("%x",&a); b=(a & 0xFF00)>>8; printf("result=%x\n",b); } 输出一个整型数据的高8位 ▪位运算符,转换 成二进制再运算 ▪& | > •思考题:如何编写 一个函数,求出一 个整数的任意一位。 int nth_bit(int x,int n)//求x的第n位 { return ( x & (int)pow(2,n) )>>n; }
位段 当为变量a分配内存空 间时,按后边指定的二 struct birthday 进制位数分配。即a共 获得5+4+13= 24bits/8=3 bytes空间, unsigned int day: 5 比不指定具体位数少用 了3个字节的空间,这 unsigned int month: 4 种方法可以有效地节省 内存。 unsigned int year: 13
3 位段 struct birthday { unsigned int day:5; unsigned int month:4; unsigned int year:13; }a; •当为变量a分配内存空 间时,按后边指定的二 进制位数分配。即a共 获得5+4+13= 24bits/8=3bytes空间, 比不指定具体位数少用 了3个字节的空间,这 种方法可以有效地节省 内存
例3:袋中有红、白、蓝三种颜色的 球,有放回地取出时,结果都是? include *define COLORNUM 3 char * col[COLORNUM]=["red","write","blue"3: void mainO int i,j, k enum COLOR color printf"result: \n) for(i=0;<=2;i++)/从0到2穷举 forj=0<=2j*+)从0到2穷举 for(k=0k<=2k++)/从0到2穷举 printf( %s\t%s\t%s\t -Ⅶr",co[叮co[j],col[k) printf yod\thd\t%d\n", i.j. k):
4 例3:袋中有红、白、蓝三种颜色的 球,有放回地取出时,结果都是? #include #define COLORNUM 3 char *col[COLORNUM]={"red","write","blue"}; void main() { int i,j,k; enum COLOR color; printf("result:\n"); for(i=0;i<=2;i++) //从0到2穷举 for(j=0;j<=2;j++) //从0到2穷举 for(k=0;k<=2;k++) //从0到2穷举 { printf("%s\t%s\t%s\t---\t",col[i],col[j],col[k]); printf("%d\t%d\t%d\n",i,j,k); } }
定义枚举类型 enum Color 方法二 同时指定这种类型的变量可 include 以取得的值,其中的每一个 *define COLORNUM 3 值其实就是一个符号常量, 如果不指定他们的值,默认 enum Color[red write, blue: 是0,1,2。。。 pedef enum Color COLOR; char co[COLORNUM]=["red",wt定义枚举类型的变量 void maino 对枚举变量进行穷举 COLOR i,j, k 好处:直观 printf"result: n"i for(i=red;i<=blue;i++)/从red到bue穷举 for(j=red:j<=blue:j*+)∥从red到bue穷举 for(k=red:k<=blue:k++)∥/从red到bue穷举 printf %s\t%s\t%s\t---\t",co[], co[jl., col[k]): printf %\t %d\t'%d\n",i,jk):
5 方法二 #include #define COLORNUM 3 enum Color{red,write,blue}; typedef enum Color COLOR; char *col[COLORNUM]={"red","write","blue"}; void main() { COLOR i,j,k; printf("result:\n"); for(i=red;i<=blue;i++) //从red到blue穷举 for(j=red;j<=blue;j++) //从red到blue穷举 for(k=red;k<=blue;k++) //从red到blue穷举 { printf("%s\t%s\t%s\t---\t",col[i],col[j],col[k]); printf("%d\t%d\t%d\n",i,j,k); } } •定义枚举类型enum Color •同时指定这种类型的变量可 以取得的值,其中的每一个 值其实就是一个符号常量, 如果不指定他们的值,默认 是0,1,2。。。 •定义枚举类型的变量 •对枚举变量进行穷举 •好处:直观
定义枚举类型erum 定义的枚举常量往往可没有指明时y二般不 include<s↑doh 只是为了直接使用后边定义 *define COLORNUM 3 的符号常量 enum [red, write blue): char" col[COLORNUM]=["red",wt:定义整型变量 void maino 直接用枚举常量 int i,i k: printf("result: \n"): for(i=red;i<=blue;|++)/从red到bue穷举 forj=red:j<=blue:j*+)∥从red到blue穷举 for(k=red:k<=blue:k+-)//从red到be穷举 }prin(%d%N+0:1。cook printf( yos\t%s\tyoslt---\t
6 定义的枚举常量往往可直接使用 #include #define COLORNUM 3 enum {red,write,blue}; char *col[COLORNUM]={"red","write","blue"}; void main() { int i,j,k; printf("result:\n"); for(i=red;i<=blue;i++) //从red到blue穷举 for(j=red;j<=blue;j++) //从red到blue穷举 for(k=red;k<=blue;k++) //从red到blue穷举 { printf("%s\t%s\t%s\t---\t",col[i],col[j],col[k]); printf("%d\t%d\t%d\n",i,j,k); } } •定义枚举类型enum •没有指明Color 时,一般不 使用这个类型来定义变量, 只是为了直接使用后边定义 的符号常量 •定义整型变量 •直接用枚举常量
多文件程序 程序文件模块 为什么?当程序较大时,可以把程序分别保存为 几个c文件,或者每个程序员编写一部分函数, 这些函数保存在一个c文件,最后再构成完整的 程序。 其中的每一个c文件称为程序文件模块。 整个程序只允许有一个man0函数 组成结构:函数一>文件一程序 大程序一若干程序文件模块 各程序文件模块分别编译,再连接
7 多文件程序 ▪ 程序文件模块 ▪ 为什么?当程序较大时,可以把程序分别保存为 几个.c文件,或者每个程序员编写一部分函数, 这些函数保存在一个.c文件,最后再构成完整的 程序。 ▪ 其中的每一个.c文件称为程序文件模块。 ▪ 整个程序只允许有一个main()函数 ▪ 组成结构:函数->文件->程序 ▪ 大程序-若干程序文件模块 ▪ 各程序文件模块分别编译,再连接
方法一:包含自己编写的c文件 问题:如何把若干程序文件模块连接成 个完整的可执行程序? 文件包含
8 ▪ 问题:如何把若干程序文件模块连接成一 个完整的可执行程序? ▪ 文件包含 方法一:包含自己编写的.c文件
例如:5个函数力编译连接后包含的内容件上, 要求通过文件 double vol_ball( 来 double vol cylinde 文件模块名:pro! double vol cone()F模块名:prog2c # include“prog{…… able vol ball( int main(void) i int sel while( 1) scanf("d", int main(void) able vol cylinde cal (sel); int sel while(1) able vol cone( void cal(int sel) scanf("%d", &sel); ●●e cal(sel ) void cal(int sel)
9 例如:5个函数分别存储在2个.C文件上, 要求通过文件包含把它们联结起来。 文件模块名:prog1.c #include “prog2.c” int main(void) { int sel ; while( 1 ){ scanf("%d",&sel); cal (sel ) ; } } void cal(int sel) { …… } 文件模块名:prog2.c double vol_ball( ) { …… } double vol_cylind( ) { …… } double vol_cone( ) { …… } 编译连接后包含的内容 double vol_ball( ) { …… } double vol_cylind( ) { …… } double vol_cone( ) { …… } int main(void) { int sel ; while(1){ scanf("%d",&sel); cal (sel ); } } void cal(int sel) { …… }
方法二 新建一个项目文件 打开所有的c文件,分别编译 再连接 10
10 方法二 ▪ 新建一个项目文件 ▪ 打开所有的.c文件,分别编译 ▪ 再连接