急 急 急 求一篇关于《通信网络仿真研究》的论文

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了急 急 急 求一篇关于《通信网络仿真研究》的论文相关的知识,希望对你有一定的参考价值。

参考技术A 帮您下了两篇,希望对您有所帮助哦!祝您愉快!

1
题目:基于无线传感器网络仿真平台的研究
一、引言

传感器网络(WSN)日新月异,各种网络方案和协议日趋复杂,网络规模日趋庞大,对网络研究人员而言,掌握网络仿真的重要性是不言而喻的。WSN仿真能够在一个可控制的环境里研究WSN应用,包括操作系统和网络协议栈,能够仿真数量众多的节点,能够观察由不可预测的干扰和噪声引起的难以琢磨的节点间的相互作用,获取节点间详细的细节,从而提高节点投放后的网络成功率,减少投放后的网络维护工作。目前无线传感器网络使用的仿真工具主要有NS2、TinyOS、OPNET、OMNET++等等。其中TinyOS是专门针对无线传感器网络的特点而研究开发的。

二、无线传感器网络仿真简介

在传感器网络中,单个传感器节点有两个很突出的特点。一个特点是它的并发性很密集;另一个特点是传感器节点模块化程度很高.上述这些特点使得无线传感器网络仿真需要解决可扩展性与仿真效率、分布与异步特性、动态性、综合仿真平台等等问题。

三、无线传感器网络常用仿真工具

无线传感器网络常用仿真工具有NS2、OPNET、OMNET++、TinyOS,下面我们简要介绍它们各自的性能和特点。

3.1 NS2
NS是一种可扩展、以配置和可编程的时间驱动的仿真工具,它是由REAL仿真器发展而来.在NS的设计中,使用C++和OTCL两种程序设计语言, C++是一种相对运行速度较快但是转换比较慢的语言,所以C++语言被用来实现网络协议, 编写NS底层的仿真引擎; OTCL是运行速度较慢,但可以快速转换的脚本语言,正好和C++互补,所以OTCL语言被用来配置仿真中各种参数,建立仿真的整体结构, OTCL的脚本通过调用引擎中各类属性、方法,定义网络的拓扑,配置源节点、目的节点建立链接,产生所有事件的时间表,运行并跟踪仿真结果,还可以对结果进行相应的统计处理或制图.NS可以提供有线网络、无线网络中链路层及其上层精确到数据包的一系列行为仿真。NS中的许多协议都和真实代码十分接近,其真实性和可靠性是非常高的。

3.2 OPNET
OPNET是在MIT研究成果的基础上由MIL3公司开发的网络仿真软件产品。 OPNET的主要特点包括以下几个方面:(1)采用面向对象的技术,对象的属性可以任意配置,每一对象属于相应行为和功能的类,可以通过定义新的类来满足不同的系统要求; (2)OPNET提供了各种通信网络和信息系统的处理构件和模块;(3) OPNET采用图形化界面建模,为使用者提供三层(网络层、节点层、进程层)建模机制来描述现实的系统;(4) OPNET在过程层次中使用有限状态机来对其它协议和过程进行建模,用户模型及OPNET内置模型将会自动生成C语言实现可执行的高效、高离散事件的模拟流程;(5) OPNET内建了很多性能分析器,它会自动采集模拟过程的结果数据;(6)OPNET几乎预定义了所有常用的业务模型,如均匀分布、泊松分布、欧兰分等。

3.3 OMNET++
OMNET++是面向对象的离散事件模拟工具,为基于进程式和事件驱动两种方式的仿真提供了支持。 OMNET++采用混合式的建模方式,同时使用了OMNET++特有的ned(Network Discription,网络描述)语言和C++进行建模。OMNET++主要由六个部分组成:仿真内核库、网络描述语言的编译器、图形化的网络编译器、仿真程序的图形化用户接口、仿真程序的命令行用户接口和图形化的向量输出工具。OMNET++的主要模型拓扑描述语言NED,采用它可以完成一个网络模型的描述。 网络描述包括下列组件:输入申明、信道定义、系统模块定义、简单模块和复合模块定义。使用NED描述网络,产生.NED文件,该文件不能直接被C++编译器使用,需要首先采用OMNET++提供的编译工具NEDC将.NED文件编译成.cpp文件。最后,使用C++编译器将这些文件与用户和自己设计的简单模块程序连接成可执行程序。

