考查点:二进制文件读操作,结构体,字符串的简单比较。 (5)编写一程序实现以下功能
求任意的一个m×n矩阵的鞍点——鞍点是指该位置上的元素在该行上为最大、在该列上为最小,可能没有鞍点,但最多只有一个鞍点。m、n(2<=m<=20、2<=n<=20)及矩阵元素从键盘输入(只考虑int型)。
考查点:多个数据的输入,基本输出,二维数组的使用,多重循环。 (6)编写一程序实现以下功能
①从键盘上读入三个字符串,规定每个字符串的长度最长为20字节(编程时不考虑用户未按要求输入)。这三个字符串中,肯定只有两个字符串为数字字符(0-9)和字母(a-f或A-F)组成且长度不超过6(前一个称之为s16_1、后一个称之为s16_2),但其是第几个则在输入时临时确定。
②将s16_1、s16_2作为两个16进制数相加,将相加的结果分别转换为小写16进制、大写16进制、二进制字符串在屏幕上显示(提示,可从itoa,ltoa中选一合适函数使用)。
程序运行的效果示例:
Please input 3 string: aasf 0123a 323B2 0123a+323B2=335ec, 335EC, 110011010111101100
考查点:函数设计,sscanf,16进制数格式,字符与数值间的转换。 (7)编写一程序实现以下功能
程序main.c包含了需要考生完成的程序ks_lb.c,考生不可修改main.c。main.c的功能是从键盘读入一个一个的学生信息(成绩输入-1或成绩输入失败时表示输入结束)并将其加入到以stuHead为头的链表中,再调用考生编写的函数ksFunc以实现指定的功能。
实际考试时,考生需要完成ks_lb.c的一部分函数,不需要考生完成的函数将由考试系统负责提供,保证考生能顺利完成程序。
/* main.c */
#include
/* 将oneStu中的学生信息加到以Head为头的链表尾部,返回最新Head */ struct stuNode *addStu(struct stuNode *Head, struct STU oneStu);
void main() {
struct stuNode *stuHead = NULL, *tmpNode; struct STU tmpStu; int inpNum; char xh[11];
16
printf(\ while (1) {
inpNum = scanf(\
tmpStu.xh, tmpStu.xm, &tmpStu.xb, &tmpStu.cj); if (inpNum < 4 || tmpStu.cj == -1) {
break; }
stuHead = addStu(stuHead, tmpStu); }
printf(\ scanf(“%s”, xh);
tmpNode = ksFunc(stuHead, xh); if (tmpNode != NULL) {
printf(\
tmpNode->student.xh, tmpNode->student.cj); } }
struct stuNode *addStu(struct stuNode *Head, struct STU oneStu) {
struct stuNode *tmpNode, *curNode;
tmpNode = (struct stuNode *)malloc(sizeof(struct stuNode)); tmpNode->student = oneStu; tmpNode->nextStuNode = NULL;
curNode = Head;
if (curNode == NULL) {
Head = tmpNode; } else {
for (; curNode->nextStuNode != NULL; curNode = curNode->nextStuNode) ; curNode->nextStuNode = tmpNode; }
return Head; }
/* ks_lb.c 由考生完成的程序代码文件 */ struct STU {
char xh[11], xm[9], xb; int cj; };
struct stuNode {
struct STU student;
struct stuNode *nextStuNode; };
/* 由考生完成的函数,给定链表的头Head和学号xh,实现以下功能:
17
(1)计算并显示:除xh外其余学生的平均成绩(保留1位小数)或除xh外其余学生的最高、最低成绩。
(2)返回学生xh所在节点的节点地址,若链表中不存在学生xh,则返回NULL */ struct stuNode *ksFunc(struct stuNode *Head, char *xh);
struct stuNode *ksFunc(struct stuNode *Head, char *xh) {
/* 由考生完成本函数,注意,链表可能为空、只有1个或2个、3个节点 */ }
考查点:单向静(动)态链表的遍历,函数的应用,结构的使用。 1.2.4 第4(类)题
(1)编写一程序实现以下功能
①从键盘上读入一组整数(只考虑int型),数与数之间只使用空格(考试时可能是其它符号)或回车作分隔。数可正可负,最多10000个,但若读入的数为-1(考试时可能是其它数)时,则表示输入结束且-1不算在该组数内。
②对这一组数按从小到大的顺序进行排序。
③将排序后的这一组数输出到屏幕上,输出格式为每行10个数,数与数之间使用逗号(,)分隔,两个逗号之间的宽度(不算逗号)为6且使用左对齐格式(或其它格式)。注意,行尾没有逗号。输出格式举例:
-919 ,-709 ,-218 ,-206 ,-123 ,15 ,21 ,32 ,32 ,42 63 ,64 ,69 ,79 ,85 ,103 ,136 ,139 ,143 ,174 184 ,217 ,227 ,233 ,246 ,269 ,271 ,273 ,274 ,285 303 ,337 ,350 ,403 ,407 ,408 ,436 ,438 ,452 ,467 470 ,475 ,478 ,480 ,481 ,485 ,486
考查点:从键盘读取数据及其控制,多重循环与排序,输出及格式控制。 (2)编写一程序实现以下功能 从键盘读入一行字符:
①统计其中的单词(以空格分隔)个数并输出,约定单词数不超过20个,每个单词最长30字节。
②将其中的单词按从小到大的顺序(使用strcmp函数比较)在屏幕上输出,每行输出一个单词。
考查点:字符串中单词的拆分,二维数组,常用字符串函数。
以下的例子供考生参考,它的功能是将字符串inBuf中以空格作为分隔的单词一个一个
18
找出来,在屏幕上显示——若还需要保存到其它字符串中,可使用strcpy进行复制。其算法与教材上的算法不同,但这种算法的思路清晰、用途很广,且灵活、恰当使用了系统提供的标准库函数,是相应函数应用的一个较好范例。此算法使用了库函数sscanf,比scanf多了一个s,用法与scanf基本相同,唯一区别是scanf是键盘读入,而sscanf是从一缓冲区(字符串数组)中读入——顺便告诉考生库函数sprintf,去看看在线帮助或上网搜索,若能灵活应用,则可能对以后的工作大有帮助,例如,将字符串A、数B、字符串C、数D连接成一个字符串。
另外,考生应考虑,若单词未使用空格作分隔,而是同时用“ ,;.?/\\”作分隔时该怎么办?可否利用下面的算法?提示:可自编一个xscanf来替代sscanf。
#include
#include
void main() {
int numOfInput;
char inBuf[] = \ char tmpBuf[200], *p;
p = inBuf; while (*p) {
numOfInput = sscanf(p, \从缓冲区p中读一单词 */ if (numOfInput == EOF) /* 若未读到单词(缓冲区中已无单词) */ {
break; }
printf(\
p = strstr(p, tmpBuf) + strlen(tmpBuf); /* 将p指向当前单词后面 */ } }
(3)编写一程序实现以下功能
设有20名歌手(编号为1-20)参加歌咏比赛,另有10名评委打分,每位歌手的得分从键盘输入,先输入第1个歌手的10位评委打分(10分制,分数有1位小数,分数之间使用空格分隔),再输入第2个,...。计算出每位选手的最终得分(扣除一个最高分和一个最低分后的平均分),最后按最终得分由高到低的顺序输出每位选手的编号及最终得分。
考查点:从键盘读取数据及其控制,多重循环与排序。 1.2.5 第5(类)题
(1)编写一程序实现以下功能
①给定ASC字符的点阵字库ASC16,其格式为:字符的点阵数据存储到文件ASC16时,按字符的ASCII码(0~255)为序由前到后存储;字符为16(高)×8(宽)点阵,存储时每行8点为1字节(相应位为1表示有点、为0表示无点),从第1行到第16行按序存放。
19
注意:考试时的字符点阵可能不为16×8。
②程序运行时,从键盘读取用户输入的1个字符 (为可见的ASCII标准字符),然后从前面给出的点阵字库文件中取出该字符的点阵数据并在屏幕上显示:相应位置有点则显示*(考试时可能为其它符号),无点则显示空格(考试时可能为其它符号)。例如用户输入A,则在屏幕上显示如图1的内容。
图1 A的字模显示
注意:考试时可能要求将点阵横向放大n倍后显示,或将字符(点阵)加上最外围框线后显示,或此二变换组合。
③将②中字符的原始点阵数据进行处理(不增减字节数)以得到新的点阵数据,新的点阵数据若按②中的方法进行显示时(不需要显示),效果是给原有字符加了外围框线,如图2所示,将新的点阵数据存储到指定路径、名称的新文件中。
图2 A加外围框线的字模显示
考查点:字符点阵知识(图像数字化与存储),文件指针的定位与文件数据读取(fseek、fread),位运算(与、或),多重循环,二维数组的行列变换,文件写操作。
以下的例子作为参考,其功能是在屏幕上显示一个加框的A:
#include
void readOneZfDz(unsigned char dzBuf[], int theChar, FILE *Fp); void dispOneZfHz(unsigned char dzBuf[]);
void main()
20