您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 电气安装工程 > C语言程序设计课程教学大纲 22
第1章C语言导论为什么称之为C语言?这通常是C程序设计语言初学者最先提出的问题之一。答案为C语言是从B语言演变而来!但B语言不是从A语言演变而来,而是从BCPL(BasicCombinedProgrammingLanguage)语言演变而来。BCPL是由MartinRichards在1967年设计出来的,是一种无数据类型的语言,它直接处理机器系统的字和地址。在BCPL的启发下,KenThompson在1970年开发了无数据类型的程序设计语言B,B语言和汇编语言被用来开发UNIX操作系统的第一个版本。1972年,DennisRitchie设计出了C语言,该语言既吸收了BCPL和B语言的许多思想,又具备数据有类型的特色(整型、浮点型等)。直到1989年,C语言的定义还是沿用了BrianW.Kernighan和DennisM.Ritchie在TheCProgrammingLanguage(EnglewoodCliffs,NJ:Prentice-Hall,1978)一书中的描述,我们称C语言的这个版本为传统C语言。由于该语言的发展和扩充、最初定义中有一些不明确之处以及出于其他方面的考虑,1983年,美国国家标准化协会(ANSI)组织一个委员会“提供明确的和与机器无关的C语言的定义”,并于1989年通过了所制定的标准。本书介绍的C语言基于ANSIC标准,此后简称为标准C语言。本章将举例介绍一些基本的语言概念:C语言程序的结构、标识符、while和dowhile循环、条件语句(if-else)、输入、输出和文件,在以后的章节中会就这些主题展开详细描述。1.1第一个C语言程序下列程序打印输出的信息如下:ANSI--AkinderandgentlerC!/*该程序打印输出如下信息:ANSI--AkinderandgentlerC!*/#includestdio.hmain(){printf(ANSI--AkinderandgentlerC!\n);}在C语言中,符号/*标记注释行的开始,符号*/标记注释行的结束,编译器忽略注释行。如下行是一条预处理指令(preprocessordirective):#includestdio.h它表示在把程序实际翻译成机器代码之前还需要做某个预处理动作(预处理器在编译之前执行预处理指令,将在4.6节详细介绍预处理器)。预处理指令总是以井号(#)开头。这里的#include预处理指令使得预处理器把名为stdio.h的文件内容准确地插入到#include行出现的地方,这样的文件称为头文件(headerfile),扩展名.h即来自于这种命名法。实际上,头文件stdio.h提供使用库函数printf的适当接口。附录B列出了标准所要求的头文件,附录D列出了一些有用的库函数以及对应需要的头文件。一个C语言程序由一个或多个函数(function)组成,其中必须有一个main函数。程序从main函数开始执行。任何一个函数的所有语句用一对大括号{}括起来。在本例中,程序仅由一个main函数组成,ANSIC应用程序设计·2·该main函数仅含一条语句:printf(ANSI--Akinderandgentlerc!\n);C语言中的单条语句,如:printf(ANSI--AkinderandgentlerC!\n);是以分号“;”结束的。除了特殊的字符如反斜杠“\”之外,函数printf简单地复制两个双引号里面的字符到视频显示器上。因此如下语句:printf(ANSI--AkinderandgentlerC!\n);在屏幕上打印输出:ANSI--AkinderandgentlerC!反斜杠“\”作为特殊的转义字符。字符组合\n的意思是换行,并使下一个输出从下一行的行首开始,这里下一个输出是系统提示符。像大部分现代高级语言编译器一样,C语言编译器不需要程序的语句以任何特定的格式出现。本书格式化编写的程序,尤其是采用缩排的形式,目的是便于阅读。附录F描述如何在BorlandC++和Windows下的MicrosoftVisualC++中编译、连接和运行C语言程序。附录E讨论UNIXC编译器。练习1.在你的系统上编译运行本节的程序。2.修改并运行本节的程序。尝试删除程序的某部分,例如省略如下行:#includestdio.h再如,省略一个大括号,省略一个双引号。若有错误的话,说明是什么错误,并解释这些错误。1.2应用举例:长度转换◇问题从键盘读入以码(yd)为单位的长度,把该长度转化成对应的英尺(ft)和英寸(in),并将转换后的长度输出到屏幕上。假设输入的长度是非负整数(如:0,1,2,…中的一个),程序以输入负数结束(如:-1,-2,…中的一个)。这些单位之间的换算关系如下:1yd=3ft1yd=36in◇输入/输出举例输入部分用斜体字标出,输出部分用黑体字标出,如下所示:Enternextlength22yd=第1章C语言导论·3·6ft72inEnternextlength3030yd=90ft1080inEnternextlength–99***ENDOFPROGRAM***◇用C语言实现/*程序从键盘读入以码(yd)为单位的长度,把该长度转化成对应的英尺(ft)和英寸(in),并将转换后的长度输出到屏幕上。假设输入的长度是非负整数,程序以输入负整数结束。*/#includestdio.hmain(){intyard,foot,inch;printf(Enternextlength);scanf(%d,&yard);while(yard=0){foot=3*yard;inch=36*yard;printf(\n%dyd=\n,yard);printf(%dft\n,foot);printf(%din\n,inch);printf(Enternextlength);scanf(%d,&yard);}printf(***ENDOFPROGRAM***\n);}◇讨论在C语言中所有变量都必须在被定义后才能使用。在C语言中定义变量就是为特定数据类型的变量申请存储空间。本程序首先定义3个变量yard、foot和inch:intyard,foot,inch;因为这些变量被定义为int类型(整型),所以每个变量都能存储一个有符号整数。我们把类型(如:int型)对应的存储空间称为单元(cell)。定义变量yard、foot和inch的结果如图1.1(a)所示。这时,这些单元所含的值与系统有关,不能认为每个单元存储的值是零或其他特殊的值。一般说这些单元含有“垃圾数据”,因为它们现在所含的值对程序是无意义的。可以在定义变量yard、foot和inch的同时对它们进行初始化。例如,下面语句定义变量yard、foot和inch:intyard=0,foot=1,inch=8;ANSIC应用程序设计·4·同时初始化yard值为0、foot值为1和inch值为8,如图1.1所示。yardfootinch(a)分配3个存放整型数的单元yardfootinch018(b)赋初值图1.1分配3个整型单元并初始化其值为了提示用户输入长度,程序使用了在1.1节中介绍的printf函数。其中由双引号括起来的字符串称为格式字符串(formatstring),由于该格式字符串不包含特殊字符(如,反斜杠),当执行下列语句时:printf(Enternextlength);将在显示器上输出如下信息:Enternextlength其次,本程序使用库函数scanf从键盘读入一个整数,函数scanf也需要一个格式字符串。一个scanf的格式字符串包含一个或多个以百分号(%)作为标志的格式描述符(formatdescriptors),这些格式描述符决定了下一个输入项的类型(如int型)和如何存储这个值(如按二进制补码表示一个有符号整数)。跟在格式字符串之后的是那些将用于存储数据的单元的地址,符号&称为地址运算符(addressoperator)。例如,&yard的值是yard单元的地址。必须给函数scanf提供变量的地址,这样函数scanf就知道将输入的内容存储到何处,因此执行如下语句时:scanf(%d,&yard);读取下一个由用户提供的数值,将它解释成十进制整数并存储到变量yard中(位于地址&yard处)。在scanf语句之后是while循环。注意while循环的如下循环体是由大括号括起来的,右大括号后面并没有分号。foot=3*yard;inch=36*yard;printf(\n%dyd=\n,yard);printf(%dft\n,foot);printf(%din\n,inch);printf(Enternextlength);scanf(%d,&yard);若while循环的循环体只由一条语句组成,则大括号可以省略。只要while循环中的如下条件成立,就将执行while循环体:yard=0除了=(大于或等于)之外,C语言提供了如下关系运算符:大于小于=小于或等于第1章C语言导论·5·==等于!=不等于while循环体中的第一条语句如下:foot=3*yard;赋值运算符是=,乘法运算符是*。这样在执行该语句后,3和yard值的乘积被存储到变量foot中,执行该语句后的情形如图1.2所示。假设yard的值是8,如图1.2所示,foot单元存储的值是24。当执行while循环体中的如下语句后,36和yard值的乘积被存储到变量inch中:inch=36*yard;yardfootinch824图1.2执行完赋值语句foot=3*yard的情形while循环体中下一条语句如下:printf(\n%dyd=\n,yard);这时如下格式字符串包含特殊字符反斜杠(\)和百分号(%):\n%dyd=\n在1.1节中可以看到,printf格式字符串中的字符组合\n(换行)使得下一个输出结果从下一行的第一列开始。与scanf格式字符串一样,printf格式字符串中的百分号(%)指示一个格式描述符。为了将变量的内部表示转换为可打印形式,函数printf使用格式描述符。格式描述符%d是指把printf中给出的变量(本例为yard)的值按十进制整数形式输出。随后的如下字符无特别的含义,被直接输出到屏幕上:yd=最后的字符\n使得下一个输出从下一行的第一列开始。例如,如果yard的值是2,在执行如下语句后:printf(\n%dyd=\n,yard);在下一行第一列开始,输出:2yd=并且,下一个输出将从下一行的第一列开始。注意:在scanf中的变量名前写地址运算符(&),但却不在printf中的变量名前写符号&。对printf来说,知道变量的值已足够,而无须知道其地址。例如,如果yard的值是2,就传给printf值2(在printf中包含变量yard),printf将输出2,printf无须知道2存储在何处(即yard的地址)。在执行while循环体内的如下语句时:printf(%dft\n,foot);输出foot的值,随后原样输出字母:ft并且下一个输出将从下一行的第一列开始。例如,若foot的值是6,则输出:6ftANSIC应用程序设计·6·下一个输出将从下一行的第一列开始。在执行while循环体内如下语句时:printf(%din\n,inch);输出inch的值,并随后原样输出字母:in则下一个输出将从下一行的第一列开始。例如,若inch值是72,就输出:72in下一个输出将从下一行的第一列开始。执行while循环体的最后两行语句:printf(Enternextlength);scanf(%d,&yard);再次出现提示,函数scanf用来读取yard的下一个值。只要用户输入一个负整数,while循环中如下条件就不成立:yard=0至此while循环结束。这时执行while循环之后的语句:printf(***ENDOFPROGRAM***\n);输出内容:***ENDOFPROGRAM***由于这是main函数的最后一条语
本文标题:C语言程序设计课程教学大纲 22
链接地址:https://www.777doc.com/doc-6162964 .html