编程语言实现模式

2024-06-30

编程语言实现模式(精选8篇)

编程语言实现模式 第1篇

//头文件 #include/*====================栈 数据结构利用数组实现====================*/#define MAX 100#define ok 1#define error 0typedef struct Stack{ int data[MAX]; int top;//栈顶 int bottom; //栈底}Stack,*STACK;//初始化栈int InitStack(STACK stack);//销毁int DestroyStack(STACK stack);//清空int ClearStack(STACK stack);//栈空int StackEmpty(STACK stack);//获取栈顶元素int GetTop(STACK stack,int* elem);//压栈int Push(STACK stack,int* elem);//出栈int Pop(STACK stack,int* elem);//返回栈中元素长度int StackLength(STACK stack,int* len);//打印栈中元素int PrintStack(STACK stack);//栈满int StackFull(STACK stack);

//main函数中实现#include “stack.h”int main{ int num=10, num1, i=0,j=0; Stack stack; int initFlag=InitStack(&stack); if(!initFlag) return 0; for(num1=0;num1<10;num1++) Push(&stack,&num1);/* int pushFlag=Push(&stack,&num); if(!pushFlag) return 0;*/// ClearStack(&stack); for(;i<10;i++) { int flag=Pop(&stack,&num1); if(flag) printf(“%d ”,num1); else printf(“Pop error”); } int lenFlag=StackLength(&stack,&num1); if(lenFlag) printf(“len=%d ”,num1); else printf(“StackLength error”);/* int getFlag=GetTop(&stack,&num1); if(getFlag) printf(“%d ”,num1);*/ PrintStack(&stack); return 0;}//初始化栈int InitStack(STACK stack){ if(stack==NULL) return error; stack->bottom=stack->top=0; return ok;}//压栈int Push(STACK stack,int* elem){ int flag=StackFull(stack); if(!flag) return error; stack->data[stack->top] =*elem; ++stack->top; return ok;}//打印栈中所有元素int PrintStack(STACK stack){ int i=0; int flag=StackEmpty(stack); if(!flag) return error; for(i=0;itop;i++) { printf(“%d ”,stack->data[i]); } printf(“n”); return ok;}//栈空int StackEmpty(STACK stack){ if(stack==NULL || stack->top==stack->bottom) return error; else return ok;}//出栈int Pop(STACK stack,int* elem){ int flag=StackEmpty(stack); if(!flag) return error; *elem=stack->data[stack->top-1]; --stack->top; return ok;}//栈满int StackFull(STACK stack){ if(stack==NULL || stack->top>MAX) return error; else return ok;}//销毁int DestroyStack(STACK stack){ if(stack==NULL) return ok; else { stack->top=stack->bottom; stack=NULL; return ok; }}//清空int ClearStack(STACK stack){ int flag=StackEmpty(stack); if(!flag) return error; else { stack->top=stack->bottom; return ok; }}//获取栈顶元素int GetTop(STACK stack,int* elem){ int flag=StackEmpty(stack); if(!flag) return error; *elem=stack->data[stack->top-1]; return ok;}//返回栈中元素长度int StackLength(STACK stack,int* len){ if(stack==NULL) return error; if(stack->top==stack->bottom) { *len=0; return ok; } else { *len=stack->top; return ok; }}

编程语言实现模式 第2篇

用c语言实现单纯形法的编程

#include “stdio.h” #include “math.h” #include int M,N;float c[100],a[100][100],b[100],CZ[100],Dn[100],th[100],x[100];int Fn[100];int K,L,ths;float zy;int shuru();void findmm();void chang();main(){ float max_Z,sum=0,s=0;int i,j,r=0;if(!shuru()){ printf(“ERROR!!n”);return 0;} while(r0){findmm();if(ths==M){goto loop;} else chang();} else r++;} } loop: if(ths==M){printf(“n此线性规划没有有限最优解!!n”);printf(“n此线性规划最终迭代结果为:”);printf(“n Cj ”);for(j=0;jDn[K])max=i;K=max;for(i=0;i0)&&(th[i]Dn[K])K=i;for(i=0;i

编程语言实现模式 第3篇

Matlab是高性能的科学计算软件,在软件开发过程中经常将Matlab和专业的Windows应用程序开发工具结合使用。微软新推出的开发工具VisualStudio .NET成为开发Windows平台应用程序的一次革命,在.NET中程序被编译成通用中间语言(CIL),然后在.NET提供的虚拟机上运行,这提供了更好的安全性,而且使得程序开发在各种语言之间的移植十分容易。而Matlab是原生的Windows程序,提供的API在.NET属于非托管函数,不能直接在.NET的虚拟机中运行。因此.NET和Matlab软件的异构性使得它们之间的交互编程具有一定的困难,本文通过运用设计模式对问题进行分析,通过一组可重用的类实现了Matlab计算功能在.NET中的调用。

1 设计模式

