上周,结束了计算机基础这门课程的学习,感觉收获还是挺多的,通过word的学习和我自己对word的一些实践操作, 在这里主要想谈一下word在我们写毕业论文的时候的一些帮助。
我们大学毕业生完成毕业设计、撰写毕业论文的时候,大家往往要苦熬一个多月才能完成自己的毕业论文。现在大家主要都是用Microsoft Word来编辑论文。如果不能充分Word的一些强大功能,大家在撰写和编辑较长篇幅的科技论文的时候,可能经常要为不断地调整格式而烦恼。在这里我把自己以前使用Word的经验和教训总结一下,以求抛砖引玉。
一篇论文应该包括两个层次的含义:内容与表现,内容是指文章作者用来表达自己思想的文字、图片、表格、公式及整个文章的章节段落结构等,表现则是指论文页面大小、边距、各种字体、字号等。相同的内容可以有不同的表现,例如一篇文章在不同的出版社出版会有不同的表现;而不同的内容可以使用相同的表现,例如一个期刊上发表的所有文章的表现都是相同的。这两者的关系不言自明。
论文“表现”的编辑,是一个非常费时费力的工作。如果在写论文之前,做了各方面的准备,并按照一定的规律来编写和排列,会起到事半功倍的效果。
1、
编写论文,一定要使用样式,除了Word原先所提供的标题、正文等样式外,还可以自定义样式。 如果你发现自己是用选中文字然后用格式栏来设定格式的,一定要注意,想想其他地方是否需要相同的格式,如果是的话,最好就定义一个样式。对于相同排版表现的内容一定要坚持使用统一的样式,这样做能大大减少工作量和出错机会。如果要对排版格式(文档表现)做调整,只需一次性修改相关样式即可。使用样式的另一个好处是可以由 Word 自动生成各种目录和索引。 2、
一定不要用手动敲空格来达到对齐的目的。只有英文单词间才会有空格,中文文档没有空格。所有的对齐都应该利用标尺、制表位、对齐方式和段落的缩进等来进行。如果发现自己手动打了空格,一定要谨慎,想想是否可以通过其他方法来避免。同理,一定不要通过敲回车来调整段落的间距。
3、
论文中会用到很多图表,我们一定要分清论文中的图形和表格,表格可以使用Word提供的工具进行编写,很简单,这里就不再赘述了。框图和流程图的编辑,可以使用Office 2003中绑定的Microsoft Office Visio Professional 2003画。
4、
Word中还有一个很重要也很常用的技能-编辑数学公式,个人建议使用MathType5.0,其实Word集成的公式编辑器就是它的3.0版。安装MathType后,Word会增加一个菜单项,其功能一目了然。推荐使用 MathType 的自动编号和引用功能,这样首先有良好的对齐效果,还可以自动更新编号。Word 正文中插入公式的一个常见问题是把上下行距都撑大了,很不美观,这部分可以通过固定行距来修正,如果你计算机上安装了MathType5.0后,撰写公式的速度非常快,占用少量的CPU。但是,当你准备打印论文的时候,要记得找个按照了MathType5.0的计算机打印,不然,我们的公式就“不翼而飞”了。
5、
论文中一般都含有大量的表格,所以表格的对齐就显得很重要了,整个表格的水平对齐:选定整个表格(包括表格右侧所有换行符)后,即可按格式工具栏上的左、右、居中对齐等按钮进行整个表格的水平对齐。(如未选定所有换行符,上述操作则只对单元格中的文字内容进行水平对齐。)选定行的水平对齐,可以通过“单元格高度和宽度”对话框中的“对齐”设置。利用表格工作栏还可对表格内容进行垂直对齐。对齐表格中的内容:在表格中也可用制表位对齐文本内容。按CTRL+TAB组合键即可在单元格中插入一个制表位。
6、
我们知道,Word提供了各式各样的模板,当我们在制作专业的文档之前,看看有没有现成的模板可用,如果答案是肯定的,那么就发挥“拿来主义”的精神吧,如果没有我们也可以借鉴标准模板来进行改进,当自己的文章有自己的独特风格,是不是感觉很好呢?下面就介绍一下使用其它模板改变现有文档的风格的方法。
具体操作方法如下:
在当前文档打开的情况下,选择菜单“格式→主题”命令,打开“主题”对话框,单击“样式库”按钮,显示“样式库”对话框,在左侧的“模板”列表框中选择一个模板,比如“典雅型报告”,单击“确定”按钮(图 28),返回Word编辑界面,可以看到当前文档的外观按照“典雅型报告”模板的样式风格显示。
该方法也可以用于当你把文档制作完成后,发现先前为文档选择的模板并不适合,需要为文档更换一个模板的情形。
还有很多word的技巧也对我们将来写毕业论文很有帮助,除了word,excell,powerpoint等也很有用处,学好了对我们将来也是有不小的帮助,以上就是我的一点点小体会。
第二篇:计算机算法设计与分析学习心得
计算机算法设计与分析小论文 ——回溯法精髓 计算机科学系06级(1)班 李元锁 学号:20061081135 摘要:
计算机算法设计与分析课程已经结束 ,为了充分理解算法分析的思想,能利用算法思想解决实际问题,而回朔法是算法分析中的精华,所以充分体现课程的真正目的特写此论文。
关键字:回溯法,着色
回溯法背景: 回溯法也称为试探法,该方法首先暂时放弃关于问题规模大小的限制,并将问题的候选解按某种顺序逐一枚举和检验。当发现当前候选解不可能是解时,就选择下一个候选解;倘若当前候选解除了还不满足问题规模要求外,满足所有其他要求时,继续扩大当前候选解的规模,并继续试探。如果当前候选解满足包括问题规模在内的所有要求时,该候选解就是问题的一个解。在回溯法中,放弃当前候选解,寻找下一个候选解的过程称为回溯。扩大当前候选解的规模,以继续试探的过程称为向前试探。
1、回溯法的一般描述
可用回溯法求解的问题P,通常要能表达为:对于已知的由n元组(x1,x2,?,xn)组成的一个状态空间E={(x1,x2,?,xn)∣xi∈Si ,i=1,2,?,n},给定关于n元组中的一个分量的一个约束集D,要
求E中满足D的全部约束条件的所有n元组。其中Si是分量xi的定义域,且 |Si| 有限,i=1,2,?,n。我们称E中满足D的全部约束条件的任一n元组为问题P的一个解。
解问题P的最朴素的方法就是枚举法,即对E中的所有n元组逐一地检测其是否满足D的全部约束,若满足,则为问题P的一个解。但显然,其计算量是相当大的。
我们发现,对于许多问题,所给定的约束集D具有完备性,即i元组(x1,x2,?,xi)满足D中仅涉及到x1,x2,?,xi的所有约束意味着j(j<i)元组(x1,x2,?,xj)一定也满足D中仅涉及到x1,x2,?,xj的所有约束,i=1,2,?,n。换句话说,只要存在0≤j≤n-1,使得(x1,x2,?,xj)违反D中仅涉及到x1,x2,?,xj的约束之一,则以(x1,x2,?,xj)为前缀的任何n元组(x1,x2,?,xj,xj+1,?,xn)一定也违反D中仅涉及到x1,x2,?,xi的一个约束,n≥i>j。因此,对于约束集D具有完备性的问题P,一旦检测断定某个j元组(x1,x2,?,xj)违反D中仅涉及x1,x2,?,xj的一个约束,就可以肯定,以(x1,x2,?,xj)为前缀的任何n元组(x1,x2,?,xj,xj+1,?,xn)都不会是问题P的解,因而就不必去搜索它们、检测它们。回溯法正是针对这类问题,利用这类问题的上述性质而提出来的比枚举法效率更高的算法。 回溯法首先将问题P的n元组的状态空间E表示成一棵高为n的带权有序树T,把在E中求问题P的所有解转化为在T中搜索问题P的所有解。树T类似于检索树,它可以这样构造:
设Si中的元素可排成xi(1) ,xi(2) ,?,xi(mi-1) ,|Si| =mi,i=1,2,?,n。从根开始,让T的第I层的每一个结点都有mi个儿子。这mi个儿子到它们的双亲的边,按从左到右的次序,分别带权xi+1(1) ,xi+1(2) ,?,xi+1(mi) ,i=0,1,2,?,n-1。照这种构造方式,E中的一个n元组(x1,x2,?,xn)对应于T中的一个叶子结点,T的根到这个叶子结点的路径上依次的n条边的权分别为x1,x2,?,xn,反之亦然。另外,对于任意的0≤i≤n-1,E中n元组(x1,x2,?,xn)的一个前缀I元组(x1,x2,?,xi)对应于T中的一个非叶子结点,T的根到这个非叶子结点的路径上依次的I条边的权分别为x1,x2,?,xi,反之亦然。特别,E中的任意一个n元组的空前缀(),对应于T的根。
因而,在E中寻找问题P的一个解等价于在T中搜索一个叶子结点,要求从T的根到该叶子结点的路径上依次的n条边相应带的n个权x1,x2,?,xn满足约束集D的全部约束。在T中搜索所要求的叶子结点,很自然的一种方式是从根出发,按深度优先的策略逐步深入,即依次搜索满足约束条件的前缀1元组(x1i)、前缀2元组(x1,x2)、?,前缀I元组(x1,x2,?,xi),?,直到i=n为止。 在回溯法中,上述引入的树被称为问题P的状态空间树;树T上任意一个结点被称为问题P的状态结点;树T上的任意一个叶子结点被称为问题P的一个解状态结点;树T上满足约束集D的全部约束的任意一个叶子结点被称为问题P的一个回答状态结点,它对应于问题P的一个解。
2、回溯法的方法
对于具有完备约束集D的一般问题P及其相应的状态空间树T,利用T的层次结构和D的完备性,在T中搜索问题P的所有解的回溯法可以形象地描述为:
从T的根出发,按深度优先的策略,系统地搜索以其为根的子树中可能包含着回答结点的所有状态结点,而跳过对肯定不含回答结点的所有子树的搜索,以提高搜索效率。具体地说,当搜索按深度优先策略到达一个满足D中所有有关约束的状态结点时,即“激活”该状态结点,以便继续往深层搜索;否则跳过对以该状态结点为根的子树的搜索,而一边逐层地向该状态结点的祖先结点回溯,一边“杀死”其儿子结点已被搜索遍的祖先结点,直到遇到其儿子结点未被搜索遍的祖先结点,即转向其未被搜索的一个儿子结点继续搜索。
在搜索过程中,只要所激活的状态结点又满足终结条件,那么它就是回答结点,应该把它输出或保存。由于在回溯法求解问题时,一般要求出问题的所有解,因此在得到回答结点后,同时也要进行回溯,以便得到问题的其他解,直至回溯到T的根且根的所有儿子结点均已被搜索过为止。
例如在组合问题中,从T的根出发深度优先遍历该树。当遍历到结点(1,2)时,虽然它满足约束条件,但还不是回答结点,则应继续深度遍历;当遍历到叶子结点(1,2,5)时,由于它已是一个回答结点,则保存(或输出)该结点,并回溯到其双亲结点,继续深度遍历;当遍历到结点(1,5)时,由于它已是叶子结点,但不满足约束条件,
故也需回溯。
3、回溯法的一般流程和技术
在用回溯法求解有关问题的过程中,一般是一边建树,一边遍历该树。在回溯法中我们一般采用非递归方法。下面,我们给出回溯法的非递归算法的一般流程:
在用回溯法求解问题,也即在遍历状态空间树的过程中,如果采用非递归方法,则我们一般要用到栈的数据结构。这时,不仅可以用栈来表示正在遍历的树的结点,而且可以很方便地表示建立孩子结点和回溯过程。
问题描述 :
对一张地图,可以用不超过4种颜色对其填色,使得相邻的区域填上不同的颜色。现在我们就来模拟这一填色过程,输入一张行政区地图,用4种颜色对其填色,要求相邻的行政区域内没有相同的颜色,给出所有的填色方案,并统计方案的个数。
数据描述 :
首先考虑如何存储行政区地图,由于邻接矩阵能更好地描述各行政区之间的关系,我们采用邻接矩阵G来存储地图。邻接矩阵G可以用二维数组表示;另设一维数组color[i]记录第 i(i=0...n-1)个行政区所填的颜色,分别取值为:{1(红),2(黄),3(蓝),4(绿)};数据描述如下:
int G[n][n];
int color[n+1];
算法描述:
该问题的实现是从第一个行政区到最后一个行政区依次填色的过程,如果采用递归的算法,可以简单描述如下: Void trycolor(&color[],i){
// 设前i-1个行政区已经填好颜色,现对第i个行政区用递归法填色;
for (c=1;c<=4;c++)
{对第i个行政区填上c颜色;检查其合法性;
if (合法)
if (i<n) tricolor(&color[],i+1); //递归
else 打印一种填色方案; //递归出口 } //end_for
} //end_tricolor
如果采用非递归的算法,可用试探和回溯来实现:对每一个行政区(用邻接矩阵表示后,可称为结点)先试填一个颜色,在确定其合法性后,再填下一个结点;如果4种颜色都填完后仍不合法,就回溯到上一个结点重新填色。算法描述如下:
Color[0..n-1]=0; 选择第一个行政区为当前要处理的结点; do
{
将当前结点顺序向后试填一个颜色;
if (所填颜色合法)
当前区域确定了所填的颜色;
if (当前结点是最后一个区域)
{打印一种填色方案;if (所填颜色是4) 回溯到上一个结点继续填色;}
else 下一个结点设为当前结点;
else if (所填颜色是4) 回溯到上一个结点;} while(所有的结果都试探完);
现在的问题是:如何确定合法的填色?设前i-1个行政区已经填好颜色,现对第i个行政区填色c,通过邻接矩阵的定义,我们可以分析出这样的结论:
for (k=0;k<=i-1;k++)
if (color[k]*G[i][k]==c)
{i与第k个结点相邻并同色,c是不合法的};
所以我们可以用color[k]*G[i][k]!=color[i]来确定当前color[i]的颜色是合法的。
如何回溯?如果对当前结点,从颜色1到颜色4都不合法,则要退到上一个结点重新填色,如果上一个结点也填了4种颜色,就继续后退;这就是回溯的思想。
源程序:
#include<stdio.h>
#define n 10
int G[n][n]={{1,1,0,1,0,1,0,0,0,0},
{1,1,1,1,0,0,0,0,0,0},
{0,1,1,1,1,0,0,0,0,0},
{1,1,1,1,1,1,1,0,0,0},
{0,0,1,1,1,0,1,0,0,0},
{1,0,0,1,0,1,1,1,0,0},
{0,0,0,1,1,1,1,1,0,1},
{0,0,0,0,0,1,1,1,1,1},
{0,0,0,0,0,0,0,1,1,1},
{0,0,0,0,0,0,1,1,1,1}};
void backtrack(int color[],int *i) /*回溯过程*/ {if (*i>0)
while (color[*i]==4) (*i)--;
}
int check(int color[], int *i) /*检查是否合法*/
{int k,b;
b=1;
for(k=0;k<=*i-1;k++)
if (color[k]*G[*i][k]==color[*i]) b=0; if (b) return 1;
else return 0;
}
void print (int color[]) /*打印一种填色方案*/
{int k;
for (k=0;k<n;k++)
printf("%d",color[k]);
printf("\n");
}
void main(){
int i,total=0;
int color[n];
for(i=0;i<n;i++) color[i]=0;
i=0;
do
{color[i]++;
if (check(color,&i))
if (i==n-1) { print(color); total++; if
backtrack(color,&i);
}
else {i=i+1;color[i]=0;}
else
if (color[i]==4) backtrack(color,&i); (color[i]==4)
}while (i); printf("\n");
printf("total=%d",total); scanf("\n");
}
运行结果:
????????????
总结:
本实验给出的方法称为回溯,这种方法可以试探性地按一定的规律例举出所有的可能性,最终找到目标结点。一般性的回溯问题可用以下 算法简单描述其思想:
初始化;
do {
可行(合法)则进; //按一定顺序试探前进
不行(不合法)则换; //判断其可行性,对不可行的换成下一个试探
换不成则退; //对当前结点所有试探都不可行,回溯到上一个结点
}while(所有试探都完成);
参考文献:
《计算机算法设计与分析》 王晓东 编著
《算法设计与分析习题集》
《算法设计与分析实验指导》
致谢:
谢谢老师的指导,学习算法分析与设计使我对软件基础知识中算法的地位有了充分的了解,虽然课程结束了,但我依然还会继续学习算法分析与设计,以后我将充分利用所学到我实际的开发项目中。