第1章〓上机实验

1.1熟悉C语言编程环境
1.1.1实验目的

(1) 熟悉C语言编程环境DevC++6.3,掌握运行C语言程序的基本步骤,包括编辑、编译、连接和运行。

(2) 了解C语言程序的基本框架,能够编写简单的C语言程序。

(3) 了解程序编译报错的含义,能找到并改正程序中的语法错误。

1.1.2实验内容
1. 验证实验

【实验1】编写程序,在屏幕上显示“THIS IS A C PROGRAM.”。

源程序。



1#include "stdio.h"

2int  main(void)

3{

4printf("THIS IS A C PROGRAM.\n ");

5return 0;

6}






下面在DevC++6.3的编程环境下,以上述C语言程序的源程序为例,介绍运行一个C语言程序的基本步骤。

(1) 下载DevC++6.3软件并完成安装。下载地址为https://sourceforge.net/projects/embarcaderodevcpp/。单击“Download”按钮,完成下载,如图11所示。“Embarcadero_DevCpp_6.3_TDMGCC_9.2_Setup.zip”软件解压后的安装操作和普通软件相同,请自行完成。



图11DevC++软件下载页面




图12DevC++6.3软件打开方式

(2) 建立自己的文件夹。在计算机磁盘中新建一个用于存放C程序的文件夹,比如D:\cpro。

(3) 启动DevC++6.3。执行“开始”→所有程序→“Embarcadero DevC++”→“DevC++”(如图12所示),或者双击桌面的“Embarcadero DevC++”图标,进入编程环境。

(4) 新建和编辑文件。在软件的初始界面的右侧单击“新文件”,然后直接在“未命名1/Untitled1”文件里编辑代码。也可以依次单击“文件”→“新建”→“源代码”,或者直接使用快捷键Ctrl+N完成创建新文件的操作。

在“未命名1”文件中第1行开始输入所有的程序代码。

主窗口(如图13所示)的顶部是主菜单栏,其中包括10个菜单项,即“文件”“编辑”“搜索”“运行”等。主窗口的左侧是项目管理工作区窗口,右侧是用于程序编辑的文件窗口,下面是调试信息窗口。项目管理工作区窗口显示所设定的项目的相关信息,程序编辑窗口用来输入和编辑源程序,调试信息窗口用来显示程序的出错信息,表示结果“无错误(Errors)”或“警告(Warnings)”。

此外,可以依次单击“工具”→“编辑器属性”,在“编辑器属性”对话框中的“显示”选项卡中,修改字体的大小,可以使代码方便观看。注意,修改字体属性之后,在新建的文件中才会执行这项修改。



图13DevC++6.3的主界面


(5) 保存文件。编辑代码后,依次单击“文件”→“保存”,或者直接使用快捷键Ctrl+S,打开“保存为”对话框,如图14所示,选择保存位置(D:\cpro)、输入文件名称(test1)和选择保存类型(C source files (*.c)),完成保存新文件D:\cpro\test1.c的操作。

(6) 编译和连接文件。
编译时,编译器首先要对源程序检查语法错误,当发现错误时就在屏幕上显示错误的位置和错误类型的信息。此时,要再次调用编辑器进行查错、修改。然后,重新编译,直至排除所有语法和语义错误。具体操作如下所述。

单击“运行”下拉菜单中的“编译”选项,或者直接使用快捷键F9,如图15所示。经过短暂的编译处理时间,界面下方的“编译日志”子窗口会出现编译的相关信息,如图16所示。目前显示“错误和警告个数均为0”,说明当前代码没有任何错误信息。



如果代码出现了语法错误,“编译”操作后会在界面下方“编译器”子窗口出现报错的提示信息,包括出现错误的文件名、报错的行号、列号和错误原因信息,具体改错操作可以查看后面“陷阱实验”的内容。




图14保存对话框




图15“运行”菜单





图16“编译日志”窗口信息


如果之前从未保存过该程序,在第一次单击“编译”选项后,屏幕上会出现一个“保存”对话框,按照要求选择保存的路径和输入文件名。编译完成后会生成一个可执行文件,并在下方编译日志中显示源程序编译后的结果信息。

