《C程序设计项目教程》整套ppt课件完整版教学教程最全电子讲义(最新)_第1页
《C程序设计项目教程》整套ppt课件完整版教学教程最全电子讲义(最新)_第2页
《C程序设计项目教程》整套ppt课件完整版教学教程最全电子讲义(最新)_第3页
《C程序设计项目教程》整套ppt课件完整版教学教程最全电子讲义(最新)_第4页
《C程序设计项目教程》整套ppt课件完整版教学教程最全电子讲义(最新)_第5页
已阅读5页,还剩310页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C语言程序设计项目教程项目一共分为两个任务项目一 欢迎进入C语言世界任务一 熟悉C开发环境任务二 创建简单的C应用程序任务一 熟悉C开发环境一、计算机语言二、C语言的历史三、C语言程序执行过程四、C语言开发环境简介在本任务中,我们将学习C语言的历史及其常用的开发环境。任务说明预备知识一、计算机语言按计算机语言的发展进程,可将计算机语言分为三类:1机器语言 以二进制代码(0和1)表示机器指令的一种语言,其程序能被计算机直接执行。2汇编语言 用助记符代替机器指令,用变量代替各类地址,称为汇编语言(也称符号语言)。3高级语言 高级语言屏蔽了机器的细节,更接近于自然语言和数学语言,给编程带来了极大的方

2、便。二、C语言的历史1967年为开发UNIX操作系统,Ken Thompson在BCPL程序设计语言的基础上,将其改造成B语言。1971年M.Ritchie改进B语言,并命名为C语言。随着UNIX操作系统的成功,C语言也获得巨大成功。1989年ANSI发布了一个完整的C语言标准,被称为C89或ANSI C。ISO直接采用了C89作为C语言标准,有的资料上称其为C90。1990年ISO发布了最新的C语言规范,被称为C99。1999年ISO正式发布了C语言的新标准C11。2011年12月8日三、C语言程序执行过程高级语言编写的程序只有借助编译程序将其翻译为用0和1表示的机器语言指令代码,才能真正在

3、计算机中执行。高级语言翻译有两种方式:一是编译方法,二是解释方法。1编写源代码2编译(Compile)将我们编写的源代码翻译为计算机能够理解的二进制目标代码。3连接(Link)将目标文件与函数合并成完整的可执行文件,即生成.exe文件。4运行执行连接成功后得到的可执行程序。C语言程序都采用编译方式运行。四、C语言开发环境简介 Dev-C+是一个运行在Windows环境下、免费的C/C+开发工具,体积非常小,只有9M多一点,其界面如下图所示。1Dev-C+2Code:Blocks 它是一个开源、免费、跨平台的C/C+开发工具。由纯粹的C+语言开发完成,使用了著名的图形界面库wxWidgets,其

4、运行界面如右图所示。3C-FreeC-Free是一款支持多种编译器的国产C/C+集成开发环境(IDE),其运行界面如右图所示。4Microsoft Visual C+系列 Microsoft Visual C+系列是最经典的、功能强大的C/C+开发工具,尤以Visual C+ 6.0(简称VC或者VC6.0)版本使用最多。类视图用于面向对象的C+语言编程文件视图列出了整个工程的文件架构,用户可以从不同文件夹中找到不同后缀的文件,如源文件、头文件、资源文件等。工作区任务实施输出问候信息实施步骤1创建源程序步骤1 启动Visual C+ 6.0,打开“文件”菜单,选择“新建”菜单项,在打开的 “新

5、建”对话框中选择“文件”选项卡,在左侧文件类型列表中选择“C+ Source File”选项,创建一个C+源程序,如图1-8所示。图1-8 选择新建C+源文件步骤2 在右侧“文件名”编辑框中输入文件名“任务1-1”,然后单击 按钮选择文件存储位置。单击“确定”按钮,接下来在编辑区中输入以下代码:/任务1-1#include /*文件包含*/void main( ) /*主函数 */ /*函数体开始*/ printf (Welcome to C World!n); /*输出语句*/ /*函数体结束*/步骤3 单击工具栏中的“保存”按钮 或者直接按【Ctrl+S】组合键,保存文件,源程序创建完成。

6、2编译连接步骤1 选择“组建”“编译任务1-1.cpp”菜单,系统将显示如图1-9所示对话框,询问是否在创建源文件的目录下建立一个活动工程和一个工作空间。图1-9 询问对话框步骤2 单击“是”按钮,创建一个与源程序同名的工作区(对应文件为“任务1-1.dsw”)和一个工程(对应文件为“任务1-1.dsp”),系统开始编译。编译结束后,将在输出窗口显示编译信息,如图1-10所示。图1-10 输出编译信息步骤3 编译信息显示“任务1-1.obj - 0 error(s), 0 warning(s)”,表示编译程序时没有错误和警告。为此,可继续选择“组建”“组建任务1-1.exe”菜单,对生成的目标