3.4 TinyOS
TinyOS是专门针对传感器研发出的操作系统。在TinyOS上编程序使用的语言为nesC(C language for network embedded systems) 语言。

nesC语言是由C语言扩展而来的,意在把组件化/模块化思想和TinyOS基于事件驱动的执行模型结合起来。 nesC 组件有Module(模块)和Configuration(连接配置文件)两种。在模块中主要实现代码的编制,在连接配置文件中主要是将各个组件和模块连接起来成为一个整体。

TinyOS程序采用的是模块化设计,所以它的程序核心往往都很小,能够突破传感器存储资源少的限制,这能够让TinyOS很有效的运行在无线传感器网络上并去执行相应的管理工作等。TinyOS的特点主要体现在以下几个方面:

(1)组件化编程(Componented-Based Architecture)。TinyOS的组件通常可以分为以下三类:硬件抽象组件、合成组件、高层次的软件组件;硬件抽象组件将物理硬件映射到TinyOS组件模型.合成硬件组件模拟高级硬件的行为.高层次软件模块完成控制、路由以及数据传输等。

(2)事件驱动模式(Event-Driven Architecture)。事件驱动分为硬件驱动和软件事件驱动。硬件事件驱动也就是由一个硬件发出中断,然后进入中断处理函数。而软件驱动则是通过singal关键字发出一个事件。

(3)任务和事件并发模式(Tasks And Events Concurrency Model)。任务用在对于时间要求不是很高的应用中,任务之间是平等的,即在执行时是按顺序先后来的,而不能相互抢占,TinyOS对任务是按简单的FIFO队列进行处理的。事件用在对于时间的要求很严格的应用中,而且它可以占先优于任务和其他事件执行。

(4)分段执行(Split-Phase Operations)。在TinyOS中由于tasks 之间不能互相占先执行,所以TinyOS没有提供任何阻塞操作,为了让一个耗时较长的操作尽快完成,一般来说都是将对这个操作的需求和这个操作的完成分开来实现,以便获得较高的执行效率。

(5) 轻量级线程(lightweight thread)。轻量级线程(task, 即TinyOS中的任务)按FIFO方式进行调度,轻量级线程之间不允许抢占;而硬件处理线程(在TinyOS中,称为硬件处理器),即中断处理线程可以打断用户的轻量级线程和低优先级的中断处理线程,对硬件中断进行快速处理响应。

(6) 主动通信消息(active message)。每一个消息都维护一个应用层和处理器。当目标节点收到这个消息后,就会把消息中的数据作为参数,并传递给应用层的处理器进行处理。应用层的处理器一般完成消息数据的解包操作、计算处理或发送响应消息等工作。

TinyOS操作系统中常用的仿真平台主要是TOSSIM和Avrora

(1)TOSSIM(TinyOS simulation)是一个支持基于TinyOS的应用在PC机上运行的模拟器.TOSSIM运行和传感器硬件相同的代码,仿真编译器能直接从TinyOS应用的组件表中编译生成仿真程序。

(2)Avrora是一种专门为Atmel和Mica2节点上以AVR单片机语言编写的程序提供仿真分析的工具。它的主要特点如下:1) 为AVR单片机提供了cycle accurate级的仿真,使静态程序可以准确的运行。它可以仿真片上(chip-on)设备驱动程序,并为片外(off-chip)程序提供了有规则的接口;2)可以添加监测代码来报告仿真程序运行的性能,或者可以在仿真结束后收集统计数据,并产生报告;3)提供了一套基本的监控器来剖析程序,这有助于分析程序的执行模式和资源使用等等;4)Avrora可以用gdb调试程序;5) Avrora可以为程序提供一个程序流图,通过这个流程图可以清楚的表示机器代码程序的结构和组织;6) Avrora中提供了分析能量消耗的工具,并且可以设置设备的带电大小;7) Avrora可以用来限制程序的最大堆栈空间,它会提供一些关于目前程序中的最大的堆栈结构,和一些关于空间和时间消耗的信息报告。

3.5性能比较

TinyOS 用行为建模,可以仿真跨层协议;仿真程序移植到节点上,不需要二次编码。
通过对上述几种仿真软件的分析比较,我们可以清楚的看到各个仿真软件的特点、适用范围,我们可以根据研究需要选择适合的仿真软件,使得我们的学习研究可以事半功倍。

结束语

网络仿真技术为通信网络规划和优化提供了一种科学高效的方法。网络仿真在国内是近几年才发展起来的,但在国外网络仿真技术已经相当成熟,我们应该大胆地借鉴国外先进技术,促进国内网络仿真技术迅速发展。