模式的创始人Christopher Alexander给出了模式的定义:“模式是表达应用环境、问题和解决方案之间关系的三元组,是在某种环境下如何解决某种问题的指导。”。模式存在于所有的阶段(分析、设计以及实现)之中,它描述了问题域中实体间的明确关系。文献[1]总结了23种设计模式,并按其目的分为创建型、结构型、行为型三类。模式描述了问题域中实体间的明确关系,为我们在设计阶段考虑系统中各实体间的关系提供了方法。在实际应用中,各种模式经常不是单独使用,而是被结合在一起共同解决一个问题的,系统中的一个模式经常通过为系统中的其它模式提供应用背景来与它们相关联 。在设计过程中应该首先理解需求牵涉到的问题领域,将注意力集中到问题领域中的实体间的高层关系,找出可能用到的模式,根据这些模式考虑系统中实体间的关系,为要解决的问题勾画一个大的框架。接着在框架中使用其它的相关模式,并在使用模式的过程中对设计进行进一步的细化。最后是系统的具体实现。

1.1 应用程序调用Matlab的方法

在应用程序中调用Matlab有三种方法,直接使用Matlab引擎提供的C语言API;通过Matlab的COM自动化服务器;应用程序借助DDE会话和Matlab通信。这三种方法中直接调用Matlab引擎提供的C语言API的方法执行效率最高,但是这种方法使用比较复杂,如果每次编写应用程序都要考虑如何调用的细节,不仅不利于开发人员将精力集中到特定的应用上去,而且在应用程序中加入的大量和Matlab操作紧密相关的代码,也会降低程序的可扩展性和可维护性。因此我们运用设计模式对问题域进行分析,通过设计一组可重用的类来简化Matlab在.NET中的调用。

1.2 运用模式进行设计

设计模式中的一条基本原则就是,优先使用对象的组合而不是继承,这样设计出来的对象粒度较小,容易复用和适应未来的变化。在.NET中调用Matlab的计算功能,主要涉及到三个方面:对Matlab计算引擎的调用;Matlab中的矩阵数据类型和.NET中的数据类型的相互转换;对Matlab提供的Mat类型文件的操作。为了提高对象的内聚度,我们不应该让一个类负担太多的责任,可以将这三个功能放在三个不同的类中,通过对象之间的组合完成所需的功能。

首先,分析题域找出可用的模式,对于在.NET中调用Matlab的计算功能的用户来说,他们只想通过Matlab完成所需的科学计算任务。因此,在设计时我们应该通过一个类向用户屏蔽模块中的三个不同的类,为用户提供一个简单一致的界面。

设计模式中的外观(Facade)模式是对象结构型模式,其意图是为系统中的一组接口提供一个一致的界面,该模式定义了一个高层接口,这个接口使得子系统更加容易使用。此外,它还可以使子系统间的通信和相互依赖关系达到最小。MATFacade类采用了外观模式,为Matlab中最常用的功能如打开、关闭Matlab引擎,传递参数、执行计算等提供了一个一致的接口,降低了客户程序和子系统之间的耦合度,在大多数情况下用户只需调用MatFacade类的接口,再由该类去调用子系统中其它的类执行相应的功能,简化了系统的使用。

适配器(Adapter)模式也是对象结构型模式,其意图是将一个类的接口转换成客户希望的另一个接口,使得原来由于接口不兼容而不能一起工作的类可以一起工作。由于Matlab提供的API是基于C语言的,在.NET中属于非托管函数,无法直接调用。类MATInvoke和类MatFile采用了适配器模式,完成Matlab和.NET之间的接口转换。为了在.NET中调用C语言的API,需要利用平台调用(PInvoke)服务。平台调用服务使得托管代码可以调用在动态链接库(如Win32API中的DLL)中实现的非托管函数。此服务将查找并调用导出的函数,然后根据需要跨越调用边界对参数(整数、字符串、数组、结构等)进行封装并传送。平台调用服务是通过.NET中的定制特性DllImport来实现的。例如启动Matlab引擎的函数engOpen通过以下形式在.NET中调用:

[DllImport(″libeng.dll″)]特性可以让.NET调用Matlab提供的动态连接库libeng.dll中打开引擎的导出函数engOpen。Matlab提供的所有函数分布在几个动态链接库文件当中,例如打开引擎函数engOpen在libeng.dll中,而创建双精度矩阵函数mxCreateDoubleMatrix在libmx.dll中,需要加上不同的特性。

MAT文件是Matlab数据存储的默认文件格式,由文件头,变量名和变量数据三部分组成,类MATFile封装了对MAT文件的存取功能,该类接收应用程序中传递过来的文件名等参数,然后通过平台调用Matlab提供的和MAT文件有关的函数,完成打开、关闭MAT文件,将MAT文件中的内容读入Matlab计算引擎和将Matlab的矩阵写入MAT文件等功能。类MATInvoke和MatFile将Matlab所提供的所有应用程序接口都加上相应的DllImport特性封装起来,既实现了跨平台调用又隐藏了不同函数位于不同DLL文件中的具体细节。

设计模式中的代理模式(Proxy)是对象结构型模式,其意图是为其他对象提供一种代理以控制对这个对象的访问。使用Proxy模式可以实现智能指引(Smart Reference),它可以取代简单的指针,在访问对象时执行一些附加操作,例如分配和释放内存等。Matrix类通过代理模式实现数据的访问控制,完成.NET中的数据类型和Matlab的矩阵类型的互相转换。用户通过这个类可以“透明”地完成数据类型转换的功能。在.NET中CLR提供了一个先进的垃圾回收器,它可以自动回收托管代码占用的资源。为了使自定义的Matrix类也具有同样的优点,使其继承自IDisposable接口。Matrix类在构造函数中调用mxCreateNumericMatrix方法对矩阵所需内存进行分配,在Dispose方法中调用mxDestroyArray方法完成程序中创建的Matlab矩阵的删除工作,一旦Matrix类中所申请的内存已经不再需要了,就会被列为可回收的资源,垃圾回收器会在合适的时候进行内存回收。