7、程序进行连接,以生成可执行程序,如图1-11所示。图1-11 输出连接信息3调试运行编译连接通过后,选择“组建”“执行任务1-1.exe”菜单,或者直接按【Ctrl+F5】组合键,运行生成的程序,将出现图1-12所示画面。结果正确无误,按任意键返回。图1-12 运行结果任务二 创建简单的C应用程序一、C程序基本结构任务说明在正式学习C语言语法之前,我们先来感受一下C程序的概貌。预备知识二、VC的调试程序功能一、C程序基本结构下面来看一段C程序的代码,该代码用于求取计算两个整数中的最大值。【例1-4】 求取两个整数的最大值。#include /* GetMax函数用于求两个整数中的最大值,参数类

8、型和返回值类型均为整型 */int GetMax(int a, int b)if(ab) /* 如果a值大于b值,则返回a */return a;return b;/* 否则返回b */void main()int x, y, max;printf(Please input two integers: );scanf(%d%d, &x, &y);/* 通过键盘输入两个整数值 */max = GetMax( x, y );/* 调用GetMax函数求两个整数中的最大值, 并将其保存到max变量中 */printf(The max number is: %dn, max);/* 输出最大值 */1

9、C语言程序由函数构成2程序中包含对库函数的引用3程序有良好的编码格式4编写程序注释5友好的人机交互提示二、VC的调试程序功能第一步 设置断点程序成功编译后,将鼠标光标停留在需要设置断点的代码行,单击工具栏按钮 即可添加断点,此时该行前端将出现一个断点标志 ,如右图所示。第二步 开始调试程序如图1-16所示,打开“组建”下拉菜单,执行“开始调试”“GO”命令(或直接按【F5】键),程序会进入调试模式,并且会在断点处暂停,如图1-17所示。第三步 单步运行打开“调试”下拉菜单,执行“Step Over”命令或直接按【F10】键,即可单步运行程序。不断按【F10】键,程序会一步一步地向前执行,如图1

10、-18所示。单步调试程序时,可以Variables窗口和Watch窗口中察看变量值的变化,这两个窗口的作用如下: 在Variables窗口中会自动显示当前运行程序中所有变量的值。随着单步调试的进行,我们会看到变量i的值逐渐递增。 如果本地变量比较多,Variables窗口就会比较混乱,此时可以直接在代码中选中需要监控的变量,将其拖放到Watch列表,该变量的值会被显示出来。在调试模式下,“调试”工具栏会自动弹出,各按钮作用如下:重启调试(【Ctrl+ Shift+F5】);结束调试(【Shift+F5】);在当前点上挂起程序的执行;可以在调试状态下修改程序源代码(【Alt+F10】);显示程序

11、代码中的下一条语句(【Alt+Num】);正在跟踪的语句是一个子程序调用(函数或方法)时,该选项单步进入所调用的子程序(【F11】);正在跟踪的语句是一个子程序调用(函数或方法)时,该选项跳过所调用的子程序,停留在子程序调用下面的语句(【F10】);确认当前子程序中没有程序错误时,该选项可以快速执行该子程序,并停留在子程序后面的语句(【Shift+F11】);快速执行到光标所在的代码处(【Ctrl+F10】);显示QuickWatch窗口,在该窗口可以计算表达式的值(【Shift+F9】);打开Watch窗口,该窗口包含当前程序中变量名的当前值,以及所有选择表达式;打开Variables窗口,

12、该窗口包含关于当前和前面的语句中所使用的变量和返回值。任务实施输出“九九”乘法口诀表实施步骤步骤1 启动VC,按任务一中介绍的方法创建一个C源程序,命名为“九九口诀”,在打开的代码编辑框中输入如下代码:#include stdio.hvoid main() int i,j,result; /用到3个变量,i和j用于存储乘数,result用于存储乘积 printf(n); for(i=1;i10;i+)/i的值从1到9 for(j=1;j“执行九九口诀.exe”菜单命令,或者直接按【Ctrl+F5】组合键,运行生成的程序,结果如图1-21所示。图1-21 “九九”乘法口诀C语言程序设计项目教程项

13、目二共分为两个任务项目二 C语法基础任务一 熟悉C语言的基础语言元素任务二 掌握简单的C语句项目拓展 数据类型转换任务一 熟悉C语言的基础语言元素任务说明预备知识 在本任务中,我们首先了解数据在计算机中的存储方式和数据类型,然后学习常量、变量、运算符和表达式等C语言的基础语言元素。一、数据存储方式与数据类型二、标识符三、常量和变量四、运算符和表达式一、数据存储方式与数据类型(一)数据存储方式 在计算机中,所有信息(包括数值、字符、汉字、计算机指令等)的存储、处理与传送都采用二进制的形式。二进制数中只有“0”和“1”两个数字符号,其运算规则如下表所示。在计算机中,数的表示方法一般有两种,它们分别