参考文献
【1】于海斌,曾鹏等.智能无线传感器网络.科学出版社,2006,p283~p303,
【2】石怀伟,李明生,王少华,网络仿真技术与OPNET应用实践,计算机系统应用2006.第3期
【3】李玥,吴辰文,基于OMNeT++地TCP/IP协议仿真,兰州交通大学学报(自然科学版),2005年8月
【4】袁红林,徐晨,章国安,TOSSIM:无线传感器网络仿真环境,传感器与仪表仪器 ,2006年第22卷第7-1期

2

集群虚拟服务器的仿真建模研究

来源:电子技术应用 作者:杨建华 金笛 李烨 宁宇

摘要:阐述了集群虚拟服务器的工作原理和三种负载均衡方式,通过实例讨论了虚拟服务器的仿真和建模方法,创建了测试和仿真系统性能的输入和系统模型,并依据Q—Q图和累积分布函数校验了其概率分布。

关键词:集群虚拟服务器负载均衡仿真建模概率分布

随着互联网访问量和数据流量的快速增长,新的应用层出不穷。尽管Intemel服务器处理能力和计算强度相应增大,但业务量的发展超出了先前的估计,以至过去按最优配置建设的服务器系统也无法承担。在此情况下,如果放弃现有设备单纯将硬件升级,会造成现有资源的浪费。因此,当前和未来的网络服务不仅要提供更丰富的内容、更好的交互性、更高的安全性,还要能承受更高的访问量,这就需要网络服务具有更高性能、更大可用性、良好可扩展性和卓越的性价比。于是,集群虚拟服务器技术和负载均衡机制应运而生。

集群虚拟服务器可以将一些真实服务器集中在一起,组成一个可扩展、高可用性和高可靠性的统一体。负载均衡建立在现有网络结构之上,提供了一种廉价、有效和透明的方法建立服务器集群系统,扩展网络设备和服务器的带宽,增加吞吐量,加强网络数据处理能力。提高网络的灵活性和可用性。使用负载均衡机制.大量的并发访问或数据流量就可以分配到多台节点设备上分别处理。系统处理能力得到大幅度提高,大大减少用户等待应答的时间。

实际应用中,虚拟服务器包含的真实服务器越多,整体服务器的性能指标(如应答延迟、吞吐率等)越高,但价格也越高。在集群中通道或其他部分也可能会进入饱和状态。因此,有必要根据实际应用设计虚拟服务器的仿真模型,依据实际系统的测量数据确定随机变量的概率分布类型和参数,通过分位点一分位点图即Q-Q图(Quaantile-Quantile Plot)和累积分布函数(Cumulative Distribution Functions)等方法校验应答或传播延迟等性能指标的概率分布,通过仿真软件和工具(如Automod)事先分析服务器的运行状态和性能特点,使得集群系统的整体性能稳定,提高虚拟服务器设计的客观性和设计的可靠性,降低服务器建设的投资风险。

1 集群虚拟服务器的体系结构

一般而言,首先需要在集群虚拟服务器上建立互联网协议伪装(Internet Protocol Masquerading)机制,即IP伪装,接下来创立IP端口转发机制,然后给出在真实服务器上的相关设置。图1为集群虚拟服务器的通用体系结构。集群虚拟服务器通常包括:真实服务器(RealServers)和负载均衡器(Load Balmlcer)。

由于虚拟服务器的网络地址转换方式是基于IP伪装的,因此对后台真实服务器的操作系统没有特别要求,可以是windows操作系统,也可以是Lmux或其他操作系统。

负载均衡器是服务器集群系统的惟一入口点。当客户请求到达时,均衡器会根据真实服务器负载情况和设定的调度算法从真实服务器中选出一个服务器,再将该请求转发到选出的服务器,并记录该调度。当这个请求的其他报文到达后,该报文也会被转发到前面已经选出的服务器。因为所有的操作都在操作系统核心空间中完成,调度开销很小,所以负载均衡器具有很高的吞吐率。整个服务器集群的结构对客户是透明的,客户看到的是单一的虚拟服务器。

负载均衡集群的实现方案有多种,其中一种是Linux虚拟服务器LVS(Linux Virtual Server)方案。LVS实现负载均衡的技术有三种:网络地址转换(Network Address Translation)、直接路由(Direct Routing)和IP隧道(IP Yunneling)。

