CH1 C程序设计基础

Download Report

Transcript CH1 C程序设计基础

一、C程序设计基础
1. 二进制基础
• 计算机采用二进制的原因
 成本更低
 运算更简单
 硬件上更容易实现
• 二、八、十、十六进制数的转换
 10进制数转换成2、8、16进制数
整数部分:除基取余法
小数部分:乘基取整法

2、8、16进制数转换成10进制数
按权相加法

2进制数转换成16进制数
四位一组用16进制数代替

16进制数转换成2进制数
每位用四位2进制数代替
• 数据在计算机中的存储形式
 位、字节和字的概念
 内存单元、内存单元地址和指针的概念
• 整数的无符号与有符号表示
• 原码、反码和补码
 原码:一个整数在内存中占二字节,规定高位
字节的最左边一位为最高位,表示数的符号(0
正1负),其余各位代表数本身的绝对值。
如:+8的原码 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
- 8的原码 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
+0的原码 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0的原码 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 反码:正数的反码与原码相同,负数的反码规定
符号位不动,其余各位对原码取反
如:- 8的反码 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1
- 0的反码 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

补码:正数的补码同原码,负数的补码为它的
反码加1
如:- 8的补码 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
- 0的补码 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+0的补码 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

用补码表示数时,0的代码是唯一的;
负数补码的补码是它的原码;
用补码表示数使加减法的统一 。
1111 1111 1111 1101
(-3)的补码
+ 0000 0000 0000 0001
(+1)的补码
1111 1111 1111 1110
(-2)的补码
• 模216原则
假定用16位二进制表示一个整数,则数值范围为:
无符号数:0000000000000000~1111111111111111
0~ 216 -1
即 0~65535
有符号数:1000000000000000~0111111111111111
-215 ~ 215 -1 即 -32768~32767
如果计算机进行运算时运算结果超出这16位范围,
那么将只取低16位作为结果,例如:
65534 + 3 = 65536+1
无符号 有符号
1111 1111 1111 1110
(65534) (-2)
+ 0000 0000 0000 0011
(3)
(3)
1 0000 0000 0000 0001
(1)
(1)
无符号 有符号
1000 0000 0000 0010
(32770)(-32766)
+ 1111 1111 1111 1101
(65533)(-3)
1 0111 1111 1111 1111
(32767)(32767)
无符号 32770+65533 = 65536+32767
有符号 -32766-3 = -32769 = -65536+32767
结论:设有两个整数a和b对216求余数(模)所得结
果相同(即两数的二进制表示中低16位完全相同),
那么计算机就认为这两数是同一个数,计算机的这
个特征称为取模原则或模216原则,即任何一个数加
上或减去65536所得结果相同。
2. 程序设计初步
• 程序设计语言
 机器语言
计算机能直接执行的二进制指令的集合
 汇编语言
用“助忆符”代替二进制形式的指令组成的指令集。
计算机不能直接执行汇编语言编写的程序,须经
“汇编程序”“翻译”成机器语言。
 高级语言
更接近于人们习惯的自然语言和所用的数学公式。
计算机不能直接执行高级语言编写的源程序,须
翻译成机器语言,主要有两种方式:
一种是编译方式:
“编译程序”把整个源程序翻译成机器语言的
目标
程序,以后再执行该目标程序。
另一种是解释方式:
“解释程序”把源程序翻译一句,执行一
句,…直
至结束。
• 程序设计的含义
 算法 + 数据结构 = 程序
算法:指问题的求解过程(计算机工作的步骤)
数据结构:指对参与运算的数据的组织和安排
 面向过程与面向对象
 算法的表示方法
⑴ 用自然语言
⑵ 用流程图(传统流程图和N-S流程图)
例如:描述计算1至n累加和的流程。
用自然语言描述如下:
① 输入整数n
② 置变量s为0
③ 置变量i为1
④ 将变量i的值加到s中
⑤ 变量i递增1
⑥ 如果i ≤n则转到步骤④
⑦ 输出s的值
用传统流程图描述如下:
开始
输入n
0s
1i
i≤n
T
s +i  s
i+1  i
输出s
结束
F
• 结构化程序设计
 自顶向下,逐步细化
根据总要求和完成功能逐步细分成若干相对独立
的模块和子模块
 清晰第一,效率第二
程序要清晰易读,包括采用有意义的变量名和作
必要的注释
 书写规范,缩进格式
统一标准的格式书写程序,用分层缩进的写法显
示嵌套结构的层次或区分每一结构
 基本结构,组合而成
