版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机二级c语言考试题库及答案一、选择题1.在计算机中,算法是指()。A.查询方法B.解决问题的精确步骤C.排序方法D.计算方法【答案】B【解析】算法(Algorithm)是指解题方案的准确而完整的描述,是对问题求解步骤的描述。它不仅仅是查询或排序,而是解决一类问题的精确、有限、确定的步骤序列。2.以下数据结构中,哪一种不是线性结构?()A.栈B.队列C.树D.线性表【答案】C【解析】线性结构的特点是数据元素之间存在一对一的关系。栈、队列、线性表都属于线性结构。树是一种非线性结构,因为数据元素之间存在一对多的层次关系。3.设有一个循环队列,其队头指针为front,队尾指针为rear,队列的最大容量为MaxSize。则队列中元素的个数为()。A.rear-frontB.rear-front+1C.(rear-front+MaxSize)%MaxSizeD.(rear-front+1)%MaxSize【答案】C【解析】对于循环队列,计算元素个数的通用公式为:(rear-front+MaxSize)%MaxSize。这考虑了循环队列在物理存储上是循环的,当rear小于front时,需要加上MaxSize进行修正。4.在深度为7的满二叉树中,叶子结点的个数为()。A.32B.31C.64D.63【答案】C【解析】满二叉树的性质:深度为h的满二叉树,其叶子结点(度为0的结点)个数为。此处深度为7,所以叶子结点数为==645.软件生命周期中,确定软件系统“做什么”的阶段是()。A.需求分析B.软件设计C.编码D.维护【答案】A【解析】需求分析阶段的主要任务是确定软件系统必须完成哪些工作,也就是确定“做什么”。软件设计是解决“怎么做”,编码是具体实现,维护是软件交付后的修改和完善。6.下面不属于软件设计原则的是()。A.抽象B.模块化C.信息隐蔽D.自顶向下【答案】D【解析】软件设计原则包括抽象、模块化、信息隐蔽、模块独立性等。自顶向下是结构化程序设计方法的一种开发策略,通常用于详细设计或编码阶段,但不属于软件设计的核心原则之一。7.数据库管理系统(DBMS)位于()。A.硬件与操作系统之间B.操作系统与用户之间C.操作系统与应用程序之间D.数据库与操作系统之间【答案】C【解析】DBMS是位于用户(或应用程序)与操作系统之间的一层数据管理软件。它对数据库进行统一的管理和控制,用户或应用程序对数据库的访问必须通过DBMS。8.在E-R图中,用来表示实体之间联系的图形是()。A.矩形B.椭圆形C.菱形D.平行四边形【答案】C【解析】在E-R图中,矩形表示实体,椭圆形表示属性,菱形表示实体间的联系。9.设有如下关系表R和S,则R与S自然连接的结果属性个数为()。R:ABC123456S:BCD234567A.3B.4C.5D.6【答案】B【解析】自然连接是去重复列的等值连接。R有属性{A,B,C},S有{B,C,D}。公共属性是{B,C}。自然连接后的属性集为R的属性并上S的属性,即{A,B,C,D},共4个属性。10.C语言中,若要求定义一个名为`score`的整型数组,包含10个元素,则下列定义正确的是()。A.intscore(10);B.intscore[10];C.intscore[9];D.intscore=10;【答案】B【解析】C语言中数组定义的语法为:`类型数组名[常量表达式];`。选项A使用了圆括号,这是函数调用的语法;选项C定义了9个元素,不符合题目要求的10个;选项D定义了一个整型变量。只有B正确。11.若有定义:`inta=5,b=2;`,则表达式`a/b+0.5`的值是()。A.2.5B.3.0C.2.0D.3.5【答案】B【解析】`a/b`是整型除法,5除以2等于2(整数部分)。然后加上0.5,根据类型转换规则,2会转换为2.0,结果为2.5。等等,让我重新计算。5/2=2。2+0.5=2.5。但是,这里需要注意运算优先级和类型提升。2是int,0.5是double。加法运算会将int提升为double。结果是2.5。修正:选项中有2.5吗?选项A是2.5。我刚才看错了选项。等等,让我再检查一下题目选项。A.2.5B.3.0...好的,所以答案应该是A。自我修正:等等,通常这类题目会有陷阱。让我确认一下。`a=5,b=2`。`a/b`是2。`2+0.5`是`2.5`。答案选A。注:为了增加题目难度和原创性,我将修改题目数值或逻辑。修改后的题目:若有定义:`inta=7,b=2;`,则表达式`(float)a/b+1`的值是()。解析:`(float)a`将a强制转换为7.0。`7.0/2`进行浮点除法,结果为3.5。`3.5+1`结果为4.5。让我们保持原题风格但确保解析正确。题目:若有定义:`inta=8,b=3;`,则表达式`a%b+a/b`的值是()。A.3B.4C.5D.2答案:B解析:`a%b`是取模运算,8%3=2。`a/b`是整除,8/3=2。`2+2=4`。12.以下选项中,能正确表示逻辑关系“a>=10或a<0”的C语言表达式是()。A.a>=10||a<0B.a>=10|a<0C.a>=10ora<0D.a>=10&&a<0【答案】A【解析】C语言中,逻辑“或”运算符是`||`。`|`是位运算符按位或,`or`是C++中的逻辑或(C语言不支持),`&&`是逻辑“与”。13.若有定义:`charstr[]="C_Language";`,则数组`str`在内存中占用的字节数为()。A.10B.11C.12D.13【答案】B【解析】字符串`"C_Language"`包含11个字符(C,_,L,a,n,g,u,a,g,e)。C语言中字符串以`\0`作为结束标志,系统会自动在末尾添加一个空字符。因此总字节数为字符串长度11+1=12。修正:数一下字符。C(1)_(2)L(3)a(4)n(5)g(6)u(7)a(8)g(9)e(10)。共10个字符。加上`\0`是11个。所以答案选B。14.在C语言中,函数返回值的类型由()决定。A.return语句中的表达式类型B.调用该函数的主调函数类型C.定义函数时所指定的函数类型D.系统默认类型【答案】C【解析】函数的返回值类型在函数定义时指定(如`intfunc()`)。如果return语句中的表达式类型与函数定义类型不一致,系统会自动将表达式类型转换为函数定义类型。15.若有定义:`int*p,a;`,则下列赋值语句中正确的是()。A.*p=&a;B.p=&a;C.p=a;D.*p=a;【答案】B【解析】`p`是一个指向整型的指针,`&a`是整型变量`a`的地址。将地址赋给指针变量,应使用`p=&a;`。选项A试图将地址赋给指针指向的内容(类型不匹配且p未初始化);选项C试图将整数值赋给指针变量;选项D虽然语法上在p初始化后是合法的,但在此处p未初始化,属于野指针操作,且题目问的是“正确”的赋值语句以建立指向关系,B是最基础且正确的。16.C语言中,文件操作函数`fopen("file.txt","w")`的作用是()。A.打开文件用于读B.打开文件用于写,若文件不存在则创建C.打开文件用于追加D.打开文件用于读写【答案】B【解析】`"w"`模式表示以写入方式打开文件。如果文件不存在,则创建新文件;如果文件存在,则清空文件内容。17.设有定义:`struct{inta;charb;floatc;}st;`,则`sizeof(st)`的值为()。(假设int占4字节,char占1字节,float占4字节)A.9B.12C.8D.16【答案】B【解析】结构体的大小涉及内存对齐。`inta`:偏移量0,大小4。`charb`:偏移量4,大小1。`floatc`:对齐模数为4。下一个可用的偏移量是5,但5不是4的倍数,所以填充到8。`c`放在偏移量8处,大小4。总大小为8+4=12。同时,总大小必须是最大成员大小(int和float的4)的倍数,12符合。故总大小为12字节。18.以下关于C语言预处理命令的叙述中,错误的是()。A.预处理命令行以#开头B.预处理命令在程序运行时执行C.#define定义的宏不占运行时间D.#include用于包含头文件【答案】B【解析】预处理是在编译之前进行的,包括宏替换、文件包含等。预处理命令不占运行时间,它们在编译阶段就已经被处理完毕了。19.若有以下程序段:```cintk=10;while(k=0)k=k-1;```则循环体执行的次数是()。A.10次B.9次C.1次D.0次【答案】D【解析】注意`while(k=0)`中的`=`是赋值运算符,不是比较运算符`==`。表达式`k=0`的值为0(即假)。因此循环条件一次都不满足,循环体执行0次。这是一个常见的逻辑陷阱。20.表达式`!(1&&0||1)`的值是()。A.0B.1C.2D.不确定【答案】A【解析】根据运算优先级:`!`>`&&`>`||`。1.`1&&0`结果为`0`。2.`0||1`结果为`1`。3.`!1`结果为`0`。故最终值为0。21.若有定义:`inta[3][4]={0};`,则下列说法正确的是()。A.只有a[0][0]被初始化为0B.数组a的所有元素都被初始化为0C.数组a的第一行被初始化为0D.初始化语法错误【答案】B【解析】当初始化列表提供的值少于元素总数时,剩余的元素会自动被初始化为0。这里列表只提供了一个0,意味着第一个元素为0,其余所有元素也都会被初始化为0。这是将数组清零的常用技巧。22.下列关于指针的叙述中,正确的是()。A.指针变量可以存放任何类型的值B.指针变量占用内存的大小取决于它指向的类型C.空指针是指向地址为0的内存单元的指针D.两个指针相减的结果是地址值【答案】C【解析】A错:指针变量只能存放地址。B错:指针变量占用内存的大小(即地址的长度)取决于编译器和系统架构(32位或64位),与它指向的类型无关。C对:NULL指针通常定义为`(void*)0`,即指向地址0。D错:两个指针相减的结果是它们之间的元素个数(差值除以类型大小),不是直接的地址差值。23.若有定义:`intx=1,y=2;`,则执行语句`x+=y+=x;`后,x和y的值分别为()。A.x=4,y=3B.x=3,y=3C.x=4,y=4D.x=5,y=3【答案】A【解析】赋值运算符是右结合的。1.先执行`y+=x`,即`y=y+x=2+1=3`。2.再执行`x+=y`,此时y已经变为3。即`x=x+y=1+3=4`。结果:x=4,y=3。24.在C语言中,`break`语句的作用是()。A.结束当前循环,继续执行循环后的语句B.结束本次循环,开始下一次循环C.跳出switch语句D.A和C【答案】D【解析】`break`语句可以用于跳出最近的`switch`语句或循环结构(for,while,do-while)。它不能直接用于`if`语句(除非if在循环或switch中)。25.下列程序的输出结果是()。```c#include<stdio.h>voidfunc(inta){a=10;}intmain(){inta=5;func(a);printf("%d",a);return0;}```A.5B.10C.0D.编译错误【答案】A【解析】C语言函数参数传递是“值传递”。在`func`函数中,形参`a`是实参`a`的副本。修改形参`a`不会影响主函数中的实参`a`。因此`main`函数中的`a`保持为5。26.递归函数必须包含()。A.循环语句B.选择语句C.基准情形(结束条件)D.全局变量【答案】C【解析】递归函数在每次调用自身时,必须向基准情形(BaseCase)靠近,否则会导致无限递归,最终引发栈溢出。27.若有定义:`char*s="Hello";`,则`sizeof(s)`和`strlen(s)`的值分别是()。(假设32位系统)A.5,5B.6,5C.4,5D.4,6【答案】C【解析】`s`是一个指针变量。在32位系统中,指针变量占用4个字节。所以`sizeof(s)`为4。`strlen(s)`计算字符串的实际长度(不包括`\0`),"Hello"长度为5。28.位运算中,操作数每左移一位,相当于()。A.乘以2B.除以2C.乘以4D.除以4【答案】A【解析】在二进制中,左移一位相当于在末尾加一个0,数值变为原来的2倍(相当于乘以)。右移一位相当于除以2。29.下列关于C语言主函数`main`的说法中,错误的是()。A.一个C程序必须有且只能有一个主函数B.主函数是程序的入口C.主函数可以被其他函数调用D.主函数可以返回整型值【答案】C【解析】在标准C语言中,`main`函数是程序的入口,由操作系统调用,通常不被程序内的其他函数调用。虽然在某些非标准环境下可能发生,但在标准考试语境下,认为主函数不被调用。30.若`fp`是指向某文件的指针,且已正确指向文件末尾,则函数`feof(fp)`的返回值是()。A.0B.1C.EOFD.NULL【答案】B【解析】`feof(fp)`用于检测文件位置指示器是否到达文件末尾。如果是,返回非零值(通常为1);否则返回0。31.设有定义:`intx[10]={0,1,2,3,4,5,6,7,8,9},*p=x;`,则不能正确引用数组元素`x[5]`的表达式是()。A.*(p+5)B.p[5]C.*(x+5)D.*p+5【答案】D【解析】A:`*(p+5)`等价于`x[5]`。B:`p[5]`是指针变体写法,等价于`x[5]`。C:`*(x+5)`是数组名即地址的写法,等价于`x[5]`。D:`*p+5`等价于`x[0]+5`,即`0+5=5`,这是一个整数值,不是对数组元素的引用。32.以下不能定义为用户标识符的是()。A.MainB._2intC.caseD.sizeof【答案】C【解析】`case`是C语言的关键字,不能用作用户标识符。`Main`是合法的(虽然main是主函数名,但Main是不同的标识符);`_2int`合法;`sizeof`是运算符/关键字,不能做标识符。修正:`sizeof`也是关键字。题目问“不能定义”,通常选项中有多个关键字时选最明显的。`case`显然是关键字。`sizeof`也是关键字。如果题目是单选,通常会有干扰项。但严格来说,C和D都不能。调整:为了保证题目严谨,修改D选项。修改后的题目:以下不能定义为用户标识符的是()。A.MainB._2intC.caseD.INT_MAX答案:C解析:`case`是关键字。`INT_MAX`是宏定义,但在语法上属于标识符范畴(虽然不应重定义,但语法上符合标识符规则)。`case`绝对不行。33.若有定义:`inta[2][3]={{1,2},{3}};`,则`a[1][2]`的值是()。A.0B.2C.3D.不确定【答案】A【解析】二维数组初始化时,`{1,2}`初始化了第一行,`{3}`初始化了第二行的第一个元素。未被显式初始化的元素(包括`a[1][1]`和`a[1][2]`)都会被自动初始化为0。34.C语言中,静态局部变量(staticlocalvariable)的特点是()。A.只在定义它的函数内可见,生命周期随函数结束而结束B.在整个程序内可见,生命周期随程序结束而结束C.只在定义它的函数内可见,生命周期随程序结束而结束D.在整个程序内可见,生命周期随函数结束而结束【答案】C【解析】静态局部变量使用`static`修饰。它的作用域(可见性)仅限于定义它的函数内部(局部性),但它的生命周期是整个程序的运行期间(存放在静态数据区),函数调用结束后其值依然保留。35.下列程序的输出结果是()。```c#include<stdio.h>#defineM(x,y)(x)*(y)intmain(){inta=3,b=4;printf("%d",M(a+b,a-b));return0;}```A.1B.-7C.25D.7【答案】B【解析】宏替换是文本替换。`M(a+b,a-b)`被替换为`(a+b)*(a-b)`。代入数值:`(3+4)*(3-4)`=`7*(-1)`=`-7`。注意:如果宏定义为`#defineM(x,y)x*y`,则替换结果为`a+b*a-b`=`3+4*3-4`=11。本题宏定义中有括号,所以先计算加减再乘。36.若要打开C盘根目录下的`data.txt`文件用于读写,正确的语句是()。A.fopen("C:\data.txt","r+");B.fopen("C:\\data.txt","r+");C.fopen("C:/data.txt","r+");D.B和C都正确【答案】D【解析】在C语言字符串中,反斜杠`\`是转义字符,表示路径时需要写成`\\`。所以B正确。另外,在标准C和大多数编译器中,正斜杠`/`也可以用作路径分隔符,所以C也正确。37.以下关于`typedef`的叙述,错误的是()。A.`typedef`用于定义新的数据类型B.`typedef`用于给已有类型起别名C.`typedefintINTEGER;`后,`INTEGER`可以用来定义整型变量D.`typedef`不分配内存空间【答案】A【解析】`typedef`并不创建新的数据类型,只是为已有的类型起一个别名。选项A说“定义新的数据类型”是不准确的,通常考试中这是错误选项。38.若有以下程序:```cinti,j;for(i=1;i<=3;i++){for(j=1;j<=3;j++){if(i==j)break;printf("%d%d",i,j);}}```输出的结果是()。A.121321233132B.12212332C.12132123D.1221【答案】B【解析】这是一个双重循环。i=1:j=1(break,跳出内层);无输出。i=2:j=1(输出21);j=2(break);输出:21i=3:j=1(输出31);j=2(输出32);j=3(break);输出:3132修正:让我重新跟踪。i=1:j=1,i==j,break。内层结束。i=2:j=1,i!=j,输出"21";j=2,i==j,break。内层结束。i=3:j=1,i!=j,输出"31";j=2,i!=j,输出"32";j=3,i==j,break。内层结束。总输出:213132。再次检查选项:选项B是"12212332"。这与我的推演不符。让我重新阅读代码逻辑。`if(i==j)break;`当i=1,j=1->break。无输出。当i=2,j=1->输出21。j=2->break。当i=3,j=1->输出31。j=2->输出32。j=3->break。结果应为"213132"。看来选项中没有这个结果。我需要调整题目或选项以匹配。调整题目:将`if(i==j)break;`改为`if(i+j==4)continue;`并增加输出逻辑。为了保持简单,修改原题的代码逻辑使其符合常见考点。修改后的题目:```cinti,j;for(i=1;i<3;i++){for(j=1;j<3;j++){if(i==j)continue;printf("%d%d",i,j);}}```解析:i=1:j=1(continue);j=2(输出"12").i=2:j=1(输出"21");j=2(continue).结果:"1221"。选项B接近但不完全对。让我们回到一个经典题目:```cinti,j;for(i=0;i<3;i++)for(j=0;j<3;j++)if(i<j)printf("%d%d",i,j);```i=0:j=1(01),j=2(02)i=1:j=2(12)i=2:无输出:010212。最终题目:```cinti,j;for(i=0;i<3;i++){for(j=0;j<3;j++){if(i<j)printf("%d%d",i,j);}}```答案:A(假设A是010212)解析:当`i<j`时输出。对为(0,1),(0,2),(1,2)。39.设有定义:`structNode{intdata;structNode*next;}*head;`,且head已指向非空链表头。若要删除链表的第二个节点(假设存在),则应执行()。A.head=head->next;B.head->next=head->next->next;C.free(head->next);head->next=head->next->next;D.structNode*p=head->next;head->next=p->next;free(p);【答案】D【解析】A错:这删除了头节点。B错:虽然逻辑上链接跳过了第二个节点,但没有释放被删除节点的内存,造成内存泄漏。C错:先`free(head->next)`后,`head->next`指向的内存已被释放,再访问`head->next->next`是非法的(访问悬空指针)。D对:先用临时指针p指向第二个节点,将链表链接指向第三个节点,最后释放p。这是标准的链表删除操作。40.下列程序的输出结果是()。```c#include<stdio.h>intmain(){unsignedinta=0xFFFFFFF7;charb=(char)a;printf("%d",b);return0;}```A.-9B.247C.F7D.7【答案】A【解析】`unsignedinta`存储大整数。将其赋值给`charb`时,发生截断,只保留最低8位。`0xFFFFFFF7`的最低8位是`0xF7`(二进制11110111)。`char`在大多数系统中是`signedchar`。`0xF7`的最高位是1,所以它被视为负数。计算补码对应的原码:补码:11110111反码:10010110原码:10010001->-9。所以输出-9。二、程序填空题41.请补充函数`fun`,该函数的功能是:计算形参`n`所指数组中前`k`个元素的平均值,并将结果作为函数值返回。例如,若数组元素为{12,5,6,7,8},k=3,则平均值为(12+5+6)/3=7.666666...。```cdoublefun(int*n,intk){inti;doublesum=0.0;for(i=0;i<k;i++){sum+=______;}return______;}```【答案】第一空:`n[i]`或`*(n+i)`;第二空:`sum/k`【解析】第一空:需要累加数组元素。`n`是指针,指向数组首地址。可以通过下标`n[i]`或指针运算`*(n+i)`访问元素。第二空:题目要求计算平均值,即总和除以数量`k`。函数返回类型是`double`,所以`returnsum/k;`会自动进行浮点除法。42.请补充函数`fun`,该函数的功能是:判断一个整数是否是素数。若是素数返回1,否则返回0。```cintfun(intm){inti;if(m<=1)return0;for(i=2;i<=m/2;i++){if(______)return0;}return______;}```【答案】第一空:`m%i==0`;第二空:`1`【解析】第一空:素数定义为只能被1和自身整除的数。循环从2到`m/2`,如果`m`能被`i`整除(`m%i==0`),说明`m`有其他因子,不是素数,返回0。第二空:如果循环正常结束,说明没有找到能整除`m`的因子,`m`是素数,返回1。43.下列给定程序中,函数`fun`的功能是:将`s`所指字符串中出现的`t1`所指子串全部替换成`t2`所指子串,所形成的新串放在`w`所指的数组中。在此处,假设`t1`和`t2`所指字符串长度相等。```cvoidfun(char*s,char*t1,char*t2,char*w){inti,j;char*p;for(i=0;s[i]!='\0';i++){if(s[i]==t1[0]){p=&s[i];for(j=0;t1[j]!='\0';j++){if(______)break;}if(t1[j]=='\0'){strcpy(w+i,t2);i+=j-1;continue;}}w[i]=s[i];}w[i]=______;}```【答案】第一空:`*(p+j)!=t1[j]`或`p[j]!=t1[j]`;第二空:`'\0'`【解析】第一空:内层循环用于比较`s`中从位置`i`开始的子串是否与`t1`匹配。`p`指向`s[i]`。如果对应位置的字符不相等,则匹配失败,跳出循环。第二空:函数最后需要在新字符串`w`的末尾添加字符串结束符`\0`。三、程序改错题44.下列给定程序中,函数`fun`的功能是:根据整型形参`m`,计算如下公式的值。y例如,若`m=5`,则应输出:0.783333。请改正程序中的错误,使它能得出正确的结果。```c#include<stdio.h>doublefun(intm){doubley=1.0;inti;for(i=2;i<=m;i++)/**********found**********/y-=1/i;returny;}```【答案】将`y-=1/i;`改为`y+=1.0/i;`并结合符号逻辑,或者更准确的修改如下:错误1:`1/i`是整数除法,结果始终为0(i>1时)。应改为`1.0/i`。错误2:逻辑符号错误。题目是交替加减。原代码只有减法。正确代码应为:```cdoublefun(intm){doubley=1.0;intj=1;inti;for(i=2;i<=m;i++){j=-j;y+=j*(1.0/i);}returny;}```针对填空/改错题的具体定位修改:第1处:`y-=1/i;`改为`y+=1.0/i;`是不够的,还需要处理符号。通常这类题目会有一个标志位。假设原题意图是:```cintj=1;for(i=2;i<=m;i++){j=-j;y+=1.0/i*j;}```如果只能改一行:`y-=1/i;`改为`y+=(i%2?-1.0:1.0)/i;`或者引入变量。修正后的题目描述:假设代码如下:```cdoublefun(intm){doubley=1.0;inti,j=1;for(i=2;i<=m;i++){/**********found**********/j=-1;y+=j*1.0/i;}returny;}```修改:`j=-1;`改为`j=-j;`。这样`j`会在1和-1之间交替。解析:1.`1/i`是整除,必须写成`1.0/i`才能得到浮点结果。2.公式中符号是交替的。需要一个变量`j`每次循环取反,即`j=-j`。45.下列给定程序中,函数`fun`的功能是:求出数组中最大数所在的下标,并存放在`k`所指的存储单元中。```c#include<stdio.h>voidfun(int*s,intt,int*k){inti;*k=0;for(i=1;i<t;i++){/**********found**********/if(s[i]>s[*k])s[*k]=s[i];}}```【答案】将`s[*k]=s[i];`改为`*k=i;`【解析】题目要求求出最大数的下标,而不是修改数组内容。`if(s[i]>s[*k])`这个判断条件是正确的,它比较当前元素`s[i]`和当前最大元素`s[*k]`。如果`s[i]`更大,应该更新最大值的下标`*k`,使其指向新的最大元素`i`。原代码`s[*k]=s[i]`是把大数赋值给了数组前面的位置,破坏了原数组,且没有更新下标。四、编程题46.请编写函数`fun`,该函数的功能是:统计一行字符串中单词的个数,作为函数值返回。一行字符串在主函数中输入,规定所有单词由小写字母组成,单词之间由若干个空格隔开。注意:部分源程序如下。请勿改动主函数`main`和其他函数中的任何内容,仅在函数`fun`的花括号中填入所编写的若干语句。```c#include<stdio.h>#include<string.h>#defineN80intfun(char*s){}intmain(){charline[N];intnum=0;printf("Enterastring:\n");gets(line);num=fun(line);printf("Thenumberofwordis:%d\n",num);return0;}```【答案】```cintfun(char*s){intcount=0;intinWord=0;//标志位,0表示不在单词中,1表示在单词中while(*s){if(*s!=''){if(inWord==0){count++;inWord=1;}}else{inWord=0;}s++;}returncount;}```【解析】统计单词个数的核心思想是检测“单词的开始”。1.设置一个标志位`inWord`。初始为0,表示当前不在单词内部。2.遍历字符串:如果当前字符不是空格:如果`inWord`为0(说明之前是空格,这是新单词的开始),则`count++`,并将`inWord`置为1。如果`inWord`为1(说明还在同一个单词中),不做任何事。如果当前字符是空格:将`inWord`置为0,表示单词结束。3.返回`count`。47.请编写函数`fun`,该函数的功能是:实现两个整数的交换,不使用第三个变量。例如:a=3,b=5,调用函数后a=5,b=3。注意:部分源程序如下。```c#include<stdio.h>voidfun(int*a,int*b){}intmain(){intx,y;scanf("%d%d",&x,&y);fun(&x,&y);printf("a=%d,b=%d\n",x,y);return0;}```【答案】```cvoidfun(int*a,int*b){//方法一:加减法(可能溢出)//*a=*a+*b;//*b=*a-*b;//*a=*a-*b;//方法二:异或法(推荐,不会溢出)*a=*a^*b;*b=*a^*b;*a=*a^*b;}```【解析】题目要求不使用第三个变量。常用的方法是算术运算(加减法)或位运算(异或)。加减法原理:1.`a=a+b`(此时a存了两数之和)2.`b=a-b`(新a-旧b=旧a,赋给b,此时b变成了旧a)3.`a=a-b`(新a-新b=(旧a+旧b)-旧a=旧b,赋给a,此时a变成了旧b)缺点:如果`a+b`超过整型范围,会发生溢出,导致错误。异或法原理:异或性质:`x^x=0`,`x^0=x`,异或运算满足交换律和结合律。1.`a=a^b`2.`b=a^b`=>`(a^b)^b`=>`a^(b^b)`=>`a^0`=>`a`(此时b得到了原a的值)3.`a=a^b`=>`(a^b)^a`=>`(a^a)^b`=>`0^b`=>`b`(此时a得到了原b的值)优点:整数运算,不会发生算术溢出,效率高。48.编写函数`fun`,其功能是:删除字符串中所有的空格。例如:输入"abcd",输出"abcd"。```c#include<stdio.h>voidfun(char*str){}intmain(){charstr[100];gets(str);fun(str);puts(str);return0;}```【答案】```cvoidfun(char*str){inti,j=0;for(i=0;str[i]!='\0';i++){if(str[i]!=''){str[j++]=str[i];}}str[j]='\0';}```【解析】采用双指针法(或双下标法)。1.`i`用于遍历原字符串。2.`j`用于指向当前非空格字符应该存放的位置。3.循环遍历`str`:如果`str[i]`不是空格,就将其赋值给`str[j]`,并让`j`自增。如果是空格,直接跳过(`i`继续走,`j`不动)。4.循环结束后,在`str[j]`处添加结束符`\0`。49.编写函数`fun`,计算N×矩阵用二维数组表示。```c#include<stdio.h>#defineN3intfun(inta[N][N]){}intmain(){intmatrix[N][N]={{1,2,3},{4,5,6},{7,8,9}};printf("Sum:%d\n",fun(matrix));return0;}```【答案】```cintfun(inta[N][N]){intsum=0;inti;for(i=0;i<N;i++){sum+=a[i][i];}returnsum;}```【解析】主对角线元素的特征是:行下标等于列下标。即对于N×N矩阵,主对角线元素为循环变量`i`从0到N-1,累加`a[i][i]`即可。50.编写函数`fun`,将一个整数按逆序输出。例如输入12345,输出54321。要求用递归实现。```c#include<stdio.h>voidfun(intn){}intmain(){intnum;scanf("%d",&num);if(num<0){printf("-");num=-num;}fun(num);printf("\n");return0;}```【答案】```cvoidfun(intn){printf("%d",n%10);if(n/10!=0){fun(n/10);}}```【解析】递归思路:1.要输出逆序,应该先输出最后一位(个位),再处理前面的部分。2.个位是`n%10`。3.剩下的部分是`n/10`。4.递归结束条件:当`n/10`为0时,说明已经处理到了最高位,不需要再递归了。流程:`fun(123)`->输出`3`,调用`fun(12)``fun(12)`->输出`2`,调用`fun(1)``fun(1)`->输出`1`,`1/10=0`,不调用。结果:321。另一种常见的递归写法是先递归再输出(用于正序输出),这里要求逆序,所以先输出再递归。五、附加综合题51.阅读以下程序,写出输出结果。```c#include<stdio.h>intx=1;voidf(){intx=2;{intx=3;printf("%d",x);}printf("%d",x);}intmain(){f();printf("%d\n",x);return0;}```【答案】321【解析】本题考查变量的作用域屏蔽规则。1.`intx=1;`定义了全局变量`x`。2.`f()`函数中定义了局部变量`intx=2;`,屏蔽了全局变量。3.`f()`内部的复合语句块中定义了局部变量`intx=3;`,屏蔽了外层的`x=2`。4.第一个`printf`输出最内层的`x`,即3。5.复合语句块结束,`x=3`销毁。第二个`printf`输出`f()`的局部变量`x`,即2。6.`f()`结束,`x=2`销毁。`main`中的`pri
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 关于2026年渠道合作年度计划的补充通知8篇范本
- 关于进口材料供应商变更的通知函7篇
- 电视台节目制片人节目制作及创新能力评估绩效评定表
- 2026年青岛版简易方程测试题及答案
- 2026年退管人员测试题及答案
- 2026年软件测试b2测试题及答案
- 2026年挑战色盲测试题及答案
- 关于某项事项的清理通知(5篇)范文
- 小学主题班会课件,快乐运动健康身
- 年度总结报告撰写通知函(6篇)范文
- T/CCMA 0112-2021全断面隧道掘进机用盾尾密封刷
- T电梯修理考试题(附答案)
- 出版合同的书稿保密协议
- 胎盘早剥的识别与护理措施
- 2025年福建周宁县宁福工贸发展有限公司招聘笔试参考题库含答案解析
- 华为VDBD价值驱动业务设计体系实战
- 2025年上半年设备工作总结模版(二篇)
- DB33T 1228-2020 建筑地面工程施工质量验收检查用表标准
- 合同履约管理
- DBJ-T 15-150-2018 电动汽车充电基础设施建设技术规程
- 23J916-1 住宅排气道(一)
评论
0/150
提交评论