网络地址转换按照IETF标准,允许一个整体机构以一个公用IP地址出现在Inlemet上。通过网络地址转换,负载均衡器重写请求报文的目标地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的应答报文通过均衡器时,报文的源地址被重写,把内部私有网络地址翻译成合法网络IP地址,再返回给客户,完成整个负载调度过程。

直接路由的应答连接调度和管理与网络地址转换的调度和管理相同,但它的报文是直接转发给真实服务器。在直接路由应答中,均衡器不修改、也不封装IP报文.而是将数据帧的媒体接入控制MAC(Medium Aceess Control)地址改为选出服务器的MAC地址,再将修改后的数据帧在局域网上发送。因为数据帧的MAC地址是选出的服务器,所以服务器肯定可以收到该数据帧,从中获得该IP报文。当服务器发现报文的目标地址在本地的网络设备时,服务器处理该报文,然后根据路由表应答报文,直接返回给客户。

IP隧道是将一个IP报文封装在另一个IP报文中的技术。该技术可以使目标为某个口地址的数据报文被封装和转发到另一个IP地址。用户利用IP隧道技术将请求报文封装转发给后端服务器,应答报文能从后端服务器直接返回给客户。这样做,负载均衡器只负责调度请求,而应答直接返回给客户,不需要再处理应答包,将极大地提高整个集群系统的吞吐量并有效降低负载均衡器的负载。IP隧道技术要求所有的服务器必须支持IP Yunnehng或lP.封装(Encapsulation)协议。

2 集群虚拟服务器报文延迟的确定

通过一个装有5台真实服务器并使用网络地址转换技术实现Linux虚拟服务器的实际系统,可以得到有关请求和应答报文的时戳(Time Stamp)文件n根据这些文件.能够计算出集群虚拟服务器的仿真和建模所需数据。

为了确定随机变量分布类型和参数,应该统计下列延迟:(1)从客户到负载均衡器的传播延迟(Transport Delay);(2)负载均衡器的应答延迟(Response Delay);(3)从负载均衡器到真实服务器的传播延迟;(4)真实服务器的应答延迟;(5)从真实服务器到负载均衡器的传播延迟;f61负载均衡器对真实服务器的应答延迟;(7)从负载均衡器到客户的传播延迟。

在实际系统产生的时戳文件中,问接地描述了上述各延迟时间。文件包含的内容如下:

当一个服务请求到达集群虚拟服务器系统时,即产生带有惟一序列号的同步请求报文(Synchronized Request Package),将该报文转发到某一真实服务器,同时建立该服务器与客户端的连接,每个这样的连接都带有惟一的端口号;该服务器处理通过该连接的确认请求报文(Acknowledgement Request Package),直到服务器收到结束请求报文(Finished Request Package)。对每一种类型的请求报文,系统都给予一个相应的应答报文。因此,在不同的报文时戳文件中,如果两条记录具有相同的端口号、报文类型和序列号,则它们是同一个请求或应答报文,对相关的时戳相减即可得到集群虚拟服务器系统的仿真和建模所需的延迟数据。通过所编写的C++程序即可计算这些延迟。

3 系统仿真模型

上述的集群虚拟服务器实际系统的仿真模型如图2所示,在负载均衡器、各通道、5台真实服务器中通过或处理的均为请求或应答报文。

4 随机变量模型的确定

对具有随机变量的集群虚拟服务器进行仿真,必须确定其随机变量的概率分布,以便在仿真模型中对这些分布进行取样,得到所需的随机变量。

4.1 实际虚拟服务器的延迟数据概况

在实际虚拟服务器的负载均衡器、各通道和5台真实服务器中,对请求和应答报文都有一定的延迟。部分报文延迟的统计数据如表1所示。

由表l中的数据可见,报文延迟的中位数与均值差异较大,所以其概率分布不对称;变异系数不等于l,导致概率分布不会是指数分布,而可能是γ分布或其他分布。

4.2 随机变量的概率分布

图3为第一台真实服务器到负载均衡器之间的通道报文传播延迟直方图,其中t为报文延迟时间,h(t)为报文延迟区间数。由图3可知,通道内的报文传播延迟数据近似服从γ分布或对数正态分布。

描述γ分布需要两个参数:形状(Shape)参数α和比例(Scahj)参数口,这两个参数与均值M、方差V之间的关系是非线性的:

描述对数正态分布也需要形状参数σ和比例参数μ,这两个参数与均值M、方差V之问的关系也是非线性的:

式(1)~(4)都可以通过最大似然估计MLE(Maximum Likelihood Estimator)方法或最速下降法(Steepest Descent Method)求出。表2给出了甩这两种方法求出的从第一台真实服务器到负载均衡器之间通道内的报文延迟概率分布参数。

使用累积分布函数和Q-Q图可以校验并进一步确定上述通道内报文传播延迟的概率分布。取用表2中的参数,可以得到γ分布的累积分布函数,如图4所示,其中t为报文延迟时间,F(t)为报文延迟的累积分布函数。为作比较,实验分布也画在该图中。γ分布和对数正态分布的Q-Q图如图5所示。

由图4和图5可以看出,γ分布较好地拟合了该通道内的报文传播延迟数据分布。其他通道报文延迟直方图也有类似形状。经计算和分析,这些通道的报文传播延迟概率分布也近似服从γ分布。

根据表1中的数据以及相关的直方图都难以确定在负载均衡器和真实服务器中报文延迟的理论分布。因此,采用实验分布作为其模型。

5 模型仿真

在建立了图1所示的集群虚拟服务器的系统仿真模型并确定了其随机变量的分布特性后,可以采用由美国布鲁克斯自动化公司(Brooks Automation)开发的仿真软件Automod输入该模型,并通过在Automod环境中编程进行集群虚拟服务器的仿真和分析。

在Automod的仿真过程中,可以直接利用软件提供的资源(Resource)作为各种报文数据处理的单元;系统各部分的报文排队活动可以直接通过排队(Queue)实现;建立一个负载产生器,等效为在Inlemtet上使用虚拟服务器的客户。

通过采用Automod的属性变量(Attribute Variable)可以解决负载均衡器的双方向报文处理功能的问题。负载均衡器使用轮转调度算法(Round Robin Scheduling),即假设所有真实服务器的处理性能均相同,依次将请求调度到不同的服务器。

验证仿真模型可以分别在实际虚拟服务器系统和Automod的仿真模型中从以下两方面进行对比:(1)在负载均衡器、各个真实服务器和通道中排队的应答或传播报文数量;(2)真实服务器及负载均衡器的cPU利用率。例如,当使用实际的应答或传播报文延迟数据时,在Automod的仿真模型中,如果设置一个较低的资源量,则在仿真过程中就会发现大部分的负载都被堵在真实服务器的排队中,即真实服务器处理报文的能力过低,无法与实际系统的状况相比;如果设置一个较高的资源量,则意味着服务器的并行处理能力增加,真实服务器的利用率提高,负载就很少或不会滞留在真实服务器的排队中。因此,在Automod中可以根据实际情况调整仿真模型的资源量大小。

如果在Automod中增加负载产生器的负载产生率,就等效为用户访问量增加,通过观察排队中的负载滞留比例,就可以发现系统的最大处理报文的能力以及系统各部分应答报文可能出现瓶颈之处。例如,将负载产生率增加一倍,虽然系统仍然可以处理所有的报文,但各台真实服务器的平均利用率将达80%左右。显然,这时系统应答报文的“瓶颈”为真实服务器,有必要在系统中增添一台新的真实服务器。

通过一个包括5台真实服务器的实际虚拟服务器系统。收集并计算了仿真和建模的样板数据。依据系统报文延迟的中位数、均值、变异系数和直方图等,确定了系统随机变量的概率分布;采用最大似然估计方法和最速下降法,得到了通道概率分布的具体参数;根据Q-Q图和累积分布函数进一步校验并最终确定通道的概率分布形式。使用Automod软件进行了仿真建模和编程,借助仿真结果可以发现虚拟服务器的最大处理能力和可能的“瓶颈”之处。通过及时定位系统“瓶颈”,可以有的放矢地进一步研究和改进系统,有效提高系统性能。所采用的仿真方法也可以用于其他领域的仿真建模或分析中。

在仿真模型中,负载均衡方式和调度算法还需要进一步增加,以便于比较不同的虚拟服务器系统。样本数据也需要进一步扩充,以避免报文延迟的自相关性。

急!!![80分]求一C语言程序

本人对C语言一窍不通(TC),却要交一个课程设计,请各位大虾帮帮忙!

