孙志涛
湖北省武汉市水果湖高级中学(430071)
“两对相对性状的模拟杂交实验”是浙科版普通高中教科书生物学必修2第1章“遗传的基本规律”第2节“孟德尔从两对相对性状的杂交实验中总结出自由组合定律”中“活动”部分的内容。教科书中用“雄1”“雌1”两个信封各装入20张卡片(10张标有“黄Y”的卡片和10张标有“绿y”的卡片),“雄2”“雌2”两个信封各装入20张卡片(10张标有“圆R”的卡片和10张标有“皱r”的卡片),从“雄1”和“雄2”中各取一张卡片得到的字母组合代表F1(YyRr)产生的雄配子基因型,从“雌1”和“雌2”中各取一张卡片得到的字母组合代表F1(YyRr)产生的雌配子基因型,然后,将雌雄配子随机结合得到F2基因型,再重复多次得到F2的基因型及表现型的比例。
此实验在重复次数足够多时才会比较符合理论比例,其优点在于直观性强,然而要想得到较好的实验数据,需要花费较多时间。利用C语言对F1产生配子过程及雌雄配子的随机结合进行模拟,可以快速获得上万次的模拟实验结果,能大大节约实验的时间,并能在程序设计过程中锻炼学生的逻辑思维能力。
本程序基于C语言设计,首先需要使用者输入需要模拟的受精卵数量,即F2个体数量。程序的核心是模拟F1产生配子时的自由组合过程及雌雄配子的随机结合。程序中F1的基因型用AaBb表示。程序的总体思路如图1所示。
图1 程序的总体思路
利用字符数组sperm[ ]储存雄配子基因型,sperm[0]储存雄配子的A或a基因,sperm[1]储存雄配子的B或b基因。利用字符数组egg[ ]储存雌配子基因型,egg[0]储存雌配子的A或a基因,egg[1]储存雌配子的B或b基因。这样sperm[ ]和egg[ ]就分别代表雄配子和雌配子的基因型了。利用字符数组zygote[ ]储存受精卵基因型,zygote[0]和zygote[1]储存受精卵中的A、a基因,zygote[2]和zygote[3]储存受精卵中的B、b基因。
C语言的rand( )函数可以随机产生一个0到RAND_MAX(至少是32767)之间的整数,在随机产生的数中,奇数和偶数出现的概率几乎相同,可以用来模拟F1(AaBb)产生的配子中含A的配子:含a的配子=1∶1,产生的配子中含B的配子:含b的配子=1∶1。只是在每次开始模拟实验前,要用srand( )函数设置随机数种子,才能使每次产生的随机数不同。本模拟实验中使用〔srand(unsigned)time(NULL)〕来设置随机数种子,即通过获取当前时间将之作为种子值,这样每次模拟实验的具体时间不同,就能保证种子值不同,获得的随机数也能不同,充分保证了随机性。
通过rand( )函数产生一个随机数,当它为偶数时,模拟F1(AaBb)随机产生的雄配子中含A,当它为奇数时,模拟F1(AaBb)随机产生的雄配子含a,并将该字母存入sperm[0]中。重复上述方法,将随机产生的B或b存入sperm[1]中。用同样的方法模拟随机产生的雌配子,并将其A或a基因存入egg[0]中,将其B或b存入egg[1]中。这样就得到了随机产生的雌雄配子,其中字符数组sperm[ ]代表雄配子基因型,字符数组egg[ ]代表雌配子基因型。
在C语言中,每个字母都有对应的ASCII码,A的ASCII码是65,B的ASCII码是66,a的ASCII码是97,b的ASCII码是98,本模拟实验利用ASCII码之和判断雄配子类型,并进行计数。当sperm[0]+sperm[1]=131时,说明雄配子基因型是AB,此时将AB型雄配子数量+1;当sperm[0]+sperm[1]=195时,说明雄配子基因型是ab,此时将ab型雄配子数量+1;当sperm[0]+sperm[1]=163时,说明雄配子基因型是Ab或aB,再判断sperm[0]是否为A,若为A则说明雄配子基因型是Ab,此时将Ab型雄配子数量+1,否则说明雄配子基因型是aB,此时将aB型雄配子数量+1,然后用同样方法对雌配子进行计数。
将每次随机产生的sperm[ ]和egg[ ]拼接起来组合成受精卵基因型来模拟雌雄配子随机结合,并将受精卵基因型存入字符数组zygote[ ]中,存入时,字母A、a、B、b按基因型书写规范进行排序,然后再进行储存。排序方法如下:
先对sperm[0]和egg[0]进行排序,通过sperm[0]-egg[0]的值来判断受精卵的第1对等位基因是AA、Aa还是aa。当sperm[0]-egg[0]=32或-32时,说明受精卵的第1对等位基因是Aa;当sperm[0]-egg[0]=0时,说明受精卵的第1对等位基因是AA或aa,再判断sperm[0]是否为A,若为A,则说明受精卵的第1对等位基因是AA,否则,则说明受精卵的第1对等位基因是aa。然后通过赋值的方式将这对基因依次存入zygote[0]和zygote[1]中,这样就将受精卵的A/a这对基因按基因型书写规范存入字符数组zygote[ ]中对应位置了。
再对sperm[1]和egg[1]进行排序,通过sperm[1]-egg[1]的值来判断受精卵的第2对等位基因是BB、Bb还是bb。当sperm[1]-egg[1]=32或-32时,说明受精卵的第2对等位基因是Bb;当sperm[1]-egg[1]=0时,说明受精卵的第2对等位基因是BB或bb,再判断sperm[1]是否为B,若为B,则说明受精卵的第2对等位基因是BB,否则则说明受精卵的第2对等位基因是bb。然后通过赋值的方式将这对基因依次存入zygote[2]和zygote[3]中,这样就将受精卵的B/b这对基因按基因型书写规范存入字符数组zygote[ ]中对应位置了。
此时,zygote[0]、zygote[1]、zygote[2]和zygote[3]共存储了4个字母,连起来就是受精卵的基因型,并且形成的字符串的字母顺序完全符合基因型书写规范。
在C语言中strcmp( )函数用来比较两个字符串,并且区分字母的大小写,上述字符数组即可看作字符串,因此可以用strcmp( )函数依次和各种表现型的基因型进行比较来对各表现型F2进行计数。当字符数组zygote[ ]代表的字符串是AABB、AaBB、AABb或AaBb时,A_B_表现型个体数量+1;当字符数组zygote[ ]代表的字符串是AAbb或Aabb时,A_bb表现型个体数量+1;当字符数组zygote[ ]代表的字符串是aaBB或aaBb时,aaB_表现型个体数量+1;当字符数组zygote[ ]代表的字符串是aabb时,aabb表现型个体数量+1。这样就能统计各表现型F2的数目了。然后输出AB、Ab、aB、ab型雄配子之比,AB、Ab、aB、ab型雌配子之比以及A_B_、A_bb、aaB_、aabb四种表现型之比。
当模拟的F2个体数量小时,可能会出现某种基因型配子数为0的情况,此时显示的配子比直接用配子数量来表示。当各基因型配子数都不为0时,配子比保留两位小数。F2表现型之比也做同样处理。
程序代码写好后,可以在开发软件中编译成exe文件,该文件可以拷贝到任意Windows平台的电脑上运行,方便进行模拟实验。输入要模拟的F2的数量为10 000后,不到4 s便可得到F1产生的雌雄配子比和F2的四种表现型之比,如图2(a)所示。并且程序中设置了循环,运行程序后即可反复多次进行模拟实验,不需要通过重启程序来进行重复实验。另外还可以把源代码复制粘贴到手机App“C语言编译器”,点击运行即可进行模拟实验,如图2(b)所示,使用十分方便。
(a) (b)图2 程序在电脑和手机上运行图示
另外,笔者在编写程序过程中已经考虑了模拟数量自定义的问题,打开exe程序后,会提示“输入要模拟的受精卵(F2)数量”,这个数量可以在模拟实验者运行exe文件时进行自主设置,无需改动程序源代码,也无需重新编译源代码,这样大大拓展了程序的可用性,还能快速模拟探究样本数据大小对实验结果的影响,让学生体会进行统计学分析时,样本数据足够大对实验结果和结论的重要性。
在教学过程中,模拟两对相对性状的杂交实验的重点在于让学生理解自由组合定律的本质,即基因型为AaBb的个体产生的AB、Ab、aB、ab型雄(雌)配子之比为1∶1∶1∶1,在本模拟实验中,也是在保证AB、Ab、aB、ab型雄(雌)配子之比为1∶1∶1∶1及雌性配子随机结合的基础上,即模拟得到了最终的F2表现型之比9∶3∶3∶1,该模拟过程能让学生深刻理解自由组合定律的实质。并且整个程序只需要输入要模拟的F2个体数量即可完成模拟实验。模拟过程中需要学生进行程序设计的总体规划,画出程序设计流程图,这能锻炼学生的模型构建、归纳与概括、创造性思维等科学思维。对于有编程能力的学生,可以鼓励他们进行程序编写,有利于培养学生运用科学的思维方法解决实际问题的能力。