验证程序的技巧——以产生随机数为例

不知道有没有像笔者一样的初学者:有时候稀里糊涂按要求作出一个程序,也不知道对不对,然后一次次的验证不仅很麻烦,还有很大几率验证不出来。真是令人头秃…在这里,我找到了几种方法来验证程序功能。

首先我们先来看一个题目:

例题:

产生四个不同的随机数,并将其存在数组里输出。

代码:
#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就可以了(笑)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值