0、快速检查(常规预检)
(1)是否将类似“scanf("%?"...)”的代码写成了“scanf("%?\n"...)”或“scanf("%? "...)”?
※ 请注意scanf("%c")和scanf(" %c")在效果上的区别!
(2)让scanf输入数据的普通变量前是否忘记了取地址符“&”?
(3)scanf/printf里的%?和对应的数据之类型是否匹配?
(4)简易跟踪:读入数据执行后,相应的变量中是否有该有的数据?
输出数据前,相应的变量中的数据是否正确?
(5)自己生成的字符串是否在正确的位置放置了字符串结束标记'\0'。
(6)是否将判断相等的“==”写成了“=”,为了避免此类问题,建议平时养成习惯:将类似if (tmp == 3)的语句写成 if (3 == tmp)。
(7)if、while、for等语句后是否多写了“;”?函数原型声明后是否少了“;”、函数定义后是否多了“;”?switch、for、while里是否该有break却没有?
(8)该赋初值的变量是否赋了初值?
一、输入输出
(0)空白字符:包括空格、回车、制表符(TAB)。
(1)使用scanf读入数据:
%d十进制整数 %o八进制整数 %x十六进制整数
%c字符,空白字符也作为有效字符读入
%s字符串,遇到第一个空白字符时结束
%f或%e实数 float型数据,小数或指数形式远均可——%lf或%le double型数据
%3d读入十进制整数,最多读3位数 %3s读入字符串,最多读3个字符
%3lf读入实数到double型变量中,最多读3位(含小数点)
xmwn=%%%lf读入实数到到double型变量中(%%表示一个%),且用户输入数据的形式必须类似为xmwn=%78.32(此时实际读到变量中的数据为78.32)。
*修饰输入时表示忽略相应的数据,例如对于scanf("%d%*f%d", &num1, &num2)和键盘输入123 890.2322 5672,则num1中的数为123、num2中的数为5672。
(2)使用scanf读入数据时,应注意数据间的分隔符,分隔符不会当作数据读入。若未在程序中给予限定,则默认为空白字符。
※ 所写程序中设定的输入格式与题目中是否一致?例如程序的运行效果示例的输入格式举例为“10000,8”,正确的输入设计应为“scanf("%d,%d"...)”,但考生则可能设计为“scanf("%d%d"...)”或“scanf("%d %d"...)”并且自己运行时的测试输入为“10000 8”,结果与题目中的运行效果示例几乎一样,但传到系统中得到的评分结果就是0分——因为评分系统在测试时自动输入的数据格式将类似“10000,8”。
(3)是否将类似“scanf("%d %d"...)”的代码写成了“scanf("%d %d\n"...)”?
※ 请注意scanf("%c")和scanf(" %c")在效果上的区别!
(4)让scanf输入数据的普通变量前是否忘记了取地址符“&”?
(5)使用printf输出数据,其格式转换说明符与scanf基本相同,但应注意:
%x与%X:均表示以无符号十六进制整数形式输出,区别在于小写与大写,效果见示例printf("%x %X\n", 47, 47)。
%f:与scanf不同的是,输出时无论是double型还是float型,均使用%f,其原因是编译时,输出的实数均会被自动先转换成double型。
%%:输出一个%
※ 请注意%5d %05d %-5d在输出效果上的差异
※ 将n1,n2定义成int并反复赋与不同的值去执行代码printf("%*d\n", n1, 123)、printf("%*.*f xx\n", n1, n2, 2.123),看看效果的差异并领会其用处
(6)输出格式与题目要求是否一致?请使用题目中提供的编程素材(复制粘贴到程序中,又快又准)、避免无谓的失分——这也是系统提供编程素材的主要目的。
(7)scanf/printf的格式转换说明符与提供数据的变量之类似是否一致?例如%d对应的变量却是一double/float,%f对应的却是一int,或者有多个%d%f却与之对应的提供数据的变量却不够!
(8)更多因输入/输出格式而导致的问题,请阅读为什么在自己的计算机上程序的运行结果是对的,但传到系统却未得满分甚至是0分?如何分析定位故障原因?
二、运算的优先级与期望的不一致,建议:不写复杂的表达式,拿不准时或较难分清时使用括号
(1)是否将(*Count)++写成了*Count++?
(2)是否将((ch = getchar()) != '\n')写成了(ch = getchar() != '\n')?
(3)是否将((fp = fopen("data", "r")) == NULL)写成了(fp = fopen("data", "r") == NULL)?
三、结构体的使用
请参考Struct用例。
四、其它
(1)输出的字符串中出现很多类似于“烫”的内容:请检查字符串是否在正确的位置放置了字符串结束标记'\0'。
(2)是否将判断相等的“==”写成了“=”,为了避免此类问题,建议平时养成习惯:将类似if (tmp == 3)的语句写成 if (3 == tmp)。
(3)if、while、for等语句后是否多写了“;”?函数原型声明后是否少了“;”、函数定义后是否多了“;”?
(4)注意:2*Num与2.0*Num、1/Num与1.0/Num是有区别的。
※ 当评分系统提示“结果较大时或者大数计算正确”时,应考试存储结果的变量的数据类型是否合适,运算过程中是否有溢出。
(5)变量的初值问题:是否没有赋值?(特别是显示结果类似-858993460、-925596313493...时) 或者是否需要每次循环开始前赋初值或清0?
(6)边界问题:数组是否越界使用?例如int a[n],却使用了a[n]或for (i=0; i<=n; i++)时不该=n。
(7)是否将' '、'a'写成了" "、"a"?
(8)对于ch=getchar() ch=fgetc(..),ch是否定义成int?
(9)int foo( ) 不等于 int foo(void),int foo( )真正意思是函数可以接受任意数目的参数。
(10)程序在编译/连接时若报告以下等信息,请阅读VC6编译与链接过程中常见的出错提示。
unresolved external symbol _main
_main already defined in xxxx.obj
unknown character '0x##'
undeclared identifier
'fun' : must return a value
'atoi' undefined; assuming extern returning int
'=' : 'int *' differs in levels of indirection from 'int '
'fun' : different types for formal and actual parameter 2
......
五、Raptor流程图编程
(1)如何实现以下输入?
printf("Please input x:");
scanf("%d", &x);
建议:使用input框即可完成上述两行代码功能:在Prompt处填写"Please input x:",在其下的变量域处填写x。
(2)如何实现以下输出?
printf("\nF(%d) = %f", x, Fx);
建议:使用output框,填写"F(" + x + ") = " + Fx。
|