1、二级 C 语言上机编程题技巧一、 方法总结1、 二级 C 语言上机编程题在二级上机考试中属于较难题型,因此很多同学都害怕通过不了。综合往年的考试,结合考试大纲,每年考试的编程题都有一定的规律和方法,只要同学们认真熟练使用做题的方法,通过考试是没有问题的。2、 编程题做题方法一:使用 C 语言特有的函数做题(1) 编程思想:使用 C 语言函数库中的做题,做题时必须注意包含对应的头文件(2) 考题举例:题库中的第 37 题,要求将数字字符串转化为对应整数,例如“-1234”转化后为-1234。做题时需要添加头文件#include “stdlib.h“,然后在 fun 函数中写入程序 return
2、atol(p);其中 atol(p)表示将 p 从字符串转化为长整型数。最后编译,运行后输入测试数据后即可得到满分。#include #include #include “stdlib.h“long fun ( char *p)return atol(p);(3) 方法总结:该类方法可以适用的题目较少,同学们了解即可。3、 编程题做题方法二:使用规律做题(1) 编程思想:部分题目的答案是固定的,不会因为输入的数据改变而改变,因此这部分题目我们直接将答案记住即可,减少编程的麻烦。(2) 考题举例:题库中的 70 题,求 cos(x)-x=0 的一个实根。做题时候在 fun 函数中输入 retur
3、n 0.739085;后点击编译和运行即可,无需输入测试数据。 (补充:如果需要输入测试数据,程序在输出的黑屏上面会提示,不过一般是英文提示,所以同学们要格外小心)#include #include double fun()return 0.739085;(3) 考题总结:该题为每年必考的题目,因此同学们要将答案熟记,以便大家能顺利通过考试。4、 编程题做题方法三:使用 C 语言编程(1) 编程思想:该种方法是考试中使用频率最多的方法,就是使用学习的 C 语言进行编程,对 C 语言的知识进行综合运用,因此难度较大,容易出错。(2) 考题举例:题库 14 题,求小于形参 n 同时能被 3 和 7
4、 整除的所有自然数之和的平方根,并作为函数的返回。做题时时一定要按照三个步骤来:一要定义,二要满足题意,三要看有无返回。#include #include double fun( int n)int i;int sum=0;for(i=0;ivoid fun( char *a )int test;test=5;要求输入一个字符串,可以任意的从键盘中输入字符串,例如输入:12345 回车,得到:程序中出项 Press any key to continue 则说明程序已经运行,将在考试文件夹下面生成 out.dat 文件,否则在考生文件夹下面将不会生成 out.dat 文件,就没有办法继续做题。
5、4)打开 in.dat关闭第三步程序运行的界面,打开 int.dat 文件。在 VC+6.0 界面中“单击 File”,在弹出的菜单中选取“Open”,打开考生文件夹 D:k0124010001 下面的in.dat 文件。截图如下:查找范围里面选中 D 盘找到 k01 下面的 24010001,发现没有 in.dat 文件,单击文件类型,选择“所有文件(*.*) ”即可选中 in.dat,然后单击打开,出现下图所示界面为正确打开分析 in.dat 中的数据发现每行数据都是由*号和字母组成的,总共有 10 行。5)打开 out.dat和打开 in.dat 同样的方法打开 out.dat将 out
6、.dat 里面的数据清空,即将 out 中所有东西都删除,让 out 没有任何的代码将 in.dat 中第一行数据*A*BC*DEF*G*复制到 out.dat 中将 out.dat 第一行数据的中间*和尾部*全部删除,然后敲入回车以此类推将 in.dat 中剩余 9 行按照上面的步骤复制到 out.dat 中进行修改,两行中间没有空行6)保存交卷单击左上方的保存,保存结果保存后关闭 vc+6.0 方可交卷二、 考题总结第一种类型:字符串操作一,字符串删除*号1、 考题库中考题对应编号:8、9、10、19、45、54、57、61、65、71、77、90、92、93、100、56、60、72、7
7、5、85、862、 举例:以第 10 题为例讲解1) 分析题目:使字符串的前导*号不得多于 n 个,若多于 n个,则删除多余的*好,若少于或等于 n 个,则什么也不做,字符串中间和尾部*号不得删除。2) 分析 NONO 函数:NONO()/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */FILE *in, *out ;int i, n ; char s81 ;in = fopen(“D:k0124010001in.dat“,“r“) ;out = fopen(“D:k0124010001out.dat“,“w“) ;for(i = 0 ; i void fun( char
8、 *a, int n )int test;test=5;4) 编译运行,输入一个字符串后还需输入一个 n5) 打开 in.dat分析 in.dat 中的数据刚好是一行字符串一行整数,总共有20 行,通过fscanf(in, “%s“, s) ;fscanf(in, “%d“, 两个函数每次输入两个数据分别给 s 和 n,例如第一行中输入的时候 s 字符串就该为:*A*BC*DEF*G*,n 的值就为:4,s 字符串中的前导*号为个,多于了 n 的值,因此需要将多于的 3 个*号删除。6) 打开 out.dat打开 out.dat 并清空数据,因为 fprintf(out, “%sn“, s)
9、;只将修改后的字符串输出,将第一个字符串删除 3 个*号填写到 out.dat 中,不输出 in.dat 中的 4以此类推将数据进行输入:7) 保存交卷第二种类型:字符串操作二,移动字符串1、 考题库中对应试题编号:1、42、83、872、 试题举例:以第 1 题为例(1) 分析题目:把 1 到第 m 个字符平移到字符串的最后(2) 分析 NONO 函数:注意 fscanf(rf, “%d %s“, 表示从 rf 指向的文件 in.dat 中读取两个数据,一个整型数据给变量 m,另外一个给数组 a。根据题目我们不难判断,程序就完成:将数组 a 中的字符串从第 1 个到第 m 个移动到最后。(3
10、) 在 fun 函数中输入测试数据, ,该题函数返回 void 则无需 return 语句,在执行窗口中需要输入 m 的值。(4) 编译,执行,输入测试数据(5) 打开 in.dat分析:in.dat 结合 NONO 函数中的 fscanf 函数可以得到,函数将整数 3 给了 m,将字符串:ABCDEFGHIJK 给了数组 a(6) 打开 out.dat将 in.dat 中第一行中的字符的前 3 个字母移动到最后依次类推将得到正确的结果。(7) 保存交卷第三种类型:数学问题一,将两个数字按照要求合并成一个数字1、 对应题库中的题目编号:13、38、44、46、63、69、78、88、94、95
11、、962、 试题举例:以 13 题为例(1) 分析题目:将 a 中十位和个位数依次放在变量 c 的百位和个位上,b 中的十位和个位依次放在变量 c 的十位和千位上(2) 分析 NONO 函数:(3) 在 fun 函数中输入测试数据,编译,执行,该题函数返回void 则无需 return 语句,在执行窗口中需要输入 12 空格45 回车后,出现下图结果。(4) 打开 in.dat,fscanf(rf, “%d,%d“, 第一行中将 45 给了变量 a,将 12 给了变量 b(5) 打开 out.dat。fprintf(wf, “a=%d,b=%d,c=%ldn“, a, b, c) ;输出格式一
12、定要注意,如下图所示,否则不得分。(6) 保存交卷第四种类型:数学问题二,二维数组相关类型题目1、 题库中对应题目编号:15、17、24、26、31、32、40、41、43、50、812、 考题举例:以 15 题为例(1) 题目分析:将 M 行 N 列的二维数组中的数据,按行的顺序依次放到二维数组中(2) NONO 函数:(3) 在 fun 函数中输入测试数据,编译,执行,该题函数返回 void 则无需 return 语句,出现下图结果。(4) 打开 in.dat。fscanf(rf, “%d %d“, 从in.dat 中第一行输入两个整型数,第一个 3 给变量 mm 表示数组中的行,第二个
13、4 给变量 nn 表示数组中的列。for(i = 0 ; i mm ; i+)for(j = 0 ; j nn ; j+) fscanf(rf, “%d“, 将 mm*nn 个整数放到二维数组 w 中,即读取二维数组的数据。例如第一行 mm 为 3,nn 为 4,则应该有一个 3 行 4列的二维数组。(5) 打开 out.dat。根据 for(i = 0 ; i n ; i+) fprintf(wf, “%3d“, ai) ; fprintf(wf, “n“) ;格式进行数据的输出。for(i = 0 ; i n ; i+) fprintf(wf, “%3d“, ai) ;表示将 n 个二维数
14、组元素以%3d 的形式输出到 out.dat 中,以第一个二维数组为例即将 以行的形式进行输出,结果如下:第一个 33 前面要加一个空格,因为%3d 要求输出的宽度为 3,但是 33 这个数字只占了 2 个的宽度,因此必须在33 前面加一个空格,依次类推,第二 33 至 55 都要在前面加一个空格。输完数据后要记得执行 fprintf(wf, “n“) ;输出一个换行符。将题目中其它的二维数组修改后的结果如下:(7) 保存交卷第五种类型:找出数组中的最大值或者最大值所在的下标1.题库中对应题目编号:18、29、36、66、83、552.考题举例:以 18 题为例(1) 题目要求:求出数组中最大
15、数的下标并存放在 k 所指的存储单元中(2) NONO 函数:(3) 在 fun 函数中输入测试数据,编译,执行,该题函数返回 int 则需 return 语句,另外题目中严格要求 k 返回的是最大值下标,因此必须给*k 初始值 0,出现下图结果。(4) 打开 in.dat 文件。NONNO 函数中:说明的信息是将 10 个据通过 fscanf 函数读入到数组a 中,从 10 个数据中找到最大值及其下标分析:in.dat 可以发现,里面的数据都是 10 列,总共有 10 行,因此只要将每一行的最大值及其下标找出来存放在 out.dat 中即可。(5) 打开 out.dat 并清空文件里面的数据
16、该语句将最大值下标 k 及其最大值以%d,%d 的形式输出,结合 in.dat 中的第一行数据不难发现最大值是 121,它所在的下标是 1(补充:下标是从 0 开始的) ,因此将 1,121 输入到 out.dat 中的第一行,记得在 121 后面加上回车进行换行。(6) 保存交卷第六种类型:字符串操作三。包括统计单词、字符的个数,比较字符串,转换字符串1、题库中对应题目编号:26,30,37,40,53,56,59,60,74(比较特殊,多练习)2、考题举例:以 53 题为例(1) 题目要求:求出 ss 所指字符串中指定字符的个数,例如字符串:123412132,输入的字符为:1,则输出为:
17、3。该类型的题目一定要知道哪个字符需要计算个数。(2) NONO 函数:(3) 在 fun 函数中输入测试数据,编译,执行,该题函数返回int 则需 return 语句,出现下图结果。(4) 打开 in.dat 文件。NONO 函数中的两个 fscanf 分别从 in.dat 中读取两行数据给数组 a 和数组 b,以第一行和第二行数据为例,数组 a 存储字符串为:hsfgjkdgfdgfdgkfdjgkldf,数组 b 存储字符为:h,做题时需要从字符串中找出字符 h 的个数,为 1(5) 打开 out.dat 文件,并清空里面的数据首先程序先将*b 的值赋值给变量 ch,通过 in.dat
18、中分析可以得到,*b 存放的就是指定的字符,以第一行为例就应该为 h。数据在写入 out.dat 时,必须以%c=%dn 的形式输出,其中%c 对应 ch,即为 h,%d 对应的是函数的返回值,即为 h 在字符串中的个数为 1。输出的结果为:其它行依次类推(6) 保存交卷第七种类型: 字符串操作四,删除指定字符1、 题库中对应题目编号:4、12、25、28、35、39、52、55、72、75、85、862、 考题举例:以第 4 题为例(1) 题目要求:将 ss 所指字符串中所有下标为奇数位置上的字母转为大写,若该位置不是字母,则不转换。该类型的题目不难但是必修认真,有耐心!(2) NONO 函
19、数:该题中的 NONO 函数比较难理解,同学们只需将红色方框里面的语句读懂就行,具体的将在第四步中介绍。(3) 在 fun 函数中输入测试数据,编译,执行,该题函数返回void 则无需 return 语句,出现下图结果。(4) 打开 in.dat 文件fgets( tt, 50, rf )表示从 in.dat 中读入一个字符串给 tt数组,如果不了解也不要紧,对做题没有太大的影响。做题时候首先要知道字符的字符的小标是否是奇数,我们可以通过标注数字删除不符合的字符。以第一行为例,将奇数位置的字符改动就行,记住空格占一个字符,在做其它题目时候一定要小心d s f f d s f d s l j f
20、 d s l f d s l j k f s d0 1 2 3 4 5 6 7 8 910111213141516171819202122232425262728(5) 打开 out.dat 文件,清空数据。fprintf( wf, “%sn“, tt );将 tt 数组中的字符串修改后进行输出,即将下标是奇数位置的小写字符改为大写字母。(6) 保存交卷第八种类型: 结构体1、 题库中对应题目编号:2、3、16、23、33、51、58、64、68、82、97、98、992、 考题举例:以第二题为例(备注第二题是该类型中最典型的例题)(1) 题目要求:N 名学生的数据已经通过主函数存放在 s 数
21、组中,函数功能是:把指定分数范围内的学生数据放在 b 所指的数组中,分数范围内的学生人数由函数返回。 (注释:该题不仅仅考查题目中要求的内容,在程序段中有特殊的语句需要执行,所以需要特别注意!)(2) main 函数:该题没有 NONO 函数,因此以主函数为准。说明 main 函数:1) 在 main 函数之前定义了一个结构体STREC,里面有两个成员,分别表示学号和成绩,该题中一定要认清操作的是学号还是成绩,特别是输出的时候,该类型的题目都拥有相同的考点。2) 在主函数中 STREC sN;定义了一个结构体类型的数组,长度为 N,并且为其赋值 16 个数据。STREC hN,tt;FILE
22、*out ;定义了另一个结构体数组 h,和结构体变量tt,文件指针。在下图中已经用红色框住的部分需要明白。第一红框到第二个红框之间的部分可以不去理解,对做题没有影响。3) n=fun( s,h,80,98 );最为关键,结合题目可以知道该句话的含义是:从结构体数组 s 中找到 80 到 98 之间的所有数据放到结构体数组中。帅选的数据为:总共 8 个,题目中说将分数范围内的人数返回,这样可以得知 n 的值为 84) fprintf(out,“%dn“,n);将 n 以%d 的格式输出到out.dat 中5) 为冒泡法排序,旨在将 h 中的数据按照分数进行从小到大排序,如果不了解排序过程请参考“
23、注意事项” ,结构体数组 h 中的数据进行从小到大的操作后变为:6) 表示将排序后 h 中的数据以4d%n 的形式输出到 out.dat 中,并且输出的是 hi.s 成绩数据项。(3) 在 fun 函数中输入测试数据,编译,执行,该题函数返回int 则需 return 语句,出现下图结果。执行结果中必须出现“Press any key to continue”字样才会生成 out.dat文件,都则将不生成该文件。(4) 打开 out.dat(因为没有 in.dat,所以无须打开它) ,清空里面的数据。1) 首先输出 n 的值,以%dn 的形式进行输出:2) 其次将 h 排序后的第一个数据输出,
24、以%4dn 的形式输出,第一个数据位 85,85 的宽度为 2,但是输出中要求为4,所以必须在 85 前面加上 2 个空格。3) 将剩余数据全部输出:(5) 保存交卷第九种类型:链表类型1、 题库中对应题目编号:22、80、842、 考题举例:以 22 为例进行讲解(1) 题目要求:N 名学生的成绩已经在主函数中放在一个带头结点的链表中,h 指向链表的头结点,函数功能是:找出学生的最高分,由函数值返回。 (注释:返回值是最高分,不是数据整体)(2) NONO 函数:主要观察红框部分,具体解释将在下面介绍。(3) 在 fun 函数中输入测试数据,编译,执行,该题函数返回double 则需 ret
25、urn 语句,出现下图结果。执行结果中必须出现“Press any key to continue”字样才会生成out.dat 文件,都则将不生成该文件。(4) 打开 in.dat 文件。for(j=0 ; j N; j+) fscanf(in, “%lf,“, 表示从 in.dat 中输入 N 个实型数给数组 s 中,总共有十行。从每行中找到最大值,然后在 out.dat 中进行输出。(5) 打开 out.dat 文件。 函数将返回的最大值放在变量 max 中,然后将 max 以%6.1fn 的格式进行输出,注意%6.1f 表示数据的总宽度为 6,小数点占 1 位,则应该对数据小数点后的第二位进行四舍五入操作。以第一