电子实习报告
这次电子实习的目的是为了提高我们的编程能力,与上次的电工实习一样重要,要成为一名合格的大学本科毕业生,这是一个不可或缺的环节,所以我们要把握好这次机会,全力以赴,做到更好。
(一)需求分析
这次实习,每个同学的题目都不一样,这才能考验学生的水平嘛,我的题目是:编写二分法查法的图形演示程序,用箭头跟踪指示出二分查过程中的查位置。当我刚拿到题目的时候,顿时吃了一惊,这也太难了,让我用二分法查一个 数还说的过去,那个我们学过,可是要用箭头跟踪指示出来可就让我大伤脑筋,用C语言绘图我们压根就没学过,我还想跟指导老师好好商量商量,让她多给点提示,可是仔细一想,要是我学过,这两个星期都花上面都不合算,这也就是实习的目的所在啊,就的现学现用,顺便培养一下我们的自学能力,真是一箭双雕啊。
接着,还是在指导老师的指点下,我先去图书馆相关的资料,用是碰钉子了, C语言这
方面的书是少之又少,而且也 是盲目的在那翻阅,见与绘图有关的书都翻翻,还是没有头绪,最后借了本C语言精彩编程。接着我又借了一本C图象处理编程,只有这两本书的紧密结合才能编出我那程序。
首先我的想法是只在Borland C++这个环境下完成,先把头绪给理清一遍,从我这题目中可以看到,要编出来主要有两大步:二分法和跟踪箭头。这二分法查要求被查的数据是按照某种顺序排列的有序序列,因此应该先将数据排序,再用二分法查要查的数据。二分法查又称折半查,是一种效率高的有序顺序表上的查方法,下面讨论一下二分查的实现方法:
设顺序表存储在一维数组S中,设置三个变量low,high和mid,它们分别指向当前查范围的下界,上界和中间位置。初始化时,令low=0,high=n-1,设置待查数据元素的关键字为key.
(1)mid=[low+high/2].
(2)比较Key与s[mid].key值的大小,若s[mid].key= Key,则查成功,结束查,若s[mi
d].key〈Key,表明关键字为Key的记录可能在于记录s[mid]的后半部分,修改查范围,令下界指示变量low= mid+1,上界指示变量high的值保持不变。若s[mid].key〉Key,表明关键字为Key的记录只可能存在于s[mid]的前半部,修改查范围,令high = mid-1,变量low保持不变。
(3)当前变量low与high的值,若low 〈=high,重复执行第(1)步和第(2)步,若low 〉high,表明整个表已经查完毕,表中不村在关键字为的Key记录。
当然这里边也用到了冒泡排序法,所谓的冒泡排序就是指按增加或减少的顺序对一组类似的信息重新进行安排的过程。一般来说,当对信息进行排序时,只有信息中的某一小部分被用作排序的关键字,根据关键字对各元素进行比较。当必须要进行比较时,彼此交换的则是整个元素。
以上是对数据的查方法的分析,下面就具体说说跟踪箭头的问题:
对于这个箭头也就是光标了,这用到了C语言的图象处理,有对光标的控制程序和显示程序。光标的显示是动态图象,即一个移动的图象在屏幕上的运动,它到某处就遮盖掉部分
背景,当再移到别处时原来被覆盖的内容应该被恢复,否则画面要被移动的图象所破坏。动态显示一般由下列4个步骤组成:
(1)图符与背景的异或来实现。第1次异或显示光标,第2次异或恢复背景。16图形显示中的光标通常采用次法,WINDOWS图形编程中还时常采用这种方法。
(2)存储背景参数(字符`图象名称等),恢复时再重新生成。文字画面或下拉式菜单等通常采用此法。DOS环境下的字处理软件常采用这种方法。
(3)用存储背景图象像素数据的方法来实现。用get_image()子程序保存背景的图象数据,以后用put_image()子程序恢复数据。复杂的图象画面通常采用的方法。
(二)程序设计
本程序用到好几种数据类型,有整型,结构体,字符型
主函数的流程图如下:
开始 |
输入要从多少个数中查 |
输入那些具体数据 |
输入要查的那个数 |
调用排序函数bubblesort() |
调用那写生成箭头的函数settextstyle,inttoch等 |
调用二分法查函数binarysearch |
结束 |
这就是主函数的流程图。
(三)调试分析
在运行过程中,就是刚开始接触Turboc的时候很不了解,因为这那环境下,鼠标不能用,只能用键盘操作。
(1)编好的文件也不知道怎么在Turboc下打开,摸索后才发现可以在load中打开,不过的先把文件放在Turboc文件下。
(2)这也是调试时出现的错误,本以为程序应该没多大问题了,可出来五个错误,真让我束手无策,同样也是经过许久才到问题所在,没改路径,所以有好多文件就不
。这就是那个没修改路径出来错误的界面。出现这些错误都是因为我对那个Turboc环境不熟悉。
在运行中也遇到问题,比如说,如果我查的范围稍微大点,结果可能就看不到,因为设置的时候就出了点问题。这个问题后来也解决了,改进了一下程序,将运行的演示过程切换到另下一个屏幕,所以数据再多也可以显示。
(四)使用方法
本程序是为了用二分法查法的图形演示,可以有箭头跟踪指示出二分查过程中的位置。使用方法如下几步:
1.进入turboc或VC界面下,打开文件ERFENFA.C,在去OPTION—》DIRECTION中修改路径。
2.CTRL+F9运行程序。
3.运行界面会提示:Please input the stall number:用户就可以输入你要从几个数中查,但不超过二十个(这是程序设计),输完敲回车。
4.运行界面会提示:Please input yours numbers:用户可以输入你那些数据,输完敲回车。
5.运行界面会提示:Please input the key number:用户应该输入你要查的那个数,当然这个数必须是你上面数据中的一个,输完敲回车。
6.你就可以看到查的整个演示过程。
以上六步就是对本程序的使用步骤。
(五)测试结果
1)测试数据
Please input the stall number(<=20):11(要查的总数)
Please input the 1 number:1
Please input the 2 number:2
Please input the 3 number:3
Please input the 4 number:4
Please input the 5 number:5 (列出所有数据)
Please input the 6 number:6
Please input the 7 number:7
Please input the 8 number:8
Please input the 9 number:9
Please input the 10 number:0
Please input the 11 number:98
Please input the key number:1 (要查的数)
2)测试结果
没到能拷贝的方式
(六)注释原代码
#include"stdio.h"
#include"graphics.h"
#include"conio.h"
#define maxsize 20
typedef struct
{int key;int dress[2]; //保存数据key在屏幕上显示的位置
}st; //定义结构体
typedef struct
{st data[maxsize];
int size;
}seqlist;//顺序表
seqlist s; //全局变量
char ch[6];//全局字符数组变量
void inttoch(int x,int *n)//整形数据转换字符串函数
{int i=x,j=0;
while(i>9)//计算整数的位数
{i/=10;
j++;}
i=x;
*n=j;//返回整数的位数
ch[j+1]='\0';//在字符串数组末尾添加\0,用于打印判断
do//整数转换为字符串,从低位开始
{ch[j]=i%10+48;
i/=10;
j--;
}while(i>9);
if(i>0)
ch[j]=i+48;
}
void draw(int x,int y)//画箭头函数,(x,y)为整数在屏幕上显示的坐标
{ moveto(x,y+25);//把光标移到这个坐标
lineto(x+5,y+14);//从上面那个坐标到这个坐标画直线lineto(x+10,y+25);//从上面那个坐标到这个坐标画直线
moveto(x+5,y+14);//把光标移到这个坐标
lineto(x+5,y+29);//从上面那个坐标到这个坐标画直线
}
int binarysearch(seqlist s,int x)//二分查
{ int low=0,high=s.size-1;
int mid,col;
col=getbkcolor();//获取屏幕背景颜
while(low<=high)
{ mid=(low+high)/2;
setcolor(4);//设置画笔颜为红
draw(s.data[mid].dress[0],s.data[mid].dress[1]);//开始画箭头
if(s.data[mid].key==x)
return 1;
else if(s.data[mid].key<x)low=mid+1;
else if(s.data[mid].key>x)high=mid-1;
sleep(2);//暂停2秒
setcolor(col);//设置画笔颜为背景,也就是把先前的箭头变为背景
c语言的冒泡排序算法 draw(s.data[mid].dress[0],s.data[mid].dress[1]);//开始画箭头
}
return -1;
}
void bubblesort()//冒泡排序,对顺序表排序(从小到大)
{ int i,j,flag=1;
st temp;
for(i=1;i<s.size&&flag==1;i++)
{
flag=0;
for(j=0;j<s.size-i;j++)
if(s.data[j].key>s.data[j+1].key)
{ flag=1;
temp=s.data[j];
s.data[j]=s.data[j+1];
s.data[j+1]=temp;
}
}
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论