在设计使用中,为了找出为其他模式提供应用背景的模式,我们研究模式间的组合寻找以下关系:

一个模式是否定义了其他模式的行为;

两个模式是否互相影响。

Facade模式为在.NET调用Matlab的功能提供了一个简单一致的界面,Adapter模式完成Matlab和.NET之间的接口转换。Proxy模式提供了内存访问控制,在需要时才分配内存,用完后及时回收。显然,Facade和Adapter 、Proxy之间存在关系,Adapter模式和Proxy模式为Facade提供服务,Facade为它们提供了应用背景,因此将Facade模式作为设计的出发点,首先建立MatFacade类,根据用户的需求为其设计接口函数,然后再根据MatFacade类的接口函数划分MatInvoke类、MatFile类和Matrix类的责任,并制定相应的接口函数。我们采取自上而下,优先考虑类的接口而不是具体实现的设计方法,这样可以在开发过程中避免过早陷入具体的技术细节,从而导致各个类的接口混乱,设计出来的类高耦合、低内聚,无法进行有效的重用。图1为系统的设计类图。

1.3 快速应用开发

一般应用程序开发人员可能并不了解Matlab,只知道要进行什么样的计算而且只对计算的结果感兴趣。为了进一步简化使用,需要提供一种更便捷的方式调用Matlab的计算功能,最好能在开发环境中像使用其他可视化控件,如按钮、文本框一样便捷地使用Matlab的计算功能。

支持快速开发(RAD)是.NET中的一大特性,.NET框架允许我们开发自己的用户控件,它像所有.NET本身提供的可视化控件一样出现在VisualStudio集成开发环境中。可以将Matlab中的计算功能编写成可视化的用户控件(如图2a所示)。控件上所加的ToolboxBitmapAttribute特性定义了控件在工具箱中显示的图标。用户需要使用Matlab计算功能时,可以直接从开发环境中将它“拖放”到应用程序里。下面是建立用户控件的代码,“Comput.bmp”指定了在开发环境中显示的控件的图样,“TextClicked”说明控件可以通过鼠标点击选取。

[ToolboxBitmapAttribute(typeof(MATCtrl.MatComput),″Comput.bmp″)DefaultEvent(″TextClicked″)]

public class MatComput:System.Windows.Forms.UserControl{...}

2 应用实例

下面以对正弦波的快速傅立叶变换为例,说明如何在.NET中调用Matlab的计算功能。该控件提供了两种方法设置快速傅立叶变换的参数,一种是在集成开发环境中,通过在控件的属性加上定制特性,如给FFTCtrl控件的变换类型属性ConvertType加上Description特性,当在开发环境中选择FFTCtrl控件时,就会在开发环境的属性栏中出现对应的参数设置。如图2b所示。

a 工具箱中 b 开发环境中 c 应用程序中 的FFT控件 设置参数 设置参数

[Description(″快速傅立叶变换类型″),Editor(typeof(TypeEditor),typeof(UITypeEditor))]

public string ConvertType{...}

另一种方法是在控件加入应用程序后设置参数。用户控件可以和系统提供的控件一样响应鼠标点击等系统事件,通过重载FFTCtrl类MouseDown函数,用户在应用程序中双击FFTCtrl控件,就会弹出参数设置对话框(如图2c所示)。

FFTCtrl控件从客户的应用程序中接收数据,调用MatFacade类执行计算功能,计算完毕之后再由Matrix类将结果转换为.NET中的数据格式返回给应用程序,并显示变换结果。应用程序开发人员根本无须关心如何调用Matlab,甚至都不必知道Matlab后台运算的存在。

3 小 结

模式和设计模式作为软件复用领域他人已经成功运用的经验,存在于系统的分析、设计以及实现等各个阶段。在本文中,通过运用模式进行分析和设计,为在.NET中调用Matlab设计了一组可重用的类,开发者使用这组类,可以方便的实现对Matlab计算功能的调用,而无需了解具体的技术细节,从而使得开发人员可以将更多的精力集中到特定的应用上去。而且该方法为如何将其他优秀的原生Windows程序移植到.NET平台提供了设计思路。

参考文献

[1]Erich Gamma,Richard Helm,Ralph Johnson,et al.设计模式:可复用面向对象软件的基础.李英军,马晓星,等译.北京:机械工业出版,2000.

[2]Alan Shalloway James R.Trott.Design Patterns Explained.北京:中国电力出版社,2003.

[3]Jeff Prosise.Microsoft.NET程序设计技术内幕.王铁,徐雅骥,童霞,刘宇,译.北京:清华大学出版社,2003.

[4]Jeffery Richter.Microsoft.NET框架程序设计.修订版.李建忠,译.北京:清华大学出版社,2003.

[5]张志涌,等.精通Matlab 6.5版.北京:北京航空航天大学出版社,2003.

编程语言实现模式 第4篇

【关 键 词】任务型语言教学;教学模式;传统;整合

一、前言