14、是定点数和浮点数。1定点数定点数是指小数点位置固定不变的数,又分为定点整数和定点小数。定点整数 定点整数规定小数点的位置固定在数据的最低位之后,但不占一个二进制位,如下图所示。定点小数 定点小数规定小数点的位置固定在符号位之后,但不占一个二进制位,如下图所示。2浮点数 浮点数是指小数点位置不固定的数。对于既有整数部分又有小数部分的数,一般用浮点数表示。 任意一个二进制数N可以表示为N=S2P形式。其中S是一个纯小数,表示数N的全部有效数字,称为尾数;P是一个整数,表示小数点的位置,称为阶码。例如,(0.0011001)2=0.110012-10,其中尾数S=(0.11001)2,阶码P=(10

15、)2。浮点数由两部分组成:尾数部分和阶码部分,如下图所示。(二)数据类型 为了便于在程序中表示不同类型的数据,C语言也提供了多种数据类型,如下图所示。不同类型的数据所占存储空间及表示范围不同,如右表所示。二、标识符 在计算机语言中,常量、变量、数组、函数等需要定义名字,这些名称统称为标识符。标识符分为系统定义标识符和用户定义标识符。(一)系统定义标识符 系统定义标识符是指具有固定名字和特定含义的标识符,分为关键字和预定义标识符。1关键字 表示数据类型的关键字int、char、float、double、short、long、void、signed、unsigned、enum、struct、uni

16、on、const、typedef、volatile 表示存储类别的关键字auto、static、register、extern 表示语句命令的关键字break、case、continue、default、do、else、for、goto、if、return、switch、while 表示运算符的关键字sizeof2预定义标识符 表示系统标准库函数的预定义标识符scanf、printf、putchar、getchar、strcpy、strcmp、sqrt等 表示编译预处理命令(简称预处理)的预定义标识符include、define等在指令处展开被包含的文件用于定义符号常量(二)用户定义标识符 C

17、语言中用户定义标识符必须以字母或下划线“_”开头,且不能含有除字母、数字和下划线“_”外的其他字符。三、常量和变量 常量是指在程序执行过程中值保持不变的量,变量是指在程序运行过程中值可以改变的量,每个变量都必须在声明时明确定义其数据类型,并且需要用标识符标识。(一)常量常量分为字面常量和符号常量(标识符常量)字面本身就是它的值符号常量是一个标识符,对应着一个和它类型一致的存储空间,该存储空间中保存的数据就是该符号常量的值。1常量类型 C语言中的常量包括整型常量、实型常量、字符常量、字符串常量和布尔型常量。(1)整型常量 整型常量表示通常意义上的整数,如2、0、7等。整型常量可以用十进制、八进制

18、和十六进制表示。(2)实型常量 实型常量是指通常意义上的实数,也称浮点数。实型常量有两种表示形式:十进制小数形式和指数形式。(3)字符常量字符型常量分为普通字符常量和转义字符常量。用单引号括起来的一个字符,例如A、g等。转义字符常量是由“”开头的一个或多个字符的序列,用于表示一些无法显示的字符,如回车符、换行符、制表符等。常用的转义字符常量及其含义如下表所示。(4)字符串常量 字符串常量是由一对双引号括起来的零个或多个字符序列,如C is programming language.、computer等。字符串可以写在多行上,不过在这种情况下必须用反斜杠“”表示下一行字符是这一行字符的延续。字符

19、串常量与字符常量有所不同:字符型常量在内存中只占一个字节;字符串是按照串中字符的排列顺序存放的,每一个字符占一个字节,并在末尾添加“0”作为字符串结尾标志或结束标志。(5)布尔型常量 布尔型(bool)常量只有两个值,即false或0(表示逻辑假)和true或1(表示逻辑真)。2符号常量 对于经常引用的数值常量,可以将它们“定义”为符号常量,其名称的命名规则同样遵循标识符的命名规则。C语言中,使用编译预处理指令#define“定义”符号常量,如:#define PI 3.1415926 /定义一个符号常量PI,表示3.1415926符号常量通常用大写字母表示,符号常量名称和值之间用空格分隔。(

20、二)变量1变量的命名原则 变量名又叫做变量标识符,由字母、数字和下划线组成,且第一个字符必须是字母或下划线。变量名不允许使用C语言关键字、系统函数名和系统类名。合法变量名,如:std,code1,n_date,_kufun,i_jing,WAN,S_name,c_Code以下变量名是非法的: Mr.Smith,$dollar,y,7rain,li hua,C#,car-clour,stdn,U.S.A程序员们通常会对变量命名做一些约束,如:(1)标识符采用英文单词或其组合。保证直观且用词准确,可望文知意。(2)遵循最小化长度与最大化信息量原则。在保证一个标识符意思明确的同时,应当尽量缩短其长度

21、。(3)避免标识符过于相似。不要出现仅靠大小写区分的相似标识符,例如“i”与“I”,“function”与“Function”等。(4)用正确的反义词组命名具有互斥意义的标识符。例如“nMinValue”和“nMaxValue”,“GetName()”和“SetName()”等。(5)除非逻辑上的确需要编号,否则尽量避免名字中出现数字编号。例如Value1,Value2等,以防产生无意义的名字。2变量的定义 定义变量用于为变量分配存储空间,以存放变量的值。其中,变量存储空间的大小由变量的类型决定。在一个程序中,变量有且只有一个定义,并且变量在使用之前需要先定义或声明。定义变量的一般形式如下:数