编译后产生的目标程序还不能直接运行。连接过程就是目标文件和其他分别进行编译生成的目标程序模块及系统提供的库函数进行连接,生成可执行文件(文件扩展名是“.exe”)。DevC++6.3把“连接”步骤与“编译”步骤一并完成,因此在图16中的编译结果信息中有“输出文件名: D:\cpro\test1.exe”,说明可执行程序已经正常生成。

(7) 运行程序。程序通过了编译、连接生成执行文件后,就可以运行该程序了。操作方法为: 单击“运行”菜单下的“运行”选项,或者直接使用快捷键F10,如图15所示。

程序运行结果如图17所示。如果执行程序后得到了用户需要的结果,则C语言编写程序的过程结束。否则,要进一步检查源程序,重复编辑、编译、连接、运行,直到得到用户满意的结果为止。



图17程序运行结果


(8) 算法描述方法。

在解决问题之前最好能给出对应解决问题的步骤,算法就是描述一个问题的具体步骤。现在给出一个简单的数学问题,要求用传统流程图、NS流程图、伪代码的方式来描述算法。

例如: 求方程ax2+bx+c=0的根。分别考虑以下三种情况: ①两个不等的实根; ②两个相等的实根; ③两个虚根。



图18常用的传统流程图的

基本符号

第一步,必备知识。

普通的流程图、NS流程图和伪代码。

第二步,任务实施。

传统流程图由不同的图形组成,不同的几何图形表示各种类型的操作,如图18所示。在图形上用简明扼要的文字和符号表示具体的操作,并用带有箭头的流程线表示操作的先后次序。

描述求方程ax2+bx+c=0根的问题中,首先使用起止框表示算法的开始。然后使用输入输出框,表示对数据a,b,c的输入操作。其次使用处理框,求d的值。由于方程需要根据d的不同取值判断根的情况,因此使用判断框d>=0。当该判断成立时,再使用判断框d==0,由此产生3种不同的情况,每种情况中均使用处理框计算2个根。然后,使用输入输出框将2个根输出。最后使用起止框表示结束。因此绘制方程根问题的传统流程图如图19所示。



图19方程根问题传统流程图


(9) NS流程图。

NS流程图,又称为盒图,采用图形的方法描述处理过程,将全部算法写在一个大的矩形框中,框内包含若干基本处理框,没有指向箭头。NS图描述算法的优点是形象直观、可读性强,限制了随意的控制转移。

利用NS图描述3种基本流程结构的形式,如图110所示。



图110NS图描述3种基本流程结构


根据传统流程图中对方程根问题的算法过程可以按输入、处理、判断、再判断、处理和输出步骤依次转换成NS流程图,如图111所示。



图111方程根问题NS流程图



(10) 伪代码。



输入 a,b,c

d=b^2-4ac

if d>=0 

then

if d=0 

then

x1,x2=-b/(2a)

else 

x1=(-b+d/)/2a

x2=(-b-d/)/2a

end if

print  x1,x2

else 

p=-b/(2a)

q=-d/(2a)

print  x1= p+qi, x2=p-qi

end if






拓展思考。

(1) 能否在屏幕中输出中文信息?

(2) 如果输出的中文信息出现乱码应该如何处理?

(3) 使用DevC++6.3调试程序的步骤是什么?

2.  陷阱实验

【实验1】改正下列程序中的错误。在屏幕上显示“How do you do?”。

源程序(有错误的程序)。



1#include <stdio.h>// err1.c

2intmian(void)