《全日制义务教育普通初级中学英语课程标准(实验稿)》(一下简称《课程标准》)作为指导全国基础英语教育的纲领性文件,颁布实施十年来,受到一线的英语教师和各级教研员的高度重视。张正东先生(2005)在谈到“我国外语教育的国情特点”时指出:中国文化传承有两个特点:自上而下与大一统。[1]国家教育部的文件自上而来,自然要贯彻落实;作为贯彻文件精神的实体——学校也要随大流,融入“大一统”的潮流。英语教师对《课程标准》中倡导的“任务型语言教学”模式开展了研究,各地区不断探索适合自己教学实际的新路子。在十年的教学实践中,教师们对于任务教学理念的理解也存在很多分歧,有的理解为安排“课堂活动”,认为“活动越热烈,任务越彻底”。于是教师们在传统教学模式与任务型教学“活动”中忙碌,上级要检查听课就把课堂搞得活跃些,听课老师一走,又回到以教师为中心的传统教学模式中来。教师在“任务型教学模式”与“传统教学模式”的夹缝中求生存,努力走出一条全新的路子。

二、对任务型语言教学模式的认识

对任务型语言教学模式的认识,笔者走访了贵州南部的部分中学教师。谈到任务型语言教学模式(Task-based Language Teaching Approach),普遍认为是给学生安排些“任务”,通过任务的完成学习英语,课堂表现形式主要是分组活动,在教师的指导下完成这些“任务”。看来作为贯彻精神的教师,并不很了解或者说并不完全了解任务型语言教学模式的基本内涵。

任务型教学始于印度,20世纪80年代,N.S.Prabhuz在交际教学法的基础上,开展了任务型教学的研究,他认为语言教学活动的目的应是沟通交际,而不是学习语言,学得语言是交际的“副产品”。[2]于是,教学过程交际化成为任务型教学的主要特征;龚亚夫(2003)认为学生学习外语最终要达到的目标就是离开学校以后能用外语去完成“目标性任务”(target tasks)或“真实世界的任务”(real-world tasks),所以在课堂教学活动中应该用相当时间来模拟生活中的“任务”,这就是开展任务型语言教学的根据之一。[3]学生在课堂上要完成模拟的“任务”,必须具备扎实的语言基本功,甚至需要英语水平达到第二语言一样的水平,才能完成这些任务。针对汉语言文化环境下的学生来说,英语是地地道道的外语(foreign language),而外语对于青少年学生(大部分小学时没有学过英语,或者学了点“皮毛”)来说主要靠有意学习,目的语环境的接触,只能减难加速,起一种辅助作用。[4] 因此,每节课学生都能用英文来完成任务看来是相当困难的。

三、教学步骤决定教学模式

英语课堂教学模式与教学步骤(程序)有很大关系,步骤决定了模式。比较固定的课堂教学程序可以理解为一种教学模式(model)。[5]中国传统外语课堂教学的基本模式就是所谓的PPP模式。PPP分别代表“讲授”(Presentation)、“练习”(Practice)、“输出”(Production),这实际上是外语教学的几个重要的具体步骤,[6]教学步骤从某种意义上来讲就是教学模式的分解。

任务型教学模式作为一种舶来品,其概念也存在诸多分歧,就“task”的理解,也是各种各样的。Willis(1996)认为:任务是学者为了做成某件事情用目的语进行的有交际的活动。Rechards, Platt 和Weber(1986:289)从教育的角度(pedagogical perspective)认为:任务是人们在学习、理解、体会、语言的过程中所开展的活动。其教学模式的研究也门派众多:龚亚夫(2003)对任务教学模式作了概括,他认为任务型教学模式从步骤上看可以分为三个阶段:即语言材料的引入,语言练习与语言的输出。[7]龚亚夫进一步解释,新语言材料的引入(Pre-task preparation)指在学生学习输入新语言材料的同时,激活学生已有的生活与学习经验,把该语言的使用环境及与话题有关的思维脉络、思维发散的方向也同时提供给学生。语言的练习(while-task process)包括机械练习和有意义的练习。新语言材料的输出(Post-task activities)即要求学生用他们所学的知识和技能来完成一个交际性的任务。但在一节课内完成这三个阶段,有一定的难度;新语言材料的引入显得匆忙,学生原有的知识和经验未得到激发,接着就是学生来完成交际性质的任务,整个过程中三个环节都没有落到实处。

四、基于传统的任务型教学模式设计

1. 展示模式。展示模式目的是为了呈现目标语言,使学生初步接触目、感知目标语言。展示模式以呈现新的语言内容为中心任务,多以文字、实物、图片、多媒体等形式将本单元要学习的内容展现出来,学生在教师的带领下,通过各种活动形式,使学生对新语言的拼写、发音、语义有较全面的了解,能辨认新语言内容的音、形、义,获得初步的语言认知,是一个单元教学的开始阶段,适合七、八年级的学生。

展示模式的教学步骤:呈现语言材料→从视听方面感知语言材料→口头模仿语言材料→辨认语言材料(听、说、读、写)→初步形成语篇。这一过程是任务型教学模式中的“前任务”(Pre-task),为任务的完成提供准备。

现以八年级下学期新目标英语(Go for it)第二单元What should I do?为例,具体描述各种模式的教学程序。

教学程序:

Step 1 语言呈现(形式:板书、图片、多媒体、提问等)

