文章目录

实验题:
B.7 BSC模拟器

要求:

允许使用的编程语言:c、c++、Basic、pascal、fortran、java、tk/tcl。

输入:BSC信道的错误概率,任意的二进制序列。

输出:经BSC信道传输后的二进制序列。

源程序格式整齐清晰,注释简单明了。

分析:

BSC信道的传输原理很简单,即二元对称信道。输入部分将待编码的数据存入一维数组即可,而传输错误概率经输入后存入一float型变量中,将其乘以100放大至0到100以内,存入rand_num中,留下面的处理函数判断用。然后通过调用专门的函数bsc(input,rand_num)来按位处理先前输入的数据,最后通过数组直接返回处理好的值,直接输出即可。

Bsc函数详细解释,bsc(input,rand_num),input为传入数组参数,rand_num为传入的处理好的错误概率。在bsc函数中,通过系统自带的rand函数来模拟随机事件(信道传输)发生的概率,即用“r=rand()%100+1”语句产生一个0到100的随机数,与输入的错误概率进行比较,若r大于等于rand_num则表示信道传输此位信号进入正确区间,否则进入错误区间。当进入正确区间时,保持该位数值不变,当进入错误区间时,将该位置反。如此,便完成了BSC信道模拟的核心功能。

源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 
#include<stdlib.h>
#include<iostream.h>
#include<time.h>
 
void main(){
void bsc(int c[],float x);
float rand_num;
float p;
int input[10];
int i;
cout<<”请输入错误概率”<<endl;
cin>>p;
rand_num=100*p;
cout<<”请输入需要传输的二进制序列,长度为10,以空格分割。”<<endl;
for(i=0;i<=9;i++){
cin>>input[i];
}
cout<<”输入的二进制序列为:”;
for(i=0;i<=9;i++){
cout<<input[i];
}
cout<<endl;
bsc(input,rand_num);
cout<<”—————————————————-”<<endl;
cout<<”输出的二进制序列为:”;
for(i=0;i<=9;i++){
cout<<input[i];
}
cout<<endl;
};
 
void bsc(int c[], float x){
int i;
int r;
srand(time(0));
for(i=0;i<=9;i++)
{
r=rand()%100+1;
if (r>=x)
{         /*表示进入正确区间*/
c[i]=c[i];
}
else
{           /*表示进入错误区间*/
if(c[i]==0)
c[i]=1;
else c[i]=0;
}
}
}

实验结果:

Test1:

Test2:

Test3:

总结:

在程序编写调试的过程中,开始时出现了一个问题,每次执行时输出结果要么和输入完全相同,要么和结果完全不同,无论错误概率如何变化都是如此。经下断点单步调试后发现每次rand函数产生的值在一次输入的情况下完全相同,由此导致了结果的错误,后经查阅资料得知,只需在rand函数之前加一句“srand(time(0))”清零语句即可,后成功规避错误。


如果觉得文章很有趣或对你带来了帮助,欢迎请我喝杯咖啡哦~

文章目录