3{

4 printf(How do you do?\n")

5 return 0;// 分号是中文输入

6}






程序调试步骤如下。

(1) 编辑。按照以上代码编辑源程序err1.c 文件。

(2) 编译。执行“运行”→ “编译”,下方编译器信息窗口显示11条error错误和warning警告。

(3) 找出错误。观察编译器信息窗口中的每一条error或warning的具体提示信息,包括行号、列号、单元和信息,以此修正每个错误或警告。

(4) 首先,改正第2行代码中函数的名称。

改正错误1。将第2行mian改为main。

(5) 查看编译器信息窗口的第一条错误信息。双击该条出错信息,编辑窗口就会在代码行号处出现红色报错标志,指向程序出错的位置(如图112所示),一般在箭头的当前行或者上一行,可以找到出错语句。这条出错信息的“行”显示“4”,“列”显示“10”,代表第4行第10列可能出错。当前光标所在的行号和列号可以通过窗口最下方的状态栏得知。

这条出错信息的“单元”显示“D:\err1.c”,表示本程序文件的位置与名称。“信息”显示“[Error] 'How' undeclared (first use in this function)”,表示“How”是一个未定义的变量,但此处“How”并不是变量,请仔细对照之前学习的代码格式,会发现出错的原因是“How”前少了前双引号。所以编译程序提示的出错信息只是对编译器从头至尾编译语句时发现了不符合语法规则的错误,给出相应错误提示信息,不一定是真实的错误原因。初学者应对照正确的代码不断练习,熟悉出错信息可能对应的出错原因。

改正错误2。在第4行的“How”前加上前双引号。注意使用英文输入状态下的符号!



图112编译产生的错误信息 


(6) 重新编译。下方编译器信息窗口显示4条error。(如图113所示)修改了一个错误后,可以尝试重新编译,不建议要把所有错误修改之后再编译程序代码。

双击第一条出错信息,出错信息指出第4行第29列“expected ';' before 'return'”,即在“return”之前缺少语句的结束标志——分号。

改正错误3。在第4行结尾添加分号。



图113重新编译后产生错误的信息


(7) 重新编译。下方编译器信息窗口显示4条error。(如图114)本次出错信息指出第5行第11、12、13列出现了“stray '\357' in program'”类似错误,即在这些位置出现了中文输入状态下的全角符号而令编译器报错。

改正错误4。将第5行的分号改为英文输入状态下的分号。



图114重新编译后产生错误的信息


(8) 重新编译、运行。

如果没有任何编译错误,执行“运行”→“运行”,则自动弹出运行窗口,显示运行结果,与题目要求的结果一致。按任意键自动关闭运行窗口。

运行结果: 

How do you do?

【实验2】改正下列程序中的错误。在屏幕上显示以下3行信息。

***************

How do you do?

***************

源程序(有错误的程序)。



1#include <stdio.h>

2intmian(void)

3 {

4printf("***************\n");

5printf"How do you do?\n")

6printf("***************\n");

7return 0;

8 }






对程序进行编译,“编译器”信息窗口显示错误信息。双击每个错误,观察源程序中的箭头位置所指行的代码,并分析错误原因,改错后重新编译,直至无错误信息并显示正确的运行结果。

错误行号: 

错误原因: 

正确语句: 

运行结果如下。

***************

How do you do?

*************** 

3.  进阶实验

【实验1】在屏幕上显示一个短句 “what is a computer?”。

【实验2】在屏幕上显示下列图形。

*

***

***** 

*******

【实验3】在屏幕上显示下列图形。

**********

**

**

**********

1.2用C语言编写简单程序
1.2.1 实验目的

(1) 掌握算术表达式和赋值表达式的使用。

(2) 掌握基本输出函数的使用。

1.2.2实验内容
1.  验证实验

【实验1】输入两个整数: 100和50,求出它们的商和乘积,并输出。

第一步,必备知识。

数据类型、变量的定义、运算符、printf函数和scanf函数。

第二步,描述算法。

(1) 定义四个整型变量; 

(2) 输入两个整型数据; 

(3) 求两数的商和乘积; 

(4) 输出两数的商和乘积。

第三步,源程序。



1 #include "stdio.h"

2 int  main(void)

3 { int  a,b,c,d;

4printf("\n请输入两个整数:");

5scanf("%d,%d",&a,&b);

6c=a/b;

7d=a*b;

8printf("a/b=%d.\n",c);

9printf("a*b=%d.\n",d);

10return 0;

11 } 






第四步,运行结果。

请输入两个整数:100,50

a/b=2.

a*b=5000.

拓展思考。

(1) 输入的两个整数之间是否可以没有逗号,或输入中文输入状态下的逗号?

(2) 如果两个整数相除的商不是整数值,运行程序是否能得到正确的运算结果?原因是什么?如输入为100,40。

(3) 能否改编程序来计算两个实数的四则运算结果?

【实验2】把150分钟换算成用小时和分钟表示,然后输出。

第一步,必备知识。

数据类型、变量的定义、运算符、printf函数和scanf函数。

