c++实验(网络工程)(精选11篇)
Object Oriented Programming
课程编号: 学 分: 学 时:10 先修课程:计算机导论、C语言程序设计 适用专业:计算机科学与技术、软件工程 教 材:《C++程序设计教程:实验手册》,清华大学出版社,Harvery M.,Paul J.,Tem R.,2004 开课院系:计算机科学与技术系
一、实验的性质和任务
C++是一门高效实用的程序设计语言,它既可进行过程化程序设计,也可进行面向对象程序设计。随着C++逐渐成为ANSI标准,这种新的面向对象程序设计语言已经成为了程序员最广泛使用的工具。本课程是一门计算机及相关专业的重要的专业基础课,开设实验课程主要目的是使学生掌握有关C++语言的基本概念、基本语法和编程方法,理解C++语言面向对象的重要特征,促使学生理论联系实际,能够灵活应用自己所学的理论知识进行程序开发,增强学生的实践动手技能,并能够提高学生独立分析问题和解决问题的能力。
二、实验的基本内容及要求
实验
一、C++程序的运行环境、简单C++数据类型及运算(1学时)1. 实验目的
(1)熟悉VC++6.0集成开发环境;掌握简单C++程序的编辑、编译和运行
(2)熟悉和理解C++语言中的数据类型、表达式;掌握简单C++程序的编写及调试方法
2. 实验内容
(1)熟悉VC++6.0集成开发环境的基本操作方法,学会独立使用该系统(2)了解在该系统上如何编辑、编译、连接和运行一个C++程序(3)通过运行一个简单的C++程序,初步了解C++源程序的特点
(4)熟悉和理解C++语言中的数据类型、表达式,了解基本数据类型的字节宽度和范围表示
(5)利用学习的数据类型,编制简单的C++程序实验准备(6)初步学习程序调试方法 3. 实验准备
(1)安装Visual C++编译系统
(2)熟悉Vc++6.0编译系统的使用步骤,以及简单C++程序的编辑、编译和运行过程(3)复习C++的基本数据类型,表达式(4)复习程序的上机调试过程
(5)根据实验内容要求,编写好实验程序 4. 实验步骤
(1)选择菜单“开始/程序/Microsoft Visual Studio 6.0/Microsoft Visual C++ 6.0”,得到Visual C++ 6.0启动后的用户界面;(2)创建一个新工程;
(3)编写一个简单的C++源程序,并保存;(4)编译连接和运行程序
(5)输入源程序,编译、连接直到没有错误(6)运行程序,观察程序运行结果 5. 实验报告
(1)提交源程序
(2)举例说明在建立源程序、编译、连接程序时,发现的错误属于何种类型及解决办法
(3)改变所用变量的数据类型,观察程序运行结果的变化并分析原因(4)写出上机实验体会和实验报告
实验
二、数组(1学时)1.实验目的
熟练掌握一维数组和二维数组的定义、引用和初始化;掌握字符数组与字符串的关系以及字符串变量的表示,熟练字符串处理函数的应用。2.实验内容
(1)有一个数组,内放10个整数,找出最小的数和它的下标,然后把它和数组中最前面的元素对换
输入一个n×n的矩阵,求出两条对角线元素值之和
编写一程序,将两个字符串连接起来,不要strcat函数 3.实验准备
(1)复习一维数组和二维数组的定义、引用和初始化方法,进一步了解常用字符串处理函数的使用。
(2)根据实验内容要求,编写好实验程序 4.实验步骤
(1)输入源程序,编译、连接直到没有错误(2)根据实验步骤,撰写实验报告 5.实验报告
(1)结合上课内容,写出程序,并调试程序,要给出测试数据和实验结果(2)整理上机步骤,总结经验和体会(3)完成实验报告和提交源程序
实验
三、函数与编译预处理(1学时)1.实验目的
掌握函数的定义、申明和使用方法;掌握函数调用的方法;掌握全局变量、局部变量、静态变量的使用方法;掌握编译预处理的使用。2.实验内容
(1)求两正整数的最大公约数和最小公倍速数,用一个函数求最大公约数,另一个函数求最小公倍数。要求:不使用全局变量。将最大公约数和最小公倍数在主函数中输出。
(2)十进位制数转换二、八和十六进制数程序。要求:
a.编写一个函数实现十进制数转换其它进制数; b.在主函数中给十进制数和转换的进位制,输出转换结果。
3.实验准备
(1)复习函数的定义、申明和使用方法,熟悉函数调用和编译预处理(2)根据实验内容要求,编写好实验程序 4.实验步骤
(1)输入源程序,编译、连接直到没有错误(2)根据实验步骤,撰写实验报告 5.实验报告
(1)结合上课内容,写出程序,并调试程序,要给出测试数据和实验结果(2)整理上机步骤,总结经验和体会(3)完成实验报告和提交源程序
实验
四、指针(2学时)1.实验目的
熟练掌握各种类型指针的定义、申明、引用和运算;掌握数组指针和指向数组的指针变量,以及字符串的指针和指向字符串的指针变量;了解指针与链表关系。2.实验内容
(1)编写程序,在堆内存中申请一个float型数组,把10个float型数据0.1、0.2、0.3„、1.0赋予该数组,然后使用float型指针输出该数组的各元素值并求出其累加和。(2)使用指针编写函数strcat()函数,即实现两个字符串的首尾连接(将字符串str2接到str1的后面,str1最后面的‘’被取消)。
(3)用指针变量设计一通用函数,该函数查找实型数组中最大和最小元素并输出相应元素和下标。3.实验准备
(1)复习指针的定义、申明和引用方法,以及其它各种类型指针的定义以及使用(2)根据实验内容要求,编写好实验程序 4.实验步骤
(1)输入源程序,编译、连接直到没有错误(2)根据实验步骤,撰写实验报告 5.实验报告
(1)结合上课内容,写出程序,并调试程序,要给出测试数据和实验结果(2)整理上机步骤,总结经验和体会(3)完成实验报告和提交源程序
实验
五、类和对象(2学时)1.实验目的
掌握类的定义以及类对象的定义;理解类的成员的访问控制的含义,公有、私有和保护成员的区别;掌握构造函数和析构函数的含义与作用、定义方式和实现,能够根据要求正确定义和重载构造函数,能够根据给定的要求定义类并实现类的成员函数。2.实验内容
(1)定义一个圆类,计算圆的面积和周长。要求:分别用成员函数和友元函数来求圆的面积和周长。
(2)定义一个学生类,其中有3个数据成员有学号、姓名、年龄,以及若干成员函数。同时编写主函数使用这个类,实现对学生数据的赋值和输出。要求: a)使用成员函数实现对输出的输入、输出;
b)使用构造函数和析构函数实现对数据的输入、输出。
3.实验准备
(1)复习类以及对象的定义和使用
(2)复习构造函数和析构函数的作用、定义方式和实现(3)根据实验内容要求,编写好实验程序 4.实验步骤
(1)输入源程序,编译、连接直到没有错误(2)根据实验步骤,撰写实验报告 5.实验报告
(1)结合上课内容,写出程序,并调试程序,要给出测试数据和实验结果(2)整理上机步骤,总结经验和体会(3)完成实验报告和提交源程序
实验
六、继承与派生类(2学时)1.实验目的
理解继承的含义;掌握派生类的定义方法和实现;理解公有继承下基类成员对派生类成员和派生类对象的可见性,能正确地访问继承层次中的各种类成员; 理解保护成员在继承中的作用,能够在适当的时候选择使用保护成员以便派生类成员可以访问基类的部分非公开的成员;理解虚函数在类的继承层次中的作用,虚函数的引入对程序运行时的影响,能够对使用虚函数的简单程序写出程序结果。2.实验内容
1)编写一个学生和教师数据输入和显示程序,学生数据要求有编号、姓名、班号和成绩,教师数据有编号、姓名、职称和部门。要求将编号、姓名的输入和显示设计成一个类person,并作为学生数据操作类student和教师数据操作类teacher的基类,学生数据中的班号和成绩的输入和显示在student类中实现,教师数据中的职称和部门的输入和显示在teacher类中实现。最后在主函数中进行该类的测试。
2)编写一个程序计算出球、圆柱和圆锥的表面积和体积。要求:
(1)定义一个基类圆,至少含有一个数据成员半径;
(2)定义基类的派生类球、圆柱、圆锥,都含有求表面积和体积的成员函数和输出函数;
(3)定义主函数,求球、圆柱、圆锥的和体积。
3.实验准备
(1)复习继承和派生类的定义和实现方法
(2)复习不同继承方式下,派生类成员对基类成员的访问方式(3)根据实验内容要求,编写好实验程序 4.实验步骤
(1)输入源程序,编译、连接直到没有错误(2)根据实验步骤,撰写实验报告 5.实验报告
(1)结合上课内容,写出程序,并调试程序,要给出测试数据和实验结果(2)整理上机步骤,总结经验和体会(3)完成实验报告和提交源程序 实验
七、多态性和虚函数(1学时)1.实验目的
掌握运算符重载的概念以及使用friend重载运算符的方法;掌握虚函数和纯虚函数的概念及应用 2.实验内容
1)
分别用成员函数和友元函数重载运算符,使对整型的运算符=、+、-、*、/ 适用于分数运算。要求:
(1)输出结果是最简分数(可以是带分数);(2)分母为1,只输出分子。2)
下列shape类是一个表示形状的抽象类,area()为求图形面积的函数。请从shape类派生三角形类(triangle)、圆类(circles)、并给出具体的求面积函数。#include
(1)复习运算符重载的概念以及使用friend重载运算符的方法(2)根据实验内容要求,编写好实验程序 4.实验步骤
(1)输入源程序,编译、连接直到没有错误(2)根据实验步骤,撰写实验报告 5.实验报告
(1)结合上课内容,写出程序,并调试程序,要给出测试数据和实验结果(2)整理上机步骤,总结经验和体会(3)完成实验报告和提交源程序
一、实验教学特点
1、实验教学对象
本次实验教学面向2010级通信专业学生,先修过《VB程序设计》,部分学生自修C语言,因VB未设期末考试,所以大部分学生的程序设计基础比较薄弱,所以本门课程的日常教学内容都比较基础,重点加强基础知识的学习。
2、实验教学目的
通过本次实验,希望学生正确理解C++面向对象编程的封装性的基本特征;了解友元语法机制设置的目的和使用环境;掌握友元函数的声明、定义和调用;能明确区分一般函数、成员函数和友元函数的使用;简单了解友元类的设计和使用。
3、备课及课件设计
首先认真研读实验教学大纲和教材,参考教学辅助材料,合理设计实验任务,帮助学生理解基本友元概念,促使学生快速掌握类的友元机制;其次采用多媒体教学,实验课件的准备与理论课同步,共占2学时。课件以Power Point为主要工具,将实验教学目的、实验任务、主要实验步骤和实验报告要求等内容展示出来。
二、实验教学内容分析
1、预备知识
本节实验课在学生已经具备下面基础知识的情况下开设:C++封装机制、类的定义、类中数据成员和函数成员的声明、类中函数成员的实现及调用,一般函数(形参为类的对象时)的定义和调用等。
2、实验教学内容分析
本次实验的主要任务就是理解并学会使用友元机制,重点是友元函数的设计,简单了解友元类。
内容分析:首先友元函数破坏了类的封装性,打破了一般函数的规律,它的函数体可以直接访问类中的保护数据,对数据的访问与类中成员函数的权限相同;友元函数需要在类中进行声明,与成员函数类似。所以实验课程应重点引导学生区分友元函数和成员函数异同。其次友元函数既然不是类中的成员函数,也不是一般函数,一般函数在类外是不能够直接访问类中受保护的数据成员,它是类的“友元”。所以实验课程也应引导学生区分友元函数和一般函数异同。最后,当需要将类中多个成员函数同时声明为一个类的友元函数时,需要使用到友元类,简单对比友元类和友元函数的设置机制及注意事项。
教学重点:友元语法机制的设置目的;友元的特点;友元函数的声明定义和调用;
友元函数和一般函数、成员函数的区别。
教学难点:友元函数的声明、定义和调用与一般函数、成员函数的区别。
三、实验教学设计
友元机制的实验设计以C++的基本特征之一———封装性为出发点,旨在希望学生能注意到,封装机制的高安全性是以程序的低效性为基础的,很多情况下,为了提高程序的运行效率,可以采用友元机制,这种小小的破坏是必需的,所以在使用的过程中需要在高效性和高安全性之间寻求一个平衡点。考虑到实际的教学条件和学生的具体情况,本次实验主要以课堂演示、学生自主上机为主,进行启发式教学,实验过程现场辅导,引导学生同步思维,及时发现问题、解决问题。最后总结本次实验重点内容,加深学生对基本概念的理解。设置选做题目,供基础较好的学生参考。具体实验流程见下表1:
实验设计至少2/3的时间交由学生自主上机,实验过程中,注重引导学生思考友元机制的使用条件,比如说,当计算两点之间的距离时,我们设计了double Distance(Point p1,Point p2);这个函数,这个函数的参数特点是两个点的对象,求距离公式中需要用到点的横坐标和纵坐标,如果是一般函数,因为类的封装机制而不能直接访问,只能通过接口间接访问,如果设为友元函数,那函数体的设计就不一样了,可以直接访问私有成员,当然如果设计为成员函数,同样可以直接访问,但是对它的调用却必须通过对象或者是对象指针进行选择。有了这部分分析做基础相信大部分同学在完成实验任务1时都会自觉的采用友元函数设计求和函数。
四、实验报告要求和实验注意事项
1、实验的过程固然重要,但另外一个关键环节———撰写实验报告也是必不可缺的,通过实验报告可以直接了解学生实验的完成情况、关键语法的掌握情况等等,所以本次实验报告要求学生必须将如下问题写在报告纸上:如何总结和独立设计实验步骤;将上机过程中出现的问题及解决方法写在实验报告上;总结友元函数等友元机制的特点。
2、注意事项教学结束后,适时进行教学评价,以诊断教学过程的优点和缺点,达到及时的反馈和调控的作用。
摘要:友元破坏了类的封装机制,实现了程序运行的高效性,友元函数的定义和使用与类中成员函数和一般函数比较容易混淆,本文根据实际教学条件,结合学生情况,设计本次实验教学内容,方便学生理解友元的设计并巩固掌握类的封装机制。
关键词:C++,友元机制,实验教学
参考文献
[1]钱丽萍等.面向对象程序设计C++版[J].机械工业出版社,2007.7.
关键词:ACM-ICPC;程序设计;OnlineJudge;能力
中图分类号:G642 文献标识码:A 文章编号:1674-7712 (2012) 18-0097-01
ACM国际大学生程序设计竞赛(ACMInternational CollegiateProgrammingContest,ACM-ICPC)是由美国计算机协会(AssociationforComputingMachinery,ACM)主办,是最具影响力的大学生计算机竞赛。如何抓住机遇,结合ACM竞赛,提高教学质量和水平,培养高质量的人才等问题成为广大教师的探索热点和各高校相关教师之间热议的话题。笔者积极探索将它引入到C++程序设计实验课当中,提高教学效果。
一、C++程序设计实验教学中存在的问题
由于本学科的特点、生源的客观情况及硬件条件的限制等使得实验课教学仍有一些不足之处,进而学生对这么课程失去兴趣。1)重视程度不够。由于实验环节常常被看作是理论环节的附属部分,最终成绩仍以卷面为主,实验成绩只占一小部分,另外实验考核还容易出现缺乏清晰的依据的情况,有限实践时间里学习动力不足。2)验证性实验内容为主。以往实验教学中,实验内容的安排完全服从理论章节的学习,学生的注意力集中在某种结构或某个算法实现上,容易忽视对概念整体性理解把握,对于规模较大、较复杂的问题往往素手无策。综合设计能力得不到很好地训练。3)实验考核方法单一。传统的考核一般由两种方式组成:一是教师检查程序的运行结果。工作量很大,而且也不一定能在课时内完成,既费时又费力。二是检查实验报告中的程序编写情况。批改中容易忽略学生的独特思路。由此一来,某种程度上限制了学生思维的拓展,不利于学生创新能力的培养。
经积极探索与实践,将ACM-ICPC竞赛引入实验课教学,能够很好解决以上问题,并取得良好效果。
二、ACM-ICPC竞赛简介
(一)ACM-ICPC简要规则如下
以團队的形式代表各学校参赛,每队由3名队员组成。每位队员必须是在校学生,有一定的年龄限制,并且最多可以参加2次全球总决赛和5次区域选拔赛。比赛期间,每队使用1台电脑。需要在5个小时内使用C、C++、Pascal或Java中的一种编写程序解决7到11个问题。程序完成之后提交裁判运行,运行的结果会判定为正确或错误两种并及时通知参赛队。每队在正确完成一题后,升起一只代表该题颜色的气球。每道试题用时将从竞赛开始到试题解答被判定为正确为止,其间每一次提交运行结果被判错误的话将被加罚20分钟时间,未正确解答的试题不记时。
(二)ACM竞赛给教学带来的好处有
1.ACM竞赛题目的涉及面广,融入多门学科的知识,参赛队员必须掌握大量的学科基础理论,包括程序设计、算法分析、数据结构、数学建模等等,这也大大激发了学生学习的动力。
2.为以后做实际项目做了很好的衔接。
3.分组实验教学,由教师为主体转变为学生团队为主体的模式,学生学会了如何分工协作,与人沟通。
4.ACM网络拓展了学生的知识面。教师可以引导学生加入这个大平台,从简单的小题开始做起。学生们在这里增长了知识,开阔了视野,结识了更多优秀的人。
5.利用OnlineJudge(简称OJ)平台改变学生评价方法。平时的作业和实验课都充分利用开放的OJ系统进行评判。
三、实验课中OnlineJudge平台的应用
OnlineJudge系统(简称OJ)是一个在线的判题系统。用户可以在线提交程序多种程序(如C、C++、Pascal)源代码,系统对源代码进行编译和执行,并通过预先设计的测试数据来检验程序源代码的正确性。用于ACM-ICPC竞赛和OI(OlympiadinInformatics)信息学奥林匹克竞赛中的自动判题和排名。现广泛应用于各地高校学生程序设计训练、参赛队员选拔、各种竞赛以及数据结构和算法的学习中。
(一)强化基础,突出实践
从竞赛的题目来看,试题涉及到多门学科,要求学生具有一定的数据建模知识,算法分析能力,软件工程的思想,综合性很强,与C++程序设计课程能力培养的目标要求是一致的。
(二)案例、任务驱动式的实验教学模式
在实验教学中,同学们分析、学习别人设计好的程序代码。还可以将日常教学的课程内容融合在ACM竞赛题目中。教师根据实际情况布置任务,简单任务由单个人完成,复杂任务让同学们自行分组。在完成实验中,每个人必须完成其中一部分,开展组内或组间学习和讨论。学生们经过这些锻炼之后,程序设计能力、团结合作能力、沟通能力都得到极大的提高。
(三)弥补实验课时不足,课堂教学的延伸
利用OnlineJudge系统的网络环境,可以随时在线进行学习和练习。如今随着信息化、网络化的迅速普及,学生团队对自己分配的任务可以在实验室做,也可以在自习室、甚至宿舍都可以完成。无形中增加了实践的机会,同时提高了学生自学能力。
(四)帮助教师更好地完成教学任务,提高教学效率
教师在实验课上课之前将实验任务的题目、测试数据等输入OJ内。上课时,在规定的时间让学生登录OJ,提交自己的程序,等待结果.OJ系统后台编译,根据对比结果判断程序正确与否。还能指出错误的大致原因。教师可随时了解学生对知识的掌握情况。
四、结束语
C++程序设计实验课的教学中引入ACM竞赛的理念和方法,激发了学习兴趣,改变了传统的教学模式,拓展了学生的知识面,提高了学生实践能力、学习能力、团结合作以及沟通能力、教学质量效果。今后,我们将进一步完善OJ系统,让它更有效地服务于课程教学,诸如作业的布置和批改、其他课程的应用以及开放实验室的建设等。
参考文献:
[1]琚生根,廖勇,周刚.CM竞赛与实验教学创新[J].实验技术与管理,2009,26(5):125-131.
[2]朱月秀.基于ACM竞赛的C++程序设计课程教学改革[J].漳州师范学院学报(自然科学版),2012,75(1):97-99.
c++实验总结报告
——网络工程14班饶思哲 ——学号:2013211574 实验一简单C++程序设计 1.猜价格游戏
编写C++程序完成以下功能:
(1)假定有一件商品,程序用随机数指定该商品的价格(1-1000的整数);
(2)提示用户猜价格,并输入:若用户猜的价格比商品价格高或低,对用户作出相应的提示;
(3)直到猜对为止,并给出提示。
题目1-1总结:
1)本题需要随机生成整数,我开始只使用rand(),即price=rand();来生成随机整数
但这样只是一个伪随机函数,每一次重新打开程序生成的数都是一致的。因此加入时间随机种子:srand((unsigned)time(NULL))2)个人改进1:定义最大值最小值,在每次猜测数字时显示应猜的数字范围,作为提示。
想到这个是因为有一次猜了很多遍都没猜到,一时突然忘记猜到什么范围,然后往前翻猜过的数字和大小感觉相当麻烦,所以就添上了应猜范围,方便再一次猜数。3)个人改进2:本来有一个判断条件判断生成的随机数是不是1~1000范围内,而后更进为随机生成整数对1000取余得到0~999整数,再+1得到1~1000的整数。
实验二类与对象 1.矩形
编写C++程序完成以下功能:
(1)定义一个Point类,其属性包括点的坐标,提供计算两点之间距离的方法;(2)定义一个矩形类,其属性包括左上角和右下角两个点,提供计算面积的方法;(3)创建一个矩形对象,提示用户输入矩形左上角和右下角的坐标;(4)观察矩形对象以及Point类成员的构造函数与析构函数的调用;(5)计算其面积,并输出。
题目2-1总结:
1)这一题是第一次用到class类的题目,开始并不明白为何要定义class,然后还需要区分public和private。而后来去图书馆借了书看到c++最大特色就是可以封装,定义私有属性和公有函数,以确保有些函数和参数不会被轻易访问到,降低错误率。2)class类在最起初定义时总是在class Rectangle那一行报错,经查书发现class定义最后一个大括号后有分号,开始并没有加上。
3)起初在调用class中函数时用c调用的方式,没有跟面向的对象结合,导致编译出错,而后从distance()改为p.distance()就正确了。
4)计算两点距离和面积运用开方和绝对值函数,前面若没有加头文件math.h则会报错。5)输入左上角右下角坐标时,若输入不当,可能会出现面积为负值的情况,所以加上绝对值函数保证面积非负。
6)起初不知道构造函数和析构函数的定义和用法,经翻阅书籍和运行程序得知构造函数在创建对象时调用,可以有多个。而析构函数则在释放对象时调用,一般每一个class中都只有一个默认析构函数。且构造函数与类名称一致,析构函数则在类名称前加~。
2.友元
编写C++程序完成以下功能:
(1)定义一个Boat和Car两个类,他们都具有私用属性——重量;
(2)编写一个函数,计算两者的重量和。double TotalWeight(Boat& b, Car& c);
题目2-3总结:
1)友元函数:在两个对象中都使用到时,可以使用友元函数,并在类外单独定义。
友元函数是允许在类外访问类中的任何成员的。开始在类外单独定义时跟类的成员函数单独定义混淆,写成了double Boat::TotalWeight(),导致编译错误,而后发现友元函数直接用函数名和函数返回值类型定义即可,不需要加上class类的名称。
2)起初定义完class Boat和class Car后发现编译错误,在友元函数的声明那一行出错,而后发现在这行之前没有定义Car类,于是将其在最开头声明出来,通过。
3)起初并没有加上boat和car类的构造函数和析构函数,可是经上网查阅,默认构造函数和析构函数可以系统自动生成,但析构函数只能删除成员指针,并不能释放指针指向的空间,所以若没有申请动态内存,析构函数可不写出,若申请,则需自行在析构函数中delete。
实验三数组与指针 1.矩阵
(一)编写C++程序完成以下功能:
(1)假定矩阵大小为4×5(整型数组表示);
(2)定义矩阵初始化函数,可以从cin中输入矩阵元素;(3)定义矩阵输出函数,将矩阵格式化输出到cout;
(4)定义矩阵相加的函数,实现两个矩阵相加的功能,结果保存在另一个矩阵中;(5)定义矩阵相减的函数,实现两个矩阵相减的功能,结果保存在另一个矩阵中;(6)定义三个矩阵:A1、A2、A3;(7)初始化A1、A2;
(8)计算并输出:A3 = A1加A2,A3 = A1减A2。
题目3-1总结:
1)起初在矩阵相加相减的赋值中所用语句为:m.matrix[i][j]=a.matrix[i][j]+b.matrix[i][j] 但是运行程序发现m矩阵所有元素都是0。经单步调试,发现并没有赋值成功。经查阅书籍,了解到this指针是指向类的对象的地址,便改用this->matrix[i][j]作为赋值对象,最后程序正确。
2)个人改进:将行数列数在文件开头用define定义,可以随时更改。
3)经多次调试后,程序运行结果正确,但矩阵看起来非常混乱,因为并没有行列对齐,于是在打印矩阵中每列直接用table空格隔开,保证美观。2.矩阵
(二)编写C++程序完成以下功能:
(1)假定矩阵大小为4×5(整型);
(2)矩阵空间采用new动态申请,保存在指针中;
(3)定义矩阵初始化函数,可以从cin中输入矩阵元素;(4)定义矩阵输出函数,将矩阵格式化输出到cout;
(5)定义矩阵相加的函数,实现两个矩阵相加的功能,结果保存在另一个矩阵中;(6)定义矩阵相减的函数,实现两个矩阵相减的功能,结果保存在另一个矩阵中;(7)动态申请三个矩阵:A1、A2、A3;(8)初始化A1、A2;
(9)计算并输出A3 = A1加A2,A3 = A1减A2;(10)释放矩阵空间。
题目3-2总结:
1)与3-1题目的区别在int main中用new函数动态申请内存,然后析构函数需要释放申请的空间而不只是自动删除指向空间的指针。析构函数如图。
一开始并不知道该怎么动态申请内存,在c中使用malloc可是c++中并不一样。经查阅书籍,发现c++中申请释放内存用new和delete非常简便。2)指针调用类成员函数一开始不知道该怎么写,写成A1.input()结果编译错误。经查阅书籍,得知指针调用成员函数需写成A1->input()的形式。
3)在释放动态内存时,用到delete函数。但开始的时候写delete matrix时候会出问题。上网查询后得到以下delete用法。
Delete用法:当释放内部类型,如int double型时,直接delete a 即可。若是释放自己定义的class类型,需用delete[]matrix来释放内存。3.矩阵
(三)编写C++程序完成以下功能:
(1)用类来实现矩阵,定义一个矩阵的类,属性包括:
矩阵大小,用 lines, rows(行、列来表示);
存贮矩阵的数组指针,根据矩阵大小动态申请(new)。(2)矩阵类的方法包括:
构造函数,参数是矩阵大小,需要动态申请存贮矩阵的数组; 析构函数,需要释放矩阵的数组指针; 拷贝构造函数,需要申请和复制数组; 输入,可以从cin中输入矩阵元素; 输出,将矩阵格式化输出到cout; 矩阵相加的函数,实现两个矩阵相加的功能,结果保存在另一个矩阵类,但必须矩阵大小相同; 矩阵相减的函数,实现两个矩阵相减的功能,结果保存在另一个矩阵类,但必须矩阵大小相同。
(3)定义三个矩阵:A1、A2、A3;(4)初始化A1、A2;
(5)计算并输出A3 = A1加A2,A3=A1减A2;
(6)用new动态创建三个矩阵类的对象:pA1、pA1、pA3;(7)初始化pA1、pA2;
(8)计算并输出pA3=pA1加pA2,pA3=pA1减pA2;(9)释放pA1、pA1、pA3。
题目3-3总结:
1)拿到这道题我认为要定义一个矩阵类对象,其中包括3-1和3-2一样的input函数,print函数,plus函数,subtract函数,还有新增的构造函数析构函数。一上来我认为class中属性不再是之前的某行某列的数值,而是行数和列数还有矩阵的头指针。根据输入的行数列数来申请内存,再将数值存入不同的位置。然后在主函数中分为两个部分,一个是直接创建对象,另一个是创建矩阵数组指针。
2)第一部分跟前两题类似,所以很快就调试完成并且得到了正确的结果,但是指针部分一直出现问题。最开始是三个矩阵分别申请内存,这样的后果就是要输入三次行数和列数的数值,有可能出现行列数不相等的情况,给之后的加减操作带来麻烦。因此想到让A1矩阵申请内存,而让A2、A3矩阵都与A1相等,就可以避免多次输入行列数,且保证了矩阵大小相等。但这样输入第一个矩阵数值后,矩阵元素获取正常。可当输入第二个矩阵的数值以后,A1和A2矩阵的元素都变为第二个矩阵的元素,即第一个矩阵的元素被覆盖掉。导致和矩阵为第二个矩阵的2倍,差矩阵都是零。经过反复调试,曾经试过将含参构造函数中输入行列数改到主函数中,再给A1申请动态内存。但是因为A2和A3还是初始化跟A1相等,结果并没有改变,还是错误的。而后想到用含参构造函数来申请动态内存,输入固定的行列数后,用确定的行列数来new Matrix(x,y),这样一来不仅矩阵大小相等,而且也不会存在前一个矩阵的值被后一个覆盖掉的问题。经过调试,终于得到了正确的结果。
3)调试过程中我了解到指针初始化和赋值过程中是容易发生树脂覆盖的,所以尽量不要将指针初始化成跟某个指针相等。
实验四继承与派生
1、形状
(一)编写C++程序完成以下功能:
(1)声明一个基类Shape(形状),其中包含一个方法来计算面积;(2)从Shape派生两个类矩形和圆形;(3)从矩形派生正方形;
(4)分别实现派生类构造函数、析构函数和其他方法;
(5)创建派生类的对象,观察构造函数、析构函数调用次序;(6)不同对象计算面积。
题目4-1总结:
1)这一题主要是函数的派生方法使用,经过查阅书籍,得知在class定义后加上:: public(基类名称)便是作为一个派生类的定义,可以沿用基类中的成员函数。
2)并且经过对构造函数和析构函数调用,得知是先调用基类的构造函数,再调用派生类的构造函数创建派生类对象,在程序结束时,先调用派生类的析构函数释放派生类对象,再调用基类的析构函数释放基类对象。
2、形状
(二)——虚函数(1)将【形状
(一)】中的基类计算面积的方法定义为虚函数,比较与【形状
(一)】程序的差异;
(2)将【形状
(一)】中的基类定义抽象类,比较与【形状
(一)】程序的差异。
题目4-2总结:
1)起初并不知道虚函数的作用,后来经过查阅书籍得知在基类中定义虚函数,是为了在派生类中定义这一函数的不同操作方式。并且起初只改变了基类中area函数,在其前面加了virtual,但并没有体现出虚函数的运用。而后看到书上虚函数的应用,发现虚函数是可以让一个基类指针调用派生类相应函数的。于是经过改进,在主函数中定义了3个基类指针,分别指向派生矩形类对象、派生圆形类对象、派生正方形对象,然后并非通过对象名称调用成员函数,而是用基类指针调用派生类中的area函数,充分体现出对虚函数的应用。
2)这一题虽然跟上一题相似,但却因为运用了虚函数而变得不同。这一题让我对虚函数有了更加深入的了解。也了解到调用类中的成员函数不一定非要用对象名或者对象指针调用,也可以用其基类的指针通过虚函数调用。
实验五多态性
1、对Point类重载++和――运算符
编写C++程序完成以下功能:
(1)Point类的属性包括点的坐标(x,y);(2)实现 Point类重载++和――运算符:
++p,--p,p++,p--。
++和――分别表示x,y增加或减少1。
题目5-1总结:
1)对于符号的重载开始并不理解什么意思,后来得知是重新定义一下++、--操作的过程,包括自加自减和赋值。
2)通过这一道题,对于自加符号的前后置的区别又有了更深的印象。起初在—p和++p的时候都只是将x和y加一,并没有赋值,导致在主函数中写q=++p和q=--p时q保持原值,造成结果错误。单步调试后发现这一错误,及时改正过来。3)程序结果正确后编写菜单界面,使其操作步骤更加清晰明了。实验六流式IO
1、流式IO
(一)编写C++程序完成以下功能:
(1)使用ofstream向一个文本文件中输出各种类型的数据,并打开文件观察结果:
整数、无符号整型、长整型、浮点型、字符串、……
(2)用十进制、八进制、十六进制方式向文本文件中输出整数;(3)使用控制符和成员函数来控制输出的格式:
set()precision()...题目6-1总结:
1)文件流主要是向文件中输入信息和从文件读取信息。而跟c语言不同的是c需要fopen来打开一个文件,而c++中只需要用fstream函数。且文件输入方式也比c语言简便很多。2)转换进制开始想到的是用数学的方法算出不同进制下的数值,再输入文件中,但非常的麻烦。后经查阅书籍,看到有指定进制的函数,可以用来修改默认的十进制:oct和hex。3)最后程序正确后,编辑menu显示菜单,使操作更加清晰明了。
2、流式
(三)编写C++程序完成以下功能:(1)输入一个文本文件名;
(2)打开文件名,在该文件的每一行前面加上一个行号,保存在另外一个文本文件中。
题目6-3总结:
1)因为第一题流式已经尝试过向文件中输入信息,而经过翻阅书籍得知从文件中可以用getline整行读取字符串,便可以轻易的将文件内容加上行数,并输出到另一个文本文件中。
2)本题我觉得最大的困难在于输入文本文件名,并打开文件名。书上也并没有关于打开文件名的相关资料,于是上网查询,发现可以用string.h中的c_str()函数来获取键盘输入的文件名字符串,并打开文件名。
3)因为文件处理并没有在屏幕上有所显示,为了让每一步操作更加明了,在复制完一行后会在屏幕上打出某某行复制成功,使程序运行过程更清晰。实验七 C++程序设计应用
1、电话本
编写C++程序完成以下功能:
(1)实现简单电话本功能,用姓名来搜索电话号码;(2)用户输入姓名,程序查找并输出结果;(3)用户可以通过输入,添加姓名和电话号码;(4)用户可以删除姓名和电话号码;(5)电话本可以保存在指定文件中;(6)电话可被从指定文件中读入到内存。
题目7-1总结:
1)电话本分为几大部分:读到内存、输出到文件、新增联系人、删除联系人、查找联系人。因为是读到内存,就想到了可以用数组或者链表来构成电话本的框架。而这两种方式在c语言用过,所以逻辑方便很熟悉,于是选择了比较简便的数组,这样不易出现指针错误的情况。
2)个人改进1: 新增联系人函数中,就是将联系人信息从键盘逐项读入,然后选择将联系人插入到什么位置。若一共6个联系人,插入位置输入3,则插入第三个位置,后面的联系人依次向后移一位。但若是一共6个联系人,插入位置输入8,则会提醒输入位置不当,直接将联系人插入到最后一个位置,即第七。
3)删除、查找、修改函数中都用到了用姓名查找,于是将其单独摘出来定义findposition,找到联系人位置。起初写的是将输入的字符串逐个跟name比较,即a == name,但却发现这样程序查找出来联系人永远不存在。经上网查阅,发现字符串相等不能直接像字符一样用==来判断,而是用><来判断,于是将其改为>=&&<=。但一开始由于疏忽,将&&且关系写成||或关系,导致查找出来永远是第一个联系人。后来单步调试发现错误,改正过来。
4)个人改进2: 删除、查找、修改中,若是联系人不存在,需要输出提示。而我另外又加了一句,并不是说不存在就直接返回,而是让用户自己选择是继续输入姓名还是返回主菜单。也让手误的时候不再把前面的操作进行一遍,留有手误的余地。5)修改联系人模块,一开始class类中只有setPhone函数,并没有setname,setmobile等等,而是直接将所有属性值组合起来构建联系人。这样的后果就是在修改联系人的时候,只修改了一项,但是并不能赋值进去。表面上虽然修改了,可查找后发现联系人的信息并没有改变。后来将每一项信息都分别set,经过调试最终结果正确。
6)从指定文件将电话本读入内存,就跟实验6第三题的流式很相似,都是逐行读取信息,只是读取后是存入数组的不同属性值中。开始不知道该怎么确定文本文件中不再有联系人信息,而后上网查资料发现当文件中不再有信息可以读的时候,infile>>name>>mobile…的值就是0,便可停止操作。而姓名等信息也可以逐个赋值到phone类数组里。
7)个人改进3: 电话本不需要手动保存在指定文件中,主菜单也不再显示这一操作,而是当选择退出电话本时自动保存到输出的output.txt中。
1、按照公司产品开发计划完成软件设计工作;
2、根据设计报告,进行编码,并参与代码的评审测试工作;
3、相关软件的维护完善和升级工作;
4、具有通信核心网相关经验,熟悉通信系统协议软件开发原理和流程,熟悉WCDMA/TD-SCDMA协议或H.248、BICC、SIGTRAN协议者优先;
5、负责产品新版本完成后对其进行功能测试,异常测试,性能测试以及系统测试等工作。从业要求
1、计算机、通信相关专业本科及以上学历,2年以上相关工作经验;
2、精通C、C++等开发语言,熟练掌握和使用C++Builder工具,具有1-2年的使用时间;熟悉INFOMIX、Oracle、SQL Server等主流数据库技术,SNMP、CORBA等网管协议,Solaris操作系统;
3、具备嵌入式实时系统开发经验或网管软件开发经验;
4、具备移动通信无线接入网操作维护开发经验;熟悉通信系统协议软件开发原理和流程及WCDMA/TD-SCDMA协议者优先;
5、良好的团队合作能力;
6、良好的英语水平。
薪资分析
C/C++软件工程师的月薪范围一般在3500-10000元之间。一般而言,刚刚毕业的大学生以及拥有1-3年的工作经验者的月薪通常在3500-4500元左右,拥有3-5年工作经验者的月薪通常在5000-7000元之间,拥有更丰富的工作经验且跟过大型开发项目的高级C/C++软件工程师的月薪有时可高达万元;从学历角度看,拥有硕士学历的起薪多在3000-4000元之间,拥有本科学历的起薪多在3000元左右,拥有大专学历的起薪多在2000元左右;从地域上面来看,北京、上海等大城市的起薪多在3500元以上,其他中等城市的起薪则会低些。职位规划
C++软件工程师-C++高级软件工程师
职位充电
C、C++开发语言、C++Builder工具、主流数据库技术、SNMP、CORBA等网管协议、Solaris操作系统等
编辑本段就业前景
权威部门统计,我国目前C/C++软件开发人才缺口每年为10万人左右,未来随着信息化、数据化不断提速,这一数字还将成倍增长.,如果这一问题得不到解决,软件产业未来将面临危机。因为C/C++软件人才的严重稀缺,C/C++软件工程师的薪资水平正有逐年递增的趋势。
据调查,初、中级C/C++软件开发工程师的年薪目前为5万-15万元,高级软件工程师则高达15万-30万元。市场最紧缺的C/C++技术总监或项目总监年薪更高。C/C++软件工程师的年薪与JAVA软件工程师和.NET软件工程师的年薪相比一般平均要高于2-3万。据专家预测,C/C++软件工程师是未来几年最热门和最受欢迎的职业之一。
参考资料:
1.C++软件工程师的就业优势
Matlab是Cleve Moler博士和他的同事共同开发的一个软件, 采用矩阵 (MATRIX) 和实验室 (LABORATORY) 的头三个字母的组合。它是一个跨平台的科学计算环境, 以其强大的计算和绘图功能、大量稳定可靠的算法库、简洁高效的编程语言以及庞大的用户群, 成为数学计算工具方面事实上的标准。Matlab语言被称为第四代计算机语言, 具有编程效率高、扩充能力好、语句简单等优点[1,2,3]。
Visual C++是Microsoft公司推出的一种以C++语言程序设计的集成开发环境。用VC++开发的系统具有容易维护升级、界面友好、代码效率高、执行速度快等一系列优点, 因此Visual C++已成为目前应用软件开发广泛采用的主要工具之一[4,5]。
本文采用Visual C++编辑非常友好的Windows风格的界面, 以Matlab作为后台进行大量的数据运算, 给出了Visual C++调用Matlab的一种实现方法。
2 Visual C++与MATLAB应用程序接口的设计
Matlab与Visual C++的混合编程, 根据Matlab运行方式可大致分为两类:一类是M a t l a b在后台运行, 另一类是Matlab可以脱离Matlab环境运行。本文采用的是Matlab引擎采用客户机/服务器的计算方式, 通过Windows的Activc X通道和Matlab接口。这种方法不要求连接整个Matlab, 只需要嵌入必要的Matlab引擎库, 可大大地节省系统资源。
在具体的应用中, VC的程序作为前端客户机, 通过调用Matlab引擎在后台与Matlab服务器建立连接, 实现动态通信。首先对Visual C++进行环境配置, 其方法如下:
(1) 由于MATLAB引擎库函数都在文件engine中予以说明, 所以在所创建的工程文件头文件中包括engine.h, 如果在程序中涉及对mat文件的操作, 还应对文件mat.h进行包含。
(2) 在Visual C++开发窗口下, 打开工具 (tool) 菜单, 点击选项 (options) , 在弹出的对话框中选择目录标签, 在显示目录下拉列表中选中“include files”选项, 把目录%MATLAB%externinclude加入到路径中, 然后在显示目录下拉列表中选中“library files”选项, 把目录%MATLAB%externlib加入到路径中。其中, %M A T L A B%代表本地机器上MATLAB所安装的目录。
(3) 链接M A T L A B所必需的库文件。为了能够调用M A T L A B引擎库函数, 所编程序必须包含几个MATLAB库文件。将libeng.lib, libmx.lib, libmat.lib这3个文件通过Visual C++的工程菜单下添加工程子菜单的文件项加入到工程中。这3个库文件根据所使用的编译工具的不同, 分别位于%MATLAB%externlibwin32文件夹下的相应位置。
完成了上述步骤之后, 就可以在Visual C++中调用MATLAB引擎程序进行编译和调试。
其次, 在Matlab中进行BP神经网络的训练和仿真, 将训练好的BP神经网络以.m a t文件格式保存。本文以硕士论文《基于BP神经网络的农业机械导航控制系统》中的BP神经网络为被调用的对象[6]。
最后在Visual C++进行编程, 以实现Visual C++调用Matlab神经网络工具箱, 部分程序如下:
3 小结
本文给出了Visual C++与Matlab两种软件的一种通信方法。实现了V i s u a l C++调用Matlab神经网络工具箱的方法。
摘要:在Matlab中对神经网络进行训练和仿真, 并将训练好的神经网络在Matlab中以.mat文件格式保存, 以Visual C++为主要编程软件, 给出如何调用Matlab中的神经网络工具箱的方法。Visual C++通过调用Matlab神经网络工具箱的方法, 调用训练好的神经网络, 实现Visual C++与Matlab之间的调用。
关键词:Visual C++,Matlab,神经网络
参考文献
[1]刘志俭等.MATLAB应用程序接口用户指南[M].北京:科学出版社.2000:1-90
[2]张威.MATLAB外部接口编程[M].西安:西安电子科技大学出版社.2004:1-601
[3]何强, 何英.MATLAB扩展编程[M].北京:清华大学出版社.2002:10-60
[4]李伯全, 张捷.应用MATLAB工具箱在VC++中实现神经网络的程序设计[J].研究?开发.2002, 40 (459) :22-24
[5]庞承宗, 李宝树, 王晓云.用MATLAB和Visual C++混合编程及应用[J].电力科学与工程.2003, 1:59-61
今天在学习用windows自带的dos命令提示符窗口的命令:
列文件名dir,创建文件夹md(其他文件不能通过该命令创建,即使用了该类文件的后缀名,也只是将该名称和后缀名一块作为了一个新建文件夹的名字,例如md aa.txt的作用是建立一个名为aa.txt的文件夹),删除文件夹下的所有文件del(但是不包括该文件夹下的子文件夹。网上还有人说用deltree可以删除目录树,但是我试了不管用),删除文件夹rmdir或者rd(必须是空的,不能含文件或者文件夹),重命名文件或者文件夹ren x y(将x改名为y,如果是文件则应包括后缀名,如果是文件夹只是名字就可以),移动文件或者文件夹(没找到),复制文件copy a b(a和b可以是文件夹,这时候会复制a中的所有文件但不包括子文件夹到b中,遇到同名文件会询问是否覆盖;如果a和b是文件,则要包括后缀名,而且不只是相同后缀的可以复制,例如两个txt文件,而且非同后缀的文件也可以,例如txt复制到doc文件或者rar文件,这种复制后会连txt的属性一起复制给doc或rar,包括大小和占用空间这两个属性,doc的话还是可以打开,但是rar会损坏掉),创建文本文件copy con A.txt(或者用edit A.txt,区别是前一个会在输完命令后让你再输入文本内容,输完用ctrl+z结束,而后一个会跳出一个类似turbo-c的界面让你输入文字再保存),以树形结构显示出目录tree(用参数-f 将列出第个文件夹中文件名称)。
然后我想解压一个再f盘的压缩文件B,发现在ms-dos里进入B的目录后,直接输入
3、在下列关键字中,用以说明类中私有成员的是_private___。
4、C++对C语言作了很多改进,(引进了类和对象的概念)使得C语言发生了质变,即从面向过程变成面向对象。
5、面向对象程序设计将数据与_对数据的操作_放在一起,作为一个相互依存、不可分割的整体来处理。6、已知f1(int)是类A 的公有成员函数,p 是指向成员函数f1()的指针,采用__ p=&A::f1___是正确的。
7、在说明:const char *ptr;中,ptr应该是___指向字符的常量指针_____。判断:
1、空类就是没有名字的类。错
2、面向对象系统的封装性是一种信息隐藏技术,目的在于将对象的使用者与设计者分开,使用者不必知道对象行为实现的细节,只需用设计者提供的协议命令对象去做即可。错
3、引用类型和指针类型作为函数的形式参数时,对调用函数的实际参数的要求是一样的,均是地址。
4、对象数组在创建时要求构造函数不能有任何参数。错1.___静态数据成员_____是一个类的多个对象共享的。
2.下列静态数据成员的特性中,D)_静态数据成员不是所有对象所共有的_是错误的.A)说明静态数据成员时前边要加关键字static来修饰 B)静态数据成员在类体外进行初始化
C)引用静态数据成员时,要在静态数据成员名前加<类名>和作用域运算符 3.静态成员的值对每个对象都是一样的,它的值是可以更新的。()4.由于数据隐藏的需要,静态数据成员通常被说明为(保护的)
5.下面对静态数据成员的描述中,正确的是(静态数据成员是类的所有对象共享的数据)1.允许访问类的所有对象的私有成员,公有成员和保护成员的是(友元函数)2.类A是类B的友元,类B是类C的友元,则__D)__是正确的.A)类B是类A的友元B)类C是类A的友元C)类A是类C的友元D)以上都不对 3.一个类的友元函数能够访问该类的___所有成员___4.类模板的模板参数____D)______.A)只可作为数据成员的类型B)只可作为成员函数的返回类型 C)只可作为成员函数的参数类型D)以上三者皆可
5.一个(类模板)允许用户为类定义一种模式,使得类中的某些数据成员、某些成员函数的参数和返回值可以取任意数据类型。
6.类模板的使用实际上是将类模板实例化成一个具体的___类_____。1 关于类和对象的说法不正确的是()C A类是对象的类,对象是类的对象
B系统不为类分配内存空间,而为对象分配内存空间 C如果把人看作动物,那么细菌也是动物
D类可以看作数据类型,对象也可以叫做对象的实体、实例等类是()的集合,分类的依据是()具有相同属性和服务的一组对象抽象 1对象的封装就是(可进可出,但是外界不能干涉内部的处理过程)C 2关于类的继承不正确的是()C
A引入类的继承目的就是为了代码重用,提高编程效率B子女有父母的特征是类的继承 C子继父产业是类的继承
D子类可以全部继承父类的属性和服务,也可部分继承父类的属性和服务 下列关于运算符重载的描述中 运算符重载不可以改变语法结构
友元重载运算符obj1〉obj2被C++编译器解释为(operator>(obj1,obj2))。下列运算符中,A)?:运算符在C++中不能重载。
继承具有___传递性_,即当基类本身也是某一个类的派生类时,底层的派生类也会自动继承间接基类的成员。派生类的对象对它的基类成员中___公有继承的公有成员_____是可以访问的。
在多继承中,公有派生和私有派生对于基类成员在派生类中的可访问性与单继承的规则__部分相同,部分不同_。下列对派生类的描述中,__D)_____是错误的。
A)一个派生类可以作另一个派生类的基类B)派生类至少有一个基类 C)派生类的成员除了它自己的成员外,包含了它的基类的成员 D)派生类中继承的基类成员的访问权限到派生类保持不变对基类和派生类的关系描述中,____B)______是错误的。A)派生类是基类的具体化B)派生类是基类的子集 C)派生类是基类定义的延续 D)派生类是基类的组合派生类的构造函数的成员初始化列表中,不能包含__C)基类的子对象初始化____。A)基类的构造函数B)派生类中子对象的初始化
C)基类的子对象初始化D)派生类中一般数据成员的初始化
下列对派生类的描述中,错误的是(D.)
A. 派生类的缺省继承方式是PRIVATEB. 派生类至少有一个基类
C. 一个派生类可以作为另一个派生类的基类D. 派生类只继承了基类的公有成员和保密成员下列说法中错误的是(D.)
A. 公有继承时基类中的public成员在派生类中是public的B. 公有继承时基类中的private成员在派生类中是不可直接访问的 C. 私有继承时基类中的public成员在派生类中是private的 D. 私有继承时基类中的public成员在派生类中是protected的若派生类的成员函数不能直接访问基类中继承来的某个成员,则该成员一定是基类中的私有成员)实现运行时的多态性要使用___虚函数__。
关于函数的描述中,A)派生类的虚函数与基类的虚函数具有不同的参数个数和类型__是正确的。关于动态联编的下列叙述中,__A)__是错误的。
A)动态联编是以虚函数为基础的B)动态联编调用虚函数操作是指向对象的指针或引用 C)动态联编是在运行时确定所调用的函数代码的D)动态联编是在编译时确定操作函数的用于类中虚成员函数说明的关键字()
A.virtualB.publicC.protectedD.private编译时的多态性通常使用()获得。
A.继承B.虚函数C.重载函数D.析构函数
若要强制C++对虚函数的调用使用静态联编,则在调用中对该函数使用(指针)C++有(.2)种联编。
虚函数必须是类的(成员函数)
不能说明为虚函数的是(构造函数)
不同的对象可以调用相同名称的函数,并可导致完全不同的行为的现象称为(.多态性)若析构函数是虚函数,则delete对析构函数的调用采用(重载函数)
若派生类中没有对基类的虚函数进行重定义,则它继承基类中的(成员函数)多态调用指(借助于指向对象的基类指针或引用调用一个纯虚函数)动态联编所支持的多态性称为(运行时的多态性)下列描述中,()是抽象类的特性。
A)可以说明虚函数B)可以定义友元函数C)可以进行构造函数重载D)不能说明其对象(纯虚函数)是一个在基类中说明的虚函数,它在该基类中没有定义,但要求任何派生类中的可访问性的规定是相同的。如果一个类至少有一个纯虚函数,那么就称该类为(抽象类)。下面哪个基类中的成员函数表示纯虚函数(virtual void vf()=0)
关于纯虚函数,下列表述正确的是(纯虚函数是给出实现版本(即无函数体定义)的虚函数)下面哪个基类中的成员函数表示纯虚函数()
A.virtual void vf(int)B.void vf(int)=0 C.virtual void vf()=0D.virtual void vf(int)||
关于纯虚函数,下列表述正确的是(纯虚函数是给出实现版本(即无函数体定义)的虚函数)1 下列关于对象的描述不正确的是(A)A对象只能描述有形的东西
B对象具有属性和服务两个主要因素
C现实世界中的一切事物都可以看作对象,但只有在具体的系统中加以论述才有实际的意义
D对象的属性是对象的静态特征,服务是动态特征,并且对象的属性只能由本对象的服务来操作 2 构成对象的两个主要因素是(属性)和(服务),其中(服务)属于动态属性,(属性)属于静态属性,(属性)只能由(服务)来操作。关于多继承二义性的描述中,错误的是C A.一个派生类的基类中都有某个同名成员,在派生类中对这个成员的访问可能出现二义性B.解决二义性的最常用的方法是对成员名的限度法C.基类和派生类同时出现的同名函数,也存在二义性问题D.一个派生类是从俩个基类派生出来的,而这俩个基类有又以个共同的基类,对该基类成员进行访问时,可能出现二义性。设置虚基类的目的是 消除二义性 虚基类声明 class B virtual public
带有虚基类的多层派生类构造函数的成员初始化列表都要列出虚基类构造函数,这样将对虚基类初始化 二次 子类型描述错误的是 A子类型关系是可逆的A子类型关系是可逆的 B公有派生类的对象可以初始化基类的引用 C只有在公有继承下,派生类是基类的字类型D子类型是可传递的不符合复制兼容规则的是B基类的对象可以赋值给派生类的对象
初级:语法/语意(C++)
《Essential C++ 中文版》,侯俊杰 译,282页
《C++大学教程(第二版)》,邱仲潘等 译,816页
《C++ Primer 中文版》,侯俊杰 译,《标准C++宝典》,林丽闽等 译,766页
《C++ 编程思想》,刘宗田等 译,420页
中级:
《More Effective C++中文版》,侯俊杰,培生 2000.318页
《Effective C++ 2/e 中文版》,侯俊杰,培生 2000.256页
《Exceptional C++中文版》,侯俊杰,培生 2000.248页
高级:
《windows 程序设计 》
《深入浅出MFC》
《深度探索C++物件模型》,侯俊杰 译
《设计模式》,李英军等译,机械工业出版社,2000.254页
《重构-改善既有代码的设计》
学好一门语言任重而道远
下面是一些建议,希望你能对c++有一定的了解和认识。
如何认识c++?
对这个问题会感到困惑的,也只有那些刚踏入编程大门的初学者。因为对于很多工作多年的老年而言,看到这个问题也只会会心一笑。对于他们而言,无所谓存在是否要学C++的问题。他们所处的环境,所做的业务,已经决定了他们只能使用何种语言。更进一步,那些得道的大侠,语言只不过是他们的工具,信手拈来,他们心中已经没有语言,他就是语言,语言就是他,合而为一,乃为共同体。
开篇之前,先略微声明一下。本文目的不在于为C++辩护或抬举,当然也不会有为此而抬高或打压别的编程语言的意图。所有的,仅仅是有感而发,并且还是从我个人的角度,有所缺失在所难免。如果你是老鸟,其中之缺还望相见一笑;如果你是菜鸟,对于文中的赞美和批评,请擦亮眼睛,别被我忽悠了。
首先我们先要知道一点,C++是一门什么语言?简单点来说,C++是一门接近于全能的语言。为什么说是接近呢?因为C++有一门语言是无法取代的,那
就是汇编。再直白点来说,汇编对于寄存器的操作,C++是无法胜任的。不信?你试试用C++来改写一下PC寄存器看看?没辙吧?
“接近”可以理解了,那么“全能”呢?我们知道,C++是兼容C的。不严谨地说,我们可以简单认为C只是C++的一个子集,所以C能做的,C++也能做,这个应该没有人有异议。为了方便,以下所描述的C++,在某些方面也代表C,之所以没采用C/C++这样的写法,仅仅是为了保护键盘而已。转回正题,那C#呢?JAVA呢?它们所能做的,比如网络方面的应用,B/S的方方面面,怎么就没见C++的身影呢?关于这个问题嘛,我们从另一个角度来看,C#和JAVA的运行基础是什么?没错,是虚拟机。虚拟机是用什么写的?嘿嘿,C++。所以,你完全可以用C++先写一个虚拟机,然后再在虚拟机上解释C++语法。是不是很酷?当然,我想现实中是不会有人那么去做的。就像从深圳到上海,你可以坐飞机去,也可以骑自行车去。两者都能到达目的地,但我估计没几个人会选择后者。这就是效率问题。坐飞机,眼一睁一闭,就到了;骑自行车?呃,这时间就不好估计了。所以这领域,该让C#的,或是JAVA的,就让它们去折腾吧。至于C++,就让它干在一旁瞪眼好了,除非你一定想要耍耍酷。
接着,我们就来看看桌面应用吧。所谓的桌面应用,我们狭义一点,就是桌面应用程序。总的来说,目前在这领域,C++确实还能占有一席之地。但这仅有的一席之地,也岌岌可危。在XP之前,因为系统都是没有预装.net framework,所以C++的对手无非就是VB和DELPHI,但这两者根本无法撼动C++这颗大树。虽然XP也能装.net framework,但为了一个应用而弄一个体积如此巨大的玩意,却有那么一点点的不现实。但后XP时代,世界就不一样了。Vista已经预装了.net framework,更不用说Windows 7。甚至还有传言,Windows 7的用户界面就是用C#搞定的。何况,C#还有杀手锏,能和Silverlight完美结合,大大减轻UI的开发难度。看起来,在今后的日子,在这个桌面应用领域,C++日子过得并不舒坦。在这领域,可能C++还能耀武扬威的,也许就剩下大型的3D游戏了。虽然用.net配合OpenGL或Direct3D也能做C++的事,但效率却会大打折扣。虽然随着硬件的不断提升,可能这折扣会不断缩小,但毕竟还是存在的。只要折扣存在,那些游戏厂商就不会放弃C++,因为能优化,为何不优化?但,也许也仅仅限于此了。C++,它泪流满面。
最后呢,就是嵌入式领域。在这里,是C++的天下,C++是永远的王者。它不是一个人在战斗!此刻,它灵魂附体!你见过那些RTOS是用C++以外的语言写的(再次重申,正如前文所说,这里的C++也代表了C)?至少我印象中没有。嵌入式linux支持.net?除非微软的脑袋秀逗了。也许有人说,WinCE不是可以支持.net么?支持是可以支持,但并不代表所有的WinCE设备都支持。因为WinCE是可裁剪的操作系统,也许是为了节约内存空间,也许是为了启动速度,或是由于别的杂七杂八的,甚至莫名其妙的理由,很多厂商根本就不会将.net这个会将系统膨胀至少4M的组件加到产品去。看看WinCE的内核代码,看看WinCE的BSP包,哪里有.net代码的身影?全部清一色的C++。甚至于WinCE的应用程序,微软的态度也非常明确,在桌面只能.net使用的Silverlight,在WinCE SP3添加之后,却是更改为了C++接口。王者,绝对的王者,根本就不可能有别的语言在这里将C++撼动!此时,C++站起来了!腰板直了!
说了那么多,那么我们的最后,就来看看为什么大家都说学好C++难吧。如果你对学好C++没啥兴趣,以下的文字估计对你也没啥营养,你可以完全忽略不计,可以很愉快或很气愤地将当前网页给咔嚓掉。
其实学C++很简单,但难就难在这个“好”字。初学者会发现,入门很简单,因为C++也没啥语法;但搞清楚语法后,接下来就犯糊涂了,下一步应该怎么走呢?只所以产生这种原因,是因为C++太灵活了。对于一种功能,C++有各种各样的方法,究竟什么方法才是最合适的?比如说,传递给函数的形参,什么时候该使用指针,什么时候该使用引用?就连平常得再也不能平常的指针转型,有C的括号形式,还有C++特有的dynamic_cast和reinterpret_cast,究竟哪个才是该使用的?更不用说分配内存了,既有malloc,还有new,如果算上STL的话,还有一个resize。我想所有的这些,对于初学者而言,如果他看着这些能够腿不痛腰不酸,那么我强烈佩服这人的淡定力。
C++还有更让初学者郁闷的是,即使不用STL,不用类,不用虚拟继承,甚至不用C++的一切特性,也是能够完成所相应的功能。所以,疑惑了,C++是什么?也许这时候,很多人就会想,如果选择是唯一的,那是多么地幸福啊!因此,很多人就转向了C#(或别的语言),因为对于某些操作,方法是唯一的;即使不是唯一,也没有C++那么繁多。
没打算在这论述该如何学习C++,因为一千个人有一千种方法,而这一千种方法,还不一定适合你。但有一点是共通的,那就是多看书。将市面上经典的C++著作,仔仔细细地消化,相信一定能达到炉火纯青的地步。即使达不到吧,也没事,不会作诗也会呤吧?只是,这时候意志力就非常重要,当然也需要那么一点点情商,要相信没有迈不过的坎。
文件中有一组整数,要求排序后输出到另一个文件中
答案:
#i nclude
#i nclude
using namespace std;
void Order(vector& data) //bubble sort
{
int count = data.size() ;
int tag = false ; // 设置是否需要继续冒泡的标志位
for ( int i = 0 ; i < count ; i++)
{
for ( int j = 0 ; j < count – i – 1 ; j++)
{
if ( data[j] > data[j+1])
{
tag = true ;
int temp = data[j] ;
data[j] = data[j+1] ;
data[j+1] = temp ;
}
}
if ( !tag )
break ;
}
}
void main( void )
{
vectordata;
ifstream in(“c:data.txt”);
if ( !in)
{
cout<<”file error!”;
exit(1);
}
int temp;
while (!in.eof())
{
in>>temp;
data.push_back(temp);
}
in.close(); //关闭输入文件流
Order(data);
ofstream out(“c: esult.txt”);
if ( !out)
{
cout<<”file error!”;
exit(1);
}
for ( i = 0 ; i < data.size() ; i++)
out< out.close(); //关闭输出文件流
近五十年间,软件技术经历了多个阶段的发展演变 目前为止最流行的技术还是面向过程编程(POP)
面向过程编程采用了自顶向下的设计方案,问题被看做多个执行任务的序列。为完成这些任务,须实现一些函数。
面向过程有两大不足,即:(1)数据可在程序内自由迁移,程序内任何函数都会引起数据的更改,增加了数据的脆弱性。(2)它并不能很好地建模现实世界。
为了克服面向过程编程中的不足,人们发明了面向对象编程(OOP)。它采用自底向上的编程方案,在程序开发中,把数据视为重要元素,不允许数据在系统内自由迁移。它还将数据和函数紧密绑定于成为类的数据结构中,函数可操作类中的数据。此特性称为数据封装。
在面向对象编程中,问题被视为一系列称为对象的实体的集合。对象是类的实例; 将数据与程序的直接访问隔绝,这称为数据隐藏。
数据抽象指的是,将各种必要特性合并,而不引入背景细节。 继承是这样的一个过程,即某类的对象得到另一类对象的属性。
多态指的是,一个名称,多种形态。在程序中,我们可以借此定义多个同名函数。此特性亦可重载运算符,这样一来,同一个运算符在不同的实例下,会有不同的行为。 动态绑定指的是,给定过程的代码,直到运行期被调用时才确定。 消息传递涉及对象名,函数(消息)名以及发送的信息。
与传统的编程技术相比,面向对象技术具有诸多优势——最显著的当属重用技术。 在实时系统等几乎所有的计算机领域,面向对象编程的应用程序都已受到重视。 不少语言都支持面向对象编程,流行的语言包括C++、Smalltalk和Java。
第二章C++入门
C++是C语言的超级
C++在C语言的基础上,添加了一些面向对象的特性,诸如对象、继承、函数重载和运算符重载。这些特性加强了程序的清晰性,可扩展性,使程序容易维护。
C++可用于开发各种系统,诸如编辑器、编译器、数据库、通信系统以及其他更多复杂的实际系统。
C++支持交互式输入输出,并引入了新的注释符号//,可用于注释单句。它也支持C语言的注释风格。
和C程序一样,所有C++程序的执行入口都是main()函数,并以return()语句作为结束。头文件iostream应包含于所有使用输入输出操作的程序开头。 所有标准C++程序都要包含using namespace std指令
典型的C++程序包括四个基本部分:也就是头文件包含部分、类声明部分、成员函数部分和主程序部分
和C程序一样,C++程序可用于任何文本编辑器创建
大多数编译器提供了集成开发运行环境。流行的编译器系统有UNIX AT&T C++、Turbo C++和微软公司的Visual C++
第三章符号、表达式和控制结构
C++有不同的符号,包括关键字、标识符、常量、字符串和操作符 标识符指的是变量名、函数名、数组名、类名等 C++中增加了void的一个用途,可用于声明通用指针
C++中枚举数据类型略有不同,枚举类型名称为新的类型名。这样我们就可以声明枚举类型的变量
在C++中,字符数组的大小应比字符串的实际长度大1 C++增加了指针常量和常量指针的概念,对于前者我们不能修改赋予它的地址值,对于后者,我们不能修改它指向的内容。
在C++的内存管理和多态实现中,指针被广泛地使用。
C++中提供了const修饰符,用于声明常量,常量也是变量,只是其值不可变更。const修饰符默认修饰整型。
C++的变量类型检查非常严格,它不允许不同类型变量之间的赋值。类型转换是打破此规的唯一办法。
C++允许我们在程序中随处声明变量,而且可以利用声明处的表达式,在运行期完成初始化。
引用变量给之前定义的变量提供了一个别名。它们都指向内存中的同一个数据对象。所以,改变其中一个的值,另一边量的值也会随之改变。
引用变量必须在声明时初始化,这建立了它和要引用的变量之间的对应关系。 作用于解析操作符(::)的主要用于类,以识别成员函数所属的类
除了malloc()、calloc()、free()函数外,C++提供了两个一元操作符,即new和delete,以更好和更方便地分配和释放内存
C++也提供了操纵器,来格式化输出数据。最常用的操纵器为endl和setw C++支持七种表达式类型。表达式中数据类型混用时,C++使用特定规则,自动地进行类型转换。
使用类型转换操作符,C++也可显示地进行变量和表达式的类型转换
和C语言一样,C++也支持三种基本的控制结构,也就是顺序结构,分支结构和循环结构,并使用各种控制语句实现它们,比如if、if…else、switch、do…while、while以及for。
第四章C++中的函数
在程序的不同处,调用函数可减少程序的大小。
在C++中,main()函数向操作系统返回一个整型值。因为函数的返回值类型默认是整型,所以main()函数中的关键字int是可选的。而如果没有返回语句,大部分C++编译器会提示一个警告。
函数原型向编译器提供了函数的细节,比如参数的数目和类型,以及返回值的类型。 C++的引用变量使我们可以传引用参数给函数。函数也可以返回引用变量。
当函数声明为内联时,编译器用相应的函数代码替换了函数调用。一般情况下,小函数才使用内联。
编译器可能会忽略函数的内联声明,如果函数声明太长或过于复杂,编译器将按常规函数编译它。
当函数声明时,C++允许我们把默认值赋给函数参数。这种情况下,我们可以无需指明所有参数,便可调用函数。默认参数总是由右到左添加。 C++中,函数的参数可声明为常量,表示函数不可更改此变量。
C++允许函数重载,也就是说,我们可以定义多个同名函数。通过检查参数数目和类型编译器会准确地匹配函数调用和函数代码。
C++支持两种新的函数类型,亦即友元函数和虚函数。
C++标准库支持很多数学库函数,使用它们可以完成许多数学计算。
第五章 类和对象
类是结构体数据类型的扩展,一个类有多个成员变量和成员函数。 默认情况下,类的成员是私有的,而结构体的成员是公用的。
只有成员函数可以访问私有数据成员和私有函数。但是类外可以访问公用成员。 在C++中,类变量称为对象。利用对象并使用点操作符,我们可以访问类的公用成员。 我们可以在类内或类外定义成员函数。成员函数和常规函数的区别在于,成员函数的头
部有一个隶属标识符,以表明所属类。
对象声明时,内存空间才会分配。每一对象的成员变量空间单独分配,而成员函数的空间则统一分配。
类的一个成员变量可声明为静态成员,一般用于维护整个类的通用值。 静态成员变量必须定义于类外。
静态成员函数可访问声明在同类的静态成员,调用静态成员函数时需要用到类名。 C++允许我们使用对象数组。 对象可用作函数自变量。
友元函数不在友元声明类的作用域类,它可以访问累的所有私有数据。 函数可以返回对象。
如果成员函数不改变类内的任何数据,我们可以将其声明为常量成员函数,只要在函数原型中加上关键词const(声明和定义都要加)。
我们也可以在函数内定义和使用类。这种类称为局部类。
第六章构造函数和析构函数
C++提供了一种称为构造函数的特殊成员函数,它能帮助对象在创建时完成初始化。这一过程被称为对象的自动初始化。 构造函数名和类名一致。
构造函数通常用来初始化变量,以及分配内存。 和常规函数一样,构造函数也可以被重载。
当对象同时被创建和初始化时,复制构造函数被调用。 我们可以声明一个常量对象,其数据值不能改变。
C++还提供另一种成员函数,称为析构函数。当对象不再需要时,会调用这种函数来销毁对象。
第七章运算符重载和类型转换
运算符重载是C++的重要特性之一。又被称为编译时多态性。
使用重载特性,我们可以对两个用户自定义数据类型,比如说对象,执行相加的操作,使用的语法就和基本数据类型一样。
我们可以重载几乎所有C++的运算符,下面几个是例外:
类成员访问符(.,.*)。 作用域解析符(::)。
大小运算符(sizeof)。 条件运算符(?:)。
运算符重载是通过一种称为运算符函数的特殊函数完成的,该函数定义了运算符的特定任务。
运算符重载时有一些限制。运算符函数必须是非静态的成员函数或者友元函数。重载的运算符必须有至少一个用户自定义类型的操作数。
编译器不支持用户自定义数据类型的自动类型转换,我们可以使用自定义的转换运算符函数,以实现自定义数据类型的自动类型转换。 转换运算符函数应符合下列条件:
必须是类成员。 必须不指定返回值。 必须没有参数。
第八章继承:类的扩展
从旧类派生一个新类的机制被称为继承。继承提供了可重用性的概念。通过继承,C++的类可以被重用。
派生类继承了基类的一部分或所有特性。 只有一个基类的派生类被称为单继承。 可从多个类继承,这被称为多继承。 可从另一派生类继承类,这被称为多级继承。
当某类的属性被多于一个类继承时,这被称为层次继承。 不管是在公用模式还是私有模式,类的私有成员都不可被继承。
以公用模式继承的保护成员仍为派生类的保护成员,而以私有模式继承的保护成员,则变成派生类的私有成员。
友元函数和友元类的成员函数可直接访问私有和保护数据。
派生类的成员函数只能直接访问保护和公用数据。不过他们可通过基类的成员函数访问私有数据。
多路继承可能引起祖父基类的继承成员的重复。通过将共同的基类设为虚基类,我们可以避免祖父基类成员的重复。
【c++实验(网络工程)】推荐阅读:
信息系C++实验报告(练习)07-04
网络工程实践实验报告06-02
实验三网络信息检索11-21
网络营销实验总结03-22
网络编程实验报告03-27
网络安全实验报告综合06-13
网络数据采集实验报告10-09
无线传感器网络实验10-11
网络数据库上机实验01-26