作者:李丽娟主编
出版社:人民邮电出版社
格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT
C语言程序设计教程实验指导与习题解答(第4版)试读:
第4版 前言
在学习 C 语言的过程中,很多人都有过这样的想法:概念易懂,程序难写。其实,出现这种情况的主要原因是缺少足够的实践与练习。为了帮助读者学好 C语言,真正掌握用 C 语言进行程序设计,我们特别在《C 语言程序设计实验指导与习题解答(第2版)》与第3版的基础上,结合多年的教学经验,特别是近几年教学改革的实践,对其内容进行了进一步的优化、补充和完善,编写了这本《C语言程序设计教程实验指导与习题解答(第4版)》,希望能对读者有所帮助。
本书共分为3部分。第一部分为实验,共有11章,与《C语言程序设计教程(第4版)》中的章节对应,每一章都简要地提出了学习目的和要求,列出了相关知识和实验范例,并给出了相关的实验练习。我们将为教师提供所有实验练习的程序参考答案。
第二部分为习题解答,是对《C语言程序设计教程(第4版)》中所有习题的解答,习题的内容基本上覆盖了国家教育委员会考试中心编写的《全国计算机等级考试大纲》(C语言部分),共有11章,与《C语言程序设计教程(第4版)》中的章节完全对应,并对部分疑难问题给出一些解答提示,对于编程题,参考答案并不是唯一的、最优的,给出的参考答案仅仅起到抛砖引玉的作用,希望引导读者思考,将计算思维的方法应用于程序设计,设计不同的算法来实现,以拓宽自己的思路,掌握C语言的基本概念和编程方法。
第三部分为附录,简单介绍了Visual C++ 6.0、Turbo C和Borland C++ 5.0集成开发环境的使用,给出了这些环境下常见的编译错误信息,帮助读者快速掌握 C语言程序的调试。
书中所有程序均在Visual C++ 6.0 环境上调试通过。
本书由李丽娟任主编,吴蓉晖、杨小林、谷长龙、洪跃山、李根强、杜四春任副主编。
第一部分的第1章、第3章和第二部分的第1章、第3章及附录A、附录B由李丽娟编写;第一部分的第2章、第4章和第二部分的第2章、第4章由杨小林和谷长龙编写;附录C、附录D、附录E由杨小林编写;第一部分的第5章、第6章和第二部分的第5章、第6章由吴蓉晖编写;第一部分的第8章和第二部分的第8章由洪跃山编写;第一部分的第7章、第9章和第二部分的第7章、第9章由李根强编写;第一部分的第10章、第11章和第二部分的第10章、第11章由杜四春编写;全书由李丽娟统稿。
由于编者水平有限,书中难免存在错误之处,敬请读者批评指正。编者2012年12月于岳麓山
第一部分 实验
●
第1章 实验引言
● 第2章 基本的程序语句实验
● 第3章 程序的简单算法设计实验
● 第4章 分支结构实验
● 第5章 循环结构实验
● 第6章 函数和宏定义实验
● 第7章 数组实验
● 第8章 指针实验
● 第9章 构造数据类型实验
● 第10章 文件操作实验
● 第11章 位运算实验第1章 实验引言
1.1 目的和要求
(1)了解C语言程序的开发环境,掌握C语言源程序的编辑、编译、执行的过程。(2)了解不同的C语言程序开发环境,并在不同的环境下编辑、编译、链接和运行C语言程序。(3)通过运行简单的C程序,初步了解C语言源程序的特点。1.2 相关知识
1.C 语言程序要在特定的开发环境下才能生成可执行的程序,适合 C 语言的开发环境有:Turbo C 2.0、Borland C++、Visual C++ 6.0、gcc等。
2.C语言程序的基本结构主要由以下6部分组成:(1)文件包含部分;(2)预处理部分;(3)变量说明部分;(4)函数原型声明部分;(5)主函数部分;(6)自定义函数部分。
若要生成可执行的程序,其中文件包含部分和主函数部分一般不可以缺少,其他部分可根据程序的需要而定。
3.C语言源程序是不能直接运行的,必须要对源程序进行编译、链接后,才能生成可执行的程序。
1.3 实验内容
1.3.1 熟悉Turbo C环境
Turbo C是Borland公司推出的一种C语言程序集成开发环境,它将编辑、编译、链接和运行集成在一起,使用起来方便简单,具有效率高、功能强等优点。
实验练习 安装Turbo C 2.0,并在该环境下编辑一个如下所示的简单C语言程序:
#include
main()
{
printf("Hello,World!\n");
}
对其进行编译、生成可执行的程序,执行该程序,观察程序的运行结果。
1.实验目的
本实验旨在巩固学生对编程基本概念的理解。主要目的如下:(1)了解Turbo C环境下的C语言程序的开发过程;(2)了解和学会printf函数的基本用法。
在强化练习中,练习如何输出指定的信息。
2.问题描述
修改上面的程序,输出信息:
I am learning The C program.
Very good!
3.示例输出
I am learning The C program.
Very good!
4.程序样板
#include
main()
{
printf("___①___");
printf("___②___");
}
5.问题解答与提示(1)启动Turbo C系统,进入Turbo C集成开发环境。(2)在主菜单下,选择“File”菜单下的“New”命令(建立新文件),进入Turbo C编辑状态。(3)在编辑窗口下,输入上述程序。
6.强化练习
根据程序模板,现要求输出如下信息:
**************************
Very good
**************************
请写出相应的源程序。
7.实验结果小结
根据使用过程,回答下面的问题:(1)怎样进入程序的编辑状态?(2)使用什么命令对源程序进行编译?(3)怎样生成可执行的文件?(4)怎样查看程序的运行结果?(5)给出Turbo C 2.0两个不同状态下的界面图,如编辑状态、编译状态、环境设置状态、文件打开状态等。
1.3.2 熟悉Visual C++环境
Visual C++ 6.0(简称VC或者VC6.0),是微软推出的一款C++编译器,该编译器同样也适合于 C 语言,它是一个基于 Windows 操作系统的可视化集成开发环境(Integrated Development Environment,IDE),相对于Windows操作系统的不同版本,Visual C++也有不同的版本。
实验练习1 安装Visual C++ 6.0,并在该环境下重做1.3.1 小节的练习。
实验练习2 在Visual C++环境下,编辑一个如下所示的简单C语言程序:
#include
main()
{
int a,b,c;
printf("please enter a,b:");
scanf("%d,%d",&a,&b);
c=a+b;
printf("c=%d\n",c);
}
1.实验目的
本实验旨在巩固学生对编程基本概念的理解。主要目的如下:(1)了解算术运算的表达式;(2)掌握printf函数的基本用法;(3)了解scanf函数的基本用法。
在强化练习中,练习整数的减法运算和乘法运算。
2.问题描述
编写程序,计算两整数的和与积。
3.示例输出
please enter a,b:3,5
3 + 5 = 8
3*5 = 15
4.程序样板
下面的程序需要输出表达式的计算结果,请在下面程序的空白处填入合适的内容,将表达式的计算结果输出到屏幕,运行程序,观察程序的运行结果。
#include
main()
{
int a,b,c,d;
printf("please enter a,b: ");
scanf("%d,%d",&a,&b);
c=a+b;
d=a*b;
printf("___①___");
printf("___②___");
}
5.问题解答提示(1)程序功能是进行加法运算和乘法运算,因此需要从键盘输入两个变量的值。(2)观察示例输出a+b和a*b的结果可知,程序进行的是整型数据的计算,因此变量类型均为整型。(3)用scanf语句接收数值,并存储在变量a、b中。(4)分别将加法运算和乘法运算的结果赋给不同的变量保存起来。(5)输出计算结果。
6.强化练习
如果要计算两整数的差,上述程序又将如何修改呢?请写出正确答案。
7.实验结果小结
根据使用过程,回答下面的问题:(1)怎样进入程序的编辑状态?(2)使用什么命令对源程序进行编译?(3)怎样生成可执行的文件?(4)怎样查看程序的运行结果?(5)给出Visual C++两个不同状态的下的界面图,如编辑状态、编译状态、环境设置状态、文件打开状态等。
1.3.3 熟悉Dev C++环境
DevC++是一个Windows环境下适合C语言和C++的开发工具,它是一款自由软件,DevC++是一个非常实用的编程软件,适合初学者与编程高手的不同需求,是适合用于学习C语言或C++的开发工具。
实验练习1 安装Dev C++ 5.0(也可以是Dev C++的其他版本),在该环境下,重做1.3.1 小节的练习。
实验练习2 在Dev C++环境下编辑一个如下所示的简单C语言程序:
#include
main()
{
printf("*\n");
printf("**\n");
printf("***\n");
printf("****\n" );
printf("*****\n" );
}
对其进行编译、生成可执行的程序,执行该程序,观察程序的运行结果。
1.实验目的
本实验旨在巩固学生对编程基本概念的理解。主要目的如下:(1)熟悉Dev C++环境下的C语言程序的开发过程;(2)通过运行简单的C程序,初步了解C语言源程序的特点;(3)改变printf中的符号,输出其他自创图案。
在强化练习中,练习用C语言的printf语句输出各种不同的图案。
2.问题描述
编写程序,输出一个由字母A组成的等腰三角形图案,三角形的两边空白处用字母O填充。
3.示例输出
OOOOOAOOOOO
OOOOAAAOOOO
OOOAAAAAOOO
OOAAAAAAAOO
OAAAAAAAAAO
AAAAAAAAAAA
4.程序样板
请在下面程序的空白处填写你喜欢的字母符号,能使程序输出不同的几何图案,然后运行程序,观察程序的运行结果,了解printf语句的输出几何图案特点。
#include
main()
{
printf("___(1)___");
printf(___(2)___");
printf("___(3___");
printf("___(4)___");
……
printf("___(n)___");
}
5.问题解答与提示(1)根据问题描述进行分析,程序的主要任务是输出有规律的几何图案。因此,关键在于要给出图案的形状,然后用printf语句逐行将图案输出。(2)通过这种固定方式来输出几何图案,大小是固定不变的,除非修改程序的源代码。
6.强化练习
请在上面程序的基础上,输出下列几种几何图案:圆形、五角星、倒三角形。
7.实验结果小结
根据使用过程,回答下面的问题:(1)怎样进入程序的编辑状态?(2)使用什么命令对源程序进行编译?(3)怎样生成可执行的文件?(4)怎样查看程序的运行结果?(5)给出Dev C++两个不同状态的下的界面图,如编辑状态、编译状态、环境设置状态、文件打开状态等。
1.3.4 熟悉Borland C++环境
Borland C++也是一个Windows环境下适合C语言和C++的开发工具,它使用方便,适合用于学习C语言或C++的开发工具。
实验练习1 安装Borland C++ 5.0(也可以是Borland C++的其他版本),在该环境下,重做1.3.1小节的练习。
实验练习2 在Borland C++环境下编辑一个如下所示的简单C语言程序:
#include
main()
{
printf("Data Types and Sizes :\n");
printf("char: %d\n",sizeof(char));
printf("float: %d\n",sizeof(float));
printf("double: %d\n",sizeof(double));
}
对其进行编译、生成可执行的程序,执行该程序,观察程序的运行结果。
1.实验目的
本实验旨在巩固学生对编程基本概念的理解。主要目的如下:(1)熟悉Borland C++环境下的C语言程序的开发过程;(2)通过运行简单的C程序,初步了解C语言源程序的特点;(3)了解sizeof运算符的特殊用法。
在强化练习中,练习C语言的各种数据类型是否固定不变。
2.问题描述
编写程序,第1行输出字符串“Data Types and Sizes:”,从第2行开始打印输出Borland C++环境下C语言中各种数据类型存储空间的大小。
3.示例输出
Data Types and Sizes:
long: 4
unsigned int: 2
double: 8
4.程序样板
请在下面程序的空白处随意填写文字或者表达式,然后运行程序,观察程序的运行结果,了解printf语句的特点。
#include
main()
{
printf("___①___@");
printf("___②___");
printf("___③___");
printf("___④___");
}
5.问题解答与提示(1)根据问题描述进行分析,程序分为两项任务,第1项要求输出指定的字符串,第2项要求输出C语言中各种数据类型存储空间大小。(2)对于第1项任务,与实验练习1内容相似,故可以采用printf语句进行编写。(3)对于第2项任务,首先分析C语言中有哪些主要的数据类型(int型、char型、float型、double型等),然后如何通过程序计算出这些类型所占用的存储空间(使用系统提供的求某种数据类型存储空间字节数的函数sizeof();最后将各种类型所占用的存储空间大小输出。
6.强化练习(1)考虑上述类型所占用的存储空间大小是否是固定的?如果不是,你能说出原因吗?(2)如果在输出字符串下加一行“----------------------”,应怎么修改程序?请写出正确答案。
7.实验结果小结
根据使用过程,回答下面的问题:(1)怎样进入程序的编辑状态?(2)使用什么命令对源程序进行编译?(3)怎样生成可执行的文件?(4)怎样查看程序的运行结果?(5)给出 Borland C++两个不同状态下的界面图,如编辑状态、编译状态、环境设置状态、文件打开状态等。
1.4 C语言开发环境综合练习
1.练习安装几种不同的适合C语言的集成开发环境。要求了解和掌握以下几个方面的内容:(1)系统的目录结构;(2)系统每一个目录下的文件形式;(3)运行该集成编辑环境,调入系统提供的程序范例,练习对该程序的编辑、运行,了解程序的运行机制。
2.对一个已经安装好的Turbo C 2.0集成编辑环境系统,要求了解和掌握以下几个方面的问题:(1)改变系统的根目录名;(2)运行该集成编辑环境,调入系统提供的程序范例,对该程序进行编译,看看会发生什么问题,寻找解决方案;(3)了解集成环境下的其他功能。
第2章 基本的程序语句实验
2.1 目的和要求
(1)掌握C语言几种基本数据类型,如整型(int)、字符型(char)、单精度型(float)、双精度型(double),以及由这些基本类型构成的常量和变量的使用方法。(2)掌握C语言的运算符和表达式的正确使用。(3)掌握自增(++)和自减(−−)运算符的正确使用。(4)掌握基本的输入/输出函数scanf( )、getchar( )、printf( )和putchar( )函数的基本功能、调用方法、输入/输出格式控制规定等。(5)能独立编写顺序结构程序并调试通过。(6)用表达式语句、输入/输出语句解决简单的应用问题并上机实现。2.2 相关知识
2.2.1 常量和变量
常量和变量是C语言数据处理的基本对象。
1.常量分为数值常量、字符常量和字符串常量
数值常量分为整型常量和实型常量两种,分别表示整数和实数。整数可以使用十进制数、八进制数和十六进制数表示;实数只使用十进制数,采用小数形式和指数形式具体表示。
字符常量是用单引号括起来的一个字符表示,字符常量的值是该字符所对应的ASCII值。
字符串常量是用双引号括起的一串字符表示,字符串在内存存储时,自动在其尾部加上一个空(NULL)字符。
2.变量按照数据类型定义
基本数据类型有字符型、整型、单精度浮点类型和双精度浮点类型,由基本数据类型的数据长度不同及有无符号又可派生多种类型。
2.2.2 算术表达式
算术表达式是用算术运算符和括号将运算对象连接起来,且符合C语言语法规则的式子。
C语言在不同数据类型混合运算时会按规则自动转换成相同的数据类型后再进行运算,即在C语言编译时自动把参与运算的各种常量和变量转换为它们中间数据长度最长的数据类型进行计算,但赋值操作按把赋值号右边类型转换成赋值号左边类型的原则进行。如果希望在一个算术表达式中按用户的要求确定结果的类型,则可以采用强制类型转换符号进行操作。
2.2.3 运算符
1.算术运算
单目运算:−,++,−−。
双目运算:+,−,*,/,%。
2.关系与逻辑运算
关系运算的结果是1和0,若关系表达成立,则其值为1,否则为0。
逻辑运算的结果是真或假,如果为真,定义其值为1,如果为假,定义其值为0。
2.2.4 编程中应注意的事项
1.用整型(int、short、long)说明变量时,要注意变量的取值范围,否则将出现意想不到的错误;字符常量和字符串常量是有区别的。
2.运算符的优先级:关系运算符中的等号(==)不要写成赋值号;逻辑运算中,当有&&和||联结的表达式时,按从左至右顺序运算,且一旦能确定结果便终止后面的运算。
2.2.5 典型案例
案例一 计算面积
1.问题描述
输入r1、r2,求出圆形垫片面积(网格部分),如图2-1所示。图2-1 圆形垫片
2.具体分析(1)所求面积s =大圆面积s2(半径r2)−小圆面积s1(半径r1)。(2)圆面积=半径 × 半径 × 3.14。(3)程序接收r1、r2,定义为float类型。
算法流程如图2-2所示。图2-2 案例一算法流程
3.程序实现
/*sy2_1.c*/
#include
#define P 3.14
int main()
{
float r1,r2;
double s1,s2,s;
printf("Please enter r1,r2:\n" );
scanf("%f%f",&r1,&r2);
s2=r2*r2*P;
s1=r1*r1*P;
s=s2-s1;
printf("s=%lf\n",s);
return 0;
}
4.思考
如果输入的圆半径r1大于r2,按程序计算出来会得负数,要避免这种情况出现,怎样修改程序?
案例二 温度计算
1.问题描述
编写程序,输入华氏温度h,输出摄氏温度c(摄氏温度= 5/9*(华氏温度−32))。
2.具体分析(1)输入数据和输出数据均为温度,因此用float型来定义,其中,输入数据为华氏温度,输出数据为摄氏温度。(2)提示用户输入华氏温度,并用scanf()语句接收该值。(3)根据华氏温度和摄氏温度之间的计算公式,将华氏温度转化为摄氏温度,并存储在变量c中。(4)用printf()语句显示对应的摄氏温度。
算法流程如图2-3所示。图2-3 案例二算法流程
3.程序实现
/*sy2_2.c*/
#include
int main()
{
float h, c;
printf("请输入华氏温度:");
scanf("%f",&h);
c=5.0/9*(h-32);
printf("\n摄氏温度:%f\n",c);
return 0;
}
4.思考
若将上述程序改为输入摄氏温度,输出华氏温度,应如何改写程序?
案例三 自增运算符的使用
1.问题描述
编写程序,观察自增运算符放在变量之前和放在变量之后,表达式的值有何不同。
2.具体分析(1)设计两个整型变量a、b,赋相同的初值,自增运算符分别放在两个变量的前面和后面。(2)再分别把两个表达式值赋给不同的整型变量x、y。(3)输出变量x、y的值,观察自增运算符的使用,及其位置对表达式值的影响。
算法流程如图2-4所示。图2-4 案例三算法流程
3.程序实现
/*sy2_3.c*/
#include
int main()
{
int a=6,b=6,x,y;
x=a++;
y=++b;
printf("\nx=%d, y=%d\n",x,y);
return 0;
}
4.思考
请将自增运算符(++)改为自减运算符(−−),编译运行,观察其结果。
2.3 实验内容
2.3.1 表达式的计算
1.实验目的
本实验旨在巩固学生对编程概念的理解。在这个实验中,学生将练习:
● 掌握C语言数据类型,熟练掌握变量定义;
● 使用scanf()输入变量的值,使用printf()输出变量;
● 掌握运算符与表达式的使用方法及其优先级和结合性规律。
在强化练习中,学生将练习:
● 对程序的分析能力。
2.问题描述
计算并输出表达式的值。其中a和b的值从键盘输入。
3.示例输入/输出
Please enter a,b:
20.6
10.2
x=2.14
4.具体要求(1)a、b以键盘输入且在输入前要求有提示信息;(2)输出结果的小数点后取2位;(3)变量a、b定义为单精度类型。
5.问题解答提示(1)输入a、b。(2)C语言表达式为:(b+sqrt(b*b+2*a))/(a−b)。(3)将计算值赋给x变量,然后输出变量x。
6.强化练习
C语言表达式中的括号能部分或全部省去吗?为什么?
2.3.2 表达式的应用
1.实验目的
本实验旨在巩固学生对编程概念的理解。在这个实验中,学生将练习:
● 掌握C语言表达式的表示;
● 正确定义程序中的变量;
● 正确使用scanf()输入用户提供的数据;
● 正确使用printf()输出变量。
2.问题描述
从键盘输入圆锥体的半径r和高度h,并计算其底面积和体积。
3.示例输入/输出
Please input r,h:
10,20
底面积 = 314.16 圆锥体积 = 2094.39
4.具体要求(1)圆锥体的半径r和高度h以键盘输入且在输入前要求有提示信息。(2)输出结果时要有文字说明(中、英文均可),每个输出值占一行,在输出结果的小数点后取2位。(3)所有变量均定义为单精度类型。
5.问题解答提示(1)依题意,输入数据半径r和高度h,输出面积和体积,因此用float或double定义。(2)依据圆面积的计算公式 s = r*r*π和圆锥体体积计算公式 v = r*r*π*h/3,可计算其底面积和体积。(3)用scanf()语句接收输入数据。(4)用printf()语句输出计算结果,程序为顺序结构。
2.3.3 字符与ASCII码
1.实验目的
本实验旨在巩固学生对编程概念的理解。在这个实验中,学生将练习:
● 了解字符在计算机中以ASCII 码方式表示;
● 了解字符的类型、字长其数的表示范围;
● 熟练使用scanf()输入用户提供的数据;
● 熟练使用printf()输出变量。
2.问题描述
从键盘输入一个大写字母,要求转换成小写字母输出,并输出这个小写字母相邻的两个字母,以及它们的ASCII码值。
3.示例输入/输出
请输入一个大写字母:
E
小写字母为:d,e,f
ASCII码值为:100,101,102
4.具体要求(1)从键盘输入任意字符,且在输入前要求有提示信息。(2)输出两行:第1行是字符形式输出3个字符,3个字符以逗号隔开,第2行是输出字符对应的ASCII码。
5.问题解答提示(1)定义字符型变量ch。(2)大写字母与小写字母的ASCII码的值差为32,大写字母转换成小写字母应将其ASCII码+32。(3)将字符型变量ch按整型输出,便可得到字符的ASCII码。
6.强化练习
求3个字符的ASCII码的平均值,并输出。
2.3.4 运算符与表达式的应用
1.实验目的
本实验旨在巩固学生对编程概念的理解。在这个实验中,学生将练习:
● 掌握算术运算符的使用;
● 正确定义程序中的变量;
● 熟练使用scanf()输入用户提供的数据;
● 熟练使用printf()输出变量。
2.问题描述
从键盘输入一个3位整数,将输出该数的逆序数。例如,输入123,输出321。
3.示例输入/输出
请输入一个3位的正整数:
256
256: 652
4.程序实现(根据注释完善程序)
/*sy2_4.c*/
#include
int main()
{
int a,b,c,x,y;
printf("请输入一个3位的正整数:\n");
scanf("%d",&x);
__________/*求x的百位数*/
__________/*求x的十位数*/
__________/*求x的个位数*/
y=c*100+b*10+a;
printf("%d: %d\n",x,y);
return 0;
}
5.问题解答提示(1)将输入的3位整数,个位数转换为百位数,百位数转换为个位数,把转换的3个数字生成一个新的逆序数。(2)任意的3位整数以键盘输入且在输入前要求有提示信息。(3)输出结果时,要求形式为:原数:转换后的数。
6.强化练习
将上述程序增加功能,判断整数3位数值之和能否被5整除,能整除输出能被5整除。
2.3.5 顺序结构应用程序
1.实验目的
本实验旨在巩固学生对编程概念的理解。在这个实验中,学生将练习:
● 掌握算术运算符的使用;
● 正确定义程序中的变量;
● 熟练使用scanf()输入用户提供的数据;
● 熟练使用printf()输出变量。
2.问题描述
编写一个程序,用于医院收费处出纳算账。要求输入所在医院费用(西药费、检查费、材料费、床位费、观察费和护理费),打印出应付钱数,再输入病人所付款数,打印出应找的钱数(已知某病人,西药费268.2元,检查费600元,注射用材料费206元,床位费120,观察费360元,护理费220元)。
3.示例输入/输出
输入西药费,检查费,材料费,床位费,观察费,护理费:
268.2,600,206,120,360,220
应付款(元):1774.20病人付款(元):1800
计算结果:
病人付款 = 1800.00元
应收款 = 1774.20元应找回 = 25.80元
4.程序实现(根据注释完善程序)
/*sy2_5.c*/
#include
int main()
{
float x,j,c,hj,fk,zh,cw,g,f;
/*其中,x代表西药费;j代表检查费;c代表材料费;cw代表床位费;g代表观察费;
f代表护理费;hj代表应付款;fk代表病人付款;zh代表应找回的金额;*/
printf("输入西药费,检查费,材料费,床位费,观察费,护理费:\n");
__________/*编写接收语句,将西药费、检查费、材料费、*//*床位费、观察费、护理费存放在相应的变量中*/
__________/*计算各项费用的总额*/
printf("应付款(元):%.2f",hj);
printf("病人付款(元):");
scanf("%f",&fk);
__________/*得出应找回给病人的金额*/
printf("计算结果:\n");
printf("病人付款=%6.2f元\n应收款=%6.2f元应找回=%6.2f元\n",fk,hj,zh);
return 0;
}
5.问题解答提示(1)输入数据包括9个浮点数,因此可以用float来定义。(2)提示用户输入6项费用,并用scanf()读入到相应的变量中。(3)计算6项费用的总额,并存储在相应变量中。(4)用printf()语句输出应付款。(5)用scanf()语句接收病人的实际付款金额,并存储在相应变量中。(6)计算应付款和实际付款之间的差额,并存储在相应变量中。(7)用printf()语句将病人付款、应收款、应找回的各项金额显示。
6.强化练习(1)考虑增设显示用户基本信息功能(序号,性别)。(2)显示用户各项费用。
2.3.6 分析程序
1.分析下列程序的运行结果有何问题,请将分析结果写在实验报告上。
/*sy2_6.c*/
#include
int main()
{
int n=1000;
printf("n=%d\n",n);
n =n*1000;
printf("n=%d\n",n);
n =n*1000;
printf("n=%d\n",n);
n =n*1000;
printf("n=%d\n",n);
return 0;
}
2.写出下面程序的运行结果,掌握用“\t”与“\n”显示简单菜单。
/*sy2_7.c*/
#include
int main()
{
printf("\t************************************\n");
printf("\t\t欢迎使用图书管理系统\n");
printf("\t1、添加图书\t\t2、查询图书\n");
printf("\t3、显示书库\t\t4、修改图书\n");
printf("\t5、删除图书\t\t0、退出系统\n");
return 0;
}
3.下面的程序用五种不同的方法将键盘输入的整数1,2,3分别给整型变量x,y,z,应该如何输入,请测试,然后分析哪种输入方式更好。
/*sy2_8.c*/
#include
int main()
{
int x,y,z;
printf("The first method:\n");
scanf("x=%d,y=%d,z=%d",&x,&y,&z);
printf("x=%d,y=%d,z=%d\n",x,y,z);
printf("The second method:\n");
scanf("%d%d%d",&x,&y,&z);
printf("x=%d,y=%d,z=%d\n",x,y,z);
printf("The third method:\n");
scanf("%d %d %d",&x,&y,&z);
printf("x=%d,y=%d,z=%d\n",x,y,z);
printf("The fouth method:\n");
scanf("%d %d %d ",&x,&y,&z);
printf("x=%d,y=%d,z=%d\n",x,y,z);
printf("The fifth method:\n");
scanf("%d%d%d\n",&x,&y,&z);
printf("x=%d,y=%d,z=%d\n",x,y,z);
return 0;
}
2.4 程序案例
1.将一个小于256的十进制正整数转换成8位二进制形式并输出。
分析:
十进制整数转换为二进制整数,采用“除2取余”的方法。即将十进制数除以2得到一个商数和一个余数,再将商数除以 2,又得到一个商数和一个余数,继续这个过程直到商数等于零为止。每次得到的余数(是0或1)就是对应二进制的各位数字,第一次得到的余数为二进制数的最低位,最后一次得到的余数为二进制数的最高位。
在编程实现时,可以设置8个变量在转换过程中存放二进制中的各位,在输出二进制数时,注意变量输出的顺序。
程序实现如下:
/*sy2_9.c*/
#include
int main()
{
int x,s,d0,d1,d2,d3,d4,d5,d6,d7;
printf("请输入要转换的数(<256):\n");
scanf("%d",&x);
s=x;
d0=x%2;
x=x/2;
d1=x%2;
x=x/2;
d2=x%2;
x=x/2;
d3=x%2;
x=x/2;
d4=x%2;
x=x/2;
d5=x%2;
x=x/2;
d6=x%2;
x=x/2;
d7=x%2;
printf("%d : %d%d%d%d%d%d%d%d\n",s,d7,d6,d5,d4,d3,d2,d1,d0);
return 0;
}
程序运行效果如下:
请输入要转换的数(<256):
210
210 : 11010010
思考:
若将上述所得二进制数转换成八进制数,源程序需怎样修改?2
2.有一直径为80m的圆形地块,计划在这块地中建近3 000m 的圆形花坛,如图2-5所示,花坛周围是一圆形过道,求过道的宽度。图2-5 圆形花坛与过道示意图
分析:
方法一(1)建数学模型。设过道的宽度为x,大圆直径为D,花坛面积为S,圆周率为PI,由数学知识可得:
S = ((D/2−x)*(D/2−x))*PI
即得到一元二次方程:22
PIx −2PI(D/2)x+PI(D/2) −S = 0(2)通过求根公式解该方程。(3)找出算法。算法流程如图2-6所示。图2-6 算法流程
程序实现如下:
/*sy2_10(1).c*/
#include
#include
#define PI 3.14
#define S 2000
#define D 80
int main()
{
double a,b,c,x1,x2,d;
a=PI;
b= -2*PI*(D/2.0);
c=3.14*(D/2.0)*(D/2.0)-S;
x1=(-b+sqrt(b*b-4*a*c))/(2*a);
x2=(-b-sqrt(b*b-4*a*c))/(2*a);
printf("x1=%.2lf\nx2=%.2lf\n",x1,x2);
return 0;
}
方法二(1)建数学模型。设花坛半径为 r,大圆直径为 D,花坛面积为 S,圆周率为 PI,由数学知识可得:2
S = r *PI
即得
x = D/2−r(2)找出算法。算法流程如图2-7所示。图2-7 算法流程
程序实现如下:
/*sy2_10(2).c*/
#include
#include
#define PI 3.14
#define S 2000
#define D 80
int main()
{
double x,r;
r=sqrt(S/PI);
x=D/2−r;
printf("x%.2lf\n",x);
return 0;
}
第3章 程序的简单算法设计实验
3.1 目的和要求
(1)掌握结构化程序的算法描述方法。(2)了解C语言的基本语法要素,能熟练地将算法描述转化为C语言程序。(3)熟练掌握C语言的运算符,即运算符的优先级和结合性、运算规则、运算对象类型等。3.2 相关知识
1.程序设计的依据是算法。
2.C语言程序常用的算法描述方法有以下两种:(1)流程图:用有限的图符来表达算法思想,结构清晰;(2)伪代码:用类程序语言来描述算法思想,与程序代码接近,便于程序设计。
3.3 实验内容
3.3.1 数学函数的算法描述
实验练习 制定数学函数计算的算法。
1.实验目的
本实验旨在巩固学生对算法概念的理解。在这个实验中,进行两部分练习:(1)用if语句根据条件的真假进行判断;(2)掌握运算符的运算规则。
在强化练习中,练习对于同一问题的不同解法。
2.问题描述
有一函数:
请用流程图表示该函数的算法。输入x值,输出满足函数关系的y值。并用C语言编写程序进行检验。
流程图如图3-1所示。图3-1 流程图
3.示例输出(1)第1组输出:
请输入X的值:0.5↲
Y的值为0.5(2)第2组输出:
请输入X的值:8↲
Y的值为15(3)第3组输出:
请输入X的值:13↲
Y的值为38
4.程序模板
#include
main()
{
float x,y;
printf("请输入 X的值:");
scanf("%f",&x);
___①___/*判断变量X的值是否小于1*/
___②___/*判断X的值是否小于10*/
___③___/*其他*/
printf ("Y的值为%.2f\n",y);
}
5.问题解答提示(1)程序需要接收1个浮点数,因此用float来表示。(2)使用scanf语句接收用户输入的X的值,并保存在变量X中。(3)判断变量X的值是否小于1,如果是,根据函数公式1,将X的值赋给Y;如果不是,则进一步判断X的值是否小于10,是则根据函数公式2,计算Y的值;不是则根据函数公式3,计算Y的值。(4)用printf语句输出Y的值。
6.强化练习
请给出第二种算法来解决这个问题,画出流程图,并根据流程图编写程序。
3.3.2 鸡兔同笼的算法描述
实验练习 鸡兔同笼问题。将鸡和兔子关在同一个笼子里,假如知道鸡和兔的总头数h,鸡和兔的总脚数f,请设计算法,能计算出鸡和兔分别有多少只。
1.实验目的
本实验旨在巩固学生对算法概念的理解。在这个实验中,要求掌握以下两点:(1)用if语句根据条件的真假进行判断;(2)掌握运算符的运算规则。
在强化练习中,练习整数由大到小的排序法。
2.问题描述
用流程图描述求解鸡兔同笼问题的算法:已知鸡兔的总头数为 h(head),总脚数为 f(feet),求鸡兔各有多少只?
流程图如图3-2所示。图3-2 流程图
3.示例输出
输入:30,80↲
显示:鸡:20 兔:10
4.程序模板
#include
main()
{
int h,f,x,y;
printf("鸡兔总数,鸡兔脚总数:");
scanf("%d,%d",&h,&f);
if (x>0&&y>0)
{
___①___/*计算鸡的数量*/
___②___/*计算兔的数量*/
printf("鸡:%d 兔:%d\n",x,y);
}
else
printf("输入错误!\n");
}
5.问题解答提示(1)程序中,需要定义两个整型变量,分别代表鸡兔的总头数和总脚数,因此用int来定义它们。(2)判断输入数据的正确性,如果小于0,则表示输入有误。(3)如果h、f均大于0,则根据一只鸡一个头,两只脚;一只兔一个头,四只脚;列出关系式。(4)计算得出鸡和兔各有多少只,并输出。
6.强化训练
请给出第二种算法来解决这个问题,画出流程图,并根据流程图编写程序。
3.3.3 确定坐标的算法描述
实验练习 根据平面坐标,输出圆塔的高度。
1.实验目的
本实验旨在巩固学生对算法概念的理解。在这个实验中,要求掌握两点:(1)用if语句根据条件的真假进行判断;(2)掌握运算符的运算规则。
在强化练习中,学生将学习对于题目中指定的问题进行回答。
2.问题描述图3-3 4个圆塔坐标
有4个圆塔,圆心分别为(2,2)、(−2,2)、(2,−2)、(−2,−2),圆半径为1,如图3-3所示。这4个塔的高度均为10m,塔以外无建筑物。现输入任一点的坐标,若该点坐标在任一圆塔内,则输出圆塔的高度;若该点不在圆塔内,则输出0。
3.示例输出(1)第1组输出:
请输入一个点(x,y):0.5,0.7↲
该点高度为:0(2)第1组输出:
请输入一个点(x,y):2.1,2.3↲
该点高度为:10
4.程序模板
#include
main()
{
int h=10;
float x1=2,y1=2,x2=−2,y2=2,x3=−2,y3=−2,x4=2,y4=−2,x,y,d1,d2,d3,d4;
printf("请输入一个点(x,y)");
scanf("%f,%f",&x,&y);
___①___/*求该点到各中心的距离*/
if(d1>1&&d2>1&&d3>1&&d4>1)
h=0;
printf("___②___%d",h);/*判断该点是否在塔外*/
}
5.问题解答提示(1)根据题目,用户输入某点坐标(x,y)。(2)程序求出该点(x,y)到各个塔心的距离d1,d2,d3,d4,根据两点间距离公式。(3)进行判断是否在塔外,条件是d1,d2,d3,d4的值均要大于1(圆半径)。(4)如果是,则表明在塔外,根据题意,该点处高度为0;否则该点处高度为10。(5)输出最终结果。
6.强化练习(1)试说明为何要将h的初始值设为10?是否可以不设定h的初始值?请将原因列出。(2)请给出第二种算法来解决这个问题,画出流程图,并根据流程图编写程序。
第4章 分支结构实验
4.1 目的和要求
(1)掌握C语言逻辑量的表示方法(0代表“假”,1代表“真”)。(2)学会正确地使用关系表达式和逻辑表达式。(3)掌握各种形式的if语句语法和使用方法。注意if语句中if和else的匹配关系,及if语句的嵌套。(4)掌握switch语句语法和使用方法。注意switch语句的控制流程,在switch语句中break语句的用法及switch语句的嵌套。(5)能独立编写分支结构程序并调试通过。(6)用if语句、switch语句解决简单的应用问题并上机实现。4.2 相关知识
4.2.1 if语句
if语句根据给定的条件表达式值(为非0或为0)进行判断,决定执行两条分支中的哪一条。
if语句的一般形式:
if (表达式)
语句1
else
语句2
4.2.2 switch语句
switch语句的一般形式为:
switch(表达式)
{
case常量表达式1:语句序列1
case常量表达式2:语句序列2
...
case常量表达式n:语句序列n
default :语句序列n+1
}
4.2.3 编程中应注意的事项
if_else语句中,if后面的单个语句有分号,但复合语句(花括号)后没分号,当if_else语句有嵌套时,注意其搭配关系,else总是与它前面最接近的尚未配对的if对应。
switch 后一对括号中的“表达式”只要其值为整型即可,可以是整型表达式、字符型表达式或枚举型表达式,case后的表达式必须是常量表达式,不能包含变量;和if语句中的条件判断不同,switch语句只测试相等条件;一般在使用switch语句实现“多选一”功能时,每个case子句后都使用break语句。
由于switch语句的表达式不允许是实型的,当应用于实型值选择情况时,通常将实数表达式乘上一个适当的比例因子,将实数表达式的值映射到一个较小的范围上,然后再将它转换成整型。
4.2.4 典型案例
案例一 找最小数
1.问题描述
输入3个数,找出最小数并打印。
2.具体分析
设3个数为a、b、c,由键盘读入,用一个变量min来标识最小数,a、b、c与min都定义为int型变量。
算法如下:
① 输入a、b、c;
② 将a与b 中较小者赋给min;
③ 将min 与c中较小者赋给min;
④ 输出min。
算法流程如图4-1所示。图4-1 案例一算法流程
3.程序实现
/*sy4_1.c*/
#include
int main()
{
int a,b,c,min;
printf("input a,b,c:");
scanf("%d%d%d",&a,&b,&c);
if(a
min=a;
else
min=b;
if(c printf("The result is %d\n",min); return 0; } 4.思考 上述程序是找3个整型数中最小数,如果要找3个字符型数或3个实数中最小数,程序要修改吗?如果要修改,应该怎样修改?如果要找3 个数中最大的数程序应该怎么修改?如果要对3个数进行排序又应该怎么修改呢? 案例二 判定三角形 1.问题描述 根据用户输入的三角形的3条边长判定是何种三角形。 2.具体分析(1)考虑输入数据的有效性:构成三角形的条件为任意两边之和要大于第三边,否则无法构成三角形。(2)考虑三角形的类型:一般三角形、正三角形、等腰三角形、直角三角形。(3)在满足(1)的前提下,考虑各种三角形的检测方式: ① 正三角形,要求三边相等; ② 等腰三角形,要求三边中有两边相等; ③ 直角三角形:要求两边的平方和等于第三边平方。 算法流程如图4-2所示。图4-2 案例二算法流程图 3.程序实现 /*sy4_2.c*/ #include #include int main() { float a,b,c; printf("输入三角形的三条边a,b,c:"); scanf("%f,%f,%f",&a,&b,&c); if ((a>0)&&(b>0)&&(c>0)&&((a+b)>c)&&((b+c)>a)&&((a+c)>b))/*判断三边是否构成三角形*/ { if((a==b)&&(b==c)&&(a==c)) /*如果三条边均相等,则为等边三角形*/ printf("等边三角形\n"); else if ((a==b)||(b==c)||(a==c)) /*如果只有两条边相等,则只为等腰三角形*/ printf("等腰三角形\n"); else if((a*a==b*b+c*c)||(b*b==a*a+c*c)||(c*c==a*a+b*b)) /*如果两边的平方和等于第三边平方,则为直角三角形*/ printf("直角三角形\n"); else printf("一般三角形\n"); } else printf("不能组成三角形\n"); return 0; } 4.思考 上述程序应该怎样完成?怎样判断两实数相等,可直接用运算符“==”吗?为什么? 案例三 模拟简单计算器 1.问题描述 模拟简单计算器,进行两个数的加、减、乘、除四则运算。 2.分析(1)程序接收用户输入的算术表达式,表达式构成为两个操作数、一个操作符,因此用float型声明两个变量,用于保存操作数的值,用char型声明一个变量,用于保存操作符(+、−、*、/)。(2)采用switch/case结构,根据操作符的种类不同,进行不同的运算。(3)考虑除法的特殊情况,即当除数为零时,出现异常。(4)考虑用户输入非法操作符的情况。 算法流程如图4-3所示。图4-3 案例三的算法流程 3.程序实现 /*sy4_3.c*/ #include int main() { float x,y; char op; printf("输入表达式:"); scanf("%f%c%f",&x,&op,&y); switch(op) { case '+': /*匹配加法*/ printf("%.2f%c%.2f=%.2f\n",x,op,y,x+y);break; case '-': /*匹配减法*/ printf("%.2f%c%.2f=%.2f\n",x,op,y,x-y);break; case '*': /*匹配乘法*/ printf("%.2f%c%.2f=%.2f\n",x,op,y,x*y);break; case '/': /*匹配除法*/ if (y!=0) {printf("%.2f%c%.2f=%.2f\n",x,op,y,x/y);break;} else {printf("除数为零!\n");break;} default : printf("输入表达式有错!\n"); } return 0; } 4.思考 用if_else嵌套结构实现上述程序。 4.3 实验内容
4.3.1 if语句的应用
1.实验目的
本实验旨在巩固学生对编程概念的理解。在这个实验中,学生将练习:
● 掌握C语言逻辑运算和关系运算的规则;
● 学会正确地使用关系表达式和逻辑表达式;
● 掌握if_else语句的使用方法。
2.问题描述
读入3个分别表示箱子长、宽、高的整数值,判断并输出该箱子是正方体还是长方体。
3.示例输入/输出
请输入箱子的长、宽、高:
16 10 20
该箱子是长方体。
4.程序实现(根椐注释完善程序)
/*sy4_4.c*/
#include
int main()
{
int l,w,h;
printf("请输入箱子的长、宽、高:\n");
scanf("%d%d%d",&l,&w,&h);
______/*如果长、宽、高相等,则为正方体*/
printf("该箱子是正方体。\n");
else
printf("该箱子是长方体。\n");
return 0;
}
5.问题解答提示(1)若箱子的长、宽、高相等,则箱子为正方体。(2)从键盘输入箱子的长、宽、高,且在输入前有提示信息。(3)输出结果时有文字说明。
4.3.2 switch/case语句的应用
1.实验目的
本实验旨在巩固学生对编程概念的理解。在这个实验中,学生将练习:
● 掌握算术运算符和运算规则;
● 掌握switch/case语句的使用方法。
2.问题描述
编一程序实现如下功能:商店有打印纸(18元/本)、墨盒(132元/个)、光盘(4.5元/片)出售,商店进行优惠酬宾活动。具体做法如下:顾客购买商品的总额达到了 100 元,优惠 5%;达到了200元以上,优惠6%;达到了300元以上,优惠7%;达到了400元以上,优惠8%;达到了500元以上,优惠10%。根据不同的购买量,打印应付货款。
3.示例输入/输出
请输入打印纸、墨盒、光盘的数量:10,5,20
应付款数= 837.00
4.具体要求(1)从键盘输入各种商品的购买数量,且在输入前给出提示信息;(2)输出各种商品的购买数量;(3)输出结果时要有文字说明(中、英文均可),输出应付货款;(4)分别采用switch/case结构和if/else结构实现。
5.问题解答提示
购买商品的总额=打印纸数*18(元)+墨盒数*132(元)+光盘数*4.5(元),当sum≥100元,给予相应的优惠,将sum/100,使用switch语句判定优惠率。
4.3.3 switch/case语句嵌套if语句的应用
1.实验目的
本实验旨在巩固学生对编程概念的理解。在这个实验中,学生将练习:
试读结束[说明:试读内容隐藏了图片]