4.34k likes | 4.57k Views
C 语言程序设计. 辽宁对外经贸学院信息技术系. C 语言发展历史. C 语言特点. C 程序格式和结构特点. C 程序上机步骤. 第一章 C 语言概述. 1 .1 C 语言发展历史 程序设计语言的发展. 机器语言. 汇编语言. 高级语言. 面向过程. 面向对象. 面向机器的语言. 程序设计是数据被加工的过程. 程序设计 = 设计数据结构+设计算法. CPU 指令系统,由0、1序列构成的指令码组成 如: 10000000 加 10010000 减 ( 8086 有 133 条指令).
E N D
C语言程序设计 辽宁对外经贸学院信息技术系
C语言发展历史 C语言特点 C程序格式和结构特点 C程序上机步骤 第一章 C语言概述
1.1 C语言发展历史 程序设计语言的发展 机器语言 汇编语言 高级语言 面向过程 面向对象 面向机器的语言 程序设计是数据被加工的过程 程序设计=设计数据结构+设计算法 CPU指令系统,由0、1序列构成的指令码组成 如:10000000 加 10010000 减 ( 8086有133条指令) 客观世界可以分类,对象是类的实例 对象是数据和方法的封装 对象间通过发送和接受消息发生联系 以构成一个系统的对象为中心编写程序 用助记符号描述的指令系统 如 ADD A, B 程序设计关键是定义类,并由类派生对象 主要特点:继承性、封装性、多态性
C语言发展过程 产生背景 产生过程 ALGOL60 BCPL B C 1960年出现ALGOL 60是一种面向 问题的语言,不宜编写系统软件 1967年英国剑桥大学推出BCPL语言,在ALGOL 60基础上更接近硬件 1970年以BCPL为基础,美国Bell实验室 Ken. Thompson设计出简单且接近硬件的B语言 1972年在B语言基础上,美国Bell实验室 D.M.Ritchie设计出C语言 时间:1972~1973 地点:美国贝尔实验室 目的:UNIX操作系统 设计人: Ken.Thompson和Dennis.M.Ritchie
1.2 C语言特点 语言简洁、紧凑、灵活 运算符和数据类型丰富 程序设计结构化、模块化 生成目标代码质量高 可移植性好 中级语言 < >
32个关键字:(由系统定义,不能重作其它定义)32个关键字:(由系统定义,不能重作其它定义) • auto break case char const • continue default do double else • enum extern float for goto • if int long register return • short signed sizeof static struct • switch typedef unsigned union void • volatile while
9种控制语句: • if( )~else~ • for( )~ • while( )~ • do~while( ) • continue • break • switch • goto • return
例 C语言与Pascal语言比较 • C语言Pascal语言 含义 • { }BEGIN….END复合语句 • if(e) s;IF(e) THEN s条件语句 • int i ;VAR i:INTEGER定义i为整型变量 • int a[10];VAR a:ARRAY[1..10] OF INTEGER定义整型数组a • int f();FUNCTION f():INTEGER定义f为返值整型的函数 • int *p;VAR p:INTEGER定义p为指向整型变量的指针 • i+= 2;i=i+2赋值i+2i • i++,++i;i=i+1 i自增值 • 结论:C比 Pascal简练,源程序短。
34种运算符: 算术运算符:+ - * / % ++ -- 关系运算符:< <= == > >= != 逻辑运算符:! && || 位运算符 :<< >> ~ | ^ & 赋值运算符:=及其扩展 条件运算符:?: 逗号运算符:, 指针运算符:* & 求字节数 :sizeof 强制类型转换:(类型) 分量运算符:.-> 下标运算符:[] 其它 :( ) -
短整型short 整 型 整型int 长整型long 数值类型 单精度型float 浮点型 基本类型 双精度型double 字符类型char 数组 C 数 据 类 型 结构体struct 构造类型 共用体union 枚举类型enum 指针类型 空类型void 定义类型typedef
真 假 当P为真 P P 真 假 A A B A B 假 A A P B 真 B 流程图 N-S图 A 顺序结构 选择结构 循环结构
语句 主函数 编译预处理 1.3 C程序格式和结构特点 例1.1 第一个程序 Hello,World! main() { printf(“Hello,World!”); } #include <stdio.h> 输出: Hello,World! 函数名后面必须跟一对(),函数参数可放在其中 printf是C语言中的输出函数,双引号中的字符串原样输出 main为主函数,每个C程序有且必须有一个主函数, 无论其位置在哪,程序总是从main函数开始执行 {……}内为函数体 #include <stdio.h>是文件包含编译预处理命令, stdio.h是标准输入输出头文件 ;分号是C语言中的语句结束标志
主函数 语句 注释 注释 /*….*/是注释,对编译和执行不起作用 1.3 C程序格式和结构特点 例1.2 第二个程序: 求两数之和 /* 求两个数的和 */ #include <stdio.h> main() { int a, b,sum; /* 定义三个变量*/ a=123; b=456; sum=a+b; printf(“Sum is %d”,sum); } %d是输出格式字符,控制输出时的数据类型和格式, 表示十进制整数 输出: Sum is 579 sum是要输出的变量,与%d对应 int a, b,sum;定义三个整型变量 a=123;是赋值语句
例1.3 第三个程序: 求任意两数之和 主函数 #include <stdio.h> main() {inta,b,sum; scanf(“%d,%d”,&a,&b); sum=add(a,b); printf(“Sum= %d”,sum); } intadd(intx, inty) {intz; z=x+y; return(z); } scanf是C语言中的输入函数, 从键盘读入两个十进制整数, 分别放入变量a和b对应的 地址单元中 调用函数add,调用时: 定义函数add,函数返回值为整型, 形参x和y为整型 运行结果: 234,654 Sum=888 return将z值返回,赋给sum
main( ) { int i , j , sum; sum=0; for(i=1; i<10;i++) { for(j=1;j<10;j++) { sum+=i*j ; } } printf(“%d\n”,sum); } 缩进 缩进 main( ) {………………. ……………… ………….. ………….. ……… ………. …………… ……………. ………………. ……………….. } • 格式特点 • 习惯用小写字母,大小写敏感 • 不使用行号,无程序行概念 • 可使用空行和空格 • 常用锯齿型书写格式 优秀程序员的素质之一: • 使用TAB缩进 • { …}对齐 • 有足够的注释 • 有合适的空行
结构特点 函数与主函数 程序由一个或多个函数组成——函数式语言 必须有且只能有一个主函数main() 程序执行从main开始,在main中结束,其它函数通过嵌套调用得以执行 程序语句 C程序由语句组成 用“;”作为语句终止符 注释 /* */为注释 不产生编译代码 • 编译预处理命令
源程序 f.c 结束 执行 编辑 编译 连接 有 无 目标程序 f.obj 库函数和其 它目标程序 有错? 有错? 正确? 可执行 程序 f.exe 有 无 不正确 正确 • 1.4 C程序的上机步骤 C程序开发步骤 开始 编辑: 将源程序代码 输入并存储到 计算机内, 但不能被执行 编译: 语法分析查错, 翻译生成二进制 目标代码,但还 不能被执行 源程序: 用高级语言( 或汇编语言) 编写的程序, 不能直接运行 目标程序: 源程序经编译 后得到的二进 制代码 可执行程序: 经连接处理后 得到的目标程 序,可直接 被计算机运行 连接: 与其它目标程序 或库函数进行链 接装配,生成可执 行程序*.exe
本章小结 了解C语言发展历史及其特点 了解C语言格式及结构特点 掌握C程序开发步骤 熟练掌握Turbo C 2.0/C++3.0集成开发环境及C程序上机步骤
第二章 程序的灵魂 -----算法 学习目标: 1、理解算法的基本概念。 2、了解算法的特性。 3、掌握算法的表示方法。
对操作的描述,即操作步骤 对数据的描述,即数据类型和数据组织形式 • 2.1算法的概念 • 算法:解决某一特定问题采取的具体步骤的描述 例如太极拳图解、一首歌曲的乐谱等。 对同一个问题可以有不同的算法。但是要保证算法正确,还要考虑算法质量,选择合适的算法。 计算机算法可以分为两大类:数值运算算法和非数值运算算法。 程序=数据结构+算法 • 算法特性: • 有穷性 • 确定性 • 有效性 • 有零个或多个输入 • 有一个或多个输出 算法评价: • 正确性 • 可读性 • 效率和低存储量
判断 处理 起止 输入输出 注释 连接点 流线 2.2算法的表示方法 例 判断2000~2500年中每一年是否为闰年,将结果输出。 闰年条件: 1、能被4整除,但不能被100整除的年份 2、能被100整除,又能被400整除的年份 S1: 2000 y S2: 若y不能被4整除,则输出y“不是闰年”,然后转s6。 S3:若y能被4整除,不能被100整除,则输出y“是闰年”,然后转s6。 S4:若y能被100整除,又能被400整除,输出y“是闰年”,然后转s6。 S5:输出y“不是闰年”。 S6: y+1 y S7: 当 y<=2500时,转s2继续执行,否则算法停止。 算法表示: • 用自然语言 • 流程图 • N-S图 • 用为代码 • 用计算机语言
分析问题 2000->y 整理思路 不能 y能被4 整除 画流程图 能 能 y能被100 整除 y不是闰年 不能 不能 能 编写程序 y能被400 整除 y是闰年 y不是闰年 y是闰年 y+1->y 否 y>2500 是 结束 用流程图表示算法如下: 开始
用N---S图表示算法如下: P A 成立 不成立 A B B 分支结构 顺序结构 当P成立 A A 直到 P成立 当型循环 直到型循环
2000 y Y/4的余数为0 是 否 Y/100的余数不为0 否 是 Y/400的余数为0 是 输出y “非闰年” 否 输出y是 “闰年” 输出y “是闰年” 输出y “非闰年” Y+1 y 直到y>2500
用伪代码表示算法如下: • Begin • Y • while y<=2500 • { if y 能被 4 整除 • if y 不能被 100 整除 • print y:”是闰年” • else • if y 能被 400 整除 • print y:”是闰年” • else • print y:”非闰年” • endif • endif • else • print y:”非闰年” • endif • y+1 y • } 中层选择结构 外层选择结构 内层选择结构
用计算机语言表示算法如下: main() { int y; for(y=2000;y<=2500;y++) { if (y%4!=0) printf("The year is not bissextile year"); else if (y%100!=0) printf("The yesr is bissextile yesr"); else if (y%400==0) printf("The year is bissextile year"); else printf("The year is not bissextile year"); } }
C语言课程 C程序结构如图: 第一章 第二章 第三章 第十章 …… C程序 第一节 第一节 第一节 第一节 第二节 第二节 第二节 第二节 第三节 第三节 第三节 第三节 源程序文件1 源程序文件2 源程序文件n …... 函数n 预处理命令 全局变量声明 main 函数1 …... ….. ….. 小节一 小节二 小节三 小节一 小节二 小节一 小节二 小节三 小节一 小节二 函数首部 函数体 局部变量声明 执行语句 2.3结构化程序设计 • 基本思想:任何程序都可以用三种基本结构表示,限制使用无条件转移语句(goto) • 结构化程序:由三种基本结构反复嵌套构成的程序叫~ • 结构化程序设计方法 • 自顶向下 • 逐步细化 • 模块化设计 • 结构化编码 • 优点:结构清晰,易读,提高程序设计质量和效率
基本数据类型 各类运算规则 第三章 数据类型、运算符与表达式
C语言数据类型 整型 字符型 单精度型 基本类型 实型(浮点型) 枚举类型 双精度型 数组 数据类型 构造类型 结构体类型 共用体类型 指针类型 空类型 3.1 C语言数据类型
3.2 常量与变量 3.2.1常量与符号常量 1.定义:在程序执行期间,其值不可改变的量称为常量 2.类型: 数值常量 例如:10,3 , 2.68等 符号常量即用一个符号代表一个常量 例如: #define PI 3.1415926 main( ) {float r,l,s; r=2; l=2*PI*r;s=PI*r*r; printf(“l=%f, s=%f”, l,s); }
3.2.1常量与符号常量 说明: 符号常量必须先定义后才能用它表示一个数值。 符号常量的值在其作用域内不能改变,也不能再被赋值。 符号常量名习惯用大写字母表示。
3.2.2 变量 1. 定义:程序执行期间值可以改变的量。 2.命名规则:变量名由标识符表示,只能由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。 标识符:用来对变量、符号常量、函数、数组、类型等数据对象命名的有效字符序列。 例如:下列标识符中,不合法的变量名有: M.D.John 12%gf 1add _ce36 age& 5thclass lotus-1-2-3 cd*ef
3.2.2 变量 说明: • 变量要“先定义,后使用” • 定义格式:类型说明符 标识符1, … ,标识符n 例如:int x, y, z; float a, b, c, d; • 选变量名时,要做到“见名知意” 例如:name st_num xm total class sum • 大小写字母是两个不同的字符,C变量名习惯 用小写字母表示。
例如:任意输入两个数,求其和。 mian() { int a,b,sum; scanf(“%d,%d”,&a,&b); sum=a+b; printf(“sum=%d”,sum); } 请思考:该程序在任何时候都是正确的吗?
3.3 整型数据 3.3.1整型常量的表示方法 1、十进制整数:由数字(0-9)和正负号表示 例如:123、-456、0 等 2、八进制整数:以0开头,后面一串由八进制数字 (0-7)组成 例如:0123 即(123)8 =( 83 ) 10 012 即(12)8 =( 10 ) 10 3、十六进制整数:以0x或0X开头,后面一串由十六进制数字(0-9,a-f,A-F)组成 例如:-0x12 即 (-12) 16 =( -18 ) 10 0x2F 即 (2F) 16 =( 47 ) 10
3.3.2整形变量 1、整型数据在内存中的存放形式 数据在内存中是以二进制形式存放的, 实际上数值是以补码表示的。 • 数值的表示方法——原码、反码和补码 • 原码:最高位为符号位,其余各位为数值本身 • 反码: • 正数:反码与原码相同 • 负数:符号位为1,其余位对原码取反 • 补码: • 正数:原码、反码、补码相同 • 负数:将该数的绝对值的二进制形式,按位取反再加 1。
例如:求-10 的补码的方法是: • 1、取-10的绝对值 10; • 2、10的二进制形式为 0000000000001010; • 3、对其各位取反得1111111111110101 ; • 4、再加1得 1111111111110110
基本型:以 int表示 短整型:以 short int或short表示 1.类型 长整型:以 long int或long表示 无符号基本型(unsigned int) 无符号型 无符号短整型(unsigned short) 无符号长整型(unsigned long) 3.3.2 整型变量的分类 说明: 一个无符号整型变量中可以存放的数的范围扩大一倍。 整型变量一般在内存中占2个字节(16位).
整型数据的范围是:-32768 ~32767 • 无符号整型数据的范围是:0 ~ 65535 • 有符号整型变量: • 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 =32767 • 1 1 1 1 1 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 =-32768 • 无符号整型变量 : • 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 =65535
3.3.2 整型变量的定义 int a,b,c; unsigned short d,e; long f,g,h;
3.3.4整型数据的溢出 运行结果为: 32767,-32768 #include <stdio.h> void main( ) {int a,b; a=32767; b=a+1; printf(“%d,%d\n,a,b); } a: 0111111111111111=32767 b: 1000000000000000 是 –32768的补码
3.3.3 整型常量的类型 整型常量可分为: int 、 short int 、 long int、unsigned int 、 unsigned short 、 unsigned long等。 其具体的区分利用取值范围来确定,详细内容见教材p45页。
请思考: 整形变量与无符号的整形变量的数值范围是什么? int a; unsigned int b; 因为:int类型大于或等于0的数在0000000000000000~0111111111111111之间,表示为十进制的0~32767 int型的负数在 1000000000000000~1111111111111111之间,表示为十进制数为:-32768~-1 ∴a的数值范围是:-32768~32767 b的数值范围是:0~65535
2、写出下列数据在内存中的存储形式: 1111111111111110 000…000011010 000…000011010 1111111111111110 000…000011010 1111……11111110 000…000011010 1111……111111110
3.4浮点型数据 3.4.1浮点型常量的表示方法 表示形式有如下两种: 1.十进制小数形式。由数字和小数点及正负号组成。 (注意:必须有小数点) 例如:23.678 .678 23.0 2.指数形式。由数字、小数点、字母e或E及正负号组成。 (注:e或E之前必须有数字,且后指数必须为整数) 例如:3.5E-5 2e3 错误: E2 3.6e3.5 .e6 e 一个数可以有多种指数形式表示:例如:123.456可以表示成 :123.456e0 、 12.3456e1、 1.23456e2、 0.1234e3 等。 但是只有其中的1.23456e2 “称为规范化的指数形式” ,一个浮点数据在以指数形式输出时,是按规范化形式输出的。
3.4.2 浮点型变量 1、浮点型数据在内存中的存放形式(占4个字节32位) 浮点型数据是按照指数形式存储的。例如:3.14159 2、浮点型变量的分类 浮点型变量可分为: 单精度(float型) 如: float x , y ; 双精度型(double型) 如:double a , b , c ; + .314159 1
3、浮点型数据的舍入误差 • 由于浮点型变量是由有限的存储单元组成的,因此能提供的有效数字总是有限的。在有效位以外的数字将被舍去。 main() { float a,b; a=123456.789e5; b=a+20; Printf(“%f,%f\n”,a,b); } 12345678848.000000, 12345678848.000000
3.4.2 实型变量 说明: float 型变量在内存中占4个字节;double 型 变量在内存中占8个字节。 2. 单精度实数提供7位有效数字;双精度实数提供15~16位有效数字。 3. 一个实型常量不分float 和double 型, 一个实型常量可以赋给一个float 型或double 型变量,并根据变量的类型截取实型常量中相应的有效位数字。 例如: float a; double b; a=123456.789 ; b=123456.789 ;
3.5字符型数据 3.5.1字符常量 1 .字符常量:用单引号括起来的一个字符。 例如: ‘a’ ‘A’ ‘$’ ‘!’ 注:‘a’与‘A’是不同的字符常量 2. 转义字符:以一个‘\’开头的字符序列 例如:‘\ n’换行 ‘\ t’横向跳格(水平制表) ‘ \b’退格 ‘\v ’竖向跳格(垂直制表) ‘ \r ’回车 ‘ \f ’走纸换页 ‘ \a ’报警 ‘ \ 0 ’空字符