第三章 基本程序设计_OK.ppt
第三章 基本程序设计 3.1 顺序结构程序设计3.2 选择结构程序设计3.3 循环结构程序设计第三章 基本程序设计3.1 顺序结构程序设计 【学习目标学习目标】掌握字符输入输出函数掌握字符输入输出函数getchargetchar()()和和putcharputchar()()掌握顺序结构程序设计的程序模式掌握顺序结构程序设计的程序模式 掌握掌握格式输出函格式输出函printf()和格式输入函数和格式输入函数scanf()图图3-1【实例实例11 输入与输出几个字符输入与输出几个字符】输入几个字符然后输出。程序运行结果如图输入几个字符然后输出。程序运行结果如图3-1所示。所示。3.1 顺序结构程序设计 3.1 顺序结构程序设计 【程序代码程序代码】#include stdio.hmain()char a,b,c;/*声明变量声明变量*/*使用使用getchar()函数接受用户输入的值函数接受用户输入的值*/printf(请输入字符:请输入字符:n);fflush(stdin);a=getchar();fflush(stdin);b=getchar();fflush(stdin);c=getchar();/*使用使用putchar()函数输出这几个字符,并输出一个换行符函数输出这几个字符,并输出一个换行符*/putchar(a);putchar(b);putchar(c);putchar(n);getch();3.1 顺序结构程序设计【相关知识相关知识】1顺序结构顺序结构 所谓所谓“程序结构程序结构”,即指程序中语句的执行顺序。程序设计者要把事情交,即指程序中语句的执行顺序。程序设计者要把事情交给计算机去做,使用的都是写出一条条语句,顺序地执行,这是顺序式结构。给计算机去做,使用的都是写出一条条语句,顺序地执行,这是顺序式结构。本例中的程序运行就是顺序执行每条语句。本例中的程序运行就是顺序执行每条语句。2getchar()函数函数getchar()函数是一个没有参数的函数,它从标准输入(键盘)读取一个字符,函数是一个没有参数的函数,它从标准输入(键盘)读取一个字符,返回改字符的编码值。当使用此函数时,按下的键将自动回显到屏幕上。使返回改字符的编码值。当使用此函数时,按下的键将自动回显到屏幕上。使用用getchar()函数时,任何键都是有效的返回值。调用没有参数的函数时应在函数时,任何键都是有效的返回值。调用没有参数的函数时应在函数名后写一对空括号。下面的代码演示了函数名后写一对空括号。下面的代码演示了getchar()函数的用法:函数的用法:char c;fflush(stdin);c=getchar();getchar()函数只能接受单个字符,输入数字也按字符处理。当输入多于一函数只能接受单个字符,输入数字也按字符处理。当输入多于一个字符时,只接收第一个字符。使用个字符时,只接收第一个字符。使用getchar()函数时需要注意这一点。函数时需要注意这一点。函数函数fflush()用于清空输入缓冲区。()用于清空输入缓冲区。stdin是标准的输入,即键盘输入。分是标准的输入,即键盘输入。分配给键盘的缓冲区需要清空,以便存储新数据。有时,键盘缓冲区中保留着配给键盘的缓冲区需要清空,以便存储新数据。有时,键盘缓冲区中保留着旧信息,如果不清空,在接受字符时会将旧信息返回,这样就可能引发错误。旧信息,如果不清空,在接受字符时会将旧信息返回,这样就可能引发错误。3.1 顺序结构程序设计 【相关知识相关知识】3 putchar()函数函数putchar()函数对应于函数对应于getchar()函数。函数函数。函数putchar把一个字符送到把一个字符送到标准输出。例如:标准输出。例如:putchar(o);putchar(k);两个字符两个字符“ok”将被送到标准输出。标准输出的默认连接通常是计将被送到标准输出。标准输出的默认连接通常是计算机显示器,因此,执行这两个语句的效果使字符在计算机屏幕上算机显示器,因此,执行这两个语句的效果使字符在计算机屏幕上显示出来。实例中创建了显示出来。实例中创建了3个变量个变量a、b和和c,getchar()函数将用户输函数将用户输入的字符存储在这些变量中。每个入的字符存储在这些变量中。每个getchar()前都使用一个前都使用一个fflush()()函数帮助清空缓冲区。在该程序中,如果不使用函数帮助清空缓冲区。在该程序中,如果不使用fflush(),也不(),也不会出现问题。随着每个会出现问题。随着每个getchar()函数的执行,输入的字符就显示在函数的执行,输入的字符就显示在屏幕上。最后一行输出结果将显示前面输入的所有字符。此输出结屏幕上。最后一行输出结果将显示前面输入的所有字符。此输出结果显然表明,使用果显然表明,使用putchar()函数后,所有字符将显示在同一行()函数后,所有字符将显示在同一行上,最后换一行(因为它输出一个换行符),程序随即结束。上,最后换一行(因为它输出一个换行符),程序随即结束。【实例实例12 互换两个变量的值互换两个变量的值】接收两个整数,分别保存在两个变量中,通过第三个变量将这两个变量的接收两个整数,分别保存在两个变量中,通过第三个变量将这两个变量的值互换。运行结果如图值互换。运行结果如图3-2所示。所示。3.1 顺序结构程序设计 图图3-23.1 顺序结构程序设计 【程序代码程序代码】#include stdio.hmain()int x,y,z;printf(n请输入第一个数:请输入第一个数:);scanf(%d,&x);printf(n请输入第二个数:请输入第二个数:);scanf(%d,&y);/*显示互换前的数显示互换前的数*/printf(nn输出互换前的数输出互换前的数);printf(n第一个数是第一个数是:%d,x);printf(n第二个数是第二个数是:%d,y);/*互换这两个数互换这两个数*/z=x;x=y;y=z;/*显示互换后的数显示互换后的数*/printf(nn输出互换后的数输出互换后的数);printf(n第一个数是第一个数是:%d,x);printf(n第二个数是第二个数是:%d,y);getch();3.1 顺序结构程序设计 【相关知识相关知识】1头文件头文件“stdio.h”C语言格式输入函数语言格式输入函数scanf()和格式输出函数和格式输出函数printf(),都在头文件,都在头文件stdio.h里。因此,程序中使用它们时,在程序的开始处,应该书写里。因此,程序中使用它们时,在程序的开始处,应该书写一条包含命令:一条包含命令:#include stdio.h 或或#include 2格式化输出函数格式化输出函数printf()其功能是向显示器输出若干指定类型的数据。其一般格式为:其功能是向显示器输出若干指定类型的数据。其一般格式为:printf(参数(参数1,参数,参数2,参数参数n)其中参数其中参数1是是”格式控制字符串格式控制字符串”,即用双引号括起来的字符串,它,即用双引号括起来的字符串,它包含两类字符信息:包含两类字符信息:一类是格式说明:由一类是格式说明:由%开始的格式字符序列,如开始的格式字符序列,如%d、%c、%f等。等。表示表达式的值应以给定的格式输出。另一类是普通字符,按原样表示表达式的值应以给定的格式输出。另一类是普通字符,按原样输出的字符,除了格式说明字符之外的全是普通字符。输出的字符,除了格式说明字符之外的全是普通字符。3.1 顺序结构程序设计 【相关知识相关知识】参数参数2到参数到参数n是是n-1个表达式,其值按对应的格式说明要求进行输出。因此,个表达式,其值按对应的格式说明要求进行输出。因此,表达式的数量和类型应与格式控制字符串中格式说明的数量和格式类型相表达式的数量和类型应与格式控制字符串中格式说明的数量和格式类型相一致,否则会造成错误。一致,否则会造成错误。(1)d格式符格式符它是十进制整数输出格式,它要求将一个整形数据以十进制整数输出,有它是十进制整数输出格式,它要求将一个整形数据以十进制整数输出,有以下几种形式:以下几种形式:%d:按实际数据长度输出。按实际数据长度输出。%md:m为制定的输出宽度(正整数)。如果实际数据长度大于为制定的输出宽度(正整数)。如果实际数据长度大于m,按实,按实际长度输出;小于际长度输出;小于m,则在左端补以空格(又称右对齐)。,则在左端补以空格(又称右对齐)。%-md:m同上含义,但是负号要求输出右端补以空格(左对齐)。同上含义,但是负号要求输出右端补以空格(左对齐)。%ld:如为长整型数据,应在如为长整型数据,应在d前加前加1。(2)o格式符格式符它是八进制整数输出格式,它要求将一个整形数据的机内代码以八进制数它是八进制整数输出格式,它要求将一个整形数据的机内代码以八进制数输出。因为机内代码为补码,因此负数输出时将不输出负号,而是将符号输出。因为机内代码为补码,因此负数输出时将不输出负号,而是将符号位当做数值输出。位当做数值输出。3.1 顺序结构程序设计 【相关知识相关知识】%-ms:m含义同上吗,但是右端补以空格(左对齐)。含义同上吗,但是右端补以空格(左对齐)。%m.ns 输出宽度为输出宽度为m,是实际输出字符串的前,是实际输出字符串的前n个字符。如个字符。如n大于大于实际长度,全部输出。实际长度,全部输出。(7)f格式符格式符它是小数格式输出的格式控制符,它是一个实型数据(包括单精度它是小数格式输出的格式控制符,它是一个实型数据(包括单精度型与双精度型)以小数格式输出,有以下几种形式型与双精度型)以小数格式输出,有以下几种形式::%f:整数部分全部输出,小数部分输出整数部分全部输出,小数部分输出6位(并非全部有效)位(并非全部有效)%mf:m为输出宽度,包括小数点,含义同前为输出宽度,包括小数点,含义同前%-mf:m为输出宽度,包括小数点,含义同前为输出宽度,包括小数点,含义同前%m.nf:m为输出宽度,为输出宽度,n为指定小数输出位数为指定小数输出位数3.1 顺序结构程序设计 【相关知识相关知识】3格式输出函数格式输出函数scanf()功能是从键盘输入若干指定类型的数据,其一般格式为:功能是从键盘输入若干指定类型的数据,其一般格式为:scanf(参数(参数1,参数,参数2,参数)参数)其中参数其中参数1为格式控制字符串,其含义与为格式控制字符串,其含义与printf 相同、参数相同、参数2到参数到参数n是是n-1个变量地址或字符串首地址,输入的指定格式数据送入这些地址,赋给对个变量地址或字符串首地址,输入的指定格式数据送入这些地址,赋给对应变量。应变量。4复合语句在C语言程序中,可以用一对花括号把若干条语句括起来,形成一个整体。这个整体就被称为“复合语句”。从语法上讲,它相当于一个语句。复合语句的一般格式是:语句1;语句2;语句n;续3.1 顺序结构程序设计 【相关知识相关知识】要注意,复合语句中可以出现变量说明,复合语句中的最后一条语句的语句结束符(分号)不能省略,否则会造成语法错误。另外,标识复合语句结束的右花括号的后面不能有语句结束符(分号)。5空语句 在C语言中,称仅由一个分号组成的语句为“空语句”,即:;编译程序在遇到空语句时,不会为其产生任何相应的指令代码。这就是说,空语句不执行任何操作。因此,空语句只是C语言语法上的一个概念,它起到一个语句的作用,仅此而已。3.2 选择结构程序设计 【学习目标学习目标】掌握掌握if语句的语句格式与应用语句的语句格式与应用 掌握复合掌握复合if语句的语句格式与应用语句的语句格式与应用掌握条件运算符的用法掌握条件运算符的用法掌握掌握switch语句的语句格式与应用语句的语句格式与应用 3.2 选择结构程序设计 【实例实例13 根据条件确定公司是否已经为司机投保根据条件确定公司是否已经为司机投保】如果司机满足下列条件之一,公司则为他们投保。这三个条件是:(如果司机满足下列条件之一,公司则为他们投保。这三个条件是:(1)司机已婚。(司机已婚。(2)司机为司机为30岁以上的未婚男性。(岁以上的未婚男性。(3)司机为)司机为25岁以上的未婚岁以上的未婚女性。如果以上条件一个也不满足,则公司不为司机投保。请编写一个程序,女性。如果以上条件一个也不满足,则公司不为司机投保。请编写一个程序,根据用户输入司机的婚姻状态、性别和年龄,判断该司机是否已投保。运行结根据用户输入司机的婚姻状态、性别和年龄,判断该司机是否已投保。运行结果如图果如图3-5所示。所示。3.2 选择结构程序设计 【程序代码程序代码】#include stdio.hmain()char gender,ms;int age;/*接受司机的详细信息接受司机的详细信息*/printf(nnt司机的详细信息司机的详细信息nn);printf(nt司机的婚姻状况司机的婚姻状况(y/n):);scanf(n%c,&ms);printf(nt司机的性别司机的性别(M/F):);scanf(%d,&age);/*多重多重 if 结构结构*/if(ms=Y|ms=y)/*检查司机的婚姻状况检查司机的婚姻状况*/printf(“nt该司机已投保该司机已投保n”);续续3.2 选择结构程序设计 【程序代码程序代码】else if(gender=M|gender=m)&(age30)/*如果未婚,检查是否是如果未婚,检查是否是30岁以上的男性岁以上的男性*/printf(nt该司机已投保该司机已投保n);else if(gender=F|gender=f&age25)/*检查是否是检查是否是25岁以上的女性岁以上的女性*/printf(nt该司机已投保该司机已投保n);else printf(nt该司机已投保该司机已投保n);getch();3.2 选择结构程序设计 【相关知识相关知识】1选择结构程序设计选择结构又称分支结构,有二分支或多分支结构。这种结构根据条件判断结果,选择执行不同的程序分支。选择结构是程序的基本结构之一,几乎所有程序都包含选择结构。C语言中可以用两种控制语句来实现程序的分支控制,即if语句和switch语句。用它们均可构成选择结构。2单分支选择if语句 单分支选择if语句的形式为:if(表达式)语句;执行过程,先判断表达式的值,如果成立,则行后面的语句。否则什么也不执行。3.2 选择结构程序设计 【相关知识相关知识】3双分支选择双分支选择if语句语句 双分支选择双分支选择if语句的形式为:语句的形式为:if(表达式)语句(表达式)语句l;else 语句语句2;这个条件语句的执行过程,先判断表达式的值,如果成立,执行语句这个条件语句的执行过程,先判断表达式的值,如果成立,执行语句1,如果不成,如果不成立,执行语句立,执行语句2。4多分支选择多分支选择if语句语句 多分支选择多分支选择if语句的形式为:语句的形式为:if(表达式(表达式1)语句语句1;else if(表达式(表达式2)语句语句2;else if(表达式(表达式3)语句语句3;else if(表达式(表达式n)语句语句n;else 语句语句n+1;其语句是,依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。其语句是,依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。然后跳到整个然后跳到整个if语句之外继续执行程序。如果所有的表达式均为假,则执行语语句之外继续执行程序。如果所有的表达式均为假,则执行语句句n+1。然后继续执行后续程序。然后继续执行后续程序。3.2 选择结构程序设计 【相关知识相关知识】5.if语句的嵌套在if语句中又内嵌if语句则称为语句的嵌套。前面已说明,多分支选择if语句本身就可看成为if语句的嵌套形式。其一般形式为:if()if()语句1;/*内嵌if语句*/else 语句2;else if 语句3;/*内嵌if语句*/else 语句4;在使用内嵌if语句时,要注意if和else的配对,因为if语句的第一种形式中只有if没有else。C语言在编译源程序时总是将else与它前面最近的if配对。3.3循环结构程序设计 【学习目标学习目标】掌握循环结构的内涵掌握循环结构的内涵 掌握掌握while、for、do-while循环语句的结构和应用循环语句的结构和应用 掌握掌握break和和continue语句的用法语句的用法【实例实例15 while15 while循环语句循环语句求求1+2+1+2+100+100的和值的和值】任务任务:用用while语句求语句求1+2+3+100的和值。程序的运行结果如图的和值。程序的运行结果如图3-10所示。所示。3.3循环结构程序设计 3.3循环结构程序设计 【程序代码程序代码】#include stdio.h main()int i=1,sum=0;while(i=100)sum=sum+i;/*随着随着i的变化,将的变化,将i的值累加到的值累加到sum中中*/i+;/*循环一次,循环一次,i自动增自动增1*/printf(1+2+.+100的和值为:的和值为:%dn,sum);getch();【相关知识相关知识】1循环结构程序设计循环结构程序设计 循环结构是结构化程序三种基本结构之一,它和顺序结构、选择结构共同循环结构是结构化程序三种基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。循环结构的特点是:在给定条件成立作为各种复杂程序的基本构造单元。循环结构的特点是:在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件成为循环条件,时,反复执行某程序段,直到条件不成立为止。给定的条件成为循环条件,反复执行的程序段称为循环体。反复执行的程序段称为循环体。C语言的循环体语句有语言的循环体语句有while语句、语句、do-while语句、语句、for语句。语句。2while语句语句while语句用于实现语句用于实现“当当”型循环结构。其一般形式如下:型循环结构。其一般形式如下:while(表达式表达式)循环体循环体其执行过程是当表达式为非值时,执行循环体。循环体内语句可以是空语其执行过程是当表达式为非值时,执行循环体。循环体内语句可以是空语句,可以是一条语句,可以是多条语句。如果为空语句或一条语句,可略句,可以是一条语句,可以是多条语句。如果为空语句或一条语句,可略去。去。循环执行过程中,如果参与表达式判断的变量值不能改变,则循环不会结束,循环执行过程中,如果参与表达式判断的变量值不能改变,则循环不会结束,称为死循环。称为死循环。3.3循环结构程序设计【实例实例1818 循环的嵌套结构循环的嵌套结构百钱买百鸡问题百钱买百鸡问题】任务任务:中国古代数学家张丘建在他的中国古代数学家张丘建在他的算经算经中提出了著名的中提出了著名的“百钱百钱百鸡问题百鸡问题”鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁,母,雏各几何钱买百鸡,翁,母,雏各几何?编写一程序解决此问题,程序运行结果编写一程序解决此问题,程序运行结果如图如图3-13所示。所示。3.3循环结构程序设计 3.3循环结构程序设计 【程序代码程序代码】#include stdio.h#include conio.h main()int i,j,k;/*三个变量分别代表鸡翁、鸡母、鸡雏三个变量分别代表鸡翁、鸡母、鸡雏*/*理论上鸡翁的循环范围是理论上鸡翁的循环范围是0-100,但实际上每个鸡翁值,但实际上每个鸡翁值5钱,钱,如果鸡翁的数量超过如果鸡翁的数量超过20,那么钱数一定超过,那么钱数一定超过100,那么就不合题,那么就不合题意了,意了,所以这里鸡翁的取值范围是所以这里鸡翁的取值范围是0-20,内层循环的鸡母范围也是同理。,内层循环的鸡母范围也是同理。*/for(i=0;i=20;i+)for(j=0;j=33;j+)k=100-i-j;/*计算鸡雏的数量计算鸡雏的数量*/*鸡的数量和钱的数量同时扩大三倍,以防余数问题。鸡的数量和钱的数量同时扩大三倍,以防余数问题。*/if(i*15+j*9+k=300)printf(n鸡翁鸡翁 鸡母鸡母 鸡雏数分别为鸡雏数分别为:%5d%5d%5d,i,j,k);getch();【相关知识相关知识】1 循环嵌套循环嵌套在一个循环体内又完整地包含了另一个循环,称为循环嵌套。前面介绍的三种在一个循环体内又完整地包含了另一个循环,称为循环嵌套。前面介绍的三种类型的循环都可以互相嵌套,循环的嵌套可以多层,但每一层循环在逻辑类型的循环都可以互相嵌套,循环的嵌套可以多层,但每一层循环在逻辑上必须是完整的。在编写程序时,循环嵌套的书写要采用缩进的形式,像上必须是完整的。在编写程序时,循环嵌套的书写要采用缩进的形式,像本例题程序中所示,内循环中的语句应该比外循环中的语句有规律地向右本例题程序中所示,内循环中的语句应该比外循环中的语句有规律地向右缩进缩进2-4列,这样程序分明,易于阅读。列,这样程序分明,易于阅读。2百钱买百鸡问题解析百钱买百鸡问题解析百钱买百鸡是一道用百钱买百鸡是一道用C语言程序解决数学方程运算问题的一个典型试题,用到语言程序解决数学方程运算问题的一个典型试题,用到了程序中典型的方法:穷举法。假设想了程序中典型的方法:穷举法。假设想x、y、z分别为鸡翁、鸡母、鸡雏的分别为鸡翁、鸡母、鸡雏的只数,依题意可得出联体方程组如下:只数,依题意可得出联体方程组如下:x+y+z=100 (1)5x+3y+z/3=100 (2)三个未知数,只有两个方程式,所以三个未知数,只有两个方程式,所以x、y、z可能有多组解,因此,可用可能有多组解,因此,可用“穷穷举法举法”,x、y、z可能满足要求的组合,最后把符合上述两方程的想可能满足要求的组合,最后把符合上述两方程的想x、y、z判断打印出来。判断打印出来。3.3循环结构程序设计