不知道有没有像笔者一样的初学者:有时候稀里糊涂按要求作出一个程序,也不知道对不对,然后一次次的验证不仅很麻烦,还有很大几率验证不出来。真是令人头秃…在这里,我找到了几种方法来验证程序功能。
首先我们先来看一个题目:
例题:
产生四个不同的随机数,并将其存在数组里输出。
代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
int a[4]={};//避免在忽略赋值时,输出以前不知道什么时候存的
srand(time(NULL));
for(int i = 0;i<4;i++){
a[i]=rand();
for(int timer=1;timer<=4;timer++){
if(i>=timer){
if(a[i]==a[i-timer]){
i--;
}
continue;
}
}
}
for(int j =0;j<4 ;j++)
printf("%d\n",a[j]);
}
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
#define M 4//便于修改产生不相同的随机数的个数
#define LOCAL//检查按钮
int main(){
#ifdef LOCAL
int timer=1;
while(timer<7){//多次输出结果,验证程序正确性,最后要注释掉
#endif
int a[M]={};//避免在忽略赋值时,输出以前不知道什么时候存的
srand(time(NULL));
for(int i = 0;i<M;i++){
a[i]=rand()%M+1;//把输出结果固定在一个较小的范围内,便于验证程序的正确性,最后要把多余部分删去
for(int timer=1;timer<=M;timer++){
if(i>=timer){//此处是另一种方法中可以省略的if
if(a[i]==a[i-timer]){
i--;
}
continue;
}
}
}
for(int j =0;j<M ;j++)
printf("%d\n",a[j]);
#ifdef LOCAL
timer++;
Sleep(1000);//将多次生成的种子重置,最后应该注释掉
}
#endif
}
代码并不难,如何实现这里暂且不谈。
我们主要通过这一个例子,来看一下,在初步学习中,如何提高我们验证程序的效率。
1.利用while循环
这个很简单,利用while循环可以帮助我们多次自动输出结果
2.利用#ifdef #endif
在学习程序查错时,我们常常利用输出程序中间变量的方法来寻找程序的逻辑问题。问题是:有的时候程序比较长,变量比较多,改着改着程序是改完了,然而那些printf()语句却找不到了,留在程序里,想删又懒得找。有些人可能说,我不删,我把它们留作注释万一以后又发现问题还能继续用这不好吗?这很好,事实上这是一种好方法。但是注释掉他们,也要找得着才行啊·。运用#ifdef #endif 在写的时候就把他们包围起来,就能很好地解决这个问题。
3.重定向输入输出
这个题目里没有涉及,但我们不妨一说。
在有些题目里,常常要验证大长度输入输出的问题。但是一次一次的输入长串的字符简直让人心力憔悴。这时你可以使用freopen重新定向输入输出在文件里,但注意最后一定要把它改回标准输入输出。
或者,你可以使用我们刚才的技巧
#ifdef LOCAL
freopen("testdata.in", "r",stdin);
#endif
最后只要删掉#define LOCAL就可以了(笑)