板书呈现problem,提问What problems do you have? What's wrong?

词汇呈现:broken, noisy, loud, argue, be out of style, ill

句子呈现:

My dog is ill. My brother plays his CDs loud.

I don't have enough money. I argued with my best friend.

My coat is out of style. You could write him a letter.

You should go to his house.

Step 2 视听感知(教师范读、音频、视频)

教师带读以上词汇和句子,播放Section A,1b中的听力材料,辨析听到的problems.

Step 3口头表达(学生朗读、看图说话等)

中英文交替口译上述单词和句子。

Step 4 视听辨认(连线、听音标图等)

播放Section A,2中的听力材料,辨析could和 should。

播放Section A,2b中的听力材料,用连线的方式辨析不喜欢别人建议的原因。

Step 5 课外作业

Make a list of your own problems.为下节课的实践练习奠定基础。

2. 活动模式。通过展示模式的教学,学生对要学习语言内容有了初步的认识,能“观其形、知其意”,能读出单词、词组、句子,为语言活动奠定了基础,在活动模式这一阶段,主要是开展基于目标语言的控制性活动(任务),使支离破碎的语言在一定的语言环境链接起来,形成单句或片语,让学生感受能读写英语句子的快乐。激发他们的学习热情。

nlc202309021733

活动模式的教学步骤:回忆语言材料→控制性模仿活动→半控制性活动→操练教材。

教学程序:

Step 1 回忆语言材料(听写、听说、看图说话、辨认)

观看三幅图,陈述遇到的“problems”

My dog is ill.

I don't have a bike.

I argued with my best friend.

Step 2 检查学生课外作业完成情况,列出他们遇到的问题。

Step 3 引入句型What's wrong …?What’s the matter?根据上述问题提出“advice”, You should/could…

Step 4 看图对话(半控制性口头练习)

Step 5 看图写话(半控制性练笔头习)

Step 6 处理相关教材,阅读Section A,3a对话,判断okay idea, good idea, or bad idea.

3. 理论模式。二语习得的过程中少不了母语与外语的比较。经历了展现模式的认知,活动模式的再认识,学生对新的语言内容有了进一步的感悟,由感性认识逐步过渡到理性认识阶段,认知的过程产生了一种质的飞跃,形成归纳总结的最好时期,我们将这一教学模式定义为“理论模式”,主要任务就是归纳语言现象,比如词的用法研究、词语的对比、语法现象的归纳、与汉语的比较等等。理论模式的教学步骤:感知语言规律→发现语言规律→总结语言规律→实践语言规律。

教学程序:

Step 1 句型展示(对比、分析)

询问别人的问题所在:

What's wrong? What's wrong with…? What's the matter? What's the matter with…?

Step 2 发现语言规律(提问、讲解、总结等)

讲解提出建议的关键词(could/should)的用法,包括肯定和否定句式。

Step 3 练习语言规律(口头练习、笔头练习、改错等)

指导学生完成PAIRWORK(Section A, 3b)Student A gives advice about getting more money and Student B says if the ideas are good, okay or bad.

指导学生完成PAIR WORK(Section A, 4)Give the Canadian boy, Jim, some advice on how to practice his Putonghua.

Step 4 笔头练习

Work alone, 设计一个对话,包含“问题”的提出及解决问题的“建议”。

Step 5 家庭作业

Pairwork, 两人一组准备一个对话,包含询问问题和提出解决问题的建议,下次课前作presentation.

4. 实践模式。经历了前面三种教学模式的学习,学生积淀了新的语料,有对语言的初步认识,也有对语言的单句理解,经过理论模式教学,学生还掌握了使用语言的规则,语言应用的冲动自然产生,将课堂教学与课外学习结合起来,在教师的监控下检查学生对所学语言的综合运用能力,也是任务型教学模式的根本目标所在,实践模式教学步骤:呈现任务→任务要求→现场完成任务→教师点评→新任务。在学生的学习过程中,注意肯定学生学生的学习过程和学习成绩。

在语言活动活动中,活动力求接近生活,力求真实,课堂教学主要以学生展示,学生汇报,学生交流为主线。

教学程序:

Step 1 呈现任务(事由),寻求解决问题的建议

My computer is broken; I can not sleep well. My friend wears the same clothes as I do.

Step 2 合作完成任务(结对、分组)。

Step 3 汇报任务(注意倾听、记下问题、但不要随意打断)

Step 4 评价任务(学生评价、教师评价、肯定成绩、指出不足)

Step 5 完成Section B,3a, 给遇到问题的Lonely Kid回信,提出自己的建议。

五、结论

四种教学模式的顺序,原则上是循序渐进的,但年级不同,学生对象不同,有时可能也会有变化,比如高年级的班级,某些时候一个单元的教学可能先从理论模式开始;因学生的接受能力不同,模式之间可能也有跨越,展现模式中也可以融入活动模式的某些环节,一切因人而异。

注释:

[1]张正东.我国外语教育的国情特点[M].张正东英语教育自选文集.北京:外语教学与研究出版社,2007:105.

[2]张正东.运用任务型教学的三个问题[J].中小学外语教学.2004(6).

[3]龚亚夫.任务型语言教学[M].北京:人民教育出版社,2003:3.

[4]张正东.张正东英语教育自选集[M].北京:外语教育与研究出版社,2007.

