




已阅读5页,还剩69页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章 简单C程序设计 2 回顾 v程序是为执行一项任务而编写的有序指令集 vC程序的特点 vC语言的组成 vC程序的编译和运行过程 编译器将源程序转换成机器能理解的程序 连接器用于连接相关的目标文件以生成可执行程 序 3 本章要点 C语言的数据类型、运算符 C语言的常量和变量 C语言的表达式 常用数学函数 4 #include int main( ) int celsius, fahr; fahr=100; celsius=5*(fahr-32)/9; printf(“fahr=%d, celsius=%dn“, fahr, celsius); 执行程序的输出结果为:执行程序的输出结果为: fahr=100, celsius=37 2.1 温度转换 例2.1 求华氏温度100F对应的摄氏温度 5 2.1.1 内存 v内存可以理解为一排井然有序的小开关,每个开关有 两个状态:开表示1,断表示0,所以每个开关表示一 个二进制数,0或1,称为一个位(bit). v为管理方便,8个位为一组,称为一个字节(byte) v然后为所有字节从0开始编号,这个编号称为字节的 地址 v 2的10次方( 1024)个字节称为1k v 2的20次方( 1048576)个字节称为1M v 2的30次方( 1073741824)个字节称为1G 6 2.1.2 变量 int celsius, fahr; celsius = 5 * (fahr - 32) / 9; v变量是计算机里一块特定的内存,它由一个或多个连续的 字节组成。 v每个变量都有一个名称,表示内存中的这个位置,以便通 过变量名读取该位置的数据或存储一个新数值。 v变量的值不是固定的,随时都可以改变,且次数不限。 7 编写程序时,通常使用变量来存储 数据,方便后面使用这个数据或者 修改这个数据的值。 变量 程序 内存 存储 fahr 计算5 * (fahr - 32) / 9 将值存储为celsius 100 32 输出fahr和celsius 8 内存变量用来存储数据,系统需要知道每个变量要存储什么类型 的数据,然后为每个变量分配一块足够大的内存空间,用来该类 型的数据 2.1.3 数据类型 数据属于不同类别 Africa The quick brown fox TRUE 数据 非数值数值 整型非整型 9002.12 999 9/12/2003 2.175 123 Jackie Chan char 数据类型 非数值数值 整型 int short int long int double float 非整型 9 整型变量类型 short int 2个字节-2-15至215-1 , -32768 至 +32767 整数变量还分为几种不同的类型,以存储不同范围的整数 int 4个字节-2-31至231-1,-2147438648 至 + 2147438647 long int 4个字节 -2-31至231-1,-2147438648至+2147438647 _int64 long long int 8个字节-2-63 至 263-1 1、数据类型所占字节数,取决于所使用的编译器 2、short int 可以简写为short, long int可以简写为long 3、不同编译器对64位的支持不同,在VC中只支持_int64, gcc/g+支持 long long, windows平台的gcc/g+也支持_int64 10 无符号的整数类型 unsigned short int 2个字节0至216-1 , 0 至 +65535 unsigned int 4个字节0至232-1, 0 至 + 4294967295 unsigned long int 4个字节0至232-1, 0 至 + 4294967295 unsigned _int64 unsigned long long int 8个字节0至264-1,0至18445744073709551615 当处理不能为负的数据时,可以使用无符号类型,所占内 存与有符号型相同,但对正数的表示范围比有符号型大一 倍 11 2.1.4 变量的声明和使用 v声明变量: int celsius, fahr; v定义时初始化变量: int celsius, fahr=100; v定义后初始化变量: fahr=100; 。 v给变量赋值,除了给一个直接的值以外,还 可以通过计算获得如: celsius=5*(fahr-32)/9; 12 变量的命名规则 在 C 语言中,变量命名需要遵循一定的规则 有效名称 principal cost_price marks_3 lastname city 无效名称 123rate currency$ discount% zip code v 变量的命名规则: n变量名可以由字母、数字和 _(下划线)组合而成 n变量名不能包含除 _ 以外的任何特殊字符,如:%、# 、逗号 、空格等 n变量名必须以字母或 _(下划线)开头 n变量名不能包含空白字符(换行符、空格和制表符称为空白字符 ) nC 语言中的某些词(例如 int 和 float 等)称为保留字,具有 特殊意义,不能用作变量名 nC 语言区分大小写,因此变量 price 与变量 PRICE 是两个不 同的变量 13 2.1.5 赋值运算 v赋值运算符 = v赋值表达式:用 = 将一个变量和一个表达式连接 起来的式子 变量 表达式 例如: fahr = 100; celsius = 5 * (fahr - 32) / 9; n计算赋值运算符右侧表达式的值 n将赋值运算符右侧表达式的值赋给左侧的变量 的左边必须是一个变量 14 分析错误程序 /求两个整数的和 #include int main() int a, b, sum; sum=a+b; a=3; b=5; printf(“%dn“,sum); return 0; 该程序为何得不到正确结果? 错误原因是受数学思维的影响, 吴以为sum=a+b;是建立sum和a+b 之间的一个等量关系 赋值运算“=”表示的是一个动作:先计算表达 式的值,再存入赋值号左边的变量中,既不表示 数学中的等量代换,也不表示相等关系 执行sum=a+b;语句是,因为a和 b中的值都不确定,是随机的, 所以其和也是随机的,然后把这 个数赋给了sum 该程序为何得不到正确结果? 15 2.1.6 格式化输出函数printf printf( “%d“ , count);printf 将一些信息按照指定的格式送到标准输出(显示器) count 输出参数表:待输出的数据,可以是常量、变量或表 达式 格式:printf(“格式控制串”,输出参数表) “%d“ 格式字符串:指定数据的输出格式 16 输出格式 printf(“fahr=%d , celsius=%dn“, fahr, celsius); 普通字符,原样输出 %开头的是转换说明,对应与后面一个 输出参数,对应参数将被转换成指定格 式后在该位置输出 输出结果: fahr=100, celsius=37 输出参数列表 n是转意字符,用来输出一个回车 17 转换字符串 printf( “%d“ , count);“%d“ 转换字符串说 明 %d 将参数按整数形式转换输出,对应参数应是int 类型 %ld 将参数按长整数形式转换输出,对应参数是long型 %c输出一个字符,对应参数应该是一个字符 %s输出一个字符串,对应参数应该是一个字符串 %f 将参数按带小数点数形式输出,对应参数应是double 类型 ,默认情况下精确到 6 位小数 18 转换字符串%d int visitor_count = 150; printf (“ %d“ , visitor_count); 输出结果:150 19 转换字符串%md int salary = 5500; printf (“ %10d“ , salary); 输出结果: 5500 输出结果的左边显示了 6 个空格 “ %10d“ 数据以十进制整数格式输出,宽度占m列,数据 不足m列左补空格,超过m列按实际位数输出。 20 转换字符串%-md int salary = 5500; printf (“ %10d“ , salary); 输出结果:5500 输出结果的右边显示了 6 个空格 “ %-10d“ 数据以十进制整数格式输出,宽度占m列,数据 不足m列右补空格,超过m列按实际位数输出。 21 课堂练习:输出整数幂 已知m=11,n=41,输出m和n的2次方、3次方和4次方,要 求每个数据占8列,左对齐。效果如下: 121 1331 14641 1681 68921 2825761 22 2.2:使用浮点数进行温度转换 v例2.2:例2.1中程序的运行结果并不令人满意,因 为华氏温度100,对应的摄氏温度应该为37.7777 ,而不应该是37。 需要使用浮点型变量来存储带小数点的数,我们需要将 celsius, fahr声明为双精度浮点型 #include int main( ) double celsius, fahr; /声明两个双精度浮点型变量 fahr=100.0; /赋值运算 celsius=5*(fahr-32)/9; /计算摄氏温度,并存入变量celsius printf(“fahr=%f, celsius=%fn“, fahr, celsius); 23 2.2.1 浮点变量类型 浮点数在计算机中的表示,基于指数表示法,将分为 指数和尾数来存储。浮点变量根据数据表示范围和精 确度不同,有一下几种类型 float4个字节 (+/-)3.4E38 ,6位有效数字 浮点变量用来存储浮点数,浮点数包含的值带小数点, 也可以表示分数和整数。 double8个字节 (+/-)1.7E308 ,15位有效数字 课外作业:查阅资料,了解浮点数是如何存储的 Long double12个字节 (+/-)1.19E4932 ,18位有效数字 24 注意有效位数的不同 内存 float double 213.5671435568967 64位 取值范围:10-308 至 10308 16 位有效数字 nflaot f_level = 213.5671435568967; ndouble d_level = 213.5671435568967; 去VC下试试! 25 转换字符串%f float circumference = 78.53; printf (“%f“ , circumference); 输出结果:78.530000 默认情况下精确到六位小数 9.4786789; 9.4786799.478679 2.2.2 浮点数据的输出 26 double mercury_level = 168.2251074; printf( “%7.2f“ , mercury_level); 输出结果: 168.23 宽度,表示所有的数字和小数点所占的位数。不够7位右对齐。 “ %7.2f“ 精度(精确到小数点后多少位) 转换字符串%m.nf 2.2.2 浮点数据的输出 27 程序 指令 2.2.3 常量 标识符 关键字 常量 运算符 分隔符 等 常量是在程序中保持不变的量,分为: 立即数 符号常量(宏常量) const 常量 立即数 v 整型常量:如32、100 v 实型常量: 如1.23 123.567e5 v 字符常量: a 、 2 、 n v 字符串常量:“c program” 28 定义常量 v为使程序易于阅读和便于修改,可以给程序中经 常使用的常量定义一个有一定含义的名字。 常量用于定义具有如下特点的数据: 在程序中保持不变 在程序内部频繁使用 需要用比较简单的方式替代某些值 防止意外的修改,增强程序的健壮性 29 定义宏常量 v#define PI 3.1415926 编译预处理指令#define将PI定义成一个要被3.1415926取代 的符号,此时PI不是一个变量,而是3.1415926的别名。 在编译开始之前,只要在程序的表达式中引用PI,预处理 器就会用#define 指令中的值(3.1415926)来取代它。 宏常量的缺点:宏常量被替换成立即数之后,内存中有同 一个立即数的多份拷贝。 30 定义const常量 v在定义变量时,加上const修饰,告诉编译器, 它的值是固定的,不能被改变。编译器会帮你检 查、监督。 const double PI=3.1415926; const 推出的初始目的,正是为了取代预编译指令, 消除它的缺点,同时继承它的优点。 在编译的时候,由于const定义常量只是给出了对应的内存 地址,而不是象#define给出的是立即数,所以,const定义 的常量在程序运行过程中只有一份拷贝,而#define定义的 常量在内存中有 若干个拷贝。 31 例2.3 求圆柱体的体积 /求圆面积,圆周率用立即数 #include “stdio.h” int main() doulbe v, r,h; r=10.0; h=20.0; v=3.1415926 r*r*h; printf (“v=%fn”,v); return 0; /求圆面积,圆周率用宏常量 #include “stdio.h” #define PI 3.1415926 int main() double v, r, h; r=10.0; h=20.0; v=PIr*r*h; printf(“v=%fn”,v); return 0; /求圆面积,圆周率用const宏常量 #include “stdio.h” const double PI=3.1415926; int main() double v, r, h; r=10.0; h=20.0; v=PIr*r*h; printf(“v=%fn”,v); return 0; 32 模仿练习 v(1)编程,已知圆的半径radius(实数),输 出圆的面积,保留两位小数 33 2.3:对任意华氏温度进行温度转换 v例2.3:例2.2中的程序运行后只能输出华氏温度 100F对应的摄氏温度,为提高程序地通用性,要求 程序运行后等待键盘输入一个华氏温度(实数), 程序输出其对应的摄氏温度。 /读入一个华氏温度,输出其对应的摄氏温度 #include int main( ) double celsius, fahr; /声明两个双精度浮点型变量 scanf(“%lf“, /等待用户输入一个数,存入fahr celsius=5*(fahr-32)/9; /计算摄氏温度,并存入变量celsius printf(“fahr=%f, celsius=%fn“, fahr, celsius); 34 scanf(“%d”, 2.3.1 scanf() 函数 scanf 函数从标准输入(键盘)读取信息,按 照格式描述把读入的信息转换为指定数据类 型的数据,并把这些数据赋给指定的内存区 域中。 转换字符串 (1)%d为格式转换符,每个格式转换符对应后面一个内存地址。 (2)scanf将读入数据,按指定格式理解该输入,然后存入对应内 存地址 36 3.1.2 格式转换符 格式转换符参数变量的类型要求的实际输入 %dint 十进制整数 %f float 十进制数实数 %lf double十进制数实数 格式控制字符串: (1)由一对双引号括起来 (2)可以包含格式转换符和普通字符 格式转换符以%开头,不同类型的数据,采用不同 的格式转换符,目前常用的转换符见下表: 37 内存用scanf()读入整形数据 int num; scanf(“%d“, num 在内存中分配一块 32 位存储空间 存储空间使用名称“num”标识 等待用户输入一个值 将输入的值按十进制整数来理解,然后内存中(因 为 scanf 提供了num的内存地址) 123 38 内存 用scanf()读入单精度浮点数据 float tax_rate; scanf (“%f“ , tax_rate 在内存中分配一块 32 位存储空间 存储空间使用名称“tax_rate”标识 等待用户输入一个值 将输入的值按十进制单精度实数来理解,然后内存 中(因为 scanf 提供了tax_rate的内存地址) 12.234 39 内存 double tax_rate; scanf (“%lf“ , tax_rate 在内存中分配一块 64 位存储空间 存储空间使用名称“tax_rate”标识 等待用户输入一个值 将输入的值按十进制双精度实数来理解,然后内存 中(因为 scanf 提供了tax_rate的内存地址) 12.234 约定:以后凡说要定义实型变量,都使用double 用scanf()读入双精度浮点数据 40 3.1.3格式控制字符串中的普通字符 v scanf(格式字符串,地址列表) 在格式字符串中若有普通字符,则输入时在对应位置也必须 输入该普通字符,否则会因读入格式错误而终止程序。 如果有scanf(“%d,%d”, printf(“%d“,m+n); return 0; 输入8 5 输出结果是错误的 若输入8,5,则运行结果正确 scanf中的格式字符串中若有普 通字符,则输入时在对应位置 也必须输入该普通字符 分析如下程序错误的原因 43 常见错误分析2 /输入半径,输出面积 #include #define PI 3.1415926 int main() double a, b; scanf( “%d%d“ , s=PI*r*r; printf(“s=%.2fn“,s); return 0; 输入:3 5 输出结果错误 错误原因: 因a,b是double类型 的变量,故scanf的格式转换符 应该是%lf 分析如下程序错误的原因 “%lf%lf“ 44 2.4 整数的运算 例2.4 分糖果,老师有n个糖果,要分给m个小朋 友分糖果,n和m由键盘输入,输出每个小朋友分 几个,老师还剩余几个。 /程序2.4:整数运算 #include int main() int candies , kids; scanf(“%d%d“, printf(“每人分%d个n“, candies/kids ); printf(“剩余%d个n“, candies%kids ); return 0; 45 2.4.1 算术运算 C 运 算 符 算术运算符:(+ - * / % + -) 关系运算符:( = !=) 逻辑运算符:(! scanf(“%d“, d0=n%10; /将个位存入d0; d1=(n/10)%10; /将十位存入d1 d2=(n/100)%10;/因为n最多是三位数,也可写为d2=(n/100); printf(“%dn“,d0+d1+d2); return 0; 49 课堂练习:两个整数的和差积商 输入两个整数,求两个数的和、差、积、商,要求商 保留2位小数 /整数运算 #include int main() int a,b,c; scanf(“%d%d“, printf(“%d“,a+b); printf(“%d“,a-b); printf(“%d“,a*b); printf(“%.2fn“, 1.0*a/b); return 0; 50 常见错误1: /两个整数的运算 #include int main() int a,b,c; scanf(“%d%d“, printf(“%d“, a+b); printf(“%d“, a-b); printf(“%d“, a*b); printf(“%.2fn“, a/b); return 0; 输入:8 5 商的结果是0.00,分析原因 原因是输出格式控制%0.2f与 对应输出项类型不匹配。a/b的 结果是整型数据,%.2f用来输 出浮点型数据 整数除法的运算结果是整数商, 直接扔掉余数 分析如下程序错误的原因 51 常见错误2: /两个整数的运算 #include int main() int a, b; double c; c=a/b; scanf(“%d%d“, printf(“%d“,a+b); printf(“%d“,a-b); printf(“%d“,a*b); printf(“%.2fn“, c); return 0; 输入8 5 运行结果是1.00,分析原因 依然是整数除法带来的问题: 整数除法的运算结果是整数, 5/3的结果是1,把1赋给实型 变量c,c的值是1.0,而不是你 期望的1.6 分析如下程序错误的原因 52 2.4.2类型转换 v1、不同级别的操作数运算时,精度低的自动向 精度高的转换 如: double a=1/2; a的值是0.0 double a=1.0/2; a的值是0.5 2、赋值时类型转换 如: double a=1;/会把1.0赋给a int i=1.5;/会把1.5转换为整型得1,赋给i 53 类型转换 v 3、 强制类型转换 (类型名)操作数 如: double a=2.5; int n; n=(int)a; /将a的值转换为整型2,赋给n 又如:求两整数的商,商为实数 int a=2,b=3; double c; c=(double)a/b; /强制类型转换 或 c=1.0*a/b; /不同类型运算时向精度高的转换 先将a转换为实数, 再除以b!强制转换 优先级最高 54 2.5 两个数的最大值 例2.5 输入两个数,输出其中较大的数 #include int main() int a,b,max; scanf(“%d%d“, max=a; if( bmax ) max=b; printf(“%dn“, max); return 0; (1)读入a, b (2)把a赋给max; (3)如果bmax(或ba), 把b存入max (4)输出max 55 2.5.1 关系运算 n关系运算符 n种类:= != n结合方向:自左向右 n优先级别: = = != 优先级6(高) 优先级7(低) 关系预算的结果是整型: 若关系成立,结果为1; 若关系不成立,结果为0; int a=3,b=5; ab 结果为0; A*2b 结果为1 23 = 37结果为1 56 n关系运算注意: 例 若int a=0, b=5, x=100; 则 a270 结果为 A100 结果为 1 0 57 2.5.2 基本if 语句 if (表达式) 语句 如果括号内表达式的值为真, 则执行if后的语句,否则什么 也不做 语句 表达式 真 假 语句1可以是单个语句,也可 以是用括起来的复合语句。 58 模仿练习 改写上例,实现:输入三个数,输出其中最大的数 (1)读入a, b,c (2)把a赋给max; (3)如果bmax, 把b存入max (4)如果cmax, 把c存入max (5)输出max #include int main() int a, b, c, max; scanf(“%d%d%d“, max=a; if( bmax ) max=b; if( cmax ) max=c; printf(“%dn“, max); return 0; “比武招亲”、擂台赛的思想 59 2.5.3 条件表达式 本题可以用如下条件运算符来处理: max = (ab) ? a : b #include int main() int a,b,max; scanf(“%d%d“, max = (ab) ? a : b printf(“%dn“, max); return 0; 其中,“(ab) ? a : b”是一个条件表达式,若条件 (ab)成立,则条件表达式取值a;否则,取值b 。 相当于 if (ab) max=a; else max=b; 60 条件表达式的一般形式: v表达式1?表达式2:表达式3 条件表达式的求解过程 先求解表达式1的值 若表达式1的值为真(非0);则求解表达式2的值 ,将其作为条件表达式的值。表达式3不计算。 若表达式1的值为假(0);则求解表达式3的值 ,将其作为条件表达式的值。表达式2不计算。 61 模仿练习 用条件表达式实现:输入三个数,输出其中最大的数 (1)读入a, b,c (2)把a和b中较大者赋给max; (3)把c和max中较大者赋给 max; (4)输出max #include int main() int a, b, c, max; scanf(“%d%d%d“, max = (ab) ? a : b; max = (cmax) ? c : max printf(“%dn“, max); return 0; 62 课课堂练习练习 v 时间间隔 v 从键盘输入两个时间点(24小时制), 输出两个时间点之间的时间间隔,时间 间隔用“小时:分钟:秒”表示。 v Input v 输输入包括两行。 第一行为时间为时间 点1,第二行为时间为时间 点2 。都以“小时时:分钟钟:秒”的格式输输入。 v Output v 以“小时时:分钟钟:秒”的格式输输出时间间时间间 隔。格式参看样样例。 v Hint v 注意:要输输出01:08:31中的占位符0 Sample Input 12:01:12 13:09:43 Sample Output 01:08:31 Sample Input 12:40:12 13:09:43 Sample Output 00:28:31 63 思路分析 方法1:两个时间时间 点都转换转换 成秒,然后相减,再把 结结果转换为时转换为时 分秒 方法2:时时分秒对应对应 相减,不够够减向上借位。 64 2.6 计算两点间距离 例2.6 编程: 输入4个实数x1,y1,x2,y2,数据之 间用空格隔开。表示两点坐标A(x1,y1), B(x2,y2),计算并输出两点间的距离。结果保留 两位小数。 (1)定义x1、y1、x2、y2、dist 为double类型 (2)读入x1、y1、x2、y2 (3)利用两点间距离公式求距离, 存入dist (4)输出dist 如何求平方根呢? 用C语言的标准库函 数sqrt() 65 例2.6的源程序 /求两点之间的距离 #include #include int main() double x1,y1,x2,y2,dist; scanf(“%lf%lf%lf%lf“, dist= sqrt( (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2) ); printf(“%.2fn“,dist); return 0; 也可以写成两个语句: dist=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2); dist=sqrt(dist); 66 2.6.1 常用数学函数 要包含头文件: #include 1、求绝对值 求整数的绝对值,用abs: int i=-3,j; j=abs(i); 求实数的绝对值,用fabs: double a=-12.3,b; b=fabs(a); 67 数学函数 2、求开方,用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 物资采购日常管理制度
- 环保药品销售管理制度
- 环保设备销售管理制度
- 环卫高压喷雾管理制度
- 甘肃体彩品牌管理制度
- 生产加工项目管理制度
- 生产测试软件管理制度
- 生产设备点检管理制度
- 生产车间下单管理制度
- 公园小摊活动策划方案
- 电工电子学知到智慧树期末考试答案题库2025年北京科技大学
- 人教版七年级下册数学11.1.1不等式及其解集(同步课件)
- 深度学习的基本概念试题及答案
- 委托抚养孩子协议书
- 年产200吨高纯金属铯铷项目报告书
- 园艺学:植物嫁接技术的创新与应用
- 2025商丘市辅警考试试卷真题
- 高速公路施工标准化管理指南
- 网络支付行业的发展趋势
- 不动产登记代理人《地籍调查》历年考试真题及答案(高频题)
- 铝合金门窗安装施工方案
评论
0/150
提交评论