题目如下
使用结构体,管理学生的成绩。
1. 建立一个结构体,可以保存学生的学号、语文、数学、外语,总分,假设学生数目不超过50个。
2.建立一个函数,可以从键盘依次输入每个学生的学号和语文、数学、外语,并能够计算总分。
3. 建立一个函数,提示操作者输入要修改数据的学生的学号,然后查找,找到,显示该学生的数据,操作者可以修改数据,修改后能计算并显示;找不到,显示“zhaobudao xuehao!”。
4. 建立一个函数,提示操作者输入要查找数据的学生的学号,然后查找,找到,显示该学生的数据;找不到,显示“zhaobudao cixuehao!”。
5.建立一个函数,提示操作者输入要删除数据的学生的学号,然后查找,找到,删除该学生的数据;找不到,显示“zhaobudao cixuehao!”。
6.建立一个菜单,如下图所示
1.依次输入成绩
2.修改学生成绩
3.查询学生成绩
4.退 出
操作员根据提示输入1,2,3,然后调用相应的函数,操作员输入4,结束本程序。
本人只有80分,对不住大家!

#include <stdio.h>

// 1结构体,可以保存学生的学号、
//语文、数学、外语,总分,假设学生数目不超过50个
struct Student

int No; //学号
float Chinese; //语文
float math; //数学
float English; //外语
float Sum; //总分
student[50];

//全局变量,记录学生的个数
int n = 0;

//根据学号查找是否存在,-1不存在
int isRepeat(int No);

/*显示提示信息
6.建立一个菜单,如下图所示
1.依次输入成绩
2.修改学生成绩
3.查询学生成绩
4.删除学生成绩
5.退 出 */
void ShowMessage();

/*2 从键盘依次输入每个学生的学号
和语文、数学、外语,并能够计算总分*/
void Input();

/*3 提示操作者输入要修改数据的学生的学号,
然后查找,找到,显示该学生的数据,操作者可以修改数据,
修改后能计算并显示;找不到,显示“zhaobudao xuehao!”。*/
void Update();

/*4 提示操作者输入要查找数据的学生的学号,
然后查找,找到,显示该学生的数据;找不到,
显示“zhaobudao cixuehao!”。*/
void Query();

/*5 提示操作者输入要删除数据的学生的学号,
然后查找,找到,删除该学生的数据;找不到,
显示“zhaobudao cixuehao!”。
在这里删除采用的是把相应的字段置0。*/
void Delete();

//主函数
int main()

int Choice;

while (1)

ShowMessage();
scanf("%d", &Choice);
switch(Choice)

case 1:
Input();
break;
case 2:
Update();
break;
case 3:
Query();
break;
case 4:
Delete();
break;
case 5:
return 0;
break;
default:
ShowMessage();
break;




//根据学号查找是否存在,-1不存在
int isRepeat(int No)

int i;
for (i=0; i<n; ++i)

if (student[i].No==No)

return i;


return -1;


/*显示提示信息
6.建立一个菜单,如下图所示
1.依次输入成绩
2.修改学生成绩
3.查询学生成绩
4.删除学生成绩
5.退 出 */
void ShowMessage()

printf("*************************************************\n");
printf("* *\n");
printf("* 欢迎使用学生成绩管理系统 *\n");
printf("* *\n");
printf("*************************************************\n");
printf(" 选择您要进行的操作(1—4)\n");
printf(" 1 依次输入成绩\n");
printf(" 2 修改学生成绩\n");
printf(" 3 查询学生成绩\n");
printf(" 4 删除学生成绩\n");
printf(" 5 退 出\n");


/*2 从键盘依次输入每个学生的学号
和语文、数学、外语,并能够计算总分*/
void Input()

int No;
printf("第%d学生:\n", n+1);
printf("学号:");
scanf("%d",&No);
if (-1!=isRepeat(No))

printf("你输入的学号己存在!\n");

else

student[n].No = No;
printf("语文成绩:");
scanf("%f",&student[n].Chinese);
printf("数学成绩:");
scanf("%f",&student[n].math);
printf("外语成绩:");
scanf("%f",&student[n].English);
student[n].Sum = student[n].Chinese + student[n].math + student[n].English;
++n;
printf("输入完毕!\n");




/*3 提示操作者输入要修改数据的学生的学号,
然后查找,找到,显示该学生的数据,操作者可以修改数据,
修改后能计算并显示;找不到,显示“zhaobudao xuehao!”。*/
void Update()

int No;
int i;
printf("请输入要修改的学生学号:");
scanf("%d", &No);
i = isRepeat(No);
if (-1==i)

printf("找不到学号!\n");

else

