为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > C语言自编教材2

C语言自编教材2

2011-12-26 50页 doc 2MB 26阅读

用户头像

is_667069

暂无简介

举报
C语言自编教材2C程序设计教程 主编 业宁 主审 沈丽容 主要作者 张黎宁,薛联凤,何煦岚,王文贝 东南大学出版社 目 录 1第一章 引言 11.1程序及编程语言 21.2 C语言简介 21.2.1 C语言的发展 31.2.2 C语言的特点 41.3 C语言源程序的结构 51.4准备开始编程吧 51.4.1 在Turbo C2.0集成开发环境中编辑调试程序的过程 91.4.2 在Visual C++ 6.0集成开发环境中编辑调试程序的过程 141.5 如何学习本课程 15习题 17第二章 简...
C语言自编教材2
C程序设计教程 主编 业宁 主审 沈丽容 主要作者 张黎宁,薛联凤,何煦岚,王文贝 东南大学出版社 目 录 1第一章 引言 11.1程序及编程语言 21.2 C语言简介 21.2.1 C语言的发展 31.2.2 C语言的特点 41.3 C语言源程序的结构 51.4准备开始编程吧 51.4.1 在Turbo C2.0集成开发环境中编辑调试程序的过程 91.4.2 在Visual C++ 6.0集成开发环境中编辑调试程序的过程 141.5 如何学习本课程 15习题 17第二章 简单的C程序设计 172.1 程序设计与算法 172.1.1 程序 182.1.2 算法的概念和特点 182.1.3 结构化程序设计 212.2 C程序的基本组成结构 212.2.1 简单C程序举例 242.2.2 C程序的组成结构 272.3 C程序设计的主要过程 272.3.1 问题分析与算法描述 282.3.2程序的编辑 292.3.3程序的编译与运行 30习题 31第三章 数据类型、运算符和表达式 313.1 C语言的数据类型 323.2常量与变量 323.2.1 常量 333.2.2 变量 343.3 整型数据 343.3.1 整型常量 353.3.2 整型变量 383.4 实型数据 383.4.1 实型常量 393.4.2 实型变量 413.5 字符数据 413.5.1 字符常量 423.5.2 字符变量 443.5.3 字符串常量 443.6 各种类型数据之间的混台运算 463.7 C语言的运算符与表达式 473.7.1 C语言的运算符简介 473.7.2 算术运算符和算术表达式 513.7.3 赋值运算符和赋值表达式 553.7.4逗号运算符和逗号表达式 56习题 60第四章 基本输入输出 604.1 C语句 614.2 数据输入输出的概念以及在C中的实现 614.3 字符数据的输入输出 614.3.1 putchar函数(字符输出函数) 624.3.2 getchar函数(键盘输入函数) 624.4 格式输入与输出 624.4.1 printf函数 (格式输出函数) 654.4.2 scanf函数 (格式输入函数) 67习题 69第五章 选择结构 695.1 关系运算符和表达式 705.2 逻辑运算符和表达式 715.3 If语句 725.3.1 最基本的if语句 745.3.2 if-else结构 755.3.3 条件运算符和条件表达式 765.3.4 if-else-if结构 795.3.5 if语句的嵌套 805.4 switch语句 82习题 84第六章 循环结构程序设计 846.1 简介 846.2 while语句 866.3 do-while语句 886.4 for语句 916.5 goto语句 916.6 循环的嵌套 926.7 循环语句的比较 926.8 循环控制语句 926.8.1 break语句 936.8.2 continue语句 946.9 程序应用 97习题 98第七章 数组 987.1 一维数组 987.1.1一维数组的定义 997.1.2一维数组的初始化 1007.1.3一维数组举例 1037.2 二维数组 1037.2.1二维数组的定义 1037.2.2二维数组的初始化 1047.2.3二维数组举例 1067.3 字符数组和字符串 1067.3.1字符数组的定义 1067.3.2字符数组的初始化 1087.3.3字符串常用函数 1127.3.4 常用字符函数 1137.3.5字符数组举例 114习题 115第八章 函数 1158.1 函数概述 1168.1.1 分类 1178.1.2 函数的定义 1188.2 函数的参数和返回值 1188.2.1 函数的参数 1198.2.2 函数返回值 1218.3 函数的参数的传递方式 1218.3.1 值传递 1228.3.2 地址传递 1238.4 函数的调用 1238.4.1 函数调用的一般形式 1238.4.2 函数调用的方式 1248.4.3 函数的嵌套调用 1288.5 变量的作用域与变量的存储类别 1288.5.1 变量的作用域 1328.5.2 变量的存储类别 1348.6 函数作用范围 1348.6.1 内部函数 1358.6.2 外部函数 135习题 136第九章 预处理命令 1369.1 概述 1369.2 宏定义 1369.2.1 无参宏定义 1379.2.2 带参宏定义 1409.3 文件包含 1429.4 本章小结 142习题 145第十章 指针 14510.1 地址和指针的概念 14710.2 变量的指针与指针变量 14710.2.1定义一个指针变量 14810.2.2 指针变量的初始化和赋值 14910.2.3指针变量的引用 15010.2.4指针的运算 15210.3数组与指针 15210.3.1 数组名是指针常量 15210.3.2指向数组元素的指针变量 15310.3.3通过指针引用数组元素 15810.4字符串与指针 15810.4.1 字符串变量处理 15910.4.2字符串常量处理 15910.4.3使用字符指针变量和字符数组处理字符串的比较 16110.5函数与指针 16110.5.1指针变量作为函数的参数 16410.5.2数组名与指向数组的指针变量作函数参数 16810.5.3字符串指针作函数参数 16910.5.4 函数指针的基本概念 17110.5.6函数的返回值为指针 17310.6指针数组和多级指针 17310.6.1 指针数组的概念 17610.6.2 多级指针 17710.6.3 指针数组作main函数的形参 17810.7动态存储分配与void指针类型 17810.7.1 void指针类型 17910.7.2动态内存分配函数 180小结 181习题 183第十一章 结构体与共用体 18311.1结构体类型概述 18311.1.1结构体类型的定义 18511.1.2结构体变量的定义 18611.1.3结构体变量的引用 18611.1.4结构体变量的赋值和初始化 18611.2结构体数组 18811.3指向结构体类型数据的指针 18911.3.1 结构体指针变量的定义 18911.3.2利用结构体指针变量引用结构体成员 19011.4用结构体处理链表 19011.4.1 链表概述 19111.4.2 链表的建立与输出 19411.4.3 链表的插入 19511.4.4 链表的删除 19611.4.5 链表的综合操作 19911.5共用体 20011.5.1 共用体类型及变量的定义 20111.5.2  共用体变量的使用 20311.6 枚举类型 20311.7 用typedef定义类型 204习 题 207第十二章 位运算 20712.1 位运算符 21312.2 位域 216习题 218第十三章 文件 21813.1 文件的概念 21813.1.1文件 21913.1.2文件指针 21913.1.3文件结束的判定 22013.2 文件的打开与关闭 22013.2.1文件的打开 22013.2.2文件的使用方式 22113.2.3文件关闭函数 22113.3文件的读写 22113.3.1 字符的读写 22313.3.2 字符串的读写 22413.3.3 数据块的读写 22513.3.4格式化读/写函数 22613.4文件的定位 22813.5文件检测函数 22813.6文件小结 267习题 271附录 运算符和结合性 273参考文献 第一章 引言 1.1程序及编程语言 对于我们初涉编程领域的人来说,程序是一个高深莫测的词汇。那么,程序究竟是什么呢?通俗地讲,程序就是向计算机发出的一个个操作"命令"的集合,告诉计算机如何完成一个具体的任务。由于现在的计算机还不能理解人类的自然语言,所以目前还不能用自然语言来编写程序。专业地讲,程序(program)是为解决特定问题而用计算机语言编写的命令序列的集合。执行程序时,由程序控制计算机完成相应的操作,得到相应的结果。 要学习编程技术,首先要掌握一种计算机编程语言。程序设计语言(programming language)是用于编写计算机程序的语言。计算机编程语言级别可以分为机器语言(machine Language)、汇编语言(assembly Language)和高级语言(high level Language) 三类,而机器语言和汇编语言又被统称为低级语言(low level Language)。 机器语言是用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合,它是第一代的计算机语言。机器语言的指令全部是由0和1组成的,可想而知,利用机器语言编写的程序对于我们来说简直就是"一串密码",程序的可读性非常差。同时机器语言对不同型号的计算机来说一般是不同的,所以利用机器语言编写的程序的可移植性差,重用性差,这也是当时的计算机未能迅速得到广泛应用的原因之一。 为了克服机器语言难读、难编、难记和易出错的缺点,人们就用与指令代码实际含义相近的英文缩写词、字母和数字等符号来取代机器指令代码,于是就产生了汇编语言。汇编语言是机器语言符号化的结果,比机器语言易于读写、调试和修改,同时具有机器语言高效,可有效访问控制硬件等优点。由于汇编语言中使用了助记符号,用汇编语言编制的程序是不能被计算机直接识别和执行,必须"翻译"成能被计算机识别和处理的二进制代码程序,这个过程称为汇编。用汇编语言等非机器语言书写的程序称为源程序,运行时要使用汇编程序将源程序翻译成目标程序即机器语言程序。 虽然机器语言和汇编语言效率高,但是均与特定的机器有关,语言对机器的过分依赖,要求使用者必须对硬件结构及其工作原理都十分熟悉,这对非计算机专业人员是难以做到的,对于计算机的推广应用是不利的。随着计算机事业的发展,促使人们去寻求一些与人类自然语言相接近且能为计算机所接受的语意确定、规则明确、自然直观和通用易学的计算机语言,这种与自然语言相近并为计算机所接受和执行的计算机语言称高级语言。 高级语言是面向用户的,不依赖特定计算机体系结构的程序设计语言。与用汇编语言编写的程序一样,用高级语言编写的程序称为源程序,运行时要经过解释或编译处理将源程序翻译成目标程序即机器语言程序。无论何种机型的计算机, 只要配备上相应的高级语言的编译或解释程序,则用该高级语言编写的程序就可以通用。每一种高级程序设计语言,都有自己规定的专用符号、英文单词、语法规则、语句结构和书写格式。高级语言与自然语言更接近,它的表示要比低级语言更接近于待解问题的表示方法,在一定程度上与具体机器无关,通用性强,兼容性好,便于移植,易学,易用,易维护。这种类型的高级语言非常多,有FORTRAN、COBOL、BASIC、LOGO、PASCAL、C、Ada等等,这些语言各有特点。FORTRAN语言主要用于数值计算。COBOL语言主要应用于情报检索、商业数据处理等管理领域。BASIC语言简单易学,适合作为初学者的入门语言。LOGO语言是一种与自然语言非常接近的编程语言,具有生动的图形处理功能,能用直观的运动来体现编程的结果,尤其适合儿童学习和使用。PASCAL可称为第一个结构化程序设计语言,在高校计算机软件教学中一直处于主导地位。Ada语言一度被美国国防部强制指定为军用武器系统的唯一开发语言。C语言尽管最初是作为一种系统程序设计的工具语言而设计的,但它已成功用于各个应用领域,是当前使用最广泛的通用程序设计语言之一。 目前,程序设计语言及编程环境正向面向对象语言及可视化编程环境方向发展,出现了许多第四代语言及其开发工具。如:微软公司开发的Visual系列(VC++、VB、FoxPro)编程工具及Sybase公司开发的Power Builder等,已经在国内外得到了广泛的应用。 1.2 C语言简介 C语言是目前国内外广泛使用的程序设计语言,它既有高级语言的特点,又具有汇编语言的特点。对操作系统和系统应用程序以及需要对硬件进行操作的场合,用C语言明显优于其它高级语言,所以它可以作为系统设计语言来编写系统应用程序。同时C语言又具备很强的数据处理能力,也可以作为应用程序设计语言来编写不依赖计算机硬件的应用程序。另外C语言具有很强绘图功能,适用于开发设计二维、三维图形和动画等等。因此,C语言的应用范围极为广泛。 1.2.1 C语言的发展 C语言的原型是ALGOL(Algorithmic Language) 60语言,ALGOL 60语言又称为A语言。1963年剑桥大学将ALGOL 60语言发展成为CPL (Combined Programming Language)语言。1967年剑桥大学的Matin Richards对CPL语言进行了简化,产生了BCPL(Basic Combined Programming Language)语言。1970年美国贝尔实验室的Ken Thompson将BCPL进行了修改,为它起了一个有趣的名字"B语言",意思是将CPL语言进行简化,提炼出它的精华,并且他用B语言写了第一个UNIX操作系统。在1972年至1973年间,美国贝尔实验室的D.M.Ritchie在B语言的基础上设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。1977年Dennis M.Ritchie发表了不依赖于具体机器系统的C语言编译文本《可移植的C语言编译程序》,大大简化了C移植到其它机器时所作的工作,也迅速地推动了UNIX操作系统在各种机器上的实现。1978年由美国电话电报公司(AT&T)贝尔实验室正式发表了C语言,同时由B.W.Kernighan和D.M.Ritchie合著了著名的《The C Programming Language》一书,其中介绍的C语言成为后来广泛使用的C语言版本的基础,它被称为C。后来由美国国家标准协会(American National Standards Institute)在此基础上制定了一个C 语言标准,于1983年发表,通常称之为ANSI C。1988年,随着微型计算机的日益普及,C语言出现了许多版本。由于没有统一的标准,使得这些C语言之间出现了一些不一致的地方。为了改变这种情况,美国国家标准研究所(ANSI)为C语言制定了一套ANSI标准,成为现行的C语言标准。 自1978年贝尔实验室正式发布C语言以来,C以简洁紧凑的风格,面向过程的编程方式,丰富的数据结构和强大的底层控制能力获得迅速发展。到上世纪80年代,C语言已经成为最受欢迎的编程语言。许多著名的系统软件, 如DBASE Ⅲ PLUS、DBASE Ⅳ 都是由C 语言编写的。用C语言加上一些汇编语言子程序, 就更能显示C语言的的威力,象PC- DOS 、WORDSTAR等就是用这种方法编写的。到上世纪90年代,C已经成为计算机专业学生的首选教学语言,并成为一代程序员主要工作语言。90年代中期,随着PC的普及和C++等面向对象语言的出现,人们渐渐把视线转移到PC应用软件上,程序员们也开始习惯用面向对象这种更高级方式思考和解决问题。大家对C强大的底层控制能力失去兴趣,因为那些复杂的代码已经可以交给编译器去实现,底层的操作已经完全可以交给类库和操作系统API(Application Programing Interface应用程序接口)去进行,C语言逐渐失去了主流编程语言的位置。进入21世纪,随着个人电子消费产品和开源软件的流行,C语言再次焕发生机。由于C在底层控制和性能方面的优势,使之成为芯片级开发(嵌入式)和Linux平台开发的首选语言;在通信、网络协议、破解、3D引擎、操作系统、驱动、单片机、手机、PDA、多媒体处理、实时控制等领域,C正在用一行行代码证明它从应用级开发到系统级开发强大和高效。 1.2.2 C语言的特点 C语言之所以被广泛使用,归功于自身所拥有的特点。归纳起来,C语言具有下列特点: (1)简洁紧凑、灵活方便。C语言一共只有32个关键字,9种控制语句,程序书写自由。 (2)运算符丰富。C的运算符包含的范围很广泛,共有种34个运算符。C语言把括号、赋值、强制类型转换等都作为运算符处理,从而使C的运算类型极其丰富,表达式类型多样化。灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。 (3)数据结构丰富。C的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等,能用来实现各种复杂的数据类型的运算。并引入了指针概念,使程序效率更高。另外C语言具有强大的图形功能, 支持多种显示器和驱动器,且计算功能、逻辑判断功能强大。 (4)C是结构化语言。结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。 (5)C语法限制不太严格,程序设计自由度大。例如:对数组下标越界不作检查,对变量的类型约束不严格等。这就同时要求编程人员要自己检查程序,保证其正确,而不要过分依赖C的编译程序去查错。 (6)C语言允许直接访问物理地址,可以直接对硬件进行操作 。因此既具有高级语言的功能,又具有低级语言的许多功能,能够象汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元,可以用来写系统软件。 (7)C语言程序生成代码质量高,程序执行效率高,一般只比汇编程序生成的目标代码效率低10へ20%。 (8)C语言适用范围大,可移植性好。 以上这些特点对于初学者来说现在还不能完全理解,相信等到后续各章内容学完之后就会有深刻的认识。 1.3 C语言源程序的结构 怎么用C语言编写程序呢?别着急,我们首先来看一个简单的例子吧。譬如,我们要编写程序让计算机完成求任意两个整数之和。简单加以分析,可知程序中要包含如下主要命令序列: (1) 首先要确定两个整数的大小,并由计算机的外部设备输入两个整数,由计算机的存储设备接收; (2) 让计算机的运算器完成这两个整数相加的运算; (3) 将相加的结果输出到计算机的外部设备。 那么,对应的C语言源程序长得什么样子呢?它的庐山真面目如例1.1所示: 例1.1 #include void main() { int a,b,sum; scanf("%d %d",&a,&b); sum=a+b; printf("sum=%d\n",sum); } 每一行代码表示什么含义呢?可以对程序的每一行代码加上注释,以便于别人来阅读,加上注释的原程序如下: #include void main() { int a,b,sum; scanf("%d %d",&a,&b); sum=a+b; printf("sum=%d\n",sum); } 其中每一行代码之后的"/*"与"*/"之间即为该行代码含义的注释。在此只需对该程序有个大致的了解即可,第4行到第6行是该源程序的主要部分,实现了数据的输入,运算和结果的输出,这和我们一开始的分析是吻合的。至于每行代码为什么要这样写,在后续的学习中很快就会解决了。 C语言源程序结构特点如下: (1)一个C语言源程序可以由一个或多个源文件组成。 (2)每个源文件可由一个或多个函数组成。 (3)一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数。 (4)源程序中可以有预处理命令(include 命令仅为其中的一种),预处理命令一般应放在源文件或源程序的最前面。 (5)每一个说明,每一个语句都必须以分号结尾。但预处理命令,函数开始和花括号"}"之后不能加分号 。 (6)每行代码中的标识符,关键字等不同的语法成分之间必须至少加一个空格以示间隔。 (7)对程序中主要或重要的部分可以用/*……*/加注释,增加程序的可读性。 1.4准备开始编程吧 常用的C语言IDE(Integrated Development Environment集成开发环境)有Microsoft Visual C++,Borland C++,Turbo C,CC,GCC等等。一般初学者多用Turbo C 2.0或Visual C++ 6.0/7.0开发环境来编辑调试程序。当然,在调试程序之前首先要确定你的机器上已经安装了相应的集成开发环境。 1.4.1 在Turbo C2.0集成开发环境中编辑调试程序的过程 Turbo C是美国Borland 公司的产品,Borland公司是一家专门从事软件开发、研制的公司。该公司在1987年首次推出Turbo C 1.0 产品,其中使用了全然一新的集成开发环境,即使用了一系列下拉式菜单,将文本编辑、程序编译、连接以及程序运行一体化,大大方便了程序的开发。1988年Borland公司又推出Turbo C1.5版本,增加了图形库和文本窗口函数库等。Turbo C 2.0是该公司1989年出版的,在原来集成开发环境的基础上增加了查错等功能。Turbo C 2.0是一个集源程序编辑、编译、连接、运行与调试于一体、 用菜单驱动的集成软件环境。 在TC中运行一个C语言程序的一般过程如下: (1)启动TC,进入TC集成环境。 (2)编辑(或修改)源程序,源程序文件后缀一般为*.c。 (3)编译。由编译程序将源程序编译成机器指令程序,即目标程序。目标程序的文件名与相应的源程序同名,但后缀为*.obj。如果编译成功,可进行下一步操作;否则,返回(2)修改源程序,再重新编译,直至编译成功。 (4)连接。将目标程序和库函数或其它目标程序连接成了可执行的文件,文件名与相应的源程序同名,后缀为*.exe。如果连接成功,则可进行下一步操作;否则,根据系统的错误提示,进行相应修改,再重新连接,直至连接成功。 (5)运行。通过观察程序运行结果,验证程序的正确性。如果出现逻辑错误,则必须返回(2)修改源程序,再重新编译、连接和运行,直至程序正确。 (6)退出TC集成环境,结束本次程序运行。 我们以例1.2中的程序为例介绍详细的上机步骤。 例1.2 void main() { printf("This is a test program.\n"); } 该程序的作用是输出一行信息: This is a test program.。 (1)启动Turbo C 2.0。启动Turbo C 2.0的方法很多,比较简单的是找到TC.exe文件后直接双击,或选择开始菜单中的运行命令,在打开的"运行"对话框中输入"D:\tc\tc.exe"(要注意Turbo C 2.0的安装路径,你所用的机器不一定在D盘的tc文件夹下),单击"确定"即可。启动后的界面框架如图1.1所示: 图1.1 启动Turbo C后,其主菜单条横向排列在标题栏下方,并被激活,其中File菜单成为当前项。中间窗口为Edit编辑区,接下来是Message信息窗口,最底下一行为功能键参考行和NumLock键的状态,这四个部分构成了Turbo C 2.0的主屏幕, 以后的编程、编译、调试以及运行都将在这个主屏幕中进行。编辑窗口的顶端为状态行,其中: · Line 1 Col 1:显示光标所在的行号和列号,即光标位置。 · Insert:表示编辑状态处于"插入",当处于"改写"状态时,此处为空白。 · Indent:自动缩进开关。在该状态下,每一次换行使光标自动与上一行的第一个字符对齐,用Ctrl+QI组合键切换。 · Tab:制表开关,用Ctrl+OT键切换。 · Fill:它与Indent和Tab的开关(ON/OFF)一起使用。当Tab模式为ON时,编辑系统将在每一行的开始填以适当的制表及空格符。 · Unindent:在该状态下,当光标处于某行的第一个非空字符或一空行时,退格键将使光标回退一级而不是一个字符。用Ctrl+OU键切换。 · D: NONAME.C:显示当前正在编辑的文件名,显示为"NONAME.C"时,表示用户尚未给文件命名。 (2)编辑源程序。启动之后光标停留在File菜单上,可用Esc或F10键来激活Edit编辑区。直接在编辑窗口中输入例1.1程序源代码(如图2所示),注意不要遗漏大括号,分号等符号。在源程序中,很多符号都是成对匹配出现的,为避免遗漏必须配对使用的符号,例如注释符号、函数体的起止标识符(花括号)、圆括号等等,在输入时,可连续输入这些起止标识符,然后再在其中进行插入来完成内容的编辑。在起止标识符嵌套时,以及相距较远时,这样做更有必要。虽然C程序的书写格式非常自由,但从程序结构清晰,便于阅读、理解、维护的角度出发,建议在书写程序时应遵循以下规则,以养成良好的编程习惯。 · 一个说明或一个语句占一行。 · 用{}括起来的部分,通常表示了程序的某一层次结构。"{"一般与该结构语句的第一个字母对齐,并单独占一行;"}"同样单独占一行,与该结构开始处的"{"对齐。 · 低一层次的语句或说明可比高一层次的语句或说明缩进若干格后书写(一般为2个或4个空格),以便看起来更加清晰,增加程序的可读性。 若要编辑一个已经存在的C语言源程序,先激活主菜单,选择并执行File | Load项或F3键。在"Load File Name"窗口,输入源程序文件名。有关命令菜单的使用方法如下: · 按下功能键F10,激活菜单。 · 用左、右方向键移动光标,定位于需要的菜单项上,然后再按回车键,打开其子菜单。 · 用上、下方向键移动光标,定位于需要的子菜单项上,回车即可。执行完选定的功能后,系统自动关闭菜单。 · 菜单激活后,若不使用,可再按F10/Esc键关闭,返回原来状态。 (3)保存源程序。源程序编辑结束后应该立即保存,保存时可使用File|Save菜单命令或直接按下F2功能键,在弹出的 "Rename Noname"对话框中输入文件的保存位置及文件名,如"D: \ c_program \ chapter01_01.c"若没用指定文件的保存位置则将文件保存在默认的当前位置。另外,在编辑较大的源程序过程中,随时都可以按F2键(或File|Save),将当前编辑的文件存盘,然后继续编辑。这是一个良好的习惯! (4)编译,连接源程序。选择并执行Compile | Make EXE File菜单项或F9键,则TC将自动完成对当前正在编辑的源程序文件的编译、连接,并生成可执行文件。 如果源程序有语法错误,系统将在屏幕中央的"Compiling窗口"底端提示"Error: Press any key"。此时,按空格键,屏幕下端的"Message窗口"被激活,显示出错或警告信息,光带停在第一条消息上。这时"Edit窗口"中也有一条光带,它总是停在编译错误在源代码中的相应位置。当用上、下键移动消息窗口中的光带时,编辑窗口中的光带也随之移动,始终跟踪源代码中的错误位置。 注意,如果出现错误提示:"Linker Error: Unable to open input file 'C0x.OBJ'",应该在Options/Directories菜单项中将TC安装的路径设置正确,再利用Options/Save Options菜单项保存即可。 (5)运行源程序。选择并执行Run | Run菜单项或组合键Ctrl+F9(先按下Ctrl键并保持,再按F9键,然后同时放开),程序运行结束后,仍返回到编辑窗口。当你认为自己的源程序不会有编译、连接错误时,也可直接运行(即跳过对源程序的编译、连接步骤),这时TC将一次完成从编译、连接到运行的全过程。 选择并执行Run | User Screen菜单项或组合键Alt+F5,来查看程序运行结果。查看完毕后,按任一键返回编辑窗口。如果发现逻辑错误,则可在返回编辑窗口后,进行修改;然后再重新编译、连接、运行,直至正确为止。 到此一个程序已经调试完毕了,为了进一步熟悉这个过程和学会查看程序的语法错误,不妨将例1.1中的源代码去掉";","{ }"等,将程序故意写错,看看有什么错误提示信息吧! (6)编辑下一个新的源程序。选择并执行File | New项即可。如果屏幕提示确认信息"*.C not saved. Save?(Y/N)",若需要保存当前正在编辑的源程序,则键入"Y", 直接输入源程序文件起的名字和路径即可;否则,键入"N"。系统给出一个空白的编辑窗口,可以开始编辑下一个新的源程序。 (7)退出TC。选择并执行File | Quit菜单项或组合键Alt+X。 如果程序无编译语法错误,但无运行结果,或运行结果有误时,为了找出出错的原因,还可以有以下方法对程序进行调试: · 使用功能键F7或F8进行单步调试。 · 选择并执行Break / Watch菜单中的Add Watch命令项来观察某些数据在程序执行过程中的动态变化。 · 选择并执行Break / Watch菜单中的Toggle breakpoint命令项或组合键Ctrl+F8  对光标所在的行设置断点,让程序执行到此断点"停住",观察程序当前的运行状态。  1.4.2 在Visual C++ 6.0集成开发环境中编辑调试程序的过程 Visual C++系列产品是微软公司推出的一款优秀的C++集成开发环境,由于其良好的界面和可操作性,被广泛应用。 在VC下运行一个C语言程序的一般过程如下: (1)启动VC。从"开始"菜单进入"所有程序"子菜单,找到Microsoft Visual C++ 6.0并单击它即进入VC软件的主窗口,如图1.2所示。 图1.2 (2)新建程序。执行"文件|新建"命令,单击"文件"选项卡(如图1.3所示),在"文件"文本框中输入源程序文件名(如chapter01_01.c),在""下拉列表中选择源程序保存的位置(如d:\c_program),选择"C++ Source Files"选项,单击"确定",即在d:\c_program下新建了文件,并显示编辑窗口和信息窗口。 图1.3 (3)编辑和保存源程序。在编辑窗口中输入源程序(如图1.4所示),再执行"文件|保存"命令。 图1.4 在编辑窗口中输入的任何内容(如:关键字、用户标识符及各种运算符),VC系统都会按C源程序的格式进行编排、组织。比如:在文件中,当你输入了一个C关键字时,VC系统自动将其设定为蓝色字体以示区别;在编辑过程中,如果你输入了一个块结构语句,按回车后系统会把光标定位在该块语句起始位置开始的下一行的第5个字符位置上,以表示下面输入的内容是属于该块语句的,以体现C源程序的缩进式书写格式。此时,如果输入一个左花括号"{"并回车,系统将把该花括号左移到与上一行块语句起始位置对齐的位置上;接着,再按下回车键,系统会自动采用缩进格式,将当前光标位置定位在此花括号的下一行的第5列上;如果上一行语句与下一行语句同属于一个程序段,系统会自动将这两个程序行的起始位置对齐排列。 (4)编译程序。执行"编译|编译chapter01_01.c"命令或Ctrl+F7,对程序进行编译,屏幕上出现如图1.5所示的对话框,需要建立一个默认的工程工作区,选"是"按钮,开始编译。如果程序正确,即程序中不存在语法错误,信息窗口中显示编译信息如图1.6所示。 图1.5 图1.6 如果程序中存在语法错误,信息窗口中显示编译信息如图1.7所示。按照错误提示修改程序,再进行编译,直到不存在语法为止。 图1.7 (5)连接程序。执行"编译|构件chapter01_01.exe"命令或F7,开始连接,并在信息窗口中显示连接信息,连接成功后生成可执行文件chapter01_01.exe,如图1.8所示。 图1.8 (6)运行程序。执行"编译|执行chapter01_01.exe"命令或Ctrl+F5,程序开始运行,然后显示程序的输出结果如图1.9所示。输出结果的屏幕将等待用户按下任意键后,才返回编辑状态,一个C程序的执行过程结束。 图1.9 同样,如果程序无编译错误,但无运行结果,或运行结果有误时,你就需要调用VC的编译调试工具来调试你的程序,以便找出出错的原因,从而达到正确的运行结果。常用的有: · 使用"调试"工具栏的Step Into或Step Over按钮进行单步调试运行程序,分别对应的功能键是F7或F8。区别在于:Step Over不进入函数内部,它将每一条语句看作一步,包括函数调用语句。Step Into可进入函数内部,继续函数内部的语句行跟踪。 · 使用"编译"工具栏的Insert/Remove Breakpoint按钮设置断点,让程序执行到此断点"停住",观察程序当前的运行状态。 1.5 如何学习本课程 学习本课程,一是是要掌握C语言的语法规则,二是在掌握语言语法规则的基础上编写程序。当然,最终的目的要编程解决实际应用问题。但是没有任何基础怎么编写程序呢? 读程序是入门最快,也是最好的方法。学习完每一章,都要认真体会这一章的所有概念;然后不放过这一章中提到的所有程序例程,仔细分析阅读程序,直到每一行都理解;读懂程序之后再自己原样写一遍,如果写不出来就重新再去读程序,分析自己为什么写不出来,再去理解程序,再写程序;最后再找几个编程题目,最好是和例程类似的,自己动手编程解决。即"先阅读程序,再模仿,再实战"。但是不能只是纸上谈兵,光看不练,上机调试运行程序,明确程序的每一行代码的运行结果,同样是学习过程中不可忽略的。写程序和写作文非常类似,只有在阅读了大量的程序的基础上,才会产生量变到质变的飞跃,才会自然而然地编写出程序。 可见程序在学习该课程中有着举足轻重的地位,通过阅读、调试分析程序来高效的掌握语言语法规则,通过大量阅读程序来达到熟练编写程序,通过"程序"来学习程序设计。 习题 1.什么是程序? 2.上机运行如下程序,观察运行结果。 void main(){ int a=5,b=9,t; t=a; a=b; b=t; printf("a=%d,b=%d\n",a,b); } 3.上机运行如下程序,观察运行结果。 void main(){ int a=5,b=9; a=a+b; b=a-b; a=a-b; printf("a=%d,b=%d\n",a,b); } 4.上机运行如下程序,观察运行结果。 void main(){ int x,y; printf("Please input x: "); scanf("%d",&x); if(x>0) y=1; else if(x==0) y=0; else y=-1; printf("x=%d,y=%d\n",x,y); } 5.上机运行如下程序,观察运行结果(建议采用单步运行调试)。 void main() { int a,b; a=1; while(a<=9) { b=1; while(b<=a) { printf("%d*%d=%-3d\n",b,a,a*b); b=b+1; } printf("\n"); a=a+1; } } 6.上机运行如下程序,观察运行结果。 void main(){ int a,b; for(a=1;a<=9;a++){ for(b=1;b<=a;b++) printf("%d*%d=%-3d\n",b,a,a*b); printf("\n"); } } 7.请为自己对本课程的学习作一个。 第二章 简单的C程序设计 程序在计算机内部是由一系列指令组成的,它告诉计算机如何完成一个具体的任务。由于现在的计算机还不能理解人类的自然语言,所以程序设计语言成为了人与计算机之间沟通的桥梁。在众多的程序设计语言中,C语言是一门广泛流行的高级语言。对于C语言的初学者来说,最关心的是如何尽快地用它编写程序,从而来解决实际问题。本章从简单的程序开始,逐步介绍与程序设计紧密相关的算法、C程序的基本组成结构、常见的输入/输出函数和C程序设计的过程等,使读者逐步领会和掌握C程序设计的基本方法。对于本章节例题中涉及到的C语言的语法细节,读者不必深入研究,学到相关章节自然会理解。 2.1 程序设计与算法 计算机所做的工作就是按指定的步骤执行一系列的操作,以完成某一特定的任务。因此要计算机为我们做事,就必须事先设计一些操作步骤,并用计算机语言写成程序。在学习用C语言进行程序设计之前,我们首先了解程序、算法和结构化程序设计方面的知识,它们是学习后续章节的基础。 2.1.1 程序 程序是由某种计算机编程语言编写的能够完成一定功能的代码,而设计、编制、调试程序的过程则称为程序设计。程序以文件的形式存储在计算机中,在启动运行后完成某一确定的任务,从这一角度来看,程序从静态上表现为保存在存储器中的文档,动态上表现为可以被调到内存由CPU执行的一连串指令。通过在计算机上运行程序,便可让计算机按照人的意图进行信息处理,从而完成相应的任务,解决特定的问题。计算机可以通过执行不同程序来完成不同任务,即使执行同一个程序,当输入数据不同,输出的结果也有可能不同。 采用C语言等其他高级语言编写的程序都具有一些典型的特点,如程序需要编译程序转化成机器代码后才能由计算机直接执行;程序必需严格按照计算机语言设定的拼写、语法和标点规则来编写;程序作为一个整体是有意义的,能够解决一些问题。 通常一个程序应包含对数据的描述和对操作的描述。对数据的描述是指在程序中要指定数据的类型和数据的组织形式,即数据结构。对操作的描述是指求解问题的步骤,即算法。著名计算机科学家沃思提出一个公式:数据结构+算法=程序。这个公式的重要性在于它说明了数据结构与算法是程序的两大要素,二者相辅相成,缺一不可。 2.1.2 算法的概念和特点 刚接触程序设计的读者会有这样一种感觉:通常读别人编的程序比较容易,等到自己遇到问题编写程序时就难了,虽然学了程序设计语言,可还是不知道从何下手,这是为什么呢?其中重要原因之一就是没有掌握基本的算法。事实上,我们生活中的几乎每一件事都是遵循着一定的算法来完成的,也就是说要按照事先想好的步骤有条不紊地进行。就拿生活中最常见的例子来说,你虽然认识地铁站,但是不知道按照怎样的路线才能到达目的地,当别人告诉了你一条线路,如先坐1号线在某一站下车,再转2号线,这就相当于告诉了一个解决问题的算法,于是你就可以沿着这条路线到达目的地。当你下次再去相同的地方时,就不再有疑问了。所以,当我们面对一个需要解决的问题时,不要急于编写程序,应该先思考解决该问题的方法和步骤。在学习程序设计语言的过程中,我们应该注重一些常用算法的积累。 当然我们所说的算法仅指计算机算法,具体地说,它就是一个有穷规则的集合,即为解决一个具体问题而采取的确定的有限的操作步骤。通常来说,解决某一个问题的算法不是唯一的,正如前面所说,到达目的地的公交线路或者地铁线路有很多,在这些线路中,有些价格优惠,有些节省时间。由此可见,对于相同的问题,不同的用户可能会设计不同的算法,那么算法性能也会有所差别。 当设计完一个算法后,怎样衡量它的正确性呢?一般可用以下5个特性来进行衡量。 1. 有穷性:一个算法必须保证执行有限步之后结束。如果一个无穷的算法并不能得到我们所需要的结果,那么这个算法将毫无意义。 2. 确定性:算法的每一步骤都应是确定的,没有歧义的,从而保证算法能安全正确地被执行。 3. 可行性:算法中的每一个步骤原则上都应是可以正确执行的,而且能得到确定的结果。 4. 输入:一个算法可以有0个或多个输入。输入为算法指定了初始条件,当然这个条件并不是必需的。 5. 输出:一个算法可以有1个或多个输出。算法的实现是以得到计算结果为目的的,没有输出的算法是毫无意义的。 了解了算法的概念后,我们考虑的就是如何描述算法了。描述算法常用的工具有自然语言、传统流程图、N-S流程图和伪代码等,我们在下一小节结构化程序设计中将重点介绍传统流程图和N-S流程图。 2.1.3 结构化程序设计 随着计算机的发展,人们编写的程序越来越复杂。对于一个包含数千万条代码、结构复杂的程序,其程序的可读性往往较低,而程序的质量和可靠性也很难得到保证。为了解决这一问题,意大利的Bobra和Jacopini于1966年提出了结构化程序设计的思想,它是软件发展的一个重要的里程碑。结构化程序设计的实质是控制编程中的复杂性,其基本思想是像搭积木一样,只要有几种简单的结构即可构成任意复杂的程序。Bobra和Jacopini所提到的简单结构即顺序、选择和循环三种结构,由这三种控制结构组成的程序就是结构化程序。 1. 三种基本结构 (1)顺序结构:程序流向沿着一个方向进行,它是一种最简单的结构。如图2.1(a)所示,先执行模块A然后再执行模块B,块A和块B分别代表若干条语句。 (2)选择结构:程序的流程发生分支,根据一定的条件选择其中某一模块进行执行,也可称为分支结构。如图2.1(b)所示,条件成立时执行模块A,否则执行模块B。 (3)循环结构:程序流程是不断重复执行某一模块后,再退出循环,也可称为重复结构。该结构有当型(while)循环和直到型(until)循环两种类型。当型循环结构如图2.1(c)所示,它的流程是先判断条件是否成立,若成立,则执行循环体模块A,否则退出循环。直到型循环结构如图(2.1d)所示,它是先执行循环体模块A,后判断条件是否成立,当条件不成立时继续执行循环体,否则退出循环。 2.结构化流程图(N-S图) 从图2.1可以看出结构化程序的三种基本结构可以用框图和流程线表示,但当程序较复杂时,流程线自然会增多,从而导致程序的结构不清晰,不便于阅读。所以美国学者I.Nassi和B.Shneiderman于1973年提出了一种新的绘制流程图的方法N-S图,它是以这两位学者名字的首字母命名的。N-S图的重要特点就是完全取消了流程线,这样算法被迫只能从上到下顺序执行,从而避免了算法流程的任意转向,保证了程序的质量。图2.2采用N-S流程图来描述顺序、选择和循环三种基本结构,图2.2的(a)~(d)与图2.1(a)~(d)中的传统流程图相对应。 与图2.1中传统的流程图相比,图2.2中的N-S流程图既形象直观,画出来后又节省篇幅,大大方便了结构化程序的设计,并能有效地提高算法设计的质量和效率。对初学者来说,使用N-S图还能培养良好的程序设计风格。 3.结构化程序设计方法 结构化程序设计强调程序结构的化,提倡清晰的结构。当面临一个复杂的问题时,人们往往不可能一开始就能了解问题的全部细节,更不用说立刻写出一个结构清晰、算法正确的程序。那怎样才能得到一个结构化的程序呢?一般采取以下四种方法:(1)自顶向下(2)逐步细化(3)模块化(4)结构化编码。从这四个方法可以看出,结构化程序设计的基本思想是将一个完整的、较复杂问题分解成若干相对独立的、较简单的子问题。若这些子问题还较复杂,可再分解它们,然后逐一地针对分解后的子问题进行分析、求解和编码。 具体地说,当需要求解一个实际问题即使是划分后的子问题时,怎样才能编写出程序呢?一般可按图2.3所示的步骤进行。 本小节中我们只是介绍了描述算法的工具和结构化程序设计的方法,并没有涉及到要求解的具体问题,在后续的小节中我们将针对特定的实例,给出问题的算法描述和编写程序的具体过程。 2.2 C程序的基本组成结构 在学习C语言的具体语法之前,先通过简单的C语言程序示例,初步了解C语言程序的基本结构。下面几个程序示例由易到难,它们表现了C语言源程序在组成结构上的特点。虽然有关语法内容还未介绍,但可从这些例子中了解到组成一个C源程序的基本组成部分和书写格式。 2.2.1 简单C程序举例 【例2.1】 在屏幕上显示"Very Good" 源程序: #include /*编译预处理命令*/ main() /*主函数*/ { printf("Very Good\n"); /*main函数调用库函数printf输出字符*/ } 运行结果: Very Good! 程序分析: (1)程序中的main()被称为主函数,任何一个C语言程序有且只有一个main()函数。main()后面由花括号对"{ }"括起来的部分是称为函数体,程序从main()函数的第一条可执行语句开始执行。 (2)本例中函数体内只有一条语句printf("Very Good\n");该语句由函数调用和分号两部分组成。printf()的作用一般是将双引号中的内容原样输出,"\n"是换行符,即在输出Very Good!后换行,分号表示该语句的结束。 (3)/*与*/之间的内容构成C语言程序的注释部分,它可以是任何可以显示的字符,可以是一行也可以是多行,不影响程序的编译和运行。在程序中插入适当的注释,可以使程序更容易被理解。 (4)程序中的#include 是文件包含命令,其意义是把尖括号<>内指定的文件包含到本程序中。一般情况下,如果使用了系统提供的库函数,那么应在程序的开始用#include命令将被调用的库函数信息包含到本文件中。本例中main()函数中调用的printf()函数是C语言提供的标准输出函数,需要系统文件stdio.h解释执行。需要说明的是,Turbo C规定对scanf和printf两个函数可以省去头文件包含命令,所以本程序中第一行的#include 可以删除。 经过以上的分析,我们可以清晰地理解例2.1程序的功能就是利用printf函数在屏幕上显示一行字符信息。接下来我们思考一下怎样让字符信息分行显示,也就是说让例2.1中的Very和Good两个单词分两行进行输出,要达到这个功能很简单,因为我们在上面提到过"\n"的功能是实现换行,所以只要在例2.1的基础上稍作修改就可以实现,具体程序代码见例2.2。 【例2.2】 在屏幕上分行显示"Very Good" 源程序: main() { printf("Very\nGood\n"); /*\n可以实现换行功能*/ } 运行结果: Very Good 以上两个程序非常简单,main函数的函数体内只有一条语句,下面我们将介绍稍微复杂的程序例2.3,该程序仍由一个main函数组成,但函数体中包含了变量说明、算术运算和格式输出。 【例2.3】计算3个整数之和 源程序: main() { int a,b,c,sum; /*定义整型变量a, b, c, sum*/ a=12; b=34; c=56; /*分别给a, b, c赋值*/ sum=a+b+c; /*将a, b, c之和放入sum变量*/ printf("a+b+c=%d
/
本文档为【C语言自编教材2】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索