22、据类型 变量名1,变量名2,变量名n; 若程序中需要多次使用某个常量,可将该常量定义为常变量,其声明形式为:const 数据类型 常量名=数值/表达式;四、运算符和表达式 据操作数个数不同,可将运算符分为:单目运算符(一元运算符)、双目运算符(二元运算符)和三目运算符(三元运算符)。C语言中的运算符非常丰富,总体可以分为以下几类: (1)算术运算符 (2)关系运算符 (3)逻辑运算符 (4)位运算符(5)赋值运算符(6)条件运算符(7)逗号运算符(8)指针运算符(9)求字节数运算符(10)特殊运算符(一)算术运算符(二)赋值运算符一般形式为:变量名=数值/表达式例如a=5a=sin(2.0)

23、a=b+ci=i2;等价于“i=2;” ,“=”称为复合的赋值运算符。C提供的复合赋值运算符包括:=、=、*=、/=、%=、=、&=、=和|=(三)位运算符任务实施计算三角形的面积计算三角形面积的公式为:实施步骤步骤1 启动Visual C+ 6.0,打开“文件”菜单,选择“新建”菜单项,在打开的 “新建”对话框中选择“文件”选项卡,在左侧文件类型列表中选择“C+ Source File”选项创建一个C+源程序。步骤2 单击“确定”按钮后,在编辑区中输入以下代码:#include #include void main()float edge1, edge2,edge3;float s;doub

24、le area;printf(Please input 3 edges length: );scanf(%f%f%f, &edge1, &edge2, &edge3);s=(edge1+edge2+edge3)/2;area=sqrt(s*(s-edge1)*(s-edge2)*(s-edge3);printf(The area is: %fn,area);步骤3 单击工具栏中的“保存”按钮 或者直接按【Ctrl+S】组合键保存文件,源程序创建完成。编译、连接后执行程序,执行结果如图2-8所示。图2-8 程序执行结果任务二 掌握简单的C语句任务说明学完C语言的基础元素后,下面我们来学习一些简单

25、的C语句。预备知识一、C语句概述二、数据输入输出的概念三、用printf函数输出数据四、用scanf函数输入数据五、字符数据的输入输出一、C语句概述C语句可以划分以下五类:(一)表达式语句 通过运算符将操作对象连接起来构成表达式,在表达式之后加一个分号,便构成表达式语句。(二)控制语句(1)if() else (2)for() (3)while() (4)do while()(5)continue(6)break(7)switch(8)goto(9)return(三)函数调用语句 由一次函数调用加上分号便构成函数调用语句,它实际上是表达式语句的一种。例如,调用printf库函数进行屏幕输出。p

26、rintf(Hello World!n);(四)复合语句 用“”和“”括起来的若干条语句称为复合语句,也称为块语句。复合语句有一些特殊的地方,比如可以在复合语句中定义局部变量等。(五)空语句只有一个分号也可以作为一条语句,称为空语句。二、数据输入输出的概念 C语言中并没有输入输出的语句,输入和输出是通过调用编译系统提供的库函数实现,如printf、scanf、putchar、getchar、puts和gets。使用这些标准的库函数,程序开头需要包含stdio.h头文件。三、用printf函数输出数据其一般调用格式为:printf(格式控制字符串,输出项列表); 输出项可以是常量、变量、表达式,

27、其类型、个数必须与控制字符串中格式字符的类型个数一致,当有多个输出项时,各项之间用逗号分隔。控制字符串必须用双引号括起,由格式说明和普通字符两部分组成。(一)格式说明一般格式为:%格式字符规定了对应输出项的输出格式,常用格式字符如下表所示。 修饰符是可选的,用于确定数据输出的宽度、精度、小数位数、对齐方式等,用于产生更规范更整齐的输出,当没有修饰符时,以上各项按系统缺省设定显示。下面我们介绍一些常用的修饰符。(1)字符宽度修饰符printf函数中的字符宽度修饰符如下表所示。(2)对齐方式修饰符 默认情况下,数据为右对齐格式。负号“”为左对齐控制符,使用该符号后,数据将以左对齐方式显示。下面我们

28、通过一个例子来体会该符号的使用。(3)l和h 这两个字符可以与输出格式字符d、f、u等连用,以说明是用long型或short型格式输出数据。例如:%hd短整型%ld长整型%hu无符号短整型(二)普通字符与转义字符 普通字符包括可打印字符和转义字符:可打印字符一般是一些说明字符,这些字符按原样显示在屏幕上;转义字符是不可打印字符,其实质是控制字符,用于产生一些特殊的输出效果,如下表所示。四、用scanf函数输入数据 scanf()的功能是接收从键盘上输入的数据,输入数据将按指定的输入格式赋给相应的变量。其一般调用格式为:scanf(格式控制字符串,输入项地址列表); 格式控制字符串规定数据的输入

29、格式,其含义与printf函数类似。输入项地址列表则由一个或多个变量地址组成,当变量地址有多个时,各变量地址之间用逗号“,”分隔。需要注意的是,各变量要加地址操作符“&”。scanf中所用的格式字符和附加字符含义如表2-9和表2-10所示。在使用scanf函数输入数据时,应注意以下问题: (1)当有多个输入项时,一般用空格或回车作为分隔符。其中,若以空格作为分隔符,则当输入项中包含字符类型时,可能产生非预期的结果。 (2)如果在格式控制字符串中包含除格式声明外的其他字符,则需要输入数据时在相应位置上输入这些字符。例如:scanf(%d%c, &a, &b);输入 32 q 我们期望的结果是a=

30、32,b=q,但实际上,分隔符空格被读入并赋给b。为避免这种情况,可使用如下语句:scanf(%d %c, &a, &b);/%d和%c之间加空格当输入1,2,q时,结果为:a=1,b=2,c=q;若输入1 2 q时,结果为:则除a正确赋值外,其余的值均不能正确赋值。五、字符数据的输入输出 对单个字符的输入输出可以使用getchar和putchar函数,对字符串的输入输出可使用gets和puts函数。1getchar和putchar函数:字符输入、输出函数 getchar的功能是接收从键盘输入的一个字符,它不带任何参数。 putchar函数每次可以向显示器上输出一个字符,只能接收字符变量、字符

31、常量作为参数并进行输出。#include main() char ch; ch=getchar(); putchar(ch); printf(%dn,ch); 2gets和puts函数:字符串输入、输出函数(1)puts()函数 puts()函数用来向标准输出设备(显示器)写字符串并换行,其调用格式为:puts(s);(2)gets()函数 gets()函数用来从标准输入设备(键盘)读取字符串直到回车结束,但回车符不属于这个字符串。其调用格式为:gets(s); 任务实施输出QQ好友信息 QQ是我们日常生活中常用的一款即时通讯软件,图2-14所示为QQ软件中查看好友资料的页面,我们将该好友的信

32、息进行整理如表2-11所示。下面我们将使用C语言编程,在屏幕上输出该好友的资料。图2-14 QQ好友资料实施步骤步骤1 启动VC,按任务一中的方法创建一个C+源程序,命名为“输出QQ好友信息”,在打开的代码编辑框中输入如下代码:#include stdio.hvoid main() /定义变量,用于存储QQ好友的信息 int QQ_num; char pet_name10 ;/字符串用数组方式存储,下同 char true_name10 ; char sex; int age; char city15 ; char E_mail20; printf(*n); printf(输入与输出QQ好友信

33、息n); printf(*n); /输入并存储QQ好友信息 printf(nn); printf(请输入好友QQ号码:n); scanf(%d, &QQ_num); printf(请输入好友昵称:n); scanf(%s, &pet_name); printf(请输入好友真实名称:n); scanf(%s, &true_name); fflush(stdin);/清空缓存 printf(请输入好友性别:n); scanf(%c, &sex); printf(请输入好友年龄:n); scanf(%d, &age); printf(请输入好友所在城市信息:n); scanf(%s, &city);

