c语言编程入门教程_第1页
c语言编程入门教程_第2页
c语言编程入门教程_第3页
c语言编程入门教程_第4页
c语言编程入门教程_第5页
已阅读5页,还剩429页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计语言程序设计 Copyer:Vigiking 第一章 计算机语言与 C语言概述 1.1 计算机语言概念 计算机语言定义 计算机能够识别和接受的语言。 要使计算机按自己的意图工作, 必须使用计算机所能接受、理解 和执行的指令指挥计算机工作。 计算机语言的种类 机器语言 低级语言 汇编语言 ( 面向计算机 ) BASIC 入门语言 F77 科学计算 高级语言 Foxpro 数据库管理 ( 面向问题 ) C 多用途 计算机语言 机器语言 最早问世,用二进制代码构成指令。 如: 100000 ( +) 110000 ( -) 用机器语言编程的缺点: 繁琐、不直观、不易调试。 如计算 y=2x2+3x-1需要七八条指令。 移植性差。 依赖于计算机。 汇编语言 用符号构成指令,如: MOV、 ADD 用汇编语言编程: 相对直观,但仍繁琐,仍是面向计算 机的语言。 汇编语言是计算机间接接受的语言 高级语言 与低级语言相比,有根本性的区别: 是面向问题的语言。 高级语言的一条指令(语句): y=2*x*x+3*x-1; 对应于: y=2x2+3x -1 y=sin(x); 对应于: y=sinx 用高级语言编程: 直观 、易懂、移植性好(不依赖于具体 计算机) 上机运行高级语言程序需经过 编译 : 编译 执行 要上机完成一个计算问题,主要的任务就是 用高级语言编写出相应的 源程序。即至少要 学会一种计算机语言。 高级语言源程序 机器指令 目的程序 结果 编译程序 1.2 C语言的特点 集高级语言和低级语言的优点于一身 : 能实现低级语言的大部分功能(如直接 访问内存物理地址、进行位操作等)。 图形功能强。 运算符和数据结构丰富 。 语法限制不太严格,程序设计自由度大 。 生成目标代码质量高,程序执行效率高 。 1.3 简单的 C程序介绍 例 1: main() 主函数说明 程序框架 printf(“abcdef ”); 函数体 语句 程序的功能是输出字符串: abcdef 例 2:求两数之和。 main() int a,b,c; a a=100; b=50; b c=a+b; c printf(“n c=%d”,c); 程序运行结果: c=150 例 3:求两数中的最大值。 函数类型 函数名 形参 main() int max (int x,int y) int a,b,c; int z; scanf(“%d,%d”, if(xy) z=x; c=max(a,b); else z=y; printf(“nmax is:%d”,c); return(z); a x b y c z ( 两个函数组成) 3 5 3 5 55 总结上例可知: ( 1) C程序 由函数构成 。 ( 2) 函数由两部分组成: 函数说明 部分:函数名、函数类型、形 参名、形参类型。 函数体 :实现函数的具体操作;由语句 构成。 ( 3) 程序总是 从 main函数 开始执行。 ( 4) 书写格式自由。 ( 5)语句必须有分号。 : 第二章 算法 2.1 算法的概念 要利用计算机处理问题,光学习语言 的语法规则还不够,最重要的是要学会 针对各类型的问题,拟定出有效的解题 方法和步骤。 解题方法和步骤就是算法 。 算法 : 为了解决一个问题而采取的有限步骤。 计算机算法 : 如何使计算机一步一步地工作的具体过 程。 利用计算机处理问题的步骤: 1)设计好算法 算法设计 ; 2)用计算机语言实现算法 程序设计 。 算法必须是 “ 有效 ” 的。 算法设计还要充分考虑算法的好坏。 衡量算法好坏的主要标准: 程序简练。 执行速度快。 占空间少。 例:考虑 的算法。 算法 : 直接表达。 直接用语句 s=1+2+3+4+5+6+7+8+9+10 当项数 较多时该算法不适用 s=i1 10 算法 : 迭代法(累加求和法) s=1+2+3+4+5+6+7+8+9+10 算法步骤: s i 使 s=0 + 使 i=1 累加器 记数器 s+is i+1i 若 i10 转 ,否则转 输出 s 0 11 23 36 410 5 该 算法通用,是好算法 2.2 算法的表示 算法需要有统一的表示方法 常用的表示方法有: 自然语言 流程图 结构化流程图 N-S流程图 . 1、 自然语言 对于计算 s=1+2+3+4+5+6+7+8+9+10 用自然语言表示为: 使 s=0 ( s为累加器) 使 i=1 ( i为计数器) s+is ( 累加求和公式 ) i+1i ( 计数器加 1) 若 i10 转 ,否则转 输出 s的值 特点:通俗易懂、文字冗长、含义不大严格 。 2、 流程图 用流程图符号表示算法。 常用的流程图符号 起止框 输入输出框 处理框 流程线 判断框 对于计算 s=1+2+3+4+5+6+7+8+9+10 用流程图表示为: s+i s i+1 i S+i s i 10 输出 s 0 s 1 i 直观形象,易于理解,次序清楚 Y N 3、 结构化流程图 传统的流程图有一个弊端:对流程线没 有严格的限制,对于较复杂的算法可能会 变成乱麻一般( BS型算法)。 为克服这一弊端,提出了由三个基本结构 组成算法流程图的思想: 结构化流程图 三个基本结构: 顺序结构 按固定顺序(从上到下或从左到右)执行 的结构。 A B a b 选择结构 根据条件 P选择执行哪一个分支。 成立 不成立 p A B a b 成立 不成立 例: 计算 y= 1/x 当 x0 时 y= 10000 当 x=0时 的算法流程图图: 选择结构 输入 x X=0? 10000 y 1/x y 输出 y Y N 循环结构 重复执行某些操作的结构。 分为两种: 当型循环 和 直到型循环 。 当型循环 直到型循环 P1 A A P2 a a b b Y Y N N 可以看出,每个基本结构都只有 一个入口和一个出口,因此,用三 个基本结构构成的流程图不会象乱 麻一般,用三个基本结构构成的流 程图就成为 结构化流程图 ,用结构 化流程图描述的算法称为 结构化算 法 ,相应的程序设计就称为 结构化 程序设计 。 观察前例 : 0 s 1 i S+i s i+1 i i 10 输出 s 顺序结构 循环结构 y n 4 N-S流程图 N-S流程图的三个基本结构: A B P成立 不成立 A B A B当 P1 直到 P2 顺序结构 选择结构 循环结构 例: 计算 y= 1/x 当 x0 时 y= 10000 当 x=0时 的 N-S流程图: 输入 x X=0?是 否 10000 y 1/x y 输出 y 例: 计算 s=1+2+3+4+5+6+7+8+9+10 的 N-S流程图: i10 直到 i10 直到型 当型 0 s 1 i 输出 s 1 i 0 s s+i s i+1 i s+i s i+1 i 输出 s 第三章 数据类型 、 运算符 与 表达式 3.1 C 的数据类型 基本类型 (整型 、 实型 、 字符型 、 枚举型) 构造类型 (略) 指针类型 (略) 空类型 各类型包含 常量 与 变量 3.2 常量与变量 常量与符号常量 常量 在程序运行过程中其值保持不变的量。 符号常量 用来代表一个常量的标识符。 #define PI 3.1415926 例: #define PI 3.1415926 main() float r=2,c; c=2*PI*r; printf(“%f”, c); 变量 其值可以改变的量。 变量的三要素 : 变量名 每个变量有一个名字,作为识别该变量 的标识符。 变量的值 每个变量有一个值,变量的值是随 时可以改变的。 变量的存储单元 每个变量占据一个内存单元,用于存放 变量的值 。 变量名 a 变量值 存储单元 3 变量的命名规则: 由字母、数字和下划线组成 以字母或下划线开头 a、 x1、 y_2、 _b1、 _1c 合法 1x、 a+2、 、 不合法 变量必须先定义后使用。 程序中何时使用常量?何时使用变量 ? 3.3 整型数据 整型常量 即整常数, c的整常数有三种形式: 十进制整数 与数学中的整数一致,如: 100, 123, 15等。 八进制整数 以 0开头的整数,如: 010,07,020等。 十六进制整数 以 0x开头的整数,如: 0x10,0xff,0x2a 等。 整型变量 用于存放整数的变量。 分 4种类型: 基本型: int a 16位,可表示的数值范围: -32768 32767 短整型: short int b 16位,可表示的数值范围: -32768 32767 长整型: long int c 32位,数值范围: -2147483648 2147483647 无符号型:加上 unsigned 只存放正数。 如: unsigned int x 变量 x为无符号整数, 16位全表示数码 , 数值范围: 065535 在程序设计中,如果要使用整型 变量,必须首先选择以上类型符来定义 变量,然后才能使用; 例: main() 定义 int a,b,c; a=100; b=50; 使用 c=a+b; printf(“%d”,c ); 一般根据什么原则选择变量的类型? 3.4 实型数据 实型常量 可使用两种形式表示: 小数形式: 如 1.23, 3.1415926 15.48 指数形式: 如 1e-20 1.23e5 实型变量 用于存放实数的变量 分单精度和双精度两种: float a,b 定义 a和 b为单精度型变量 32位, 7位有效数字, 10-38 1038 double x,y 定义 x和 y为双精度型变量 64位, 15位有效数字, 10-308 10308 例: main() float r,c; double r,c; r=5; c=2*3.1415926*r; printf(“%f”,c ); 3.5 字符型数据 字符常量 用单引号括起来的一个字符。 a,x,*,1 等 除此外,以 开头的字符如 n,t 等 称为转义字符,祥见书表 3.3 字符型变量 用于存放字符的变量。 char c1,c2 定义 c1和 c2为字符型 变量 c1=a; c2=b; 字符赋值 字符型变量存放一个字符,占据一个字 节 字符型数据的存储形式 存放 ASCII码 不是 而是 如字符 a 在内存中存放 97, b 存放 98。 与整数的存储形式一致,它们之间可以 通用 一个字符数据既可以作字符用,也可以 作整数用(取其 ASCII代码)。 如: 32+a 相当于 32+97 若 int x; char c; 则 x=a; c=97; x=97; c=a; 都 允许 a 97 字符串常量 用双引号括起来的字符序列。 如: ” abcde” ,”china ” ” a” 也属字符串。 注意 ” a” 与 a 的区别。 对于: char c; c=”a”; 用法错误 字符串中每个字符各占一个字节,并 且在字符串结尾加上一个结束标记 0 如: ” china” 在内存中占 6个字节。 c h i n a 0 C语言中专门的字符串变量,可用字符 数组存放(以后介绍)。 3.6 变量赋初值 在定义变量的同时给相应的变量赋初值 。 如: int a=3; a float b=5.2; char c=a; int x=y=z=6; 效果: 在给变量分配内存单元的同时在相应 的单 元中存放初值。 3 3.7 各数值型数据间的混合运算 整型、实型、字符型数据间可以进行混 合运算,如: 10-a*1.5 运算时,参加运算的两个数据如果类型 不同,则首先将其类型转换成一致再运算, 转换规则是: 将优先级低的类型转换到优先级高的类 型 数据类型的优先级: 高 double float long unsignde 低 int char 3.8 算术运算符与算术表达式 基本的算术运算符 + - * / % 算术表达式 用算术运算符将运算对象连接起来的式 子 用于表达数学公式的式子 如: 2*x+y-1/a 表达式经过运算最终得到一个值: 算术表达式的值 运算符的优先级与结合性 优先级: 在对表达式求值时,如果存在多个运算符, 则运算的先后次序按运算符的优先级别从高到 底进行。 运算符的优先级关系为: 高: * / % 低: + - 如: a-2*x 先算 * 2*(a+2) 有括号的情况? 结合性: 如果在一个运算对象两边的运算符的优先 级相同,则按规定的 “ 结合方向 ” 处理。 如: a-b+c b与 -结合是从左到右,称 “ 左结合性 ” 。 b与 +结合是从右到左,称 “ 右结合性 ” 。 每个运算符都有相应的优先级和结合性。 基本算术运算符都是 左结合性 。 计算表达式例: 2+A-1/2.0 1+3/2- 1 构造表达式例 2x2+3x-1 a+b a-b a+b a-b x+y x-y a+b/a-b ?(a+b)/(a-b) 2*x*x+3*x-1 (*不能省 ) (a+b)/(a-b)/(x+y)/(x-y)(a+b)/(a-b)/(x+y)/(x-y) (a+b)/(a-b)/(x+y)*(x-y) 强制类型转换 可以用强制类型转换运算符将一个表 达式的值转换成所需类型: 如: (int)(x+y) (float)(7%3) 应用举例: int a=200,b=300,c; c=a*b/100; ? 可知,有自动转换和强制转换, 当自动转换达不到目的时,可用强制转 换。 c=(long)a*b/100; c=(long)(a*b)/100; 自增、自减运算符 自增运算符: + 使变量值加 1 自减运算符: - 使变量值减 1 两种用法: +i, -i 先加(减)后用 i+, i- 先用后加(减) 两种用法对 i效果一样,但表达式的值不 同。 例 :假设 i的原值为 5: j=+i; j=? j=i+; j=? 注意: +和 -只能用于变量。 如: 3+和( a+1) + 不合法 +和 -为右结合性。 (-i)+ -i+ -(i+) 若 i的原值是 5,则该表达式的值是多 少? 例:分析执行下列语句后的结果: a=5; a b c d b=a+; c=-a-b+; d=(a+)-(+b)+c-; 5 56 067 -2-1 两种特殊情况: k=(i+)+(i+)+(i+) i+j 是 i+(+j) 还是 (i+)+j ? i+虽然与 i=i+1等效,但使用自增自 减运算符的代码优化程度好,因而经常 使用;但用时需特别小心。 3.9 赋值运算符和赋值表达式 赋值运算符 “ =” 称赋值运算符,其作用是将一个 数据赋给一个变量。 如: a=5 不要理解为 “ 等号 ” 。 执行赋值运算的结果,是将右边的数据 存入左边变量所对应的内存单元中。 赋值规则 如果赋值运算符两侧的类型不一致,则 在赋值时要进行类型转换,转换规则为: 实型 整变量 舍去小数部分。 int a=5.5; a中为 5。 整型 实变量 数值不变,以浮点形式存储。 字符型 整变量 放在整形变量低 8位。保持原值不变原 则。 int a=A; 复合赋值运算符 在赋值运算符前加上其它运算符,可以构 成复合赋值运算符。 a+=3 a=a+3 b-=x+5 b=b-(x+5) x*=c-6 x=x*(c-6) y/=a*4 y=y/(a*4) k%=b-2 k=k%(b-2) 属于高效率运算符。 赋值表达式 主要实现赋值运算的表达式。 一般形式: = 如: a=5 y=2*x+3 a=a+1 不是衡 等 作用: 将右边表达式的值赋给左边的变 量 。 赋值表达式的值取左边变量的值。 赋值表达式右边的 可以是任何 表达式,如: a=(b=5) 赋值表达式中包含赋值表达 式 赋值运算符的优先级低于所有算术运算 符,且是右结合性。 a=(b=5) 与 a=b=5 等效。 例:计算以下表达式的值: a=b=c=5 a=5+(c=6) a=(b=4)+(c=6) a=(b=4.5)+(c=6.5) ( a、 b、 c为整型变 量) a+=a-=a*a (设 a的原值为 3) 赋值表达式是 C语言中的一个重要成 分,在赋值表达式后加一分号就成为常 用的赋值语句。如 y=2*x+1; 赋值表达式作为表达式的一种,可以 出现在任何表达式中,如: x+2-(b/3-(a=k-5)+b 3.10 逗号表达式 逗号也是一种运算符,用它对两个表达 式实现连接运算。 3+5,6+8 称 逗号表达式 。 逗号表达式的一般形式: 表达式 1,表达式 2 取 表达式 2的值作为整个逗号表达式的 值。 如: a=3*5,a*4 逗号表达式的值为: 60 一个逗号表达式又可以与另一个表达式组 成一个新的逗号表达式,如: (a=3*5,a*4),a+5 因此,逗号表达式的一般形式可以扩展为 : 表达式 1,表达式 2,表达式 3, , 表达 式 n 取 表达式 n的值作为整个逗号表达式的值 。 逗号运算符的优先级最低 ,且是左结合性 。 逗号运算符只起到连接作用,没有实际操 作 。 第四章 最简单的 C程序设计 C 程序最基本的成分是语句 目前我们已掌握的语句: 变量说明语句 : int a,b,c; 表达式语句: x+y; 特别地: a=5; 赋值语句 可以编写简单程序如: main() int x,y; x=5; y=2*x*x+3*x-1; 该程序语法上完整,但还缺少输出。 数据的输出 用输出函数实现 ,其中的两种输出函数: 1.putchar 函数 (字符输出函数) 用于输出一个字符。 如 : putchar (a); putchar (100); char c=b; putchar (c); 例 :输出单词 Boy的完整程序: #include “stdio.h” 注意该语句的作用 main() char a, b, c; a=B; b=o; c=y; putchar (a); putchar (b); putchar (c); 2. printf函数 (格式输出函数) 任意类型、任意格式、任意个数。 例如: int a=100,b=56; printf(“a =%d,b=%d” ,a,b); 普通字符 格式说明 格式控制 输出表列 输出结果: a=100,b=56 “%” 后的字符称格式字符,不同格式字符对应不同的数据 类型。 d格式符: 按整数格式输出 几种用法: %d 不指定宽度,按实际宽度输出 %md 按指定宽度输出, m为宽度 %ld 用于输出长整型数 例: int a=125,b=453; long c=65535; printf(“a =%d,b=%5d,c=%ld”,a,b,c); 输出结果: a=125,b= 453,c=65535 %ld也可以按指定宽度输出: printf(“c =%8ld”,c); 输出结果: c = 65535 注意:格式字符的类型要与对应的输出对 象的类型一致。 c格式符: 用于输出字符 char c=A; printf(“c =%c,%c”,c,B); 输出结果 : c=A,B 输出对象既可以是字符变量、字符常量, 还可以是整型表达式。 如: int a=100; char b=A; printf(“n%d,%c”,a,a ); printf(“n%c,%d”,b,b ); 输出结果: 100,d A,65 s格式符: 用于输出字符串 %s 不指定宽度 %-ms 指定宽度,左靠齐 %ms 指定宽度,右靠齐 %m.ns 指定宽度 m, 只取左 端 n个字符, 右靠齐 %-m.ns 指定宽度 m, 只取左 端 n个字符, 左靠齐 例: printf(“1:%s”,”abcd”); printf(“2:%8s”,”abcd”); printf(“3:%-8s”,”abcd”); printf(“4:%8.3s”,”abcd”); printf(“5:%-8.3s”,”abcd”); 1:abcd2: abcd3:abcd 4: abc5:abc f格式符: 按小数形式输出实数 %f 由系统指定宽度( 6位小数) %m.nf 指定宽度 m, 小数位数 n, 右靠齐 %-m.nf 指定宽度 m, 小数位数 n, 左靠齐 注意:宽度包括符号和小数点 。 例: float a=3.141592654,b=14.326795, c=-125.2468; printf(“na =%f,b=%8.3f,c=%- 10.2f”,a,b,c); 输出结果: a=3.141592,b= 14.326,c=-125.24 完整前面的程序: main() int x,y; x=5; y=2*x*x+3*x-1; printf(“n y=%d”,y ); 程序设计例: 编写程序计算如图中的电流 I. 假设 U=220,R1=30,R2=60,R3=45 U I R1 R2 R3 算法设计 : I=U/R1+U/R2+U/R3 程序设计: main() I=U/R1+U/R2+U/R3; int U=220,R1=30,R2=60,R3=45; float I; printf(“n I=%f”,I); 正确的程序: main() int U=220,R1=30,R2=60,R3=45; float I; I=(float)U/R1+(float)U/R2+(float)U/ R3; printf(“n I=%f”,I); 考虑通用 : main() int U,R1,R2,R3; float I; 输入 U,R1,R2,R3 I=(float)U/R1+(float)U/R2+(float)U/ R3; printf(“n I=%f”,I); 数据的输入 getchar函数( 字符输入 ) #include “ stdio.h” main() char c; c=getchar(); 等待键盘输入 putchar(c); scanf 函数 (格式输入) 与 printf函数相反。 用于输入若干任意类型的数据。 scanf(“%d%d%d” , 格式控制 地址列表 scanf(“%d%d%d” , 执行此函数时,等待从键盘输入三个 整数给 a,b,c 若从键盘输入 3 5 8 则系统即从键盘缓冲区取出这三个数 分别赋给 a,b,c 注意与 printf的 区别,注意格式的匹 配 如: scanf(“%3d%2d%4d”, 若从键盘输入 123456789 a=123,b=45,c=6789 若想使 a=12,b=5,c=100 则键盘输入应为: 12 5 100 方便的输入格式一般不 指定宽度, 如: scanf(“%d%d%d”, 在键盘输入时,用分隔符把每个数据隔 开,标准的分隔符是空格。 如: 123 150 23 若想用逗号作分隔符,则: scanf(“%d , %d, %d”, 不要随便使用普通字符,如使用: scanf(“a =%d, b=%d c=%d”, float I; scanf(“%d%d%d%d”, I=(float)U/R1+(float)U/R2+(float)U/ R3; printf(“n I=%f”,I); 求 三角形面积 #include “math.h” main() float a,b,c,area,s; scanf ( “%f,%f,%f”, s=1.0/2*(a+b+c); area=sqrt (s*(s-a)*(s-b)*(s-c); printf(“n area=%f”,area); 使用数学函数 使用三角函数 #include “math.h” main() float x, y; scanf ( “%f”, y=sin(x*3.1415926/180); 以弧度为单 位 printf(“n y=%f”,y); 第五章 选择结构程序设计 对于如下的函数计算,算法上属于一个 选择结构。 y= 用于实现选择结构的主要是 if语句。 1/x 当 x0 时 10000 当 x=0时 if语句的最常见形式为: if(关系表达式 )语句 1; else 语句 2; 如: if(x!=0) y=1/x; else y=10000; 其中 x!=0 就是一个关系表达式 != 就是一个关系运算符 5 1 关系运算符和关系表达式 1、关系运算符 用于进行比较运算的运算符。共有六种: = = = != 优先级与结合性: 前 4种大于后两种。 低于算术运算符而高于赋值运算符。 左结合性。 2、关系表达式 一般形式: 表达式 关系运算符 表达式 如: ab a+bb+c 经过关系运算后最终有一个值 -关系表达 式的值 。 关系表达式的值只有 0(假 )或 1( 真 ) 例: 设 a=2, b=4, c=1 计算以下关系表达 式的值: ab a+bb+c ab 可以是字符表达 式 ( x=2) (y=5) 可以是赋值表达式 (a(by xz=xz yxz (x=y-2)x+1 5 2 逻辑运算符和逻辑表达式 有时,只用一个简单的关系表达式无法完整地 表达一个条件,如: y= 其中的条件需要用逻辑表达式来表达: x!=0 if(score=60) printf(“pass ”) ; if( 表达式 )语句 1; else 语句 2; if(x!=0) y=1/x; else y=10000; if( 表达式 1)语句 1; else if(表达式 2)语句 2; else if(表达式 3)语句 3; else 语句 n; if(score=100) printf(“A ”); else if(score=90) printf(“B ”); else if(score=80) printf(“C ”); else if(score=70) printf(“D ”); else if(score=60) printf(“E ”); else printf(“F ”); 对于: 1/x 当 x0 时 10000 当 x=0时 一般用: if(x!=0) y=1/x; else y=10000; 也可用: y=10000; if(x!=0) y=1/x; y= ? y=1/x; if(x=0)y=10000 例:(习题 5.5) : x (xmax) max=b; if(cmax) max=c; printf(“n max=%d”,max); 例: 从键盘输入三个整数到变量 a,b,c,要求 按从大到小的顺序输出。 两种典型算法: 枚举法 (将各种可能的排列枚举出来) 。 换位法 (将 a,b,c中的数据换位)。 换位法 main() int a,b,c,t; scanf(“%d,%d,%d”, if(a=80) if(score=90) printf(“A ”); else printf(“B ”); else if(score=60) printf(“C ”); else printf(“D ”); 注意 else与 if的 匹配 3、条件运算符 如果两个分支的内容都是给同一个变量赋值, 则可用简单的条件运算符处理: if(ab) max=a; else max=b; 可用: max=ab ? a : b; 赋值运算符右边为一条件表达式。 条件表达式的一般形式: 表达式 1 ? 表达式 2 : 表达式 3 条件表达式的执行过程: ab ? a : b 优先级: 低于关系运算符,高于赋值运算符。 结合性 :右结合性。 表达式 1 条件表达式 取表达式 3的值 条件表达式 取表达式 2的值 非 0 0 例:求 a,b,c中的最大值: max= ab ? (ac?a:c) : (bc?b:c) ; 5 4 switch语句( 多分支 ) 适用于根据一个表达式的值就可确定 走哪个分支的情况。 switch( 表达式 ) 常量表达式 1: 语句 1 常量表达式 2: 语句 2 常量表达式 n: 语句 n default: 语句 n+1 例:成绩分档: switch(score/10) case 10: printf(“A ”); case 9: printf(“B ”); case 8: printf(“C ”); case 7: printf(“E ”); case 6: printf(“F ”); default : printf(“G ”); 注:应使用 break. switch(score/10) case 10: printf(“A ”); break; case 9: printf(“B ”); break; case 8: printf(“C ”); break; case 7: printf(“E ”); break; case 6: printf(“F ”); break; default : printf(“G ”); 5 5 程序举例 (习题 5.10) 有 4个圆塔,圆心分别为:( 2, 2), ( -2, 2),( -2, -2),( 2, -2),圆 半径为 1。这 4个塔的高度为 10m,塔以外无 建筑物。今输入任一点的坐标,求该点的 建筑高度(塔外的高度为 0)。 算法设计: 条件 “ 在某一圆内 ” : “ 在圆 1内或在圆 2内或在圆 3内或在圆 4内 ” 若设变量 c1、 c2、 c3、 c4分别代表是否在相 应的圆内,则以上条件为: c1|c2|c3|c4 10 在某一圆内 0 在圆外 ( x,y ) h= c1=(x-2)2+(y-2)21 c2=(x+2)2+(y-2)21 c3=(x+2)2+(y+2)21 c4=(x-2)2+(y+2)21 main() int h,c1,c2,c3,c4; float x,y; scanf(“%f%f”, c1=(x-2)*(x-2)+(y-2)*(y-2)10) break; s=10;i=10; for(;-i;) s+=i; 省略表达式 2 表达式 2是 任意表达式 s=0; for(i=1,j=10;imax) max=a; printf(“n max=%d”,max); 循环体中没有引用循环变量。 i的作用? 求任意个数中的最大值? for(i=1; ;i+) if(a=-9999)break; max=-32768; 外重循环 内重循环 执行 200次 要掌握多重循环 执行的全过程 6 6 循环的嵌套 循环体内又包含另一个完整的循环结构 (多重 循环 )。 for(i=1;imax) max=a; printf(“n max=%d”,max); 用一个简单变量作为 数据结构,合理,算 法简单 对于三个数的排序: main() int a,b,c,t; scanf(“%d,%d,%d”, if(amax) max=a; if(amax) max=ai; if(aiamax) max=i; if(aiaver)n+; printf(“n %d”,n); 用 变量 数据结构不合理 main() int i,a100,n; float aver=0; for(i=0;iaver)n+; printf(“n %d”,n); 用 数组 1( 3)对 100个学生的分数统计出每分一档人 数。 0 ? 1 ? 2 ? 3 ? 4 ? 99 ? 100 ? main() int i,a; for(i=1;i=0;i-) printf(“n %3d:%3d”,i,ni); 体会数组作 为存放结果 的数据结构 时的优越性 。 按 10分一档统计? main() int i,a,n101; for(i=0;iaj) t=ai; ai=aj; aj=t; for(j=0;jai+1) t= ai; ai= ai+1; ai+1=t; for(j=0;j0;i-)ai=ai-1; k=a9; a0=k; for(j=1;jai1j1)i1=i; j1=j; printf(“n %d,%d”,i1,j1); 初始化 对二维数组赋初值的几种方法: int a34= 1,2,3,4,5,6,7,8,9,10,11,12; int a34=1,2,3,4,5,6,7,8,9,10,11,12; int a34=1,5,9; int a34=1,0,6,0,0,11; int a4=1,2,3,4,5,6,7,8,9,10,11,12; int a4=0,0,3,9,10; 举例 ( 1)矩阵的基本操作 二维数组的逻辑结构就如同一个矩阵,因 此,矩阵操作都可用二维数组实现。 a11 a12 a13 a1n a21 a22 a23 a2n a31 a32 a33 a3n am1 am2 am3 amn A= 假定 M=3, N=4 求和: main() int a44,i,j,s=0; for(i=0;ismax) smax=s; row=i; for(j=0;j字符串 2时: 返回一正整数 。 字符串 10) puts(a); 不能用 ab else puts(b); 使用字符串处理函数需要包含头文件 string.h ( 6) strlen(字符数组 ) 测试字符串的实际长度(从返回值得到) 。 ( 7) strlwr(字符串 ) 将字符串中的大写字母全改为小写字母。 ( 8) strupr(字符串 ) 将字符串中的小写字母全改为大写字母。 注意: 在使用字符串处理函数时,别忘了 将头文件 string.h包含进去。 4、字符串操作举例 ( 1) 从键盘输入一字符串到数组 a中,再拷 贝到数组 b中(不用库函数)。 main() char a50,b50; int i; scanf(“%s”,a ); for(i=0; ai; i+) bi=ai; bi=0; printf(“%s”,b ); ( 2) 从键盘输入两个字符串到数组 a和 b中, 在将 b中的内容连接到 a中(不用库函数)。 main() char a50,b50; int i,j; scanf(“%s%s”,a,b ); for(i=0; ai; i+); for(j=0; bj; j+) ai+=bj; ai=0; printf(“%s”,a ); ( 3) 从键盘输入一字符串,并将其中的大写 字母改成小写字母后输出(不用库函数)。 main() char a50; int i; scanf(“%s”,a ); for(i=0; ai; i+) if(ai=A scanf(“%d%d”, else z=y; c=max(a,b); return(z); printf(“%d”,c ); x y z a b c3 5 说明: ( 1) 程序由两个函数组成,它们逻辑上相互独 立(功能、变量)。 ( 2) 程序的执行总是从主函数开始,主函数总 是被执行一次,其他函数只有在被调用时才获 得控制。 ( 3) 函数调用有两个作用:转移控制权和传递 参数。 ( 4) return的作用也有两个:交回控制权和返 回结果。 ( 5) 实参可以是常量、变量或表达式,但类型 要一致。 定义一个函数除考虑算法外就是 :如何设 计函数的参数,通过何种途径交回结果。 例:求自然数 1100 中的素数之和。 ? prime( ? ) main() int i; int i,s=0; for(i=2;i1时 float fac(int n) main() float f; float f; if(n=0|n=1) f=1; f=fac(4); else f= ? printf(“n%f”,f ); return(f); 递归调用的执行过程: n*fac(n-1); 主函数 函数 fac 函数 fac 函数 fac 函数 fac 问题: 4个 return的执行顺序? 后进先出! f=fac(4); n=4 if(n=0|n=1)f=1; else f=n*fac(n-1); return(f) n=3 if(n=0|n=1)f=1; else f=n*fac(n-1); return(f ) n=2 if(n=0|n=1)f=1; else f=n*fac(n-1); return(f) n=1 if(n=0|n=1)f=1; else f=n*fac(n-1); return(f) 8 5 数组作为函数的参数 当要传递的参数较少时,用简单变量作为 函数的参数是方便的 ,但当要传递的参数是批量 时,需要 用数组作为函数的参数。 例:编写函数,求 100个数的平均数。 float aver(int a100) int i; float s=0; for(i=0;iaj)t=ai;ai=aj; aj=t; main() int x5,i; for(i=0;imax)max=ai; if(aimax)max=ai; if(aimax)max=ai; if(ai #include “file2.c” A file1.c A B B file1.cfile2.c 例: #include “math.h” main() float a,b,c,s,area; scanf(“%f%f%f”, s=0.5*(a+b+c); area=sqrt(s*(s-a)*(s-b)*(s-c); printf(“n %f”,area); #include “f.h” main() printf(“n%f”,f1(3.0); printf(“n %f”,fac(10); float f1(float r) return(PI*r*r); float fac(int n) int i; float s=1; for(i=1;i*max) *max=ai; if(aiaj)t=ai; ai=aj; aj=t; 只将形参改为指针变量,仍按下标法使用 void sort(int *a, int n) int i,j,t; for(i=0;i*(a+j) t=*(a+i); *(a+i)= *(a+j); *(a+j)=t; 按指针法使用 进一步优化: void sort(int *a, int n) int *i, *j,t; for(i=a;i*j) t=*i; *i=*j; *j=t; main() int a10,j; for(j=0;jy) z=x; else z=y; return(z); main() int (*p)(); 定义指向函数的指针变量 p int a,b,c; p=max; 将 p指向函数 max scanf(“%d%d”, c=(*p)(a,b); 通过 p调用函数 max 等效于 c=max(a,b); printf(“n %d”,c); 把指向函数的指针变量作为函数参数 指向函数的指针变量最常见的用途是把 它作为函数的参数,用于接受主调函数传来 的某一函数的入口地址,从而在被调函数中 可以通过该指针变量调用它所指向的函数, 这样,被调函数中就可实现非固定函数的调 用,以达到编写通用函数的目的。 例:用矩形法编写一个通用的求定积分

温馨提示

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

最新文档

评论

0/150

提交评论