c语言程序设计习题答案详解:编程题常见错误及修正方法

admin C语言 4


刚学 C 语言的朋友,是不是常遇到这种情况?做编程题时,觉得思路挺对,代码也写完了,可一运行要么弹出一堆错误,要么结果不对;翻到答案对比,好像差不多啊,可就是不知道错在哪。其实啊,这些错误看着吓人,大多是新手常犯的 “老毛病”,摸透了规律,改起来很简单。今天兔子哥就结合常见的 c 语言程序设计习题答案,讲讲编程题里的常见错误,还有怎么修正,一起往下看吧!

语法错误:分号、括号这些 “小零件” 最容易出问题?


语法错误就像写作文时漏了标点、写错了字,编译器一眼就能看出来,会提示 “error”。但新手常对着提示发呆,不知道哪错了。
最常见的是漏写分号。C 语言里,语句结束得加分号,比如 “int a=5” 后面没分号,编译器就会报错。比如有道题 “定义变量并打印”,有人写成:
c运行
#include int main(){int num=10printf("%d", num)return 0}

这代码看着没问题,其实三行语句末尾都漏了分号,编译器肯定报错。修正很简单,在每句末尾加 “;” 就行。
还有括号不配对。写 if、for 的时候,左括号 “{” 和右括号 “}” 得成对出现。比如写循环时:
c运行
for(i=1; i<=10; i++)printf("%d", i)

要是循环体里有多行代码,没加 “{}” 就会出错。哪怕只有一行,加上 “{}” 也更清楚,不容易错。
为什么这些小错误总犯?可能是刚开始写代码不熟练,注意力都在思路上,忘了这些 “细节”。其实多写几遍就好了,就像刚开始写字总漏笔画,写多了自然就顺了。

输入输出错误:scanf 总忘加 & 符号?打印结果不对咋回事?


输入输出是编程题的基础,可新手在这栽跟头的特别多,尤其是 scanf 和 printf 的用法。
先说scanf 里的 & 符号。用 scanf 接收整数、小数时,变量前面得加 &,比如 “scanf ("% d", &age)”,有人常写成 “scanf ("% d", age)”,结果程序运行时要么没反应,要么出奇怪的数。这是因为 scanf 需要变量的地址才能存数据,& 就是取地址的意思。比如一道 “输入两个数求和” 的题:
c运行
#include int main(){int a, b, sum;printf("请输入两个数:");scanf("%d%d", a, b); // 错在a和b前没加&sum = a + b;printf("和是:%d", sum);return 0;}

修正方法很简单,在 a 和 b 前面加 & 就行:“scanf ("% d% d", &a, &b)”。不过字符串(数组)不用加 &,比如 “scanf ("% s", name)”,这点得记清。
再说说printf 的格式符用错。比如想打印小数,用了 % d(整数格式符),结果会出乱码。比如 “打印 3.14”:
c运行
printf("%d", 3.14); // 错用了%d

得改成 “% f” 才行。不同类型对应不同格式符,int 用 % d,float 用 % f,char 用 % c,记混了就容易错。

循环和判断错误:循环跑不起来?判断结果总反着来?


循环和判断是编程题的 “骨架”,逻辑稍微错一点,结果就差远了。
循环条件写错很常见。比如一道 “打印 1 到 5” 的题,有人写成:
c运行
for(i=1; i>5; i++)printf("%d", i);

这代码运行后啥也不打印,因为循环条件 “i>5” 一开始就不成立(i=1 时 1>5 为假)。得改成 “i<=5” 才行。还有人把 i++ 写成 i--,结果循环停不下来,这时候按 Ctrl+C 强制结束就行。
if 判断的条件弄反也常发生。比如 “判断一个数是否大于 10”,有人写成:
c运行
if(num < 10)printf("大于10");

条件和结论反了,肯定错。这时候得把条件改成 “num> 10”,或者把结论反过来。
为什么会犯这种错?可能是脑子里想的是 “大于 10”,手上写的时候却写成了 “<”,尤其赶时间的时候。建议写完后再读一遍条件,比如 “如果 num 小于 10,就打印大于 10”,一听就不对,就能改过来了。

数组错误:下标越界是啥意思?数组名和指针分不清?


数组题里,新手最容易犯的是下标越界。比如定义了一个 5 个元素的数组 “int arr [5]”,有效下标是 0 到 4,有人却访问 arr [5],这时候程序可能运行,但结果不对,甚至崩溃。比如 “给数组赋值并打印”:
c运行
#include int main(){int arr[5], i;for(i=1; i<=5; i++) // 错在i<=5,此时arr[5]越界arr[i] = i;for(i=1; i<=5; i++)printf("%d", arr[i]);return 0;}

修正时把循环条件改成 “i<5”,让下标在 0 到 4 之间就行。
还有人把数组名当变量用,比如 “arr = 10”,这是错的,数组名是地址,不能直接赋值。得通过下标一个个改,比如 “arr [0] = 10”。
不过话说回来,数组越界有时候编译器不会报错,这就很麻烦,得自己多留意。我当年做一道 “数组求和” 的题,因为下标多写了 1,结果总和总比正确答案多一个奇怪的数,查了半天才发现是越界了。

函数调用错误:传参不对?返回值忘写?


函数题里,错误大多出在参数传递返回值上。比如写一个 “求两数之和” 的函数:
c运行
#include int add(int a, int b){// 忘了写return,函数没返回值}int main(){int x=3, y=5;printf("和是:%d", add(x, y));return 0;}

这函数声明了返回 int,却没写 return,调用时就会出问题。得加上 “return a + b;” 才行。
还有实参和形参类型不匹配,比如函数要求 int 型,却传了 float 型,虽然有时候能运行,但可能出误差。最好保证实参和形参类型一致。
关于不同函数调用方式(比如值传递和地址传递)在复杂程序中的具体差异,哪些情况必须用地址传递,我目前还没完全整理清楚,得后面再找些例子研究研究。
最后说点我的看法。做编程题,出错不可怕,可怕的是不知道为啥错。建议大家准备一个 “错题本”,把每次犯的错记下来,标上原因和修正方法,过几天翻一翻,慢慢就会发现,很多错误再也不会犯了。其实改错题的过程,比做对题更能帮你理解 C 语言的规则,所以别嫌麻烦,遇到错就认真改,坚持下去,你会进步很快的。希望能帮到你,有啥改不明白的题,随时找我聊。

标签: 程序设计 小零件

发布评论 0条评论)

  • Refresh code

还木有评论哦,快来抢沙发吧~