(0039)《C语言》A卷
发布时间:2023-07-18 09:07:59浏览次数:25西南大学网络与继续教育学院课程考试答题卷学号: 1523121146001 姓名: 陈正敏 2016 年 6 月课程名称【编号】: C 语言程序设计 【0039】 A 卷(横线以下为答题区)答题不需复制题目,写明题目编号,按题目顺序答题1. 简要回答问题(1)结构化程序设计的核心思想是什么?模块化程序设计中应该遵循的原则是什么?C 语言是如何体现结构思想的?(12 分)答:结构化程序设计方法是一种自顶向下、逐步求精、模块化的程序设计方法。按照结构化程序设计方法的思想,就是将给定的一个功能较多的复杂问题合理地划分为若干个较简单的子问题,还可以将这些子问题再分解为若干功能更简单的子任务(可将每个子任务看作一个模块),以便于“分而治之”在模块划分时,应该尽可能地保证数据的独立性和模块功能的唯一性。也就是说,各模块间的耦合性要尽量弱,即一个模块最好像是一个黑盒子,模块间的数据交换要尽量少;模块的内聚性要尽量强,即每个模块只完成单一的功能。结构化程序设计强调程序设计风格和程序结构的规范化,提倡结构清晰。良好的程序设计风格可以使程序结构清晰合理,使程序代码便于维护。著名的“清晰第一,效率第二”的论点已成为当今主导的程序设计风格。采用结构化程序设计方法的好处是:可以使每个模块功能明确,模块间的关系简单、清晰(即可读性强),每个模块内部的修改尽可能不影响其他模块(即独立性好),同时每个模块的正确性容易验证(即可维护性好)。(2)若有一个复杂问题的求解,若采用模块化程序设计方法,请你简单阐述用 C 语言编写一个模块化程序的基本过程。(6 分)答:根据模块化程序设计,一个较大的程序一般应分为若干个程序模块,每个模块用于实现一个特定的功能。在C程序中,模块用函数来实现。函数是构成C程序的基本单位,C语言不仅提供了极为丰富的库函数,如 scanf(),printf(),sin(),cos()等,另外C语言还允许用户自己定义函数。用户可以把一些完成特定功能的模块编写成一个相对独立的函数,然后通过调用这些函数使程序完成特定的功能 ,这样就可以较好地实现操作过程的封装性。对用户隐藏各个操作的细节,从而降低程序设计的复杂度 ,提高程序的可维护性。(3)调试一个 C 语言程序的经历哪些步骤?调试程序过程有哪两类错误?如何排除这些错误?(9分)答:1.先进行人工检查,即静态检查。在写好一个程序以后,不要匆匆忙忙上机,而应对纸面上的程序进行人工检查。这一步是十分重要的,它能发现程序设计人员由于疏忽而造成的多数错误。而这一步骤往往容易被人忽视。有人总希望把一切推给计算机系统去做,但这样就会多占用机器时间,作为一个程序人员应当养成严谨的科学作风,每一步都要严格把关,不把问题留给后面的程序。 为了更有效地进行人工检查,所编的程序应注意力求做到以下几点:应当采用结构化程序方法编程,以增加可读性;2 尽可能多加注释,以帮助理解每段程序的作用;3 在编写复杂的程序时不要将全部语句都写在main 函数中,而要多利用函数,用一个函数来实现一个单独的功能。这样既易于阅读也便于调试,各函数之间。错误类型和排除错误的方法(1)语法错误:这是指程序中含有不符合语法规定的语句,例如关键字或符号书写错误(将 printf 写成 print、将数组元素引用写成 a(2)等)、使用了未定义的变量、括号不配对等。含有语法错误的程序是不能通过编译的,因此程序将不能运行。(2)逻辑错误:这是指程序中没有语法错误,可以通过编译、连接生成可执行程序,但程序运行的结果与预期不相符的错误。例如整型变量的取值超出了有效的取值范围、在 scanf 函数遗漏了取地址运算符&、数组元素引用中下标越界、在应当使用复合语句时没有使用复合语句等。由于含有逻辑错误的程序仍然可以运行,因此这是一种较难发现、较难调试的程序错误,在程序设计、调试中应予特别注意。(4)在算法实现中,算法的正确性如何保证?(3 分)答:要编制一个程序,必须首先构建某问题的算法。所谓算法(Algorithm)就是对解决问题所采用的方法和步骤的描述。算法应该具有以下特点:(1)确定性:一个算法给出的每个计算步骤都必须是准确的、无二义性。(2)有穷性:一个算法必须在执行有穷多个计算步骤后终止。(3)有效性:算法中的每一个步骤必须能够有效地执行,并能够得到确定的结果。(4)输入:一个算法可以有 0 个或 1 个以上的输入。(5)输出:一个算法有 1 个或多个的输出,一个算法得到的结果就是算法的输出。在中输出的是max。任何一个问题能否让计算机处理,关键在于能否设计出合理的算法,有了合适的算法,再使用合适的计算机语言来编写程序,C 就是一种语言工具。因此要用 C 编写出高质量的程序,一方面要构建合理的算法,另一方面要掌握 C 的语法规则,它是实现算法的基础。算法的描述方法很多,如自然语言、流程图、N-S 图等。为直观、准确的表示一个问题的处理方法和步骤,通常采用流程图或 N-S 图。1966 年,Bohra 和 Jacopini 提出了程序的三种基本结构:顺序结构、选择(或分支)结构、循环结构,它们构成了实现一个算法的基本单元。(1)顺序结构:顺序结构是一种最基本、最简单的程序结构。(2)选择(或分支)结构:根据条件是否成立而去执行不同的程序模块。- 1 -
(3)循环结构:循环结构是指重复执行某些操作,重复执行的部分称为循环体。 2.编程题1. 从键盘上任意输入 10 个正整数,并将这些整数的各位数字求和。答:#include “stdio.h”int add(int n) {int r,s=0; do{r=n%10; s+=r; n=n/10; }while(n>0); return(s); }void main(){int m; scanf(“%d”,&m); printf(“%d”, add(m)); }(2)编写程序打印下列图案 答:#include main(){int I,j,k;for (I=1;I<=5;I++) {for (j=1;j<=20-I;j++) printf(" ");for (k=1;k<=2*I-1;k++) printf("*");printf("\n"); }}(5)从键盘上任意输入 20 个 3 位或 4 位整数存放在 a 数组中,将其中的每个整数的低 2 位分离出来存放在数组 b 中,并对 b 数组的值按降序排列。要求:(a)程序中分别输出 20 个整数以及 b 数组排序前和排序的值。(b)要求用模块化方法实现。(c)程序必须有输入输出提示。 int i_num = 0;//位数if(inputX >99 && inputX <1000000){ int temp_num = 0;//拆开数字 int temp_j = 0;//数组下标 int temp_input = inputX;//中间结果 while(1) { temp_num = temp_input % 10; a[temp_j ] = temp_num; //从个位开始存放 temp_j ++ ; temp_input = temp_input /10;//除开已经拆掉的位 if ( temp_input < 10) { a[temp_j ] = temp_input; i_num = temp_j + 1; break; } };} scanf("%d",inputX) ;for(int i = i_num;i > 0;i--) { printf("%d",a[i-1]);//输出 a 数组 }- 2 -
printf("%d",i_num);//位数3.依据下列提供的程序回答问题#include "stdio.h"int fun(int num){int k=1; do {k*=num%10; num/=10;}while(num); return k;}void main(){int x=651,y=123; printf("%d,%d",fun(x),fun(y));}(1)上述提供程序中,函数 fu n 的功能是什么? 答:函数 fun 功能为计算一无符号的整数各位数字的乘积。(2)请依据提供的函数 fu n 代码画出其中的传统流程图或 N-S 图。 答:(3)在 VC6.0 环境下,运行上述程序时,其输出结果是什么? 答: 30,6- 3 -