资源描述
ACM竞赛与学生综合实践能力培养
1ACM竞赛的背景<br> <br> ACM国际大学生程序设计竞赛(ACM International Collegiate Programming Contest,ACM ICPC)始于1970年,作为一种全新的发现和培养计算机科学顶尖人才的途径,竞赛很快得到美国和加拿大各大学的积极响应。1977年,在ACM计算机科学会议期间,举办了首届总决赛,由此拉开了一年一度的国际大学生程序设计竞赛的帷幕。<br> 30多年来,ACM ICPC由最初的美国、加拿大,拓展到了北美洲、拉丁美洲、欧洲、亚洲、大洋洲和非洲,成为世界性的赛事。2008年,参加各大洲预赛的队伍有来自88个国家(地区)1,838所大学的7,109支代表队,从中产生的100支队伍参加了2009年4月在瑞典斯德哥尔摩举行的世界总决赛。<br> 中国大陆从1996年开始设立ACM ICPC亚洲区预赛赛区并参与此项赛事,越来越多的高校参与其中,尤其是2005年以后,参赛势头更是如火如荼。2008年,亚洲区预赛共设立15个赛区,中国大陆占5席,有近5000支队伍参加了各赛区的网络预赛,近480支队伍参加了现场赛,最终有15支队伍进入总决赛。<br> <br> <br> 2ACM竞赛的价值<br> <br> ACM ICPC的价值和意义主要体现在两个方面,一是竞赛模式新颖,有利于培养学生的编程实践能力,二是对参赛选手的综合素质要求高,有利于培养学生的创新实践意识。<br> ACM ICPC的竞赛模式如下:<br> (1) 题目类型比较杂,涉及知识面比较广,只要能够编程的问题都可以纳入竞赛题目范围。每个题目都需要经过研读、分析、确定算法,然后编程的过程。<br> (2) 采用在线测评系统进行评判,对提交程序的要求不仅包括正确性,还包括对运行时间、占用内存和输入输出格式的限制。<br> (3) 所有的题目均采用英文命题。<br> (4) 每个参赛队伍由3人组成,比赛时每个队使用一台机器解答问题。<br> (5) 比赛题目都是由专门机构负责制作的,每次赛事都由不同的人出题,题目的风格、类型、难易度都有很高的不确定性。<br> (6) 比赛时间5小时,一共10个题目,100支队伍同场竞技,看谁做出来的题数多、用时少。<br> ACM ICPC对参赛选手的素质要求有:<br> (1) 算法实现能力。即编写代码、调试程序的能力。根据ACM ICPC的规则,在5个小时内解题数最多、用时最少的为冠军,所以算法实现能力是基础。<br> (2) 通晓各种算法。熟悉各种算法,对常用的算法达到信手拈来的程度。<br> (3) 算法选择能力。面对实际问题,在最短时间内确定最优算法。<br> (4) 数学知识。包括图论、组合数学、数论、几何等,就目前的情况而言,数学知识对选手取得好成绩是很重要的。<br> (5) 英文阅读能力。<br> (6) 团队合作能力。每支参赛队由3人构成,共用1台机器。什么样的人组成一个队伍、如何分工、如何协作、如何决策等,都有很多学问。<br> (7) 创新能力。其他的都是基础,唯有创新能力才是根本,这是所有竞赛的特点。ACM ICPC的题目涉及各个领域,类型包罗万象。不是所有的问题都有现成的算法,更多的时候需要在现有算法的基础上进行创新,有时候甚至需要观念创新、思维创新。<br> 正是ACM ICPC对提高学生综合能力尤其是创新能力的价值,深深地吸引了国内外高校和莘莘学子,他们以不同方式、不同程度地介入这项赛事,这也进一步提高了这项赛事的价值。<br> <br> 3我国参加ACM竞赛情况<br> <br> 3.1参赛学校的类型<br> 我国高校开展ACM ICPC活动的情况各不相同,时间有先有后,程度有深有浅,广度有宽有窄,力度有大有小,成绩有高有低。但无论怎样,各高校的积极性越来越高,规模越来越大。以黑龙江省为例,2005年以前只有哈工大参与这项赛事,而从2006年开始,已经连续举行了三届省赛,省内几乎所有高校都参加了网络赛和现场赛。<br> 在开展ACM ICPC的过程中,各校采取的模式不尽相同,这主要取决于学校的特点。有些学校有众多优秀的OI(信息学奥林匹克)选手,这些学生在高中阶段就参加信息竞赛,有良好的基础,自然就成为该校的ACM ICPC选手,他们要做的就是在大学继续高中阶段的竞争。这类学校的学生基础好,有助于在全校范围开展ACM ICPC活动,同时也是各种赛事中取得好成绩的保障。<br> 另一些学校也有优秀的OI选手,虽然人数不多,但是犹如种子,可以生根、发芽、结果。他们可以影响和带动其他同学,使之成为和他们一样优秀的ACM竞赛选手。这类学校一般对ACM ICPC都比较重视,全校性的活动开展得很好,各种赛事的成绩也很突出。<br> 更多的学校属于白手起家,没有优秀的OI选手,一切从零做起。这类学校开展ACM ICPC的基础比较薄弱,开展这项赛事的目标更多的不是取得成绩,而是拓展学生综合能力的空间。比较而言,虽然这类学校的成绩不是最好,但是进步是最大的。他们中许多人在上大学前从来没编过程序,通过ACM ICPC,他们可以参加赛区比赛,获得铜牌、银牌甚至金牌,对他们来说变化是巨大的。<br> 3.2选拔和培养参赛队员的途径<br> 对于很多学校来说,如何挖掘有潜力的ACM参赛队员,是要解决的第一个问题。众所周知,数据结构和算法是ACM ICPC的核心,但如何发掘从没有接触过这方面知识的人的潜力呢?本质上看,数据结构和算法都是数学范畴的知识,所以数学成绩好要比数学成绩不好的学生潜力大,但并不否认某些特例。现今ACM ICPC中有一类题目是直接的数学题,与其说是考察学生的程序设计和算法,不如说是考察数学水平。这类数学问题大多涉及组合数学、数论等知识,没有接触过这些知识的人很难完成这样的题目。另外,良好的抽象思维及严密的逻辑思维也能反映出这个人在数据结构和算法上的潜力。因此,学校可以通过测试学生数学水平和逻辑抽象能力选拔队员,也可以根据每个人的性格特点或思维习惯辅助选拔。<br> 队员经过选拔后面临的问题是怎样进行训练。因为教师的参赛经验并不丰富,所以可行的办法是高年级带低年级,形成一个团队,队员之间鼓励相互学习,相互分享知识和经验。不仅让学生学到知识,更要让他们知道要学什么,怎样学以及自己怎样提高,学会解决问题,独立探索,吃苦耐劳,这对学生的发展和综合能力的提高是大有裨益的。我们以上总说数据结构和算法,而不直接说ACM ICPC,因为ACM ICPC从根本上还是一个竞赛,而竞赛不免会包含很多不确定因素,队员的成绩未必就代表队员的水平,所以平时的心理素质训练也是不可或缺的。<br> 如何培养参赛选手是第二个要解决的问题。大多数参赛选手大学前没有接触过这些知识,所以他们首先要适应ACM ICPC编程比赛。ACM ICPC比赛追求的是速度、准确、创新,这就要求选手的思维和编程速度都很快。平时的训练大家不仅要攻克难题,提高能力,还要适当模拟正式比赛,让选手能够适应正式比赛的紧张气氛。比赛策略的训练也很重要,如三个人的配合问题、题目完成的顺序问题等。选手的知识储备不仅要广博,而且要有自己的“杀手锏”,即每个人都要有自己的专长,达到一看这些知识的题目就能立即完成的水平。当然,随着大赛的普及,题目的类型不再可以明确区分,这就更要求选手有足够多的知识储备、足够强的个人能力及一定的分析融合能力。在题目的选择上也应有取舍,选择有研究价值的题目训练。<br> 在ACM ICPC中,学生是永恒的主角,他们承担培训、集训、宣传、选秀等工作,教师永远是做引导、服务工作的配角。很多学校已经形成了以老带新的传统,一年一年下来,形成一种机制,这正是ACM ICPC培养学生综合能力的核心,而在这种机制中,老队员和新队员都得到了很好的自我锻炼和提高的机会。<br> </p> <p> <p><br> 4我校将ACM竞赛融入教学<br> <br> 和体育运动类似,要想在ACM ICPC中获得好成绩,必须有广泛的群众基础,尽可能让更多的学生受益,提高学生的整体编程水平。从2004年起,哈工大便将ACM ICPC引入计算机学院本科一年级的程序设计课程中,激发学生对ACM ICPC的兴趣,吸引更多学生投身到此项活动中。<br> 我们的具体做法是:<br> (1) 将ACM ICPC题目作为实验,加大实验成绩比重<br> 在百分制评定中,将实验(共10次)成绩的比重加大到50分,督促学生重视每次实验。实验题目以ACM ICPC题目为主,有一定的实际背景,但都没有标准答案,学生要根据所学知识做出解答,每个题目的解决方法有很多。<br> 多数题目的解决过程是这样的:首先使用最常规、最自然的思维方式解决实际问题,然后考虑时间效率较低或空间占用较大的情况,如果新方法不是最好的,还有没有更好的方法呢?这往往需要花费更多的时间和精力,也是学生收益最多的地方。对于教学管理来讲,这种具有明确输入、输出形式的实验可以由机器自动评判成绩,减轻了教师的工作量,使这项工作得以顺利开展。<br> 为了保证学生实验的质量,避免雷同情况的发生,我们引入了Moss(Measure of Software Similarity)雷同判别程序,促使学生通过自己的思考和努力独立完成实验。另外,如何从解题思路、程序风格等方面细致评判学生的实验完成情况,给出个性化的实验评语,也是亟待解决的一个问题。为此,需要大量的学生TA(Teaching Assistant)辅导实验,即每半个班级安排一名学生TA,对其负责的学生进行实验课上实时答疑,课下登录课程论坛随时答疑。同时,学生TA还对所负责同学的实验进行评判,做到仔细阅读每行代码,公正评判,给出详细的扣分原因及程序改进建议。学生TA由编程经验丰富的博士生、硕士生甚至本科生担任。<br> 学生实验情况调查显示,39.4%的学生认为“作业偏难,需要花费大量精力完成,但是从中收获很多”,有35.2%的学生认为“作业难度适中,较好地锻炼了编程能力”。可见,大部分学生对这种实验方式表示认可,并通过实验锻炼了实际动手能力。<br> (2) 培养拔尖人才,给学有余力的学生“吃小灶”<br> 仅通过完成实验培养出优秀的ACM ICPC选手困难较大,因此我们用多种精神和物质奖励刺激拔尖人才的快速进步。完成大量的题目是取得优异成绩的基础,所谓熟能生巧,量变引起质变。我们引入竞争机制,将学生在HOJ(HIT Online Judge)上的做题数进行实时排序,如图1所示,学生做题数目稳步增长,最终
<P>证券业涉计算机之经济分析</P>
<P> 关键词:电子政务;计算机;证券 <BR>摘要:电子政务评估是从多个角度对各级政府的电子政务建设状况进行评估,内容可包括从电子政务的发展环境到投资,从规划、设计、实施到维护的全过程的一切投入和产出的评估,本质是谋求用最低的成本获取最大的绩效。归纳起来,本问从以下方面介绍建立电子政务评估制度的必要性体现。 </P>
<P> </P>
<P> 由于互联网具有开放性、匿名性特点,在网上传播信息不分民族、种族和国家。在这种情况下,传统的与土地密切相连的国家疆界和国家主权行使空间被打破,没有空间的限制和国界的壁垒,各国被愈加紧密地联结在一起。电子政务的开展离不开互联网这个支撑平台,随着各国电子政务建设的逐步开展和信息化进程的不断加快,各国政府对互联网的依赖性会越来越大。电子政务信息涉及大量的国家机密、商业秘密、个人隐私,政务信息的社会化、公开化同时也为不法之徒开启了“入侵之门”,如黑客、间谍、好事之徒都对政府的资料虎视眈眈。如果电子政务不能保证政务信息免受病毒侵害、黑客攻击,则谈不上电子政务的使用与推广。因此各国要维护国家主权、信息安全和自身利益,就必须加强电子政务安全建设,这就需要政府坚持对涉及电子政务信息安全的各个环节进行评估,以便采取积极的应对策略,尽可能地维护国家的安全和利益。 <BR> 电子政务的资金多来源于政府财政,相对于电子商务而言,电子政务在资金投入方面所受到的约束要少得多。其建设是一项庞大的系统工程,使用、推广、维护、更新需要巨额资金投入。从2002年开始,国家用5年时间全力推进电子政务建设,全国电子政务市场达2000亿元左右,其中软件市场将达300亿元以上;另外我国在政府上网工程建设中,至少需要建设6000个网站,如果每个网站的建设费用按平均50万元计算,每年运营费用按平均10万元计算,此项工程将至少带来30亿元投资和每年6亿元的费用开支。对于政府管理者而言,任何的投入必须产生回报,否则就是财政的损失。因此降低电子政务运营成本是实施电子政务的重要目标之一,如果大量针对电子政务的投资,产生不了社会效益和经济效益,那就失去了建立电子政务的实际意义。对于电子政务的投入到底能给政府、企业和公众带来什么回报是政府决策者必须关心的问题。政府财政来源于纳税人对国家的贡献,政府机构在实施电子政务时,应以效益为本,开源节流,充分利用现有线路和网络资源,不要使电子政务成为增加政府预算开支的又一负担。因此,必须对电子政务的各个方面和环节进行全面分析和评估,进行最终的实施效益评估。 <BR> 我国的电子政务发展目前还只能说处于初级阶段,有很多理论、实践问题需要分析研究,也有很多实际困难需要去面对和解决。为此提出以下对策建议: <BR> 电子政务绩效评估可以有不同的评估方法和采用不同的测量工具,但是必须具有统一的评估理念和准则。电子政务绩效评估急需制定出一个公开的、科学的电子政务绩效评估的通用框架和标准,包括指标体系、评估模型、评估方法、绩效确定方法。在设计电子政务评估指标时,可采用定性和定量两种指标,尽量做到在定性的基础上用定量的方式来衡量电子政务的运作状况。应充分考虑所用指标的可操作性,在采集过程中的可获得性;评估模型主要包括评估对象及其范畴,有综合评估模型和项目评估模型;指标体系是对评估模型的具体细化;评估方法包括一套最佳实践的调查问卷、现场考察、专家评估法、综合评估法等方式来获取具体指标值的数据采集方法。 <BR> 电子政务的高投入理应带来高产出,但是由于电子政务项目所具有的政治性、行政性、公共性等特征,并不能完全按照一个市场化项目的评估标准来衡量电子政务的投入与产出,而需要把经济效益和社会效益结合起来,综合考虑电子政务的绩效问题。电子政务的社会效益的可衡量性本来就弱,很难对其社会效益进行客观、准确地测量,很可能成为有些政府部门掩盖其低效益和粉饰其政绩的借口。因此,政府在设定电子政务目标时就应该考虑目标的评测标准,把定量方法与定性方法结合起来,以提高目标的可测量性。对于不直观的电子政务的社会效益,应该提出一些直接或间接的统计与调查办法,通过某些正面、侧面的方法测出效果,使电子政务走上既重视经济效益又重视社会效益的正确轨道。 <BR> 目前我国电子政务评估以官方自身为主,缺乏专家的参与评估,也缺乏社会公众对政府的评估。由于政府也是“理性人”,在自身组织绩效评估中常常会从政府自身利益的角度出发,使评估结果失去公正性与客观性。电子政务绩效评估主体除了政府之外,还应该包括第三方机构和社会公众。任何一个业已确定的评估主体都有自身特定的评估角度,有不可替代的比较优势,同时,具有特定身份的评估主体亦有自身难以克服的评估局限。选择第三方机构作为绩效评估主体的好处是其具有明显的智力优势,并能够保证评估的公正性;选择社会公众作为绩效评估主体的好处是社会公众具有广泛的代表性,可以按照社会公众的主观需求、愿望、价值观,并根据社会公众对电子政务效果的满意度来进行评估,以充分衡量电子政务对公众需求的满足程度和公众对电子政务的满意度,体现电子政务“以民为本”、“便民”、“利民”的理念。 <BR> 电子政务绩效评估是一项长期系统的工作,能否顺利运行不能仅依赖于领导者的一时心血来潮或个人认识,必须通过一系列正式的政府文件和规章制度来确定电子政务绩效评估的地位,为电子政务绩效评估工作提供制度基础。 <BR> 同时,电子政务绩效评估工作是一项具有较强专业性的工作,需要相应的评估技术人员。由于电子政务评估绩效工作是由评估人员具体操作的,评估风险、评估结果很大程度上取决于评估人员本身的素质、立场与责任心。因此,加强电子政务评估人员队伍建设是十分重要的。首先,评估人员应自觉遵守职业道德,坚持独立、客观、公正的职业原则,站在第三者的立场上,完全按照评估的目的,遵循法定标准和操作规范,独立地进行评估估算和判断。其次,评估人员必须掌握必备的知识、专业技术和方法,特别要注重评估人员的后续教育,通过进行相应的专业培训,努力提高评估人员素质水平。 <BR></P>
</p>
摘要:本文首先明确了指针的相关概念,提出了在教学中改变指针引入时间的观点,然后结合示例对指针学习中的难点、疑点等问题由浅入深,进行了较详细地论述。<br> 关键词<br>本文来自:计算机毕业网 :C语言;指针;指针变量类型;数组;引用<br> <br> 指针是C语言中的一个重要概念,具有功能强大,使用灵活等特点,掌握指针的应用,可以使程序简洁、紧凑、高效。但是指针概念相对来说又具有复杂、抽象的缺点,初学者会经常运用出错,感到困惑。根据多年的C语言和数据结构教学经验,笔者总结出了指针循序渐进教学法。<br> <br> 1明确概念<br> <br> 很多学生感觉指针难学并对指针恐惧,主要是其对指针学习中的很多概念理解不透,因此,讲解指针时一定要循序渐进明确以下几个概念。<br> 1) 地址<br> 内存区的每一个字节都有一个固定编号,这个编号称为地址,程序要运行首先需在内存中为各种变量分配相应的空间,各种变量名称对应的是系统根据变量数据类型为变量分配的内存空间的首地址,在程序中一般是通过变量名来对内存单元进行存取操作。在讲解时可以让学生练习如下例子了解变量的地址:<br> int a;<br> printf(“%u”,&a);<br> 注意:地址要以无符号整数输出。<br> 2) 指针<br> 指针就是地址,这一点一定要对学生反复强调。一个变量的地址就是该变量的指针,所以指针就是地址。<br> 3) 指针变量<br> 存放指针的变量称为指针变量,指针变量首先也是一个变量,因此也有自己的内存空间,指针变量所占空间大小由编译器决定,在16位的系统中指针值都是一个16位的整数;在32位的系统中,指针值都是一个32位的整数。可以通过例子使学生认识指针变量占用空间大小以及指针变量内存地址等,从而形象了解指针变量,如:<br> int *p;<br> printf(“%d,%u”,sizeof(p),&p)<br> 4) 指针变量类型<br> 指针变量作为变量也有自己的类型,它的类型根据所指向的数据的类型不同而不同,如整型指针变量int *p,浮点型指针变量float *q,p,q为变量的名称,而它们的类型分别为int *和float *。指针变量类型不同,同样的运算形式得到的结果也会不同,如p的值为6000,q的值为6060,则执行p=p+1,q=q+1后,p所指向的地址为内存6002,q所指向的地址为内存6064。<br> 注意:在这里要强调指针类型加减整数运算时,跳过的步长为所指向的数据的数据类型大小;两个相同类型的指针变量之间可以进行相减以及比较等运算,但不同类型的指针变量之间不能进行运算,如将上面的指针p,q进行p-q或q>p等运算将得到错误提示。<br> 5) 指针变量的值<br> 指针
变量的值就是指针所指向的内存单元的地址,这个地址以整数的形式存储于指针变量中。<br> 下面通过一个例子和图示将上面讲的概念具体化。<br> void main()<br> { int a=13,*p1,*p2;<br> float b,*q;<br> p1=&a;<br> q=&b;<br> p2=(int near *)7000;<br> *p2=120;<br> printf("\n%d",sizeof(p1));<br> printf("\np1=%u,p1+1=%u,q=%u,q+1=%u,p2=%u",p1,p1+1,q,q+1,p2);<br> printf("\n&a=%u,&p1=%u,&p2=%u,&q=%u",&a,&p1,&p2,&q) ;<br> printf("\na=%d,*p1=%d,*p2=%d",a,*p1,*p2);<br> }<br> 运行结果如下:<br> 2<br> p1=65524,p1+1=65526,q=65516,q+1=65520,p2=7000<br> &a=65524,&p1=65522,&p2=65520,&q=65514<br> a=13,*p1=13,*p2=120<br> 分析上面的例子可以看出,指针变量p1本身的内存地址为65522,p1的值为变量a的地址65524,p1所指内存空间中存放了一个整数13,如图1所示。<br> <br> 图1<br> 在程序中p2直接指向了一个内存单元7000,并且对此单元赋值为120,注意这里p2赋值的方式,虽然p2里面存放的地址值是以整数值形式存在,但是不能将一个整数直接赋值给指针变量,要根据指针变量的类型将整数值转化为相应的地址值,这里p2为整型指针变量,所以强制类型转化为(int near *)。需要提醒的是C语言指针的功能非常强大,可以对特定内存直接读写,因此破坏性也会很大,如果操作不当,可能会产生严重后果,所以,一般不提倡直接给指针赋值。<br> 6) 与引用的区别<br> 在C++中出现了引用的概念,引用并不产生变量的副本,它只是变量的另外一个名称,与引用的对象共同使用一个内存空间。引用在一定程度上可以达到指针的效果,尤其在引用作为函数参数时,但是二者有着本质的区别:<br> 1) 在函数内定义引用时必须初始化,而指针定义时不必初始化;<br> 2) 引用不能为空,既不能引用不存在的东西,而指针可以为空(NULL);<br> 3) 在函数内一旦一个引用被作为某个变量的引用,则不能再作为另一个变量的引用,而指针可以指向任何一个相应类型的变量。<br> 具体区别可以通过下面一个示例进行讲解:<br> voidref(int &c)<br> //c与实参共用一个内存空间<br> { printf("\n&c=%u,c=%d",&c,c);<br> c=c+1;<br> }<br> void main()<br> { int a=13,*p,b=20;<br> int &m=a;<br> p=&a; printf("\n&a=%u,p=%u,&m=%u,&p=%u",&a,p,&m,&p);<br> printf("\na=%d,*p=%d,m=%d",a,*p,m);<br> m=b;//只是将b的值赋给m,m仍然与a共用一个空间,因此,相当于改变了a的值<br> p=&b;//p指向b所处内存空间<br> printf("\n&b=%u,p=%u,&m=%u,&p=%u",&b,p,&m,&p);<br> printf("\na=%d,*p=%d,m=%d",a,*p,m);<br> ref(a);<br> printf("\n a=%d",a);//a的值改变了<br> }<br> 运行结果如下:<br> &a=65524,p=65524,&m=65524,&p=65522<br> a=13,*p=13,m=13<br> &b=65520,p=65520,&m=65524,&p=65522<br> a=20,*p=20,m=20<br> &c=65524,c=20<br> a=21<br> <br> 2指针概念的引入时间<br> <br> C语言的讲解首先是从变量开始,变量离不开地址,也就离不开指针,因此,指针的学习在刚接触C语言时便已经开始了,但是,很多教材都将指针单独作为一章放到后期讲解。在实际教学中由于教学课时的限制,当讲解到指针时学时已经剩余不多了,学生往往学习的不深入,造成后续课程学习中经常出现理解困难等情况。鉴于这种情形,本人建议打破教材章节限制,在讲解变量以及输入输出语句部分便引入指针的内容。<br> 如在讲语句scanf(“%d”,&a)功能时,要强调&a是取出变量a的地址,并用printf打印出变量a的地址,由此引入指针的概念,然后用下面语句替换上条语句,让学生体会变量和指针的关系。<br> </p> <p> <p>int *p=a;<br> scanf(“%d”,p);<br> <br> 3 指针与数组<br> <br> 数组是具有相同数据类型的数据集合,数组的名称代表系统给数据集合分配的内存空间的首地址,即数组名也是一个指针,但是这里的数组名指针是一个常量,而且数组的空间大小在程序运行期间不能改变。如有下面语句:<br> int a[10],*p;<br> p=a;<br> a代表数组的首地址,在程序运行期间其值(数组的首地址)不会改变,如执行a=a+1将得到报错信息;通过p=a,将a的值付给了p,使p也指向数组的首地址,这时p的使用可以和数组的使用样式相同,如p[2]等价于a[2],因为p是变量,所以可以指向数组中任何一个单元,如p=p+4。<br> 指针与数组联系非常密切,在这里可以引入动态空间分配的内容,使学生更加深刻的理解数组以及指针。可以通过下面例子进行讲解,本例对数组和指针操作方式进行了混合。<br> int *p,i,*q;<br> p=(int *)malloc(sizeof(int)*4);<br> for(i=0;i<4;i++)<br> scanf( "%d",&p[i]);<br> p=(int *)realloc (p,sizeof(int)*8);<br> for(i=4;i<8;i0++)<br> scanf("%d",&p[i]);<br> q=p;<br> for(i=0;i<8;p++,i++)<br> printf("%d",*p);<br> 在上面例子中,p相当于一个动态数组,其空间大小可以改变,因为p是个变量,所以p的值在程序中可以改变。<br> 注意,讲解本例时要将里面用到的函数malloc 和realloc讲解清楚。<br> <br> 4 二级指针<br> <br> 有了前面的讲解,在讲解二级指针时就比较容易了,先看下面的例子:<br> int **p,*q,a=2;<br> q=&a;p=&q;<br> printf(“%u,%u,%u”,&p,&q,&a);<br> printf(“%u,%u,%u”,p,*p,**p);<br> 运行结果如下:<br> &p=65492,&q=65490,&a=65488<br> p=65490,*p=65488,**p=2<br> p首先是一个指针,p的值是指针变量q的地址,*p是p所指内存单元的值即q的值,也即a的地址;**p等价与*(*p),即首先获得q的值,然后再取出q所指内存单元a的值2。存储图示如图2所示:<br> <br> 图2<br> <br> 5 总结<br> <br> C语言指针的讲解一定要注意方式方法,结合实例演练循序渐进讲解,另外要加大学生上机实践练习,只有通过实践发现问题解决问题,学生才能真正理解掌握所学知识。 <br> <br> 参考文献<br> [1] 谭浩强.C 程序设计(第三版)[M]. 北京: 清华大学出版社, 2005.<br> [2] 吴胜华. 语言“指针”教学之思考[J]. 淮北煤炭师范学院学报,2010,27(4):86-88.<br> [3] 张丽霞. C语言指针详解[J]. 赤峰学院学报(自然科学版),2005,21(5):37-38.<br> 作者简介<br> 李天志(1977-),男
,汉,山东德州人,讲师,硕士,主要研究方向为数据挖掘,算法研究(ltz@)<br> 联系方式:山东省德州市德州学院计算机系,253023<br> TEL:13355442519<br> E-mail:ltz@<br> </p> <p> [1] <p>
</p>
<P>城市公交查询系统的设计</P>
<P> 关键词:J2EE;最短路径算法;公交查询;车次管理 <BR>摘要:公交查询系统是城市道路交通的重要组成部分,是城市发展的必然产物,是联系国民生活、社会生产和流通领域的关键环节。首先,实现多种查询功能,包括根据地点名称、公交车号、日常站点、和任意两个站点查询乘车路线。其次,采用最短路径算法查找任意两个站点之间的最短乘车路线。最后,提供了用户留言的功能、用户管理功能、新闻发布功能和后台车次管理功能。 </P>
<P><BR> Design of Urban Public Transport Query System <BR> Ma Yufeng <BR> (Northwest National University,Mathematics &Computer Science College,Lanzhou730030,China) <BR> Abstract:Public Transport Route System is an important part of urban development,is the inevitable outcome of the national life,and the social production and circulation of the key link Firstly,the various query functions,Include the name under places, public transportation vehicle number, the daily site, and any two sites check travel routes.Secondly,the shortest path algorithm adopts two sites for the shortest bus line between.Finally,provides the user message,user management function. <BR> Keywords:J2EE;The shortest path algorithm;Public transport route system;Train management <BR> 一、背景及意义 <BR> 对于公交车,人们希望能够在最短的时间内到达目的地,因此如何能够让人们在最短时间里,得到公交行车路线,并且该路线是最节约时间的,那么这个系统就是人们所需要的。 <BR> 本设计采用Dijkstra算法,主要是考虑到自己所能研究到的深度,以及实用性上来考虑,Dijkstra算法较适合于本设计。针对实际情况,本研究的公交查询系统的设计,探讨以换乘次数最少为目标的公交查询系统的设计方案。 <BR> 二、研究内容 <BR> 对公交查询系统进行系统功能需求分析,并进行系统功能模块设计,并设计其相关的换乘方法。由于该系统的功能模块不仅仅限制于公交车的查询,除此以外,还可以提供一些很实用的功能模块,比如最近的最热的新闻,以及留言系统,这样,能较大限度的满足用户的需要。采用的方法是,使用最短路径算法-迪杰斯特拉算法作为程序的中心算法。 <BR> 三、公交查询系统总体设计 <BR> (一)总体结构及说明 <BR> 如图1所示,总体来说,系统总共分成6大部分,分别是首页、本站导航、高级搜索、公交新闻、留言板和系统维护。加入了统计客流量的计数器。搜索方式有四种,分别是车次查询、站点查询、精确查询和高级搜索。 <BR> (二)数据库设计 <BR> 数据库用的是微软公司的Access数据库。它提供了表、查询、窗体、报表、页、宏、模块7种用来建立数据库系统的对象;提供了多种向导、生成器、模板,把数据存储、数据查询、界面设计、报表生成等操作规范化。 <BR> 建立的数据库名为nbos.mdb,有四个功能模块需要用到数据库,首先是公交车信息,接着是管理员信息、留言板信息、新闻,分别对应bus、ManagerMessages和News这四个表。 <BR> bus表的意义在于当用户进入到查询系统界面或者管理员进入到车次管理界面的时候,系统将和bus表进行数据的交互。 <BR> Manager表的意义在于,管理员进行管理员登陆的时候,需要验证管理员的信息,此时,在验证窗口中,管理员需要输入相关的信息。 <BR> 这四个表之间是独立的,相互之间没有很大影响,用户一登陆上网站,可以到任意一个模块中。 <BR> 由于用到的是Access数据库,因此连接数据库用的代码是标准的微软链接代码。首先,建立数据库表格,这一步在之前已经做好了。接下来,在“控制面板”→“管理工具”→“数据源 (ODBC)”中,将数据库nbos.mdb添加到数据源中,这一步是添加到系统DSN中的。 <BR> 接着在程序中添加如下代码: <BR> Try{ <BR> Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//Microsoft连接Access标准代码 <BR> } <BR> catch(ClassNotFoundException e){}//抛出异常 <BR> try{ <BR> con=DriverManager.getConnection("jdbc:odbc:nbos","","");//连接Access的Url <BR> } <BR> 测试连接,如若连接成功,数据库正式建立。在接下来的调用字段名中,用到的代码为:select * from bus ;//bus是表名 <BR> (三)算法分析 <BR> 本设计用的最短路径算法是迪杰斯特拉(Dijkstra)算法,该算法按照路径长度递增的次序来产生最短路径。迪杰斯特拉算法用于求解一个有向图(也可以是无向图,无向图是有向图的一种特例)的一个点(称之为原点)到其余各点(称之为周边点)的最短路径问题。该算法的原理是,引进一个辅助向量D,它的每个分量D表示当前所找到
展开阅读全文