34、 printf(请输入好友E-mail地址:n); scanf(%s, &E_mail); /输出QQ好友信息 printf(nn下面输出已输入的好友信息n); printf(好友QQ号码为:%dn,QQ_num); printf(好友昵称为:%sn,pet_name); printf(好友真实姓名为:%sn,true_name); printf(好友性别为:%cn,sex); printf(好友年龄为:%dn,age); printf(好友所在城市为:%sn,city); printf(好友E-mail地址为:%sn,E_mail);步骤2 编译连接通过后,执行“组建”“执行输出QQ好友信息

35、.exe”菜单命令,或者直接按【Ctrl+F5】组合键,运行生成的程序,程序执行结果如图2-15所示。图2-15 程序运行结果项目拓展数据类型转换一、数据类型的自动转换 在C语言中,精度低、表示范围小的数据类型可以向精度高、表示范围大的类型自动转换。下面我们具体看一下在赋值运算中数据类型转换的情况: = 小数部分自动补0。 = 自动舍去实型表达式的小数部分(注意不进行四舍五入)。 = = 自动截取表达式值的低字节赋值,舍去高字节。 = = 自动给高字节补0或补1。二、数据类型的强制转换 若需要转换的数据类型不满足自动转换条件时,我们就需要使用强制转换方法。强制转换的一般形式:(类型名) (表达

36、式)例如:(int)( b+3*x)%3)1/(float)a+6C语言程序设计项目教程项目三共分为两个任务项目三 算法程序设计的灵魂任务一 了解什么是算法任务二 掌握算法的表示方法项目拓展 算法的复杂度任务一 了解什么是算法在本任务中我们将了解算法的概念和特性。任务说明预备知识一、什么是算法二、算法的特性 为解决一个问题而采取的方法和步骤就称为算法。计算机能够执行的算法可分为两大类:数值运算算法非数值运算算法主要用于求解数值,如求复杂算式的值、求方程的根等;主要用于事务管理领域,如图书检索、公交汽车车辆调度等。二、算法的特性(1)有穷性(2)确定性(3)有效性(4)存在零个或多个输入(5)存

37、在若干输出结果任务实施汉诺塔问题 汉诺塔(Towers of Hanoi,Hanoi为越南首都河内)也称河内之塔。它源于印度一个古老传说:大梵天创造世界的时候做了三根金刚石柱子,在其中一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。当盘子全数搬运完毕之时,也就是世界末日来临之时。 下图为模拟汉诺塔问题的模型玩具 在本任务中我们就来编写算法解决汉诺塔问题,这里将柱子标为A、B、C,要由A搬至C,假设A柱上的盘数为n,n由用户输入。任务分析 汉诺塔问题是典型的递