[5]鲁子问.新编英语教学论[M].上海:华东师范大学出版社,2006:192.

[6]束定芳,庄智象.现代外语教学[M].上海:上海外语教育出版社,2008:156.

[7]龚亚夫.任务型语言教学[M].北京:人民教育出版社,2003:85.

[8]谢云锦.中学英语典型课示例[M].长春:东北师范大学出版社,2000:7.

链表的c语言实现⑤ 第5篇

删除某个结点,其实就是插入某个结点的逆操作,还是对于双向循环链表,要在连续的三个结点s,p,q中删除p结点,只需把s的右链域指针指向q,q的左链域指针指向s,并收回p结点就完成了。

下面就是一个应用双向循环链表删除算法的例子:

#include

#include

#include

#define N 10

typedef struct node

{

char name[20];

struct node *llink,*rlink;

}stud;

stud * creat(int n)

{

stud *p,*h,*s;

int i;

if((h=(stud *)malloc(sizeof(stud)))==NULL)

{

printf(“不能分配内存空间!”);

exit(0);

}

h->name[0]=';

h->llink=NULL;

h->rlink=NULL;

p=h;

for(i=0;i〈n;i++)

{

if((s= (stud *) malloc(sizeof(stud)))==NULL)

{

printf(“不能分配内存空间!”);

exit(0);

}

p-〉rlink=s;

printf(“请输入第%d个人的姓名”,i+1);

scanf(“%s”,s->name);

s->llink=p;

s->rlink=NULL;

p=s;

}

h->llink=s;

p->rlink=h;

return(h);

}

stud * search(stud *h,char *x)

{

stud *p;

char *y;

p=h->rlink;

while(p!=h)

{

y=p->name;

if(strcmp(y,x)==0)

return(p);

else p=p->rlink;

}

printf(“没有查找到该数据!”);

}

void print(stud *h)

{

int n;

stud *p;

p=h->rlink;

printf(“数据信息为:n”);

while(p!=h)

{

printf(“%s ”,&*(p->name));

p=p->rlink;

}

printf(“n”);

}

void del(stud *p)

{

(p->rlink)->llink=p->llink;

(p->llink)->rlink=p->rlink;

free (p);

}

main()

{

int number;

char studname[20];

stud *head,*searchpoint;

number=N;

clrscr();

head=creat(number);

print(head);

printf(“请输入你要查找的人的姓名:”);

scanf(“%s”,studname);

searchpoint=search(head,studname);

printf(“你所要查找的人的姓名是:%sn”,*&searchpoint->name);

del(searchpoint);

print(head);

}

在这里列举了一个应用单链表基本算法的综合程序,双向链表和循环链表的综合程序大家可以自己去试一试。

#include

#include

#include

#define N 10 typedef struct node

{

char name[20];

struct node *link;

}stud;

stud * creat(int n)