第二步,描述算法。

(1) 定义分钟总数、小时数和分钟数三个整型变量; 

(2) 根据题目的要求,输入分钟总数150; 

(3) 根据分钟总数求其对应的小时数和分钟数; 

(4) 输出分钟总数转换的结果。

第三步,源程序。



1 #include "stdio.h" 

2 int  main(void) 

3 { int  time,hour,minute; 

4printf("\n请输入分钟总数:"); 

5scanf("%d",&time); 

6hour=time/60; 

7minute=time%60; 

8printf("=%d小时",hour); 

9printf("%d分钟\n",minute); 

10return 0; 

11 }






第四步,运行结果。

请输入分钟总数:150↙

=2小时30分钟

拓展思考。

改写程序,当输入x小时y分钟时,程序将其换算成总分钟数。

2.  陷阱实验

【实验1】改正下列程序中的错误,求圆的周长。计算公式如下。

c=2πr

其中,c表示周长,r表示面积。

源程序(有错误的程序)。



1#include <stdoi.h>

2#definePI 3.14







3intmain(void)

4{

5intr;c;

6r=3;

7c=2*PI*r;

8printf("r=d,c=%d\n",r,c);

9return 0;

10 }






程序调试步骤如下。

(1) 编辑。按照以上代码编辑源程序文件。

(2) 编译。执行“运行”→“编译”,下方编译器信息窗口显示1条错误。

(3) 这个错误是第1行11列,代码中包含文件的位置。错误信息是“[Error] stdoi.h: No such file or directory”,指stdoi.h文件不存在。

改正错误1。将第1行的stdoi改为stdio。

(4) 重新编译。下方编译器信息窗口显示10条错误。修改了刚才第一个错误后,错误数量反而增加了,注意这不一定代表刚才的错误修改不到位,仔细查看错误提示信息,耐心修改程序中的每一条错误。

双击此时的第一条出错信息,出错信息指出第5行第10列“[Error] 'c' undeclared (first use in this function)”,即c未被定义(第一次在这个函数中被使用)。查看这一行,c是需要被定义的变量,第5行的写法不能同时定义两个变量。

改正错误2。将第5行改为“int  r,c”。

(5) 重新编译、运行。如果没有任何编译错误,执行“运行”→“运行”,则自动弹出运行窗口,正常显示运行结果“r=d,c=3”,但是与题目要求的运行结果“r=3,c=18.840000”不一致。

这种情况以后会经常遇到,语法错误由编译器(DevC++)帮助编程者查找出来,但是类似现在这种逻辑错误就需要编程者仔细阅读题目要求和程序代码,分析目前的运行结果,思考并继续修改代码。

(6) 分析逻辑错误1。分析目前的运行结果“r=d,c=3”,需要结合输出语句来查看“printf("r=d,c=%d\n",r,c);”。可以发现,“r=d,c=”这部分和printf中双引号内的内容对应,结合教材第4章中对printf函数的描述可知,“r=”之后没有出现数字3,是因为“格式字符%d”漏写了百分号。

改正错误3。在第8行的d前增加“%”,整行改为“printf("r=%d,c=%d\n",r,c);”。

(7) 重新编译、运行。

无编译错误,正常显示运行结果“r=3,c=18”,这与题目要求的结果“r=3,c=18.840000”仍不一致,但是已经成功一半了。

分析当前的逻辑错误,就集中在c的取值上,为什么结果不是小数呢?结合配套的《C语言程序设计》教材第4章中对printf函数的描述可知,格式字符%d用来输出整数,因此c不可能输出题目需要的小数。

那么,如何修改使得运行结果完全正确呢?

(8) 分析逻辑错误2。第1种思路,修改printf中输出c的格式字符为%f,修改编译运行后发现运行结果仍然不正确。第2种思路,修改变量c的类型为实型,因为如果c是整型,它的取值一定是整数。

改正错误4。在第5行将c的类型改为float, “int r; float c;”,将第8行c的格式字符改为“%f”。

(9) 重新编译、运行。

运行结果(改正后程序的运行结果)。

r=3,c=18.840000

【实验2】 改正下列程序中的错误。

计算某个数x的2倍并赋值给y,最后分别以“y=2*x”和“2*x=y”的形式输出。