38、归调用问题。当n1时,直接将盘子从A移动到C即可。将n(n1)个盘子从A柱移动到C柱可以分为三个步骤: 将n1个盘子从A借助C移到B; 将最后一个盘子从A移到C; 将n1个盘子从B借助A移到C。实施步骤步骤1 启动Visual C+ 6.0,新建一个C+源程序,在编辑区中输入以下代码:#include void hanoi(int n, char A, char B, char C) if(n = 1) printf(Move sheet %d from %c to %cn, n, A, C); else hanoi(n-1, A, C, B); printf(Move sheet %d fr

39、om %c to %cn, n, A, C); hanoi(n-1, B, A, C); int main() int n; printf(请输入盘数:); scanf(%d, &n); hanoi(n, A, B, C); return 0;步骤2 编译、连接后执行程序,执行结果如下图所示。(a)n=2时移动方法(b)n=4时移动方法任务二 掌握算法的表示方法任务说明 除可以用自然语言对算法进行描述外,还有其他一些表示算法的方法,下面我们就来学习。一、算法的表示方法预备知识二、结构化程序设计方法一、算法的表示方法在使用计算机语言编写算法前,可以通过以下几种方式描述算法: 自然语言 流程图 N

40、-S结构图 伪代码(一)用自然语言表示算法 自然语言就是人们日常生活中所使用的语言,可以使用人类语言加上数学语言描述一个算法的实现,其特点是通俗易懂,但描述不直观、容易造成歧义。(二)用流程图表示算法 流程图采用图形符号配合文字说明来表示各种操作,这种方法形象直观,易于理解。常用的流程图符号如右图所示。(三)用N-S结构图表示算法 N-S流程图与传统流程图相比,取消了流程线的使用,算法只能自上而下执行,常用的N-S结构图符号如图3-6所示。(四)用伪代码表示算法 伪代码介于自然语言和计算机语言之间,通过接近编程语言的文字和符号来描述算法。采用这种方式时,并无固定、严格的语法规则,可以使用英文也

41、可以使用中文,把意思表达清楚即可。【例3-5】 用伪代码表示计算n!的算法。begin t1; i2; while(i5) tt*i ii+1 printf tend二、结构化程序设计方法任何复杂的问题都可以通过顺序、选择和循环三种基本算法结构来描述。(1)顺序结构各部分操作按照书写顺序依次执行,不存在任何跳转。(2)分支结构也称选择结构,通过一个判断框来描述。(3)循环结构 循环结构是对一组操作进行重复操作的结构,往往需要借助对循环控制条件的判断,决定是否继续重复执行操作。三种基本结构的共同点: 都是只有一个入口和一个出口; 结构内的每一个框都有机会被执行; 结构内没有死循环。结构化程序设计

42、的基本原则: 采用自顶向下、逐步细化的方法进行设计; 采用模块化原则和方法进行设计。即将大型任务从上向下划分为多个功能模块,每个模块又可以划分为若干子模块,然后分别进行模块程序的编写; 每个模块都是用结构化程序实现,即都只能由三种基本结构组成,并通过计算机语言的结构化语句实现。任务实施约瑟夫环问题(Josephus Problem) 据说,著名犹太历史学家Josephus曾讲过故事:在罗马人占领乔塔帕特后,39个犹太人与Josephus及他的朋友躲到一个洞中。39个犹太人决定宁愿死也不要被敌人逮到,于是决定了一个自杀方式:41个人排成一个圆圈,由第1个人开始报数,每报数到3,该人就必须自杀,然

43、后再由下一个人重新报数,直到所有人都自杀身亡为止。 然而Josephus和他的朋友并不想遵从,他将朋友与自己安排在第16个与第31个位置,逃过了这场死亡游戏。 在本任务中,我们将这个问题扩大,假设现在你与m位朋友不幸参与了这个游戏,你要如何做才能保护自己和朋友呢?任务分析 要解决约瑟夫问题,只要画两个圆圈就可以了,内圈是排列顺序,外圈是自杀顺序,如下图所示。 最后一个自杀的人排在第31位置上,而倒数第二个自杀的人排在第16个位置。约瑟夫将自己和朋友安排在了这两个位置上,之前的人都死了,所以他们也就不知道约瑟夫与他的朋友没有遵守游戏规则了。如何计算外环的自杀顺序呢?首先我们画出程序的流程图如图3

44、-9所示。首先我们建立一个长度为41的数组man,数组中的每个值代表一个人,然后使用变量pos记录报数者的位置,变量i记录报数值13,变量cout记录报数为3的数组元素的顺序。 当i的值为3时,将跳出报数循环(此时i的值将会置为0,以备下次报数),将cout的值加1,并将cout存入数组元素manpos,pos开始指向下一个报数者的位置,这里为使pos计数到41后自动回到0,需要通过语句“pos = (pos1) % N;”对数值进行环状处理。实施步骤步骤1 启动VC,创建一个C+源程序,在打开的代码编辑框中,输入如下代码:#include #define N 41 #define M 3 i