printf("语文成绩:%.1f 修改为:", student[i].Chinese);
scanf("%f", &student[i].Chinese);
printf("数学成绩:%.1f 修改为:", student[i].math);
scanf("%f", &student[i].math);
printf("外语成绩:%.1f 修改为:", student[i].English);
scanf("%f", &student[i].English);
student[i].Sum = student[i].Chinese + student[i].math + student[i].English;
printf("修改完毕!\n");



/*4 提示操作者输入要查找数据的学生的学号,
然后查找,找到,显示该学生的数据;找不到,
显示“zhaobudao cixuehao!”。*/
void Query()

int No;
int i;
printf("请输入要查询的学生学号:");
scanf("%d", &No);
i = isRepeat(No);
if (-1==i)

printf("找不到此学号!\n");

else

printf("语文成绩:%.1f\n", student[i].Chinese);
printf("数学成绩:%.1f\n", student[i].math);
printf("外语成绩:%.1f\n", &student[i].English);
printf("输出完毕!\n");



/*5 提示操作者输入要删除数据的学生的学号,
然后查找,找到,删除该学生的数据;找不到,
显示“zhaobudao cixuehao!”。
在这里删除采用的是把相应的字段置0。*/
void Delete()

int No;
int i;
printf("请输入要删除的学生学号:");
scanf("%d", &No);
i = isRepeat(No);
if (-1==i)

printf("找不到此学号!\n");

else

student[i].No = -1;
student[i].Chinese = 0;
student[i].math = 0;
student[i].English = 0;
printf("删除完毕!\n");

参考技术A #include <stdio.h>
struct

int xuehao;
float yuwen,shuxue,waiyu,zongfen;

xuesheng[100];
static num2;
main()

int num1;
num1=0;
num2=1;
while(1)

printf("please choose:\n");
printf("1.yici shuru chengji\n");
printf("2.xiugai xuesheng chengji\n");
printf("3.chaxun xuesheng chengji\n");
printf("4.tuichu\n");
scanf("%d",&num1);
switch(num1)

case 1:input_information(num2);
num2++;break;
case 2:xiugai_chengji();break;
case 3:chaxun_chengji();break;
case 4:exit();



int input_information(int num)

float total;
printf("please input xuehao yuwen shuxue waiyu\n");
scanf("%d %f %f %f",&xuesheng[num].xuehao,&xuesheng[num].yuwen,&xuesheng[num].shuxue,&xuesheng[num].waiyu);
total=xuesheng[num].yuwen+xuesheng[num].shuxue+xuesheng[num].waiyu;
xuesheng[num].zongfen=total;


int xiugai_chengji()

int i,num3;
float total;
i=0;
num3=0;
printf("shuru xuehao:\n");
scanf("%d",&num3);
for (i=1;i<num2;i++)
if(num3==xuesheng[i].xuehao)

printf("please input xuehao yuwen shuxue waiyu\n");
scanf("%d %f %f %f",&xuesheng[num3].xuehao,&xuesheng[num3].yuwen,&xuesheng[num3].shuxue,&xuesheng[num3].waiyu);
total=xuesheng[num3].yuwen+xuesheng[num3].shuxue+xuesheng[num3].waiyu;
xuesheng[num3].zongfen=total;
return;

printf("zhaobudao cixuehao!\n");
return;

int chaxun_chengji()

int i;
int num3;
printf("shuru xuehao:\n");
scanf("%d",&num3);
for (i=1;i<num2;i++)
if(num3==xuesheng[i].xuehao)

printf("xuehao yuwen shuxue waiyu zongfen\n");
printf("%d %6f %6f %6f %6f\n",xuesheng[num3].xuehao,xuesheng[num3].yuwen,xuesheng[num3].shuxue,xuesheng[num3].waiyu,xuesheng[num3].zongfen);
return;

printf("zhaobudao cixuehao!\n");
return;


总算写完了测试也通过了.给分吧!
qq 64924930本回答被提问者采纳
参考技术B #include<stdio.h>
#include<string.h>
#include<ctype.h>
#define N 50
#define NULL 0
struct student

char num[50];
float Chinese;
float Math;
float English;
float Total;
struct student *next;
stu[N];

void main()

struct student *input();
void alter(struct student *);
void search(struct student *);
struct student *head=NULL;
for(;;)

switch(menu_select())

case 1:head=input();break;
case 2:alter(head);break;
case 3:search(head);break;
case 4:printf("Goodbye!\n");exit(0);



clrscr();


