首页 / 资讯中心 / 文章详情

C语言期末复习:程序运行结果题与基础考点拿分攻略

C语言期末复习:程序运行结果题与基础考点拿分攻略 ★ FEATURED ARTICLE
简介绵阳师范学院《C语言程序设计》课程期末考试B卷的参考答案及评分标准是针对2018—2019学年度第2学期该课程期末考核的doc文档。资源面向该校信息工程学院本科生也适用于其他高校正在复习C语言程序设计、需要参考典型考题答案的学习者。资源包共包含1个doc文件整体大小29KB以文字答案和代码为主方便快速查阅和打印。目前已有61人学习可作为期末复习阶段的核对工具。文档提供选择题1至20题的标准选项填空题关于补码、标识符、单精度/双精度类型、取地址与按位与等核心知识点的答案判断题的详细对错结论以及六道程序运行结果题的输出。程序设计部分则给出三道完整源码交换两个变量、统计非负整数个数、判断素数并附有评分标准能帮助读者准确理解采分点和算法细节直接用于自查和估分。1. 期末C语言试卷真正拉开分的不是最后的编程题而是程序运行结果和填空判断很多人拿到C语言期末卷第一反应是先把程序设计题写完把最值钱的24分保住。但翻开某高校这份B卷答案你会发现选择题20分填空题20分判断题12分程序运行结果题24分——前72分全是小题最后两道编程题才24分。也就是说前面的“小分”才是决定是否及格的关键。这份B卷暴露了一个常见误区只背代码不背规则结果在“补码”“合法标识符”“取地址和按位与”上反复翻车。这篇笔记就按这份卷子的题型结构帮你把高频考点、易错点和答题套路拆开讲透照着练就能拿高分。2. 高频考点选择题、填空题、判断题的必背点先拿稳60分这一大题组占了52分是试卷的“基本盘”。选择题20题每题1分填空题6题每空2分判断题12题每题1分。从答案分布看选择题前5题ACCBC中间6-10 CDDBA后10题CAACC AAACC没有连续超过3个相同选项这是出卷老师在刻意平衡选项。遇到不确定的题如果连续三个选C起码要停下来怀疑一下。2.1 选择题20个考点集中在类型、运算符、流程控制选择题覆盖的是C语言最基础的概念。从这份答案和常见考法回看重点是数据类型区分int、float、double、char算术运算符优先级取模%、自增关系运算和逻辑运算、||、!位运算、|、^以及条件语句与循环语句的流程判断。下面这道题是这类题里的“常客”用来练手以下变量定义中合法的是 A) int 3a 5; B) float a-b 3.2; C) double _score; D) char 变量;答案是C。解析标识符只能由字母、数字、下划线组成且不能以数字开头不能包含减号。C选项以下划线开头合法。D选项用了中文“变量”C语言标准不允许用中文做标识符。这个考点几乎每份期末卷都会换一种形式出现本质是考“字母、数字、下划线”这三类字符的排列规则。另一个高频考点是运算符的优先级。面试题里最常问的是“取地址符和逻辑与的区别”但期末卷更爱考“按位与”和“逻辑与”的混淆。比如int a5, b6; printf(%d, a b);printf输出什么按位与是把5的二进制101和6的二进制110逐位相与结果是100即4。如果写成a b则输出1因为两个非零值逻辑与为真。同样一份代码和的结果天差地别。这类题不用背二进制表记住“按位与是逐位计算逻辑与是判断真假”就够了。2.2 填空题六个空四个必背规则填空题的答案直接暴露了考试重点21题“补码”22题“字母、数字、下划线”23题“单精度型float、双精度型double”24题“取地址、按位与”25题“顺序、随机”。这五组词就是五个独立的拿分点。补码是计组和C语言交叉的必考概念负数在计算机中用补码表示正数的补码是原码本身负数的补码是原码取反加一。考试如果问“整数在内存中以什么形式存储”答案就是补码。这个空没有技巧背下来就行。22题的“字母、数字、下划线”前面已经讲过要注意“不能以数字开头”是隐式条件很多人在填空时只写三个词丢掉了“不能以数字开头”的说明结果判断正误题翻车。23题强调C语言中浮点型分为单精度float和双精度double默认的浮点常量是double类型这一点在选择和填空里都爱考。24题是最大陷阱“取地址”和“按位与”在C语言里都是符号但一个是单目运算符一个是双目运算符。填空考写法选择考场景判断考“可以两个连续吗”这种表述。注意按位与正确写法是单个两个是逻辑与。原卷摘要里把“按位与运算符()”写出来恰恰说明很多人会写错考试时看到默认先想逻辑与。2.3 判断题十二条规则绝对化表述优先判错判断题共12题答案分布是×√√√√ √√×√× √×。从答案分布看错误题只有3个其余9个是真命题。也就是说如果你不会做全部打√也能得9分但这样反倒容易掉进出卷人的陷阱。判断题最典型的考法是“绝对化表述”。比如“C语言中所有变量必须先定义后使用”——这是对的但“C语言中所有函数都必须放在同一个文件中”——这是错的。同理题目里出现“一定”“全部”“任何”“只能”这类词时先找反例。负数的表示、循环的三种结构、数组下标从0开始、字符串结束符是‘\0’这些是判断题的高频背景。练一道匹配这份卷子风格的判断“在C语言中while循环和do-while循环的执行次数一定相同。”答案×。原因do-while至少执行一次while可能一次都不执行。这种对比型判断考的就是你对语法细节的掌握。做判断题时建议在草稿纸上画一个最小例子比如循环条件一开始为假自己跑一遍再下笔比你盯着句子空想靠谱得多。3. 程序运行结果6道题怎么读答案怎么来的这套程序运行结果题一共6道每题4分总共24分。很多人觉得这题是“玄学”因为代码看起来不长但输出和你想的完全不一样。实际上这6道题全在考三个能力分辨运算符优先级、跟踪循环变量变化、注意printf格式串里的逗号和换行。3.1 从“3,3”到“25”数值题的分析模板第38题输出“3,3”第41题输出“25”。这类纯数值输出题通常考表达式求值或循环累加。看到“逗号”要立刻警觉逗号运算符在C语言中优先级最低整个表达式的值是最后一个子表达式的值。但printf参数列表里的逗号不是逗号运算符而是分隔符所以“printf(“%d,%d”,a,b)”就是依次输出a和b。第39题输出“0”基本跑不出两种情况整型除法舍去小数、循环条件一开始就不成立。第40题输出“5”最常见的来源是计数循环执行了5次但循环变量的初始值和结束条件变化一下结果就可能是4或6。第42题输出“2”大概率是条件满足的统计次数比如“统计能被3整除的个数”之类。第43题输出“i10,j2”这是最典型的两层循环退出后的变量状态。你要特别注意循环结束后循环变量的值并不等于循环边界而是“最后一次满足条件之后使条件不成立的那个值”。比如for(i0;i10;i)结束后i是10不是9。同理j2可能说明内层循环在j递增到2时触发了break很多人在这一步忘记break的立即跳出作用。3.2 读代码的三个固定步骤做程序运行结果题不要用眼睛“扫”要按下面三步在草稿上画状态。第一步圈出所有变量的初始值。不管是全局变量还是局部变量先把它们写在纸上一列。第二步找循环体的结束条件和自增语句。尤其注意for循环里的循环变量是在循环体之后才自增而while循环里容易漏掉自增语句造成死循环。第三步看printf放在哪里——在循环体内会输出多行在循环体外只输出最后一行。这三步走完输出的行数和内容基本不会错。以“输出0”那类题为例你按步骤推导时往往会发现问题出在浮点数比较或整数除法上。比如“5/2”在C语言里结果是2不是2.5如果把一个int型变量除以另一个int型变量哪怕结果赋给float也会先算整数除法再转换。期末考最爱考这种“看似简单但就是错”的细节。3.3 字符题和指针题的隐藏考法虽然这份卷子的结果题没有出现字符数组和指针但程序运行结果题里最值钱的其实是这类题。如果在你的试卷里看到“printf(“%c”,str[i])”要注意字符和整形的转换关系字符‘0’的ASCII码是48数字0的输出结果完全不同。如果出现指针就更要小心“p”和“(p)”的优先级。前者等价于“(p)”先取p指向的值然后p加一后者是先取p的值然后把那个值加一。期末卷不会考太深的指针运算但“p”和“*p”在输出结果里的区别一定要会。建议你在考前把“printf中输出地址用%p输出值用%d”这句话默写三遍。下面用一道模拟题练手#include stdio.h void main() { int i, sum 0; for (i 1; i 5; i) { if (i % 2 0) continue; sum sum i; } printf(%d, sum); }输出结果是9。原因是continue会跳过偶数实际累加的是1、3、5和为9。这道题如果换成break结果就变成1因为遇到第一个偶数就跳出循环。一题两问正好是程序运行结果题最喜欢的考法。4. 程序设计三道8分题的满分写法与变题程序设计一共3题每题8分共24分。最后这道“大题”看似难其实比程序运行结果题更固定。这份B卷的三道题分别是交换两个变量、统计非负整数个数、判断素数。这三道题几乎是C语言期末的“三兄弟”翻来覆去只是换数据大小和条件。4.1 变量交换临时变量法的标准写法原题代码如下#include stdio.h void main() { int num1, num2, t; scanf(%d,%d, num1, num2); printf(num1%d,num2%d\n, num1, num2); t num1; num1 num2; num2 t; printf(num1%d,num2%d\n, num1, num2); }这段代码的核心是“三步交换”先把num1的值存进t再把num2赋给num1最后把t里的原num1赋给num2。很多人会漏写第三行或者写成“num1num2; num2num1;”这样num1和num2就全变成原来的num2了。写完后一定要代入一个具体值验证比如num13num25在草稿上一步步走一遍。这道题还有一个加分写法用加减法。num1 num1 num2; num2 num1 - num2; num1 num1 - num2;但在数值很大时可能溢出而且期末考的评分标准通常不要求展开只要求结果正确和格式正确。建议第一遍先写标准三步交换后面有时间再优化。4.2 统计非负个数continue和count的配合原题代码#include stdio.h void main() { int i, a[10], count; count 0; for (i 0; i 10; i) { scanf(%d, a[i]); if (a[i] 0) continue; count; } printf(count%d\n, count); }这道题考的是continue的用法当输入是负数时continue会跳过下面的count直接进入下一次循环。也就是说count只统计非负数。换个条件就是“统计偶数个数”“统计正数个数”等变体。这里有一个容易翻车的点有些人把count写成count count 1没问题但把if (a[i] 0) continue;写成if (a[i] 0) break;就全盘崩溃了。break会直接跳出整个循环不再是跳过本次而是终结所有输入。遇到这种题先判断题目让你“跳过”还是“终止”这是送分题和零分题的区别。此外注意数组下标从0开始循环10次处理a[0]到a[9]存储或输出时下标越界会造成运行错误。如果题目要求只统计不存储你完全可以用一个变量接收输入不需要数组但这份卷子明确用了数组你就按数组写。4.3 素数判断flag与sqrt的边界坑原题代码#include stdio.h #include math.h void main() { int n, i, flag 1; printf(input an integer:); scanf(%d, n); for (i 2; i sqrt(n) flag 1; i) if (n % i 0) flag 0; if (flag 1) printf(%d is a prime.\n, n); else printf(%d is not a prime.\n, n); }这段代码有一个经典的边界漏洞当n4时sqrt(4)2循环条件是i2而i的初始值是2条件不成立所以循环一次都不执行flag保持为1程序会错误地输出“4 is a prime.”。同样n9时sqrt(9)3i2和i3都小于3i3小于3不成立实际上循环只执行i2n%21flag不变最后也误判为素数。考试时你完全可以照这份答案写因为阅卷标准可能不追究这个边界。但如果你想让程序真正正确应该把循环条件改成i sqrt(n)或者i * i n后者还避开了sqrt函数在浮点精度上的问题。写完后务必代入n4、n9、n1和n2四个特殊值测试。n1理论上不是素数原代码也会输出“1 is a prime.”所以更严谨的写法要单独判断n2的情况。4.4 找规律三道题都是“标准套路”整体来看这三道题没有任何黑匣子交换用临时变量统计用continue或条件累加素数用flag标记状态。每种题型总结成固定模板考试时先套模板再改细节。如果是变题“交换三个数”你只需要多准备两个临时变量按顺序移动如果是“统计字符串里数字的个数”把数组类型换成char条件改成‘0’ ‘9’如果是“判断完数”把素数判断里的取模逻辑改成“因子相加等于自身”。模板是死的变的是条件和边界。5. 易错点失分最多的5类题错在哪怎么扳回这一章专门盘点这份卷子暴露的失分点每一条都是期末考反复出现的坑。按“错在哪→为什么错→怎么答对”三步来看考前过一遍能救回不少分。5.1 取地址和按位与混为一谈错在哪看到就想到“取地址”却忘了它还可以做按位与运算。填空题第24题直接考这两个含义判断题也爱说“是双目运算符”。为什么错因为在scanf函数里是取地址在表达式里是按位与同一个符号在不同场景含义不同记忆时没有区分上下文。怎么答对遇到先看它旁边有没有运算符左操作数——如果出现在scanf的变量前就是取地址如果出现在两个变量之间就是按位与。做题时把“按位与”和“逻辑与”强制分列两张卡片考前各默写一遍。5.2 合法标识符漏掉“不能以数字开头”错在哪填空题第22题问标识符的组成很多人只写“字母、数字、下划线”却漏了“字母或下划线开头”这个限制条件。为什么错因为数字在标识符里确实“组成”了但只能出现在非首位置。出卷人用“以数字开头”来设置陷阱你背定义时忽略了开头规则。怎么答对背标准表述标识符由字母、数字、下划线组成且第一个字符必须是字母或下划线不能以数字开头。做题时看到“3abc”“1_x”这样的选项直接判定非法。5.3 程序运行结果忽略printf格式串里的逗号与换行错在哪题目要求输出“3,3”你写成“33”或“3 3”。程序运行结果题不仅要算对值还要对齐格式。为什么错因为printf的格式串是原样输出的逗号、空格、换行符都要算进输出结果。阅卷时经常因为顺序对但格式错被扣一半分。怎么答对把printf里的格式串当成一串普通字符来读遇到“%d”就替换成值遇到逗号就输出逗号遇到“\n”就换行。推导结果时用字符串拼接的方式写出来而不是只在心里想数字。5.4 素数判断循环边界isqrt(n)导致误判错在哪程序设计第46题原代码用i sqrt(n)会把4、9、25这类完全平方数误判为素数。为什么错因为当n恰好是完全平方数时sqrt(n)就是它的小因子isqrt(n)使得这个因子永远不会被检查到。怎么答对把循环条件改成i sqrt(n)或者用i * i n。如果题目用的是isqrt(n)你可以补充说明或额外判断n1、n2等边界。至少要在脑海里测试n4这一例否则真考试时会怀疑自己。5.5 continue和break的位置搞混错在哪统计非负个数那道题有人会在if里写break而不是continue导致只处理了几个数就跳出循环结果完全错。为什么错break和continue都影响循环但break是终止整个循环continue是跳过本次循环剩余语句。遇到负数时我们想“跳过”而不是“退出”所以必须用continue。怎么答对做这类题时先问自己条件是“不合规就跳过”还是“遇到就停止”如果要求继续处理后面的数据就用continue如果要求立即结束并输出已有结果才用break。考前可以自行写一遍对比代码加深印象。6. 答题技巧与押题最后20分钟怎么检查三类必练变式最后这20分钟比前面考场上的1小时更重要。很多同学不是不会做而是做完不检查白丢十几分。以下是我总结的检查顺序按这个来能捞回不少分。先对小题选择题和填空题的答案尽量用“代入法”验证。比如运算符优先级的题把表达式代入一个具体数值比如a2b3算一遍再选。再看程序结果重点检查printf格式串里的逗号和换行以及循环结束后循环变量的值。用草稿纸把变量变化列成表格比心算靠谱。最后审编程题卷面得分主要看三点变量是否定义、是否有输入输出、循环是否有可能死循环。尤其注意数组下标有没有越界。针对这份卷子的押题方向我建议重点练这三类变式交换两个变量的值可改成交换三个数并轮换统计满足条件的元素个数可改成统计偶数、负数或不能被3整除的数判断素数或完数可改成判断某区间内的所有素数并输出。这三类题只要条件变一下就是一套新题但代码骨架完全一样。我从第一次做类似卷子到现在每次写程序题都会强制走一遍边界测试输入最小值、最大值、0和负数各跑一遍再在printf格式串上逐字符核对。这个习惯让我在期末考和机试里少丢了无数分。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站