源程序(有错误的程序)。



1#include <stdio.h>

2intmain(void)

3{

4intx,y;

5y=2*x;

6printf("%d=2*%d",x);

7printf("2*d=%d",y);

8return 0;

9}






对程序进行编译,“编译器”信息窗口显示错误信息。双击每个错误,观察源程序中的箭头位置所指行的代码,并分析错误原因,改错后重新编译,直至无错误信息并显示正确的运行结果。

错误行号:  

错误原因: 

正确语句: 

运行结果(改正后程序的运行结果)如下。

(假设输入x 的值是4)

8=2*4

2*4=8

3.  进阶实验

【实验1】已知某位学生的数学、英语和计算机课程的成绩分别是87分、72分和93分,求该学生3门课程成绩的平均分。

输入、输出示例如下。

数学=87,英语=72,计算机=93,

平均分=84

【实验2】当n为28时,分别求出 n的个位数字和十位数字。

输出示例如下。

整数28的个位数字是8,十位数字是2

【实验3】求一个数值的平方和立方。

输入、输出示例如下。

5↙

5的平方是25,5的立方是125

1.3顺序结构程序设计
1.3.1实验目的

(1) 能够编程实现简单的数据输入、输出和运算处理。

(2) 能够理解编译错误信息的含义,掌握简单C语言程序的查错方法。

1.3.2实验内容
1. 验证实验

【实验1】 将原文中的3个字符进行加密操作。加密转换规律是: 按字典顺序,将原来字母后面的第5个字母替换原来的字母。例如要将“abc”译成密码,则“a”后面第5个字母是“f”,用“f”代替“a”,b和c也以此类推,因为,“abc”应译为“fgh”。

第一步,必备知识。

变量定义,运算符。

第二步,描述算法。

(1) 定义三个字符数据; 

(2) 输入这三个字符数据; 

(3) 进行加密操作: 给每个字符都加5,并赋给它本身; 

(4) 输出这三个字符数据。

第三步,源程序。



1#include "stdio.h" 

2intmain() 

3{ char c1,c2,c3; 

4printf("输入三个字符变量:"); 

5scanf("%c%c%c",&c1,&c2,&c3); 

6c1+=5; 

7c2+=5; 

8c3+=5; 

9printf("译成密码是:%c%c%c \n",c1,c2,c3); 

10 return 0; 

11 }






第四步,运行结果。

输入三个字符变量:abc↙

译成密码是:fgh

拓展思考。

(1) 如果输入三个字符间加入空格,思考产生的运行结果并分析其原因。提示: 可以对照ASCII表来寻找线索。

运行结果。

输入三个变量:a b c↙

译成密码是:f%g

(2) 如果修改输入函数语句为“scanf("%c,%c,%c",&c1,&c2,&c3);”,此时应该如何输入3个字符数据并得到正确结果?

【实验2】输入两个数据,它们分别为整型和浮点型。将整型数据转换成浮点类型数据; 将浮点型转换为整型数据。

第一步,必备知识。

变量定义,强制类型转换运算符。

第二步,描述算法。

(1) 定义整型数据和浮点型数据; 

(2) 输入这两个数,使用scanf或直接赋值; 

(3) 将整型数据转换成浮点类型数据,并直接输出; 

(4) 将另一个浮点型转换为整型数据,并直接输出。

第三步,源程序。



1#include "stdio.h"

2intmain()

3{

4intn;

5float f;

6n=10;

7f=25.4;

8printf("原始的数据为:n=%d,f=%f\n",n,f);

9printf("(float)n=%f\n",(float)n);

10printf("(int)f=%d\n",(int)f);

11return 0;

12}






第四步,运行结果。

原始的数据为:n=10,f=25.400000

(float)n=10.000000

(int)f=25

拓展思考。

(1) 如何验证强制类型转换运算是将浮点数直接取整还是将小数部分四舍五入?

(2) 强制类型转换运算一般出现在哪些情况中?

2.  陷阱实验

【实验1】改正下列程序中的错误。该程序将输入的两个小写字母转换成大写字母并输出。

源程序(有错误的程序)。



1#include"stdio.h"

2intmain(void) 