{

stud *p,*h,*s;

int i;

if((h=(stud *)malloc(sizeof(stud)))==NULL)

{

printf(“不能分配内存空间!”);

exit(0);

}

h->name[0]=';

h->link=NULL;

p=h;

for(i=0;i

{

if((s= (stud *) malloc(sizeof(stud)))==NULL)

{

printf(“不能分配内存空间!”);

exit(0);

}

p->link=s;

printf(“请输入第%d个人的姓名”,i+1);

scanf(“%s”,s->name);

s->link=NULL;

p=s;

}

return(h);

}

stud * search(stud *h,char *x)

{

stud *p;

char *y;

p=h->link;

while(p!=NULL)

{

y=p->name;

if(strcmp(y,x)==0)

return(p);

else p=p->link;

}

if(p==NULL)

printf(“没有查找到该数据!”);

}

stud * search2(stud *h,char *x)

{

stud *p,*s;

char *y;

p=h->link;

s=h;

while(p!=NULL)

{

y=p->name;

if(strcmp(y,x)==0)

return(s);

else

{

p=p->link;

s=s->link;

}

}

if(p==NULL)

printf(“没有查找到该数据!”);

}

void insert(stud *p)

{

char stuname[20];

stud *s;

if((s= (stud *) malloc(sizeof(stud)))==NULL)

{

printf(“不能分配内存空间!”);

exit(0);

}

printf(“n请输入你要插入的人的姓名:”);

scanf(“%s”,stuname);

strcpy(s->name,stuname);

s->link=p->link;

p->link=s;

}

void del(stud *x,stud *y)

{

stud *s;

s=y;

x->link=y->link;

free(s);

}

void print(stud *h)

{

stud *p;

p=h->link;

printf(“数据信息为:n”);

while(p!=NULL)

{

printf(“%s ”,&*(p->name));

p=p->link;

}

}

void quit()

{

exit(0);

}

void menu(void)

{

clrscr();

printf(“ttt单链表C语言实现实例n”);

printf(“tt|————————————————|n”);

printf(“tt| |n”);

printf(“tt| [1] 建 立 新 表 |n”);

Go语言单链表实现方法 第6篇

1. singlechain.go代码如下:

代码如下:

//////////

//单链表 -- 线性表

package singlechain

//定义节点

type Node struct {

Data int

Next *Node

}

/*

* 返回第一个节点

* h 头结点

*/

func GetFirst(h *Node) *Node {

if h.Next == nil {

return nil

}

return h.Next

}

/*

* 返回最后一个节点

* h 头结点

*/

func GetLast(h *Node) *Node {

if h.Next == nil {

return nil

}

i := h

for i.Next != nil {

i = i.Next

if i.Next == nil {

return i

}

}

return nil

}

//取长度

func GetLength(h *Node) int {

var i int = 0

n := h

for n.Next != nil {

i++

n = n.Next

}

return i

}

//插入一个节点

//h: 头结点

//d:要插入的节点

//p:要插入的位置

func Insert(h, d *Node, p int) bool {

if h.Next == nil {

h.Next = d

return true

}

i := 0

n := h

for n.Next != nil {

i++

if i == p {

if n.Next.Next == nil {

n.Next = d

return true

} else {

d.Next = n.Next

n.Next = d.Next

return true

}

}

n = n.Next

if n.Next == nil {

n.Next = d

return true

}

}

return false

}

//取出指定节点

func GetLoc(h *Node, p int) *Node {

if p < 0 || p >GetLength(h) {

return nil

}

var i int = 0

n := h

for n.Next != nil {

i++

n = n.Next

if i == p {

return n

}

}

return nil

}

2. main.go代码如下:

代码如下:

package main

import “fmt”

import “list/singlechain”

func main {

//初始化一个头结点

var h singlechain.Node

//往链表插入10个元素

for i := 1; i <= 10; i++ {

var d singlechain.Node

d.Data = i

singlechain.Insert(&h, &d, i)

fmt.Println(singlechain.GetLoc(&h, i))

}

fmt.Println(singlechain.GetLength(&h))

fmt.Println(singlechain.GetFirst(&h))

fmt.Println(singlechain.GetLast(&h))

fmt.Println(singlechain.GetLoc(&h, 6))

}

GO语言实现文件上传代码 第7篇

功能很简单,代码也很简洁,这里就不多废话了。

代码如下:

package main

import (

“fmt”

“io”

“net/http”

“os”

)

const (

upload_path string = “./upload/”

)

func helloHandle(w http.ResponseWriter, r *http.Request) {

io.WriteString(w, “hello world!”)

}

//上传

func uploadHandle(w http.ResponseWriter, r *http.Request) {

//从请求当中判断方法

if r.Method == “GET” {

io.WriteString(w, “我的第一个页面上传图片

”)

} else {

//获取文件内容 要这样获取

file, head, err := r.FormFile(“file”)

if err != nil {

fmt.Println(err)

return

}

defer file.Close()

//创建文件

fW, err := os.Create(upload_path + head.Filename)

if err != nil {

fmt.Println(“文件创建失败”)

return

}

defer fW.Close()

_, err = io.Copy(fW, file)

if err != nil {

fmt.Println(“文件保存失败”)

return

}

//io.WriteString(w, head.Filename+“ 保存成功”)

http.Redirect(w, r, “/hello”, http.StatusFound)

//io.WriteString(w, head.Filename)

}

}

func main() {

//启动一个http 服务器

http.HandleFunc(“/hello”, helloHandle)

//上传

http.HandleFunc(“/image”, uploadHandle)

err := http.ListenAndServe(“:8080”, nil)

if err != nil {

fmt.Println(“服务器启动失败”)

return

}

fmt.Println(“服务器启动成功”)

}

编程语言实现模式 第8篇

Visual C++是Microsoft公司推出的强大的可视化集成编程环境, 用其开发的系统具有界面友好、代码效率高和执行速度快等优点, 应用广泛[2,3,4]。

Matlab拥有强大的绘图功能, 相比VC++而言, 其描述语言更为简明, 另外, 用Matlab生成的图形可轻松实现添加文字说明、坐标轴标注、曲线说明等多种功能, 而这些若由VC来实现将较为复杂[5]。

针对Matlab与Visual C++的优缺点, 将对C++与Matlab混合编程的模式进行研究, 并实现用C++界面接收参数来调用Matlab函数的功能。Matlab的安装路径默认为C:Matlab701, Matcom安装目录为C盘。

1 使用动态链接库

利用Matlab的mcc命令建立动态链接库可以方便地将Matlab的*.m文件转化为动态链接库文件[6]。

1.1 Matlab编译环境的设置

将Matlab的*.m函数文件编译为动态链接库dll, 要先对Matlab的环境进行配置[7]。

(1) mcc编译环境设置。在环境变量设置里面添加系统变量Matlab并设把其值设为C:Matlab701, 在系统变量path中添加值C:Matlab701binwin32, 然后重启计算机或注销当前用户, 即可应用此设置。

(2) Matlab编译器设置。1) mex-setup命令设置。2) mbuild-setup命令设置。

1.2 创建动态链接库

(1) 建立m文件 (sum1.m)

(2) 将Matlab函数转成dll函数。

在Matlab7.0的Command Window下输入命令:mcc-W cpplib:libsum1-T link:lib sum1.m

生成动态链接库dll, 编译完成后, Matlab生成Libsum1.ctf;Libsum1.dll;Libsum1.h;Libsum1.lib 4个文件。

1.3 VC++6.0工程的创建与设置

(1) 建立一个C++控制台工程, 例如工程名为Test, 在工程中添加一个后缀名为.cpp的文件, 例如文件名为Test.cpp。