45、nt main(void) int manN = 0;/数组初值为0 int count = 1; int i = 0, pos = -1; int alive = 0; while(count = N) do pos = (pos+1) % N; /环状处理 if(manpos = 0) i+; if(i = M) /若报数为3 i = 0; break; /报数为3后,将跳出do.while循环 while(1); manpos = count; /记录自杀顺序 count+; printf(n约琴夫排列:); for(i = 0; i N; i+) printf(%d , mani);

46、printf(nn您想要救多少人?); scanf(%d, &alive); printf(nL表示这%d人要放的位置:n, alive); for(i = 0; i N; i+) if(mani (42- alive)printf(D); else /将需要拯救的人标记为Lprintf(L); if(i+1) % 5 = 0)/5个人一组显示,方便读者辨别位置printf( ); printf(n); return 0;步骤2 编译连接通过后,按【Ctrl+F5】组合键运行生成的程序,结果如图3-10所示。图3-10 程序运行结果项目拓展算法的效率 对于给定的任意问题,设计出复杂度尽可能低的

47、算法是我们在设计算法时追求的一个重要目标。算法的复杂度有时间复杂度和空间复杂度之分。一、时间复杂度 一个算法中的语句执行次数称为语句频度或时间频度,记为T(n)。若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数,记作T(n)=(f(n),称(f(n)为算法的渐进时间复杂度,简称时间复杂度。【例3-6】 分析三个算法的时间复杂度。(1)x:=x+1;(2)for i:=1 to n do x:=x+1;(3)for i:=1 to n dofor i:=1 to n do x:=x+1; 上面三个算法都包含基本语句

48、x:=x1,它们的执行频度分别为1、n和n2,这三个程序段的时间复杂度分别为O(1)、O(n)、O(n2),分别称为常量阶、线性阶和平方阶。二、空间复杂度 与时间复杂度类似,空间复杂度是指算法在计算机内执行时所需存储空间的度量(一般所讨论的是除正常占用内存开销外的辅助存储单元规模),记作:S(n)=O(f(n)。【例3-8】 将一维数组的n个数据逆序存放到原数组中。下面是实现该问题的两种算法:算法1for i=1 to n dobi=an-i+1;for i=1 to n doai=bi;算法2for i=1 to n/2 do begint=ai;ai=an-i+1;an-i+1=t; en

49、d; 算法1的时间复杂度为2n,空间复杂度为2n;算法2的时间复杂度为3*n/2,空间复杂度为n1。显然,算法2优于算法1。C语言程序设计项目教程项目四共分为两个任务 项目四 逻辑值与分支语句 让你的选择多样化任务一 掌握常用运算符与if分支语句结构任务二 掌握条件运算符与swith分支结构任务一 掌握常用运算符与if分支语句结构任务说明预备知识 下面我们就来学习条件表达式中用到的这些运算符、程序的基本控制结构以及if分支语句的相关知识。一、关系运算符与表达式二、逻辑运算符与表达式三、逻辑型变量四、ifelse分支结构一、关系运算符与表达式关系运算符的作用与优先级如表4-1所示。 关系表达式的

50、运算结果为真和假,通过0和1来表示。下面我们来看几个具体的示例:二、逻辑运算符与表达式三、逻辑型变量 逻辑型变量是C99标准中新增的一种数据类型,用于存储关系运算和逻辑运算的结果,定义逻辑变量使用类型符_Bool。另外,在头文件中,将bool定义为_Bool的同义词,同时定义符号常量true和false代表真和假。四、ifelse分支结构(一)if语句的基本结构if语句一般有以下三种形式:(1)单分支语句if(表达式) 语句;或语句1;语句2; 如果表达式的值为真,则执行if后面的语句;否则,跳过该语句直接执行后面的语句。执行过程如下图所示。(2)双分支语句语句结构如下:if(表达式) 语句1

51、;else 语句2; 如果表达式的值为真,则执行语句1;否则执行语句2。执行过程如右图所示。(3)多分支语句 有时必须判定多个条件以便决定执行什么操作。在这种情况下就要使用多分支语句了,其声明语法如下:if(表达式1) 语句1;else if(表达式2) 语句2;else if(表达式n) 语句n;Else 语句n1;执行过程如下图所示。 首先判断表达式1的值,如果值为真,则执行语句1,否则判断表达式2的值;如果表达式2的值为真,则执行语句2,否则判断表达式3的值;依此类推,若所有表达式的值为假,则执行语句n1。(二)if语句的嵌套 在if语句中又包含一个或多个if语句称为if语句的嵌套,它可

52、以用来实现多路选择功能,其一般形式为:(三)使用if语句的注意事项 else必须与if配对使用,它总是与它上面最近的且未配对的if配对。if()if() 语句1;elseif() 语句2;else 语句3;if()if() 语句1;elseif() 语句2;else 语句3; 虽然第一个else与第一个if写在同一列上,但实际上第一个else是与第二个if匹配的。 为使第一个else与第一个if匹配,可将以上语句改写成:任务实施制作简易教师考核成绩评定系统 教师的成绩由以下几部分组成:教务处得分、督导处得分、学生评定分和系部自评分,其中教务处得分占总分的10%,督导处得分占总分10%,学生评分

53、占总分的50%,系部自评分占总分的30%。各个单项分值的取值范围为0到100,因此教师总分的取值范围为0100。最后通过各个部分的得分总和评定教师的考核等级,总分小于70分为不“称职”,总分大于等于70小于90分为“称职”,总分大于等于90分为“优秀”。实施步骤步骤1 启动VC,创建一个C+源程序,在打开的代码编辑框中输入如下代码:#include void main() float jw, dd, xb, xs, zf; printf(请依次输入教务处评分、督导处评分、系部评分和学生评分:); scanf(%f%f%f%f,&jw,&dd,&xb,&xs);/计算教师总分 zf = jw *

54、 0.1 + dd * 0.1 + xb * 0.3 + xs * 0.5; printf(nn教师总评分数为:%fnn, zf);/计算评定等级 if (zf = 90) printf(您的评定等级为:优秀!); else if (zf = 70) printf(您的评定等级为:称职!); else printf(您的评定等级为:不称职!);步骤2 单击工具栏中的“保存”按钮 或者直接按【Ctrl+S】组合键保存文件,源程序创建完成。编译、连接后执行程序,执行结果如图4-4所示。图4-4 程序执行结果任务二 掌握条件运算符与swith分支结构任务说明 C语言提供了switch语句直接处理多分

55、支选择问题。在本任务中我们就来学习条件运算符和switch语句的使用。预备知识一、条件运算符二、switch分支语句一、条件运算符 条件运算符“?:”也称三元运算符,它根据布尔型表达式的值返回两个值中的一个,其格式如下:条件 ? 第一个表达式 : 第二个表达式; 如果条件为 true,则计算第一表达式并以它的计算结果为整个条件表达式的值;如果为 false,则计算第二表达式并以它的计算结果为整个条件表达式的值。二、switch分支语句switch语句的一般形式如下:switch (表达式) case常量表达式1: 语句组1; break; case常量表达式2: 语句组2; break; ca

56、se常量表达式3: 语句组3; Break; case常量表达式n: 语句组n; break; default: 语句组n1; break; 首先计算switch语句中表达式的值(表达式一般为整型、字符或字符串类型),当表达式的值与某个case后面常量表达式的值匹配时,就执行该case后面的语句,执行完后退出switch语句;若表达式的值与所有case后面的常量表达式的值都不匹配,则执行default后面的语句。使用switch语句时应注意以下几点: switch语句中的表达式通常为整型或字符型,配套的常量类型也应该是字符型或整型。此外,如果常量类型是字符型,一定要用单引号括起来(如A),而不

57、能使用双引号(A)。 每个case后面的常量表达式必须各不相同,否则会出现矛盾,即一个值有多种选择。 各个case语句和default语句出现的顺序对执行结果没有影响。 每个分支的语句可以是单条语句,也可以是多条语句,多条语句不用加花括号。 通常情况下,每个分支语句后都要加一个break语句,表示跳出switch语句。程序在执行完该分支的语句后,如果有break语句,则结束switch语句,否则,继续执行下面的语句,直到遇到break语句或整个switch语句结束。任务实施创建自动售货机程序 下面我们使用switch多分支条件语句创建简单的自动售货机程序。用户可以选择相应的商品,根据不同的商品

58、系统提示不同的商品价格,运行效果如图4-6所示。图4-6 “自动售货机程序”运行效果图实施步骤步骤1 启动VC,创建一个C+源程序,在打开的代码编辑框中输入【代码4-2】。#include void main()printf(请选择商品: 1=可乐 2=冰红茶 3=营养快线 4=矿泉水 5=雪碧);printf(n请输入您要购买的商品的代号:);int n; /用于存储商品代号scanf(%d,&n);/等待用户输入数字float price = 0;/用来存储顾客消费的金额switch (n)case 1:price = 3.5;break;case 2:price = 2.5;break;

59、case 3:price = 4.5;break;case 4:price = 1.0;break;case 5:price = 3.5;break;default:printf(您选择商品有误!);break;if(price!=0)printf(n您消费%f元 !, price); printf(n谢谢您的惠顾!);步骤2 单击工具栏中的“保存”按钮或者直接按【Ctrl+S】组合键保存文件,源程序创建完成。编译、连接后执行程序,在弹出的程序窗口中输入商品数值,系统将显示相应商品的价格,若输入数值不在其显示范围内,将弹出相应提示,如图4-6所示。C语言程序设计项目教程项目五共分为三个任务项目

60、五 循环语句 解决迭代问题的好办法任务一 掌握while和dowhile循环语句任务二 掌握for循环语句任务三 掌握break和continue语句任务说明预备知识任务一 掌握while和dowhile循环语句 在本任务中我们来学习while和dowhile循环语句的使用,读者要重点掌握这两种语句的区别。一、while循环语句二、dowhile循环语句一、while循环语句while循环语句语法格式如下:while ( 条件表达式 ) 循环体语句; while语句实现的循环是“当型循环”,即先测试循环条件再执行循环体。当条件表达式成立时才执行后面的循环体语句,否则不执行。该语句的程序流程如下

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论