3{ 

4char a,b; 

5printf("请输入两个小写字母:"); 

6scan("%c,%c",&a,b); 

7a=a+32; 

8b=b-32; 

9printf("%c %c",a,b); 

10return 0; 

11}






程序调试步骤如下。

(1) 编辑。按照以上代码内容编辑源程序文件。

(2) 编译。执行“运行”→“编译”,下方编译器信息窗口显示1条错误和1个警告。

(3) 查看第一个警告。这个警告指向第6行代码,信息提示“[Warning] implicit declaration of function 'scan'; did you mean 'scanf'? [Wimplicitfunctiondeclaration]”,指未对函数“scan”做声明,你是否想写“scanf”函数。

改正错误1。第6行的“scan”改为“scanf”。

(4) 重新编译和分析逻辑错误1。如果没有任何编译错误,执行“运行”→“运行”,则自动弹出运行窗口。按照“scanf”语句和题目要求,输入两个小写字母并且用逗号分隔。

运行结果如下。

请输入两个小写字母:a,b↙

可以观察到,没有输出结果,这说明发生了逻辑错误。

(5) 考虑输入是否正确,仔细观察“scanf”语句,发现“b”的前面漏写了“&”符号。

改正错误2。第6行的“b”变量前添加“&”。

(6) 重新编译、运行。发现运行结果与题目要求部分相符,代码仍然存在逻辑错误。

运行结果如下。

请输入两个小写字母:a,b↙

?B

(7) 分析逻辑错误2。“a”为何不能正确转换为大写字母“A”,而“b”字符却可以正确转换呢?观察代码第7和8行,发现了不同点。根据ASCII表的规律,小写字母要转换为对应大写字母需要减32。因此第8行是正确的。

改正错误3。第7行加号改为减号,即“a=a-32;”。

(8) 重新编译、运行。

运行结果(改正后程序的运行结果)如下。

请输入两个小写字母:a,b↙

A B

【实验2】改正下列程序中的错误,求华氏温度100度对应的摄氏温度(c表示摄氏温度; f表示华氏温度)。计算公式如下: 

c=5×(f-32)/9

源程序(有错误的程序)如下。



1#include <stdio.h>

2intmain(void)

3{floatc,f;

4f=100.0;

5c=5 (f-32)\9;

6printf("f=%.1f,c=%.1f\n",f,c);

7return 0;

8}






对程序进行编译,“编译器”信息窗口显示错误信息。双击每个错误,观察源程序中的箭头位置所指行的代码,并分析错误原因,改错后重新编译直至无错误信息并正确显示运行结果。

错误行号:  

错误原因: 

正确语句: 

运行结果(改正后程序的运行结果)如下。

f=100.0 c=37.8

3.  进阶实验

【实验1】 求摄氏温度26℃对应的华氏温度。计算公式如下。

f=(9×c/5)+32

其中,c表示摄氏温度; f表示华氏温度。

输出示例如下。

c=26f=78

【实验2】连续输入三个大写字母,输出各自对应的小写字母,输出字母之间有一个空格。

输入输出示例如下。

ABC↙

对应的小写字母是:a b c

【实验3】计算一个人的体质指数(BMI)。计算公式如下。

BMI= 体重÷身高2。(体重单位: 千克; 身高单位: 米)

输入、输出示例如下。

55 1.6↙

BMI=21.5

1.4选择结构程序设计
1.4.1实验目的

(1) 使用 if 语句计算分段函数。

(2) 正确书写关系表达式。

(3) 掌握基本输入函数的使用,能正确调用C语言提供的数学函数。

1.4.2实验内容
1.  验证实验

【实验1】输入x,计算并输出下列分段函数f(x)的值。

y=f(x)=2x,x≠0
0,x=0


第一步,必备知识。

if语句的双分支结构形式。

第二步,描述算法。

判断条件x的值是否为零。如果x的值不等于零,则y的值为2x; 否则为零。

第三步,源程序。



1#include <stdio.h>

2intmain(void)

3{

4intx,y;

5printf("Enter x:");

6scanf("%d",&x);

7if(x!=0){ y=2*x;}

8else{ y=0;}

9printf("f(%d)=%d\n",x,y);

10return 0;

11}






运行结果1如下。

Enter x:10

f(10)=20

运行结果2如下。

Enter x:0