(2) 对VC++6.0, 进行以下设置。单击Options菜单项, 出现Options对话框, 选择Directories标签。1) 在include files里面加入C:Matlab7EXTERNINCLUDE;2) 在Library files里面加入C:Matlab7EXTERNLIBWIN32MICROSOFTMSVC60。

(3) 对Test工程, 进行以下设置。单击菜单Project, 单击Setting菜单项, 出现Project Setting对话框, 选择Link标签, 在Object/library modules:下面的文本框内容的后面加入mclmcrrt.lib libsum1.lib。

1.4 代码编辑及dll调用

(1) 将生成的4个文件以及mclmcrrt.lib文件复制到VC工程所在目录。

(2) 在VC++6.0环境中, 将libsum1.h加入到工程中。

(3) 在工程文件Test.cpp中添加代码, 流程图如图1所示。

Matlab和Visual C++的混合编程的矩阵运算结果如图2所示。

2 基于Matcom的C++与Matlab混合编程

2.1 Matcom

Matcom是Mathtools公司开发的, 将Matlab编译成CC++的编译器。

Matcom具有如下优点:转换过程简单容易实现, 可以方便地生成动态链接库文件和可执行文件, 不仅可转换独立的脚本文件, 也可转换嵌套脚本文件, 设置环境后, 能使用Matlab的工具箱函数[8,9]。

2.2 Matcom的安装

安装Matcom前要求已安装Visual C++。在安装过程中出现选择编译器对话框, 选择“是”。出现选择是否安装Matlab时, 选择“否”, 其他选项采用默认设置。

2.3 将M文件编译后放入VC中

(1) 启动MIDEVA, File-New, 新建一个Test1.m文件:

x=1:0.1:10;y=sin (x) ;plot (x, y) ;

m文件保存的默认位置为:Matcom安装目录Matcom45, 生成的C++文件保存的默认位置为:C:Matcom45Debug, 在该目录下将会产生Test1.h、Test1.cpp、Test1.r、Test1.obj文件。

(2) 在VC中用MFC Wizard (exe) 创建一个基于对话框名为Examle的工程[10]。在面板上添加一个ID为IDC_BUTTON1按扭, 命名为“画图”。

(3) 将C:matcom45Debug目录下的Test1.cpp文件的内容拷贝到void CExamle Dlg::On Button1 () 下。

(4) 将Matlib.h和Test1.h文件拷贝到工程Example目录下, 然后在VC中将库文件和头文件加入到工程中, 选择刚刚拷贝到Example目录下的matlib.h、v4501v和Test.h文件。

(5) 在Examle Dlg.cpp中加入如下代码:

#include"matlib.h"

#include"Test1.h"

(6) 在void CExamle Dlg::On Button1 () 中分别添加一个初始化类库调用函数”init M (MATCOM_VER-SION) ”和一个结束类库调用函数”exit M () ”, 运行程序, 点击画图按扭, 就实现了Matcom和Visual C++的混合编程的图形绘制, 效果如图3所示。

3 结束语

Matlab与C++混合程序实践性强, 采用VC++的MFC工程完成界面的框架构造, 利用Matlab强大的矩阵计算功能和绘图功能完成核心计算和图形设计, 实现了应用程序的快速开发。两者结合, 大幅减少了编程语言的冗长复杂、提高了程序的执行效率。利用VC弥补了Matlab在处理具体问题时的缺陷, 以及采用Matlab的强大数值运算等功能还可增强VC对信号处理、三维处理、自动控制等方面的能力。真正实现了界面充实、算法简单地应用程序开发。

摘要:针对Matlab与Visual C++的优缺点, 研究了C++与Matlab混合编程的模式, 采用编译动态链接库和通过Matcom软件作为中间媒介, 两种方法分别实现了用C++界面接收参数来调用Matlab的矩阵运算函数和绘制图形函数的功能, 有助于将Matlab函数的计算结果及生成的图形通过Visual C++发布到网络中去。

关键词:Matlab,Visual C++,混合编程,动态链接库

参考文献

[1]吕延庆, 朱坚民, 周福章, 等.基于Visual C++和Matlab的联合编程方法的研究[J].计算机应用研究, 2000, 17 (11) :101-103.

[2]郑阿奇.Visual C++实用教程[M].北京:电子工业出版社, 2010.

[3]刘维.精通Matlab与C/C++混合程序设计[M].3版.北京:航空大学出版社, 2012.

[4]肖永韧, 解习农, 刘晓峰.VC与Matlab混合编程之dll实现方法[J].计算机工程与应用, 2001, 37 (13) :174-176.

[5]李娟, 张钦.基于动态链接库的Visual C++混合编程[J].计算机工程与设计, 2010, 31 (9) :2140-2143.

[6]蒋忠进, 林君, 陈祖斌.在Visual C++中调用Matlab以实现数学算法[J].计算机应用研究, 2004, 21 (5) :89-91.

[7]潘孝勇, 姜伟, 杨继隆.Visual C++与Matlab的混合编程[J].计算机仿真, 2004, 21 (3) :140-143.

[8]陶红, 袁金荣.Matlab与C/Visual C++混合编程的实现[J].计算机工程与应用, 2000, 36 (10) :100-102.

[9]Math Tools.Matcom&Visual Matcom user&apos;s guide[M].USA:Math Tools, 1999.

上一篇:重庆各大高校寒假放假时间202下一篇:对申请公开的政府信息