课件C语言程序设计方案.ppt_第1页
课件C语言程序设计方案.ppt_第2页
课件C语言程序设计方案.ppt_第3页
课件C语言程序设计方案.ppt_第4页
课件C语言程序设计方案.ppt_第5页
已阅读5页,还剩442页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言程序设计,目 录,概述 表达式、数据的I/O 函数 模块化程序设计 指针,算法、选择、循环 位运算文件 数组 预处理 结构体,概 述,56 57 BE0100 BF0200 8BC6 03C7 8946FC 8BC6 2BC7 8946FE 5F 5E,机器语言程序,push si push di mov si, 0001 mov di, 0002 mov ax, si add ax, di mov bp-04, ax mov ax, si sub ax, di mov bp-02, ax pop di pop si,int a = 1; int b = 2; int i = a + b; int j = a b;,a = 1 b = 2 i = a + b j = a - b,汇编语言程序,高级语言程序,助 记 符,=101 0110,=1000 1011 1100 0110,源程序 *.c,目标程序*.obj,可执行程序,push si push di mov si, 0001 mov di, 0002 mov ax, si add ax, di mov bp-04, ax mov ax, si sub ax, di mov bp-02, ax pop di pop si,汇编语言程序,56 57 BE0100 BF0200 8BC6 03C7 8946FC 8BC6 2BC7 8946FE 5F 5E,机器语言程序,形式参数,f ( int x) int y; y = x * x; return y; ,main( ) int a, b; scanf(“%d“, ,函数,函数名,表,参数类型,参数名,声明部分,函 数 调 用,函数,函数类型,自定义函数,主函数,变量:先定义,后使用,int,main() printf(“This is a simple C program.n”); ,main() int a,b,sum; /* add a and b ,sum is the result */ a=123; b=456; sum=a+b; printf(“The sum of %d and %d is %d.n”,a,b,sum); ,注释,int max (int x, int y) int z; if(x y) z = x; else z = y; return (z); main( ) int a, b, c; scanf(“%d%d”, ,源程序 *.c,目标程序*.obj,数据类型 运算符和表达式 ,五、常量和变量,1. 标识符 C语言中构成常量名、变量名、函数名、数组名、文件名的有效字符序列称为标识符。 C语言规定,标识符由字母、数字、下划线三种字符组成,而且第一个字符必须为字母或下划线。,C语言中的标识符: C k2 AB3 x*y x2 3A a3 a-b a+ _c _d A_b,2. 常量 在程序的运行过程中,值不能被改变的量称为常量。 C语言中的常量有三种形式 (1)字面常量或直接常量: 123 3.14159 a “Hello“,(2)符号常量 在C语言中,也可以用一个标识符来代表一个常量,叫作符号常量。 #define 注意后面不要加分号,#define PRICE 30 main() int num, total; num = 10; total = num * PRICE; printf(“total=%d“, total); ,#define PI 3.1415926,(3)常量定义 float pi = 3.14159;,const,const float pi; pi = 3.14159;,3变量 值可以改变的量称为变量 变量要先定义后使用 对变量的定义,要放在一个函数开头部分,所有执行语句的前面。,六、算术运算符和算术表达式,1. 算术运算符 双目运算符:有两个操作数参与运算 (加)、(减)、*(乘)、/(除)、(求余) 单目运算符:有一个操作数参与运算 (正)、(负)、(自增)、(自减),2. 算术表达式,算术表达式是指由算术运算符、运算量、括号和函数组成,符合C语言语法规则的式子。 算术运算符优先级:,3类型转换 (1)自动类型转换 转换的基本原则: 要尽可能地保证运算的精确度,10 + 1.5 - 123.45,10 + a + 1.5 - 123.45 * b,各数据类型混合运算的排列顺序:,算术表达式的数据类型,算术表达式的数据类型即该表达式的值的类型。 两个同类型的运算量参加运算,其结果也是同类型的。,(2)强制类型转换,(类型名)(表达式),(int),= 3,13 % 5 = 3,13.7 % 5,main() float x; int i; x = 3.999; i = (int)x; printf(“x=%fi=%dn“,x,i); ,使用强制类型转换注意:,在进行强制类型转换时,类型关键字必须用括号括住。 在对一个表达式进行强制类型转换时,整个表达式也要用括号括住。 如:(float)(a+b) (float)a+b 在对变量和表达式进行了强制类型转换后,并不改变原变量或表达式的类型。 如: int z; float x; double y; z=(int)(x+y); 执行后x、y的类型不变。,4.自增和自减运算符、,int i = 3; printf(“+i=%d“, +i ); int i = 3; printf(“i+=%d“, i+ );,作用:将操作数自己增加1或者减少1。 前置(前缀): 如:i 、i 后置(后缀): 如:i、i,表达式 5 2 + 3 abc 5 + abc f(2, 3),语句 5; 2 + 3; abc; 5 + abc; f(2, 3);,表达式语句,控制语句 for、goto,空语句 ;,复合语句 ,变量声明,函数声明,变量定义 int a, b;,C 语 句,非语句,C 程 序,int max(int x, int y) int z; if(x y) z = x; else z = y; return ( z ); ,main() int a,b,c; c = max(a, b); printf(“max=%dn“, c); ,int i = 3; i+; int i = 3; printf(“i+=%d“, i+ ); i+=3,int i = 3; +i; printf(“+i=%d“, +i ); +i=4,自增、自减运算小结:,自增运算符和自减运算符是单目运算符,且只能用于单个变量。 当前置运算或者后置运算与其他运算结合在一个表达式中时: 前置运算:先增值后引用 后置运算:先引用后增值 + 和 - 的运算结合方向是从右到左,七、赋值运算,1基本赋值运算符 赋值运算符: 优先级很低,仅比逗号运算符高,低于所有的算术运算符 结合方式为自右向左 赋值表达式:由赋值运算符 将变量和表达式连接起来的式子 形式: 变量 表达式 运算过程:将赋值运算符右边表达式的值赋给左边的变量。,赋值表达式 a = a + 1; +a; a = b = c = 2; a = (b = (c = 2); c = 2; b = 2; a = 2; a = 2 + (b = 3); b = 3; a = 2 + 3; a = (b = 2) * (c = 3); b = 2; c = 3; a = 2 * 3;,变量初始化 flota f = 123.5; char c = a; int i,j = 342, k; int a = b = c = 2;,赋值运算的注意事项:, 是一个双目运算符,需要左右两个操作数 是赋值运算符,不等于等号,没有相等的含义 左端的运算量必须是单个变量,而不能是表达式 赋值运算中,首先使运算符左端的变量具有右端表达式的值,然后整个表达式的结果为右端表达式的值,赋值运算中数值类型的转换,当赋值运算符两端的数据类型不同时,编译程序将赋值运算符右边表达式的数据类型自动转换成左边变量的数据类型。,2. 复合的赋值运算符,复合赋值运算符:+=、-=、*=、/=、%= 等。 复合赋值运算表达式的一般形式: 变量 op 表达式 说明:“op“为其它运算符,如+、-、*、/、%等。 举例: a+=b a*=b 等同:a=a+b a=a*b,变量 op 表达式;的执行过程,步骤: (1)求出“表达式“的值 (2)把求出的表达式的值与“变量“做op运算 (3)把第二步求出的值再赋给“变量“,例如:设 x = 5 y = 2 求 x %= y + 3 的值 (1)y 3 5 即:x %= 5 (2)x%5 0,(x=5) (3) 0 x,复合赋值运算小结,凡是双目运算符都可以与赋值运算符一起组合成复合的赋值运算符。注意两个运算符之间不能有空格存在。 共10种复合赋值运算符: +=、 -=、 *=、/=、%=、=、&=、=、|= 复合赋值运算符的结合方式为“自右向左”。,练习:,设有int a=10;写出下面表达式的值。 a += a a -= 12 a *= 3 + a a /= a + a n = 5 a %= n % 2 a += a -= a *= a,20 -2 130 0 0 0,八、逗号运算符、逗号表达式,逗号运算符:“,“,即顺序求值运算符 逗号表达式:用逗号把若干独立的运算表达式结合成一个运算表达式,称为逗号表达式 逗号表达式的一般形式: 表达式1,表达式2,表达式n 求解过程:先求“表达式1“,再求“表达式2“,最后求“表达式n“。整个表达式的值为“表达式n“的值。,举例:,求下面逗号表达式的值: a = 3*4 , b = a+10 , c = a*b 解题步骤: 求表达式1:a=3*4=12 求表达式2:b=a+10=22 求表达式3: c=a*b=12*22=264 写结果:逗号表达式的值为264。,逗号表达式的特点,逗号表达式可以作为赋值运算中的表达式 逗号运算符的结合方向是从左到右 逗号运算符是所有运算符中级别最低的,运算符的优先级和运算顺序,C语言中的优先级从高到低分为15级。 运算符的一般顺序: 先运算优先级别高的,再运算优先级别低的。 对于优先级别相同的运算符,按其结合方向执行。,运算符的优先级和结合方向,优先级分级一般规律:,单目运算符优先级最高,双目次之,三目较低。 双目运算符中,算术运算符较高,关系次之,逻辑较低(!除外)。 位运算符中,移位运算高于关系运算,位逻辑运算低于关系运算。 逗号运算符最低,圆括号运算符优先级最高,可用括号强调或改变运算顺序。,数据的 I/O ,main() printf(“This is a C program.n“); ,float max(float a, float b) /* 函数定义 */ float c; if (a b) c = a; else c = b; return c; main() float x = 1.23, y = 4.56, z; z = max(x, y); /* 函数调用 */ printf(“%f“, z); ,main() float x = 1.23, y = 4.56, z; z = max(x, y); /* 函数调用 */ printf(“%f“, z); float max(float a, float b) /* 函数定义 */ float c; if (a b) c = a; else c = b; return c; ,main() float x = 1.23, y = 4.56, z; z = max(x, y); /* 函数调用 */ printf(“%f“, z); float max(float a, float b) /* 函数定义 */ , float c; if (a b) c = a; else c = b; return c; main() float x = 1.23, y = 4.56, z;,float max(float a, float b) /* 函数定义 */,z = max(x, y); /* 函数调用 */ printf(“%f“, z); ,main() float x = 1.23, y = 4.56, z; z = max(x, y); /* 函数调用 */ printf(“%f“, z); float max(float a, float b)/* 函数定义 */ float c; if (a b) c = a; else c = b; return c; ,float max(float a, float b);,/* 函数声明 */,#include ,字符输出函数:putchar,作用:向终端输出一个字符 格式:putchar(c) c是整型或者字符型数据,返回值为所输出的字符 字符常量 putchar(A); 整数 putchar(65); 字符变量 char c = A; putchar(c); 八进制数 putchar(101); 十六进制 putchar(x41); 控制字符 putchar(n); 转义字符 putchar();,字符输入函数:getchar,作用:从终端输入一个字符 格式:getchar() 函数没有参数,返回值为从输入设备得到的字符,格式输出函数:printf,格式:printf(格式控制,输出表列) 作用:向终端输出若干个任意类型的数据,main() printf(“This is a C program.“); ,This is a C program.,int i = 65; printf(“i=%d“, i);,格式字符,int i = 65; printf(“i=%c“, i);,int i = 1, j = 2, k = 3; printf(“i=%d, j=%d, k=%dn“, i, j, k);,i=1, j=2, k=3n,函数声明:int printf (const char *format , .); 格式: printf( 格式控制,输出表列);,格式说明:% 标志 宽度 . 精度 h / l 格式字符,格式说明:% 标志 宽度 . 精度 h / l 格式字符,数值型: d / i signed decimal integer u unsigned decimal integer o unsigned octal integer x/X unsigned hexadecimal integer (x: a, b, c, d, e, f X: A, B, C, D, E, F) f floating point -dd.dddddd 隐含6位小数 e/E floating point -d.ddddddd 规范化 g/G floating point 根据输出的数值和精度,从f或e中选取长度较短的一种,不输出无意义的0或者小数点,字符型: c single character s string pointer % % character,格式说明:% 标志 宽度 . 精度 h / l 格式字符,h / l : h(d i o u x X): short integer 显示短整数 l (d i o u x X): long integer 显示长整数,格式说明:% 标志 宽度 . 精度 h / l 格式字符,宽度: 一个正整数,表示数据输出时所占的最小宽度。 不足补空格或零;超过,按实际位数输出 。,. 精度: 一个正整数,用于输出实数或字符串。为了与宽度相区别,在前面加一个小数点。 用于实数,表示小数的位数,默认为6位。 用于字符串为截取显示的字符数,格式说明:% 标志 宽度 . 精度 h / l 格式字符,标志: -:左对齐,右补空格 +:数值带符号显示 0:数值左补零(符号后) #:显示前导符,格式说明:% 标志 宽度 . 精度 h / l 格式字符,格式输入函数:scanf,格式: scanf(格式控制,地址表列) 作用: 按指定格式从键盘输入数据,1取地址运算符 ,2格式控制,格式说明:% * 宽度 h / l 格式字符,3说明: (1)输入数据时,两个数据间用空格、回车或跳格键(Tab)相间隔,不能用其它符号,比如逗号。 (2)如果在格式控制字符串中除格式说明外,还有其它字符,这些字符是不会显示在屏幕上的,但是在输入数据的时候,必须同时输入这些字符 (3)在用%c格式输入数据时,空格和控制字符都是有效字符,函 数 ,一、 函数的定义,类型标识符 函数名(形式参数表) 声明 语句 ,复合语句,main( ) int a, b, c; scanf(“%d%d“, ,1形式参数,无参函数 类型标识符 函数名()复合语句 类型标识符 函数名(void)复合语句,无参函数示例,main( ) printstar( ); printword( ); printstar( ); printstar( ) /* 定义无参函数printstar() */ printf(“*n“); printword( ) /* 定义无参函数printword() */ printf(“This is an examplen“); ,(2)不定参函数 类型 函数名(形式参数表 , )复合语句,int printf(const char *format , .) ; int scanf(const char *format , .) ; int max(int x , int y , . ) ;,int max(const int x , const int y) if (x y) return x; else return y; ,(3)形参声明的传统方式,int max(x, y) int x, y; int z; z = x y ? x : y; return(z); ,2类型标识符,int max( int x , int y) if (x y) return x; else return y; ,3. return语句,函数的返回值是通过return语句传递的。 return 语句的一般形式: return 表达式; return ( 表达式 );,return 语句的执行,main() int a,b,c; scanf(“%d%d“, ,int max(int x, int y) int z; z = (x y) ? x : y; return (z); ,返回值类型要与函数类型一致,且以函数类型为准。 函数类型缺省时,系统自动按整型处理。 一个函数中可以有若干个return语句,流程执行到哪里,就从哪里返回主调函数。 若函数体内没有return语句,则执行函数到末尾,然后返回主调函数。 当不需要返回值的时候,可以用void定义函数为空类型,表示无返回值。,4空函数 类型说明符 函数名(),二、 函数的调用,1. 函数调用的一般格式: 函数名(实参表); main( ) int x, y, z; scanf(“%d%d“, ,main() int a, b, c; scanf(“%d%d“, ,int max(int x, inty) int z; z = (x y) ? x : y; return(z); ,主调函数,被调函数,实际参数,形式参数,2. 值传递,调用函数时,在主调函数和被调用函数之间存在一种数据传递关系。 C语言规定,实参对形参的数据传递是单向传递,只由实参传给形参,而不能由形参传回来给实参。,c = max(a, b);,3. 函数调用的方式,作为表达式出现在任何允许表达式出现的地方,参与运算。 如:a sqrt(b); 作为一条独立的语句完成特定的操作。 如:gets(str); 作为函数的参数被其他函数调用。 如:printf(“%sn“, strcpy(str1, “Hello“);,4. 函数的嵌套调用,C语言程序由函数构成。 函数与函数之间是平行的,独立的。 不允许在一个函数内部嵌套定义另一个函数;但允许在调用一个函数的过程中,又调用另一个函数。,main函数,结束,调用函数a,调用函数b,函数b,函数a,函数的嵌套调用,5. 递归调用,递归调用: 在调用一个函数的过程中又出现直接或间接的调用该函数本身,称为函数的递归调用。,递归函数设计举例:求 n!,算法描述: n! = 1 2 3 (n1)n 递推公式:,f(n) ,1 n = 0 n (n - 1) ! n 0,main( ) int x; scanf(“%d“, ,long fact(int n) if (n = 0) return 1; else return n * fact( n 1 ); ,5!的运算过程:,? 5!,54!,43!,32!,21!,1,21,32,46,524,120,10!,11,6.1 数组元素作函数实参,数组元素作函数实参, 如同简单变量一样,采用单向值传递。,6. 数组与函数,int isprime(int x) int i; for (i = 2; i = x / 2; i+) if (x % i = 0) return (0); return (1); ,【例】用程序求出数组 a 中所有素数的和,main( ) int i, a10, sum = 0, n = 0; printf(“Enter 10 numbers:n“); for(i = 0; i 10; i+) scanf(“%d“, ,#define N 10 main() int aN; int i, j, temp; printf(“Please input %d numbers:n“, N); for(i = 0; i aj + 1) temp = aj; aj = aj + 1; aj + 1 = temp; printf(“The sorted numbers:n“); for(i = 0; i N; i+) printf(“%4d“, ai); ,6.2 数组名作函数参数,for(i = 0; i aj + 1) temp = aj; aj = aj + 1; aj + 1 = temp; ,sort( ),int aN,main() int aN; int i; printf(“Please input %d numbers:n“, N); for(i = 0; i N; i+) scanf(“%d“, ,#define N 10,int i, j, temp;,for(i = 0; i bj + 1) temp = bj; bj = bj + 1; bj + 1 = temp; ,int b N , int n ),sort(a);,sort(a, N);,三、函数原型,int max(int x, int y) int z; z = (x y) ? x : y; return (z); main() int max(int x, int y); int a,b,c; scanf(“%d%d“, ,main() int max(int, int); int a,b,c; scanf(“%d%d“, ,函数原型的一般形式为 函数类型 函数名(参数类型1 参数名1, 参数类型2 参数名2, ); 函数类型 函数名(参数类型1,参数类型2, );,int max(int,int); f1() x = max(a, b); f2() y = max(c, d); int max(int x,int y) ,作业: P186 : 8.1 8.2 8.13 8.17 实验: 第8章例题:8.1 8.2 8.3 8.4 8.5 8.8 8.11 8.12 8.13,input( ) max( ) input( ); output( ) main( ) max( ); output( ); ,file.c, file.obj, file.exe,C程序的结构,f11() f12() ,f21() f22() ,fn1() main() ,file1.obj,file2.obj,filen.obj, prog.exe,模块化程序设计,模块化程序设计 基本思想:将一个大的程序按功能分割成一些小模块 特点: 各模块相对独立、功能单一、结构清晰、接口简单 控制了程序设计的复杂性 提高元件的可靠性 缩短开发周期 避免程序开发的重复劳动 易于维护和功能扩充 开发方法: 自上向下,逐步分解,分而治之,1. 局部变量-内部变量 定义:在函数内定义,只在本函数内有效 说明: main中定义的变量只在 main 中有效 不同函数中同名变量,占用不同的内存单元 形参属于局部变量 可定义仅在复合语句中有效的变量,四、变量的作用域,若外部变量与局部变量同名,则外部变量被屏蔽,全局变量在程序全部执行过程中占用存储单元 降低了函数的通用性、可靠性,可移植性 降低程序清晰性,容易出错,2.全局变量-外部变量 定义:在函数外定义,可为所在文件所有函数共用 有效范围:从定义变量的位置开始到本源文件结束,float max, min; float average(float array, int n) int i; float sum = array0; max = min = array0; for( i = 1; i max) max = arrayi; else if(arrayi min) min = arrayi; sum += arrayi; return(sum / n); main() int i; float ave, score10; /*Input */ ave = average(score,10); printf(“max=%6.2fnmin=%6.2fn average=%6.2fn“, max, min, ave); ,/*ch7_17.c*/ int a = 3, b = 5; max(int a, int b) int c; c = a b ? a : b; return(c); main() int a = 8; printf(“max=%d“, max(a, b); ,外部变量与局部变量,运行结果:max = 8,int i; main() void prt(); for(i = 0; i 5; i+) prt(); void prt() for(i = 0; i 5; i+) printf(“%c“, *); printf(“n“); ,外部变量副作用,运行结果:*,静态变量与动态变量 存储方式 静态存储:程序运行期间分配固定存储空间 动态存储:程序运行期间根据需要动态分配存储空间,生存期 静态变量: 从程序开始执行到程序结束 动态变量: 从包含该变量定义的函数开始执行至函数执行结束,五、 变量的存储类别,auto - 自动型 register - 寄存器型 static - 静态型 extern - 外部型 变量定义: 存储类型 数据类型 变量表;,如: int sum; auto int a, b, c; static float x, y; register int i;,auto 变量的作用域,main() int x=1; void prt(void); int x=3; prt(); printf(“2nd x=%dn”,x); printf(“1st x=%dn”,x); void prt(void) int x=5; printf(“3th x=%dn”,x); ,运行结果: 3th x = 5 2nd x = 3 1st x = 1,main() void increment(void); increment(); increment(); increment(); void increment(void) int x = 0; x+; printf(“%dn”, x); ,局部静态变量,运行结果:1 1 1,main() void increment(void); increment(); increment(); increment(); void increment(void) static int x = 0; x+; printf(“%dn”, x); ,运行结果:1 2 3,int max_so_far(int curr) static int bigger = 0; if( curr bigger ) bigger = curr; return bigger; ,main() int n, biggest; do scanf(“%d“, ,register int i; (1)只有函数中的局部变量和形式参数可以作为寄存器变量,(2)一个计算机系统中的寄存器数目是有限的,(3)不允许对寄存器变量作取地址运算,(4)对一个变量只能声明为一个存储类别,声明外部变量:extern,C程序的结构,f11() f12() ,f21() f22() ,fn1() main() ,file1.obj,file2.obj,filen.obj, prog.exe,变量,作用域,存储类别,内部变量,形式参数,外部变量,auto,register,static,复合语句,函数,文件,程序,变量定义: 存储类型 数据类型 变量表;,六、函数的作用域,1外部函数,2内部函数,static 类型标识符 函数名( 形参表 ) 复合语句,定义: extern 类型标识符 函数名( 形参表 ) 复合语句,声明: extern 类型标识符 函数名( 形参表 );,float f1(int a) ,main () f1(5); ,float f1(int);,float f1(int);,f2 () f1(10); ,float f1(int);,file1.c,file2.c,file1.obj,file2.obj,float f1(int a) ,main () ,file1.c,file2.c,file1.obj,file2.obj,char f1(float x, float y) ,static,static,int a;,main () a+; ,extern a;,extern a;,f ( ) a+; ,extern a;,file1.c,file2.c,file1.obj,file2.obj,int a;,类型 函数名( 形式参数表 ) 声明部分 执行部分 ,内部变量定义; 外部变量声明; 函数声明;,求平均成绩,#include float average(int stu10, int n); main() int score10, i; float av; printf(“Input 10 scores:n“); for( i = 0; i 10; i+ ) scanf(“%d“, ,float average(int stu10, int n) int i; float av, total = 0; for( i = 0; i n; i+ ) total += stui; av = total / n; return av; ,实参用数组名,形参用数组定义, int stu ,比较:数组元素与 数组名作函数参数,#include void swap(int x, int y) int z; z = x; x = y; y = z; main() int a2 = 1, 2 ; swap(a0, a1); printf(“a0=%dna1=%dn“, a0,a1); ,#include void swap(int x) int z; z=x0; x0=x1; x1=z; main() int a2=1,2; swap(a); printf(“a0=%dna1=%dn“,a0,a1); ,8.5 写一函数,使输入的一个字符串按反序存放。,char str = “abcdef“;,char str = “abcde“;,strlen(str) / 2,strlen(str) / 2,void invert(char str , int len) int i, j; char c; for( i = 0, j = len - 1 ; i len / 2; i+, j-) c = str i ; str i = str j ; str j = c; ,main( ) char string 30 ; scanf(“%s“, string); invert(string, strlen(string); printf(“%s“, string); ,求 n 的阶乘,/*ch7_8.c*/ #include long fac(int n) if (n = 0 | n = 1) return 1; else return n * fac(n - 1); main() int n; printf(“Input an integer :“); scanf(“%d“, ,hanoi(n, a, b, c),1 : a c,n = 1,hanoi(n-1, a, c, b) n : a c hanoi(n-1, b, a, c),n 1,void hanoi(int n, char a, char b, char c) if(n = 1) printf(“1 : %c %cn“, a, c); else hanoi(n - 1, a, c, b); printf(“%d : %c %cn“, n, a, c); hanoi(n - 1, b, a, c); ,void hanoi(int n, char a, char b, char c) if(n = 1) printf(“1 : %c %cn“, a, c); else hanoi(n - 1, a, c, b); printf(“%d : %c %cn“, n, a, c); hanoi(n - 1, b, a, c); main() int n; printf(“Input an integer:“); scanf(“%d“, ,设有一个背包可以放入的物品重量为s,现有 n 件物品,重量分别为w1,w2,w3,wn。要求采用递归方法编写程序来判断能否从这 n 件物品中选择若干件放入此背包,使得放入物品的重量之和正好为s;如果存在符合上述要求的物品组合,输出其中一组所选各件物品的重量。,#define N 10 int wN+1=0,1,2,3,4,5,6,7,8,9,10; main( ) int knap( int, int ); int s; printf(“s=“); scanf(“%d“, ,knap( s, n),knap(s-wn, n 1) knap(s, n 1),s = 0,1,s 0,s 0 且 n 1,0,0,其它,int knap(int s, int n) ,或,编程寻找满足 abcd = (ab + cd)2 的所有四位数,如3025 = (30 + 25)2 形如 XYZ 和 YZY 的两个十六进制数相减, 差为 D79 ,编程求X、Y、Z的值 一个数的平方的尾数等于该数自身的自然数称为“自守数”,如62 = 36 252 = 625 3762 = 141376,编程求出 20000 以内的自守数。,int knap(int s,int n) if(s = 0) return 1; if(s 0 ,指 针,什么是地址?,在程序执行过程中,所有的数据对象都存储在计算机内存储器里。任何一个数据对象在它被执行的那段期间内都有一个确定的存储位置,占据着确定数目的存储单元。且每个存储单元有一个唯一的编号,即地址。 地址在计算机内部是用二进制编码表示的,可作为程序中能够被处理的数据。,scanf(“%d”, ,地址和指针,printf(“%d”, i);,i_pointer = ,2000,i_pointer,123,i_pointer,i,int i;,int *i_pointer;,1. 指针的概念,指针是一种特殊的变量,本质是变量,但存放的是某个变量的地址。指针变量同样具有变量名、变量数据类型和变量值。 注意内存单元的地址和内存单元的内容是两个不同的概念。,设: int i,j,k; i=3,j=6; k=i+j; (直接访问) i_pointer= (间接访问),2. 指针变量的定义,指针变量定义的一般形式: 类型 *标识符; 说明: “标识符”是指针变量的名字;“类型”表明该指针变量所指向的变量类型。,int *i_pointer;,int i;,举例:,int i, j; int *pointer_1, *pointer_2; pointer_1 = 注意:一个指针变量只能指向同一个类型的变量。指针变量存储地址,以二进制编码表示,一般占2个字节空间。,3. 指针变量的引用,指针变量中只能存放地址 例如: int a,*p1,*p2; p1 = (错误写法!) 指针变量的相关运算符: &(取地址运算符)和*(指针运算符),scanf(“%d”, ,printf(“%d”, i);,i_pointer = ,int i, *i_pointer;,scanf(“%d”, i_pointer);,printf(“%d”, *i_pointer);,指针运算符,i_pointer = =,*i_pointer = =,&*i_pointer = =,*&i= =,i_pointer = ,int i, *i_pointer;,&i,i_pointer,i,i,4 . 指针作为函数参数,void swap(int a, int b) int c; c=a; a=b; b=c; main() int x, y; scanf(“%d%d“, ,void swap(int *a, int *b) int c; c = *a; *a = *b; *b = c; main() int x, y; scanf(“%d%d“, ,void swap(int *a, int *b) int *c; *c = *a; *a = *b; *b = *c; main() int x, y; scanf(“%d%d“, ,void swap(int *a, int *b) int *c; c = a; a = b; b = c; main() int x, y; scanf(“%d%d“, ,函数的参数可以是基本类型,也可以是指针类型 指针作为函数参数,其作用是将一个变量的地址传送到另一个函数中去 指针变量作函数参数也要遵守“实参变量和形参变量之间的数据传递是单向的值传递方式”这一基本规则,5 指针与数组,int a10=0, 1, 2, 3, 4, 5, 6, 7, 8, 9;,指向数组元素的指针变量的定义,int a10; /*定义a为包含10个整型数据的数组*/ int *p; /*定义p为指向整型变量的指针变量*/ p= /*把元素a1的地址赋给指针变量p */,p = &a0,p = &a1,p = = 2000,p = = 2002,p = &a2,int *p; p = ,p = = 2002,p +;,p = = 2004,- - p;,p = = 2002,输出整型数组a的10个

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论