f(0)=0

拓展思考。

(1) 将程序中y=2*x;和y=0;换下位置,如何修改条件表达式?

(2) 如果用单分支结构替换双分支结构,如何修改程序?

【实验2】写一个程序,输入x,输出y。

y=x,x<1
2x-1,1<=x<10
3x-11,x>=10



第一步,必备知识。

ifelse 多分支选择结构,if语句的嵌套。

第二步,描述算法。

这是一个分段函数,当x取值不同时,y的值也会发生变化。当x<1时,y=x;当1<=x<10时,y=2x-1; 当x>=10时,y=3x-11。这里使用if语句的嵌套完成。 

第三步,源程序。



1#include "stdio.h"

2intmain()

3{

4intx,y;

5printf("请输入x的值:");

6scanf("%d",&x);

7if(x<1)

8{y=x;

9printf("当x=%d时,则y=x=%d\n",x,y);}

10elseif(x<10)

11{y=2*x-1;

12printf("当x=%d时, 则y=2*x-1=%d\n",x,y);

13}

14else 

15{y=3*x-11;

16printf("当x=%d时, y=3*x-11=%d\n",x,y);

17}

18return 0;

19}






第四步,运行结果(运行三次,每一种情况都进行了测试)如下。

请输入x的值:-5↙

当x=-5时,则y=x=-5

请输入x的值:5↙

当x=5时,则y=2*x-1=9

请输入x的值:15↙

当x=15时,则y=3*x-11=34

拓展思考。

(1) 如果不用if的嵌套结构,只用三个简单的if单分支结构能否解决?

(2) 如果用switch语句是否可以解决?比较switch语句和if嵌套结构的优缺点,什么情况下用switch语句算法更优?



图115圆塔分布图

【实验3】有4个圆塔,圆心分别为(2,2)、(-2,2)、(2,-2)、(-2,-2),圆半径为1,如图115所示。这4个塔的高度分别为10m。塔以外无建筑物。现输入任一点的坐标,求该点的建筑高度(塔外的高度为零)。

第一步,必备知识。

选择结构,if语句。

第二步,描述算法。

(1) 顺序结构,求各个塔点的距离; 

(2) 选择结构,判断是否在塔外。

第三步,算法分析如下。

(1) 输入某点坐标(x,y)。

(2) 求(x,y)到各塔心的距离d1、d2、d3、d4。

d1=(x-x1)*(x-x1)+(y-y1)*(y-y1);

d2=(x-x2)*(x-x2)+(y+y2)*(y+y2);

d3=(x+x3)*(x+x3)+(y-y3)*(y-y3);

d4=(x+x4)*(x+x4)+(y+y4)*(y+y4);

(3) 判断是否在塔外,如果为真,(x,y)处高度为0,(x,y)处高度为10。

if(d1>1&&d2>1&&d3>1&&d4>1)h=0;

printf("该点高度为%d",h);

(4) 最后输出结果。

第四步,源程序如下。



1#include "stdio.h"

2intmain()

3{

4inth=10;

5floatx1=2,y1=2,x2=-2,y2=2,x3=-2,y3=-2,x4=2,y4=-2,x,y,d1,d2,d3,d4;

6printf("请输入一个点(x,y):");

7scanf("%f,%f",&x,&y);

8d1=(x-x1)*(x-x1)+(y-y1)*(y-y1);

9d2=(x-x2)*(x-x2)+(y+y2)*(y+y2);

10d3=(x+x3)*(x+x3)+(y-y3)*(y-y3);

11d4=(x+x4)*(x+x4)+(y+y4)*(y+y4);

12if(d1>1&&d2>1&&d3>1&&d4>1) h=0;

13printf("该点高度为%d",h);

14printf("\n");

15return 0;

16 }






第五步,运行结果如下。

请输入一个点(x,y):0.6,0.8↙

该点高度为0

拓展思考如下。

测试该程序的其他全部情况。

2.  陷阱实验

【实验1】改正下列程序中的错误。输入实数 x,计算并输出f(x)的值。


y= f(x)=
2x,x=10
x,x≠10

源程序(有错误的程序)如下。



1 #include <stdio.h>

2 intmain(void)

3 {

4intx,y;

5printf("Enter x:");