程序用顺序、选择、循环三种基本结构组成
3. C语言概述
• C语言简史
1972年 Bell实验室D.M.Ritchie在B语言基础上设计
1973年 和Thompson合作用以改写 UNIX
1978年 B.W.Kernighan和D.M.Ritchie (简称K&R)
合著《The C Programing Language》
称为标准 C
1983年 美国国家标准化协会制定发表 ANSI C
1987年 美国国家标准化协会制定发表 87 ANSI C
1989年 美国国家标准化协会制定发表最终版 C89
1990年 国际标准化组织(ISO)批准了同一标准,
称为C90,本教材以此版本为基础
1999年 ANSI和ISO联合制订了新标准,称为C99
C语言最初是为了编写UNIX操作系统而推出的,
1978年后,C语言先后移植到大、中、小、微型机
上,成为应用最广泛的计算机语言之一
• C语言特点
 面向过程的结构化语言,包含丰富的数据类型和
运算符,适用于一般解题和科学计算等各种领域
 讲究效率,书写格式简洁自由,编译生成的代码
质量非常高。指针类型等能直接控制系统的各种
资源,因此可以最大限度地提高程序的灵活性。
但源程序的语法检查相对不太严格
 最接近于汇编语言,是汇编语言最好的替代工具
 内核部分相当小,编译器容易实现,容易推广到
各种不同的平台上,通过非常丰富的库函数和自
己扩充函数,可以编写出各种功能强大的程序
• C语言字符集
 大小写英文字母: a~z A~Z
 数字字符:
0~9
 27个特殊字符:
+ - * / = : ; ? \ ~ | ! # % & () []
{} ^ < > _ , . " ' 空格
• C语言标识符
 标识符:是指用来标识程序中用到的变量名、函
数名、类型名、数组名以及符号常量名等的有效
字符序列
 标识符组成: 标识符必须由字母或下划线开头,
后跟字母或下划线或数字,字母区分大小写
 标识符长度:有效字符个数无统一规定,随C 编
译系统而定 ,一般只能识别前8个字符,TC 2.0
支持最长为32个字符
 选择标识符时,提倡使用有意义的英文单词,注
意做到“见名知义”
 关键字是由C语言规定的具有特定意义的字符串,
通常也称为保留字 ,不允许作标识符(见附录Ⅱ)
• 简单的C程序
例1:
main ( )
{
printf("This is a c program.\n");
}
/*主函数*/
/*{函数体}*/
/*调用输出函数*/
/*"字符串"*/
/* '\n' 换行符*/
/*句末用分号*/
本程序的作用是输出以下一行信息:
This is a c program.
例2:
/* 求两个变量之和 */
main ( )
{ int a, b, sum;
a=123; b=456;
sum=a+b;
printf(“sum = %d\n”, sum);
}
/* 变量说明 */
/* 赋值 */
/* 求和计算 */
/* 调用输出函数 */
本程序的运行结果: sum = 579
几点认识:
 C是函数式的语言,C程序由函数构成
 有且只有一个主函数(main()函数)
 函数名后须有一对圆括号,括号内可有参数
 函数名下至少有一对花括号,最外层花括号内是
函数体, 函数体包括变量说明和程序语句
 每个程序语句以分号为结束
 一行内可写多个语句,一个语句可分写在多行上
 程序中可用 /*…...*/ 对任何部分作注释
本章结束
数据在计算机中的存储形式(16位系统)
字节(8位)
64K
容量
地址
0000
0001
···
···
2000
2001
2002
2003
···
···
FFFE
FFFF
00111001
00110000
00000000
00100000
16位变量x = 12345
指针变量p = &x
除基取余法:
十进制整数转二进制
十进制整数转十六进制
除2取余法
除16取余法
19÷2=9 …… 1 (低位) 9999÷16=624 …… 15
9÷2=4 …… 1
624÷16= 39 …… 0
4÷2=2 …… 0
39÷16= 2 …… 7
2÷2=1 …… 0
2÷16= 0 …… 2
1÷2=0 …… 1 (高位)
(19)10=(10011)2
(9999)10=(270F)16
乘基取整法:
十进制小数转二进制
乘2取整法
0.6875  2 = 1.375
0.375  2 = 0.75
0.75  2 = 1.5
0.5  2 = 1.0
(0.6875)10=(0.1011)2
十进制小数转八进制
乘8取整法
0.6875  8 = 5.5
0.5  8 = 4.0
(0.6875)10=(0.54)8
按权相加法:
二进制数转十进制数
(11010.01)2
=124 +123 +022 +121+020 +02-1 +12-2
= 16 + 8 + 0 + 2 + 0 + 0 + 0.25
= 26.25
十六进制数转十进制数
(2C3D)16
= 2163 +12162 +3161+13160
= 24096+12256+316+13
= 8192+3072+48+13
= 11325