int menu_select()

int ch;
printf("1.Enter the static of the students.\n");
printf("2.Alter the static of the student.\n");
printf("3.Search the static of the student.\n");
printf("4.Quit.\n");
do

printf("Make a chioce.");
scanf("%d",&ch);
while(ch>4 || ch<1);
return(ch);


struct student *input()

struct student *p1,*p2,*p3,*head;
int i=1,j,k,n=0;
printf("input the static:\n");
p1=p2=(struct student *) malloc (sizeof(struct student));
head=NULL;
printf("num:");
scanf("%s",p1->num);
if(strcmp(p1->num,"0")==0)/*输入0时可以结束*/
goto end;
printf("Chinese score:");
scanf("%f",&p1->Chinese);
printf("English score:");
scanf("%f",&p1->English);
printf("Math score:");
scanf("%f",&p1->Math);
p1->Total=p1->Chinese+p1->English+p1->Math;
p2=p1;
while(strcmp(p1->num,"0")!=0 && i<50)

i++;
n=n+1;
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(struct student *) malloc (sizeof(struct student));
printf("num:");
scanf("%s",p1->num);
if(strcmp(p1->num,"0")==0)
goto end;
printf("Chinese score:");
scanf("%f",&p1->Chinese);
printf("English score:");
scanf("%f",&p1->English);
printf("Math:");
scanf("%f",&p1->Math);
p1->Total=p1->Chinese+p1->English+p1->Math;

end:
p2->next=NULL;
p1=head;
printf("\tNUM\tChinese\tEnglish\tMath\tTotal\n");
while(p1!=NULL)

printf("\t%-5s\t%-5.2f\t%-5.2f\t%-5.2f\t%-5.2f\n",p1->num,p1->Chinese,p1->English,
p1->Math,p1->Total);
p1=p1->next;

return(head);


void alter(struct student *head)

struct student *p1,*p2;
char ser[50];
int i,j,k;
if(head==NULL)
printf("zhaobudao xuehao!\n");
else

printf("input the number to alter:");
scanf("%s",ser);
p1=p2=head;
while(p1->next!=NULL && (strcmp(ser,p1->num)!=0))

p2=p1;
p1=p1->next;

if(strcmp(ser,p1->num)==0)

printf("Enter the new static:\n");
printf("Chinese:");
scanf("%f",&p1->Chinese);
printf("English:");
scanf("%f",&p1->English);
printf("Math:");
scanf("%f",&p1->Math);
p1->Total=p1->Chinese+p1->English+p1->Math;

else
printf("zhaobudao xuehao!");

p1=head;
printf("\tNUM\tChinese\tEnglish\tMath\tTotal\n");
while(p1!=NULL)

printf("\t%s\t%5.2f\t%5.2f\t%5.2f\t%5.2f\n",p1->num,
p1->Chinese,p1->English,p1->Math,p1->Total);
p1=p1->next;




void search(struct student *head)

struct student *p1;
int i,j;
char ser[50];
printf("input the num to search:");
scanf("%s",ser);
if(head==NULL)
printf("\nzhaobudao xuehao!\n");
p1=head;
while((strcmp(ser,p1->num)!=0) && p1->next!=NULL)

p1=p1->next;

if(strcmp(ser,p1->num)==0)

printf("\tNUM\tChinese\tEnglish\tMath\tTotal\n");
printf("\t%s\t%-5.2f\t%-5.2f\t%-5.2f\t%5.2f\n",p1->num,p1->Chinese,p1->English,p1->Math,p1->Total);

else
printf("zhaobudao xuehao!\n");


总算做完了,不过看见已经有人给你答案了,择优录用,任君选择吧
参考技术C 这个程序好像不太难,80分也不低了,不过,最近感冒的挺厉害,头脑不太清楚.不过,记得谭浩强C语言的书,后面结构体那块的例子,你改改应该就可以了的了. 参考技术D 这程序这么复杂,80分没人愿意去写啊!

以上是关于急 急 急 求一篇关于《通信网络仿真研究》的论文的主要内容,如果未能解决你的问题,请参考以下文章

求一编基于JAVA银行帐目管理系统的设计与实现的文章。急!!!!!!!!!!!!!!!!

运料小车自动控制组态仿真

高分悬赏急求一段源代码

急!!![80分]求一C语言程序

C语言利用函数调用求一组数的最大值,最小值,平均数。。。。。。急。。。。

急急急!!!!!!关于虚拟机的网络设置