北邮小学期c++实验报告

2024-05-28

北邮小学期c++实验报告(精选5篇)

篇1:北邮小学期c++实验报告

面向对象程序设计与实践

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中。

8)最后程序执行结果正确,编写menu菜单界面,美化界面并且让操作编号更加清晰。

篇2:北邮小学期c++实验报告

编写C++程序完成以下功能:

(1)假定有一件商品,程序用随机数指定该商品的价格(1-1000的整数);(2)提示用户猜价格,并输入:若用户猜的价格比商品价格高或低,对用户作出相应的提示;

(3)直到猜对为止,并给出提示

矩形

编写C++程序完成以下功能:

(1)定义一个Point类,其属性包括点的坐标,提供计算两点之间距离的方法;(2)定义一个矩形类,其属性包括左上角和右下角两个点,提供计算面积的方法;

(3)创建一个矩形对象,提示用户输入矩形左上角和右下角的坐标;(4)观察矩形对象以及Point类成员的构造函数与析构函数的调用;(5)计算其面积,并输出。

友元

编写C++程序完成以下功能:

(1)定义一个Boat和Car两个类,他们都具有私用属性——重量;

矩阵

(一)编写C++程序完成以下功能:

(1)假定矩阵大小为4×5(整型数组表示);

(2)定义矩阵初始化函数,可以从cin中输入矩阵元素;(3)定义矩阵输出函数,将矩阵格式化输出到cout;

(4)定义矩阵相加的函数,实现两个矩阵相加的功能,结果保存在另一个矩阵中;(5)定义矩阵相减的函数,实现两个矩阵相减的功能,结果保存在另一个矩阵中;(6)定义三个矩阵:A1、A2、A3;(7)初始化A1、A2;

(8)计算并输出:A3 = A1加A2,A3 = A1减A2。

矩阵

(二)编写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)释放矩阵空间。

矩阵

(三)编写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。

1、形状

(一)编写C++程序完成以下功能:

(1)声明一个基类Shape(形状),其中包含一个方法来计算面积;(2)从Shape派生两个类矩形和圆形;(3)从矩形派生正方形;

(4)分别实现派生类构造函数、析构函数和其他方法;

(5)创建派生类的对象,观察构造函数、析构函数调用次序;(6)不同对象计算面积。

形状

(二)——虚函数

(1)将【形状

(一)】中的基类计算面积的方法定义为虚函数,比较与【形状

(一)】程序的差异;

(2)将【形状

(一)】中的基类定义抽象类,比较与【形状

(一)】程序的差异。

对Point类重载++和――运算符

编写C++程序完成以下功能:

(1)Point类的属性包括点的坐标(x,y);(2)实现 Point类重载++和――运算符:

 ++p,--p,p++,p--。

 ++和――分别表示x,y增加或减少1。

流式IO

(一)编写C++程序完成以下功能:

(1)使用ofstream 向一个文本文件中输出各种类型的数据,并打开文件观察结果:

 整数、无符号整型、长整型、浮点型、字符串、……

(2)用十进制、八进制、十六进制方式向文本文件中输出整数;(3)使用控制符和成员函数来控制输出的格式:

 set()precision()...流式IO

(三)编写C++程序完成以下功能:(1)输入一个文本文件名;

(2)打开文件名,在该文件的每一行前面加上一个行号,保存在另外一个文本文件中。

电话本

编写C++程序完成以下功能:

(1)实现简单电话本功能,用姓名来搜索电话号码;(2)用户输入姓名,程序查找并输出结果;(3)用户可以通过输入,添加姓名和电话号码;(4)用户可以删除姓名和电话号码;(5)电话本可以保存在指定文件中;(6)电话可被从指定文件中读入到内存。

篇3:中班上学期科学小实验材料的投放

一、材料的投放应有助于凸显科学现象

中班上学期幼儿的观察能力和水平还相对较低,往往只关注事物的表面特征和非常明显的现象,难以对多种材料进行细致观察和比较探究,不善于整体或多角度地去发现事物内在的联系。因此,为中班上学期幼儿提供的实验材料应简单、直观、有趣,通过引发幼儿与材料的充分互动,让幼儿有兴趣地探索事物间的简单关系。

例如,在小实验“吹气袋”中,我将吸管插入小号的保鲜袋中,再用橡皮筋扎紧袋口,使袋子与吸管的衔接处密封。幼儿通过吸管往袋子里吹气,袋子因充气而膨胀、因漏气而干瘪的现象十分明显,幼儿很感兴趣。他们一会儿吹气、放气,一会儿比一比谁的袋子鼓鼓的、瘪瘪的,一会儿往空中抛接,一会儿用小手摸摸袋子有没有气……凸显的科学现象引发了幼儿反复操作与观察的兴趣,幼儿不仅感知到了空气的存在,还体验到了空气的多少与袋子的鼓、瘪之间的关系。

二、材料的投放应注重生活性

幼儿新经验的获得是建立在已有经验的基础上的,已有经验的状况影响着幼儿当前探究的兴趣、注意力和持续性。因此中班上学期科学小实验的材料应源于幼儿的生活,让幼儿的探究建立在一定的生活经验基础之上。

例如,在小实验“玩玩变变”中,我以醋、碘酒等为主要实验材料。醋遇到苏打粉变成“会冒泡的水”,用醋浸泡鹌鹑蛋变出了没有壳的蛋”,碘酒遇到糨糊变出了“蓝色的画”,用碘酒涂抹在山芋雕刻成的小人上变出了“蓝色的小人”等实验让幼儿倍感兴趣。因为这些实验材料都是幼儿熟悉的生活中的材料,所以他们倍感亲切,不仅敢于大胆操作,而且还惊异于这些日常用品所产生的那么多有趣的变化。显然,来自生活中的科学小实验有助于中班上学期幼儿与实验材料积极互动,促使幼儿建构新的知识和经验。

三、材料的投放应突出操作性

中班上学期的幼儿直觉行动思维还占优势,一旦离开操作,他们的注意力和思维就会发生转移。因此,中班上学期开展科学小实验活动应更多地选择操作性强的材料,支持幼儿持续地感知操作与现象变化之间的关系,以实现活动目标。

例如,在小实验“变大变小”中,我先让幼儿通过观察镜子的凹面、凸面来感知物体成像的变化,后引导幼儿通过观察万花筒来感受图案变化的多样性,但幼儿并不感兴趣。之所以如此,是因为这个活动主要通过观察来感知,操作动作单一,对幼儿来说缺乏趣味性。而在小实验“搅泡泡”中,幼儿可以不断地重复舀、倒、搅、看等动作,他们不时地用勺子往水中加洗洁精,用搅拌棍搅拌,同时观察着泡泡的变化。看到物体随着操作而发生的明显变化,幼儿的兴趣越来越浓,他们主动要求增添材料,并兴奋地说着他们的新发现。

四、材料的投放应人手一份

中班上学期的幼儿自我意识的发展进入了一个新的阶段,他们很容易因为物品的归属问题引发争执。这提示我们应为幼儿提供人手一份的实验材料,使幼儿将注意力更多地集中在操作和观察之上。

例如,在小实验“会变的胸卡”中由于共用“溶液”,因而幼儿在操作中出现了争抢现象,并导致三种不同的“溶液”混用,影响了实验效果。为此我做了调整,将三只小瓶子用透明胶带捆成一组,分别装入这三种“溶液”,并贴上了不同颜色的标志加以区分,棉签也贴上了与瓶子颜色对应的标志。由于每个幼儿都有了属于自己的“神奇的溶液”和棉签,因此这不仅解决了“争抢”问题,也避免了因混用棉签而影响实验效果的现象。

五、材料的投放应做细致处理

中班上学期的幼儿自我保护能力还比较弱,安全意识相对淡薄,教师需要预见可能出现的安全问题,对材料做更细致的安全处理或选择替代品,以确保幼儿的安全,支持幼儿的自主探索。

篇4:北邮现场总线实验报告

实验名称:

CAN总线技术与iCAN模块实验

学院:

自动化学院

专业:

自动化专业

班级:

2010211411

姓名:

韩思宇

学号:

10212006

指导老师:

杨军

一、实验名称:

实验一:CAN总线技术与iCAN模块实验

二、实验设备:

计算机,CAN总线系列实验箱,测控设备箱,万用表。

三、实验内容:

1、熟悉iCAN各模块的功能及原理,了解接线端子。

2、学习USBCAN-2A接口卡的使用及安装,安装USBCAN-2A接口卡的驱动程序。

3、根据实验指导书中的手动设置iCAN模块MACID的方法手动设置各模块的MACID。

4、使用提供的iCANTest测试软件工具来测试各模块的功能及用法,利用测试工具与模块之间通信。

5、学习了解iCAN主站函数库中的主要操作函数及其应用。

6、学习利用VC或者VB编程来对iCAN系列各模块进行操作。

四:实验过程:

1、驱动程序安装:

USBCAN-2A接口卡的驱动程序需要自己手动进行安装,驱动程序已经存放于实验准备内容中。找到驱动程序,直接点击进行安装即可。安装完成后,在“管理->设备管理器->通用串行总线控制器”中查看驱动是否安装成功。

注意:安装驱动程序过程中PC机不能连接USB电缆。

2、iCANTEST安装与运行:

连接设备后,打开iCANTEST软件,点击“系统配置”,设置设备类型为USBCAN2,点击“启动”->“上线”,试验各模块的功能。点击“全部下线”,将断开主机与所有模块的连接。

3、各种iCAN模块的测试

4、指示灯,按钮,温湿度传感器的连接

5、测试运行记录与截屏图:

iCAN模块测试运行记录与截图。

图(1)

iCANTEST界面

iCAN4055模块界面如图(2)。DI输入由测控设备箱中的开关控制,DO输出控制设备箱上的灯泡亮灭。

图(2)

iCAN4055模块界面

iCAN4210模块如图(3)。iCAN4210模块为2路模拟量输出模块。将该模块的输出通道0与iCAN4017模块的输入通道3相连,可观察到改变iCAN4210的通道0设定值时,iCAN4017的通道3显示值会随之变化。(通道0为0x8000时,通道3显示为5.000V。)

图(3)

iCAN4210模块界面

iCAN4017模块如图(4)。iCAN4017模块为8路模拟量输入模块。将该模块的通道0与通道1与测控设备箱的温湿度传感器相连,可由通道0和1的电压值推导出传感器测出的环境温度和湿度。由于实验时使用的温湿度传感器温度测量部分故障,所以通道0显示0.000V,湿度测量部分正常,通道1显示为6.182V。

图(4)

iCAN4017模块界面

6、自编程序主要功能

(1)添加一个输入编辑框和一个按钮控件,通过输入0x00-0xFF之间的十六

进制数来控制iCAN4055的DO通道的输入;再设置一个编辑框edit控件来读取iCAN4055的8位数字量输入通道的状态。(2)设置两个输入编辑框控件,来分别设置iCAN4210两个通道的输出。(3)设置4个编辑框edit控件来分别读取iCAN4017前四个通道ch0、ch1、ch2、ch3的模拟量输入值。

7、自编程序运行结果与截图(课上未做,课下做了界面和程序)

图(5)

iCAN4055模块界面

图(6)

iCAN4017模块界面

8、主要程序部分

(1)有关iCAN4055功能模块的简单功能的实现的整体代码如下:

首先在生成的类头文件Sample4055dlg.h中的类CSample4055中添加申明变量: public:

unsigned char buf[1];//发送数据的数据缓存区 unsigned char recbuf[1];//接受数据的数据缓存区 unsigned long len;int outvalue;int count;CString str;在Sample4055.cpp文件中编写控制代码: 首先添加对变量的定义: ROUTECFG cfg;

HANDLE hRoute=0;//新的ICAN网络

HANDLE hSlave4055=0;//数字量输入输出模块4055,MACID=1 CSample4055::CSample4055(CWnd* pParent /*=NULL*/){

}

(2)添加每个控件消息响应函数的代码: void CSample4055::OnStartsysButton1(){ : CDialog(CSample4055::IDD, pParent)buf[0]=0;recbuf[0]=0;count=0;len=0;str=“";

// TODO: Add your control notification handler code here cfg.iCardType=4;//使用usbcan2接线口 cfg.iCardInd=0;//卡序号

cfg.iCANInd=0;//CAN通道选择(0表示0通道;1表示1通道)cfg.wCANBaud=0x001c;//波特率的设定0x001c(500kbps)cfg.iMasterCycle=500;//主站循环周期 cfg.wMasterID=0;//主站ID

Mgr_AddRoute(cfg,&hRoute);//添加iCAN网络

if(Mgr_StartSys()!=ICANOK)//调用Mgr_StartSys()函数对CAN网络是否启动进行判断,返回为ICANOK

} void CSample4055::OnLink4055Button2(){ if(Mgr_IsStarted()!=1){ { } else { } MessageBox(”CAN网络已启动“);MessageBox(”系统启动失败“);

MessageBox(”系统未启动或启动失败,请先启动CAN网络“);

} else { // TODO: Add your control notification handler code here Route_AddSlave(hRoute,1,&hSlave4055);//添加从站4055,MACID=1

if(Slave_Connect(hSlave4055)!=ICANOK)//判断从站4055是否连接成功 { } MessageBox(”4055连接失败“);

else

{ } MessageBox(”4055连接成功“);

SetTimer(1,1000,NULL);//设定开启定时循环,1代表消息事件id,1000表示1000ms即1s } void CSample4055::OnTimer(UINT nIDEvent)//Timer事件函数 {

// TODO: Add your message handler code here and/or call default if(nIDEvent==1){ }

len=1;Slave_GetDIData(hSlave4055,recbuf,&len);//读取4055数字量输入端口数据 str.Format(”0x%02x:%d“,recbuf[0],count);

m_getDI.SetWindowText(str);count=count+1;

CDialog::OnTimer(nIDEvent);

} } void CSample4055::OnButtonSetvalue()//设定4055数字量输出端口值 { // TODO: Add your control notification handler code here if((Mgr_IsStarted()==1)&&(Slave_IsConnected(hSlave4055)==1))

{

UpdateData(true);

outvalue=strtol(m_invalue,NULL,16);//按十六进制进行读取 if(outvalue >= 0 && outvalue <= 255){

buf[0]=(unsigned short)strtol(m_invalue,NULL,16);

Slave_SendData(hSlave4055,0x20,buf,1);//发送数据 } else { } } else { MessageBox(”请输入00~FF之间的十六进制数“);

MessageBox(”系统未启动或从站未连接,请查看后再进行操作“);}

(3)2路模拟量输出模块iCAN4210的编程使用 实验代码如下:

首先添加所用变量的申明: ROUTECFG cfg;

HANDLE hRoute=0;//新的ICAN网络 HANDLE hSlave4210=0;//MACID=2

控制代码:

void CSample4210::OnBUTTONStartCANSys(){ // TODO: Add your control notification handler code here } 8

cfg.iCardType=4;//使用usbcan2接线口 cfg.iCardInd=0;//卡序号

cfg.iCANInd=0;//CAN通道选择(0表示0通道;1表示1通道)cfg.wCANBaud=0x001c;//波特率的设定0x001c(500kbps)cfg.iMasterCycle=500;//主站循环周期 cfg.wMasterID=0;//主站ID

Mgr_AddRoute(cfg,&hRoute);//添加iCAN网络

if(Mgr_StartSys()!=ICANOK)//调用Mgr_StartSys()函数对CAN网络是否启动进行判断,返回为ICANOK

} void CSample4210::OnButtonLink4210(){

// TODO: Add your control notification handler code here if(Mgr_IsStarted()!=1){ { } else { } MessageBox(”CAN网络已启动“);MessageBox(”系统启动失败“);

MessageBox(”系统未启动或启动失败,请先启动CAN网络“);

} else { // TODO: Add your control notification handler code here Route_AddSlave(hRoute,2,&hSlave4210);

if(Slave_Connect(hSlave4210)!=ICANOK){ } MessageBox(”4210连接失败“);

else

} void CSample4210::OnButtonCanok(){ if((Mgr_IsStarted()==1)&&(Slave_IsConnected(hSlave4210)==1)){ } } MessageBox(”4210连接成功“);

{ unsigned char buf[32]={0};

UpdateData(true);if(m_setch0>=0.0&&m_setch0<=10.0){

buf[1]=(unsigned short)(m_setch0/10)*65535;

buf[0]=(unsigned short)((m_setch0/10)*65535)>>8;

} else { } if(m_setch1>=0.0&&m_setch1<=10.0)MessageBox(”提示:请输入0~10V电压“);

{

buf[3]=(unsigned short)(m_setch1/10)*65535;

buf[2]=(unsigned short)((m_setch1/10)*65535)>>8;

}

else { } MessageBox(”提示:请输入0~10V电压“);

Slave_SendData(hSlave4210,0x60,buf,4);

} else {

MessageBox(”系统未启动或从站未连接,请查看后再进行操作“);}(4)8路模拟量输入模块iCAN4017 首先,在生成的.h头文件中添加使用到的变量的申明。public:

unsigned char recbuf[16];unsigned long len;int count;} 在.cpp文件中首先添加iCAN网络定义和申明以及变量的初始化操作。

ROUTECFG cfg;HANDLE hRoute=0;//新的ICAN网络

HANDLE hSlave4017=0;//AI模块4017,MACID=3

CSample4017::CSample4017(CWnd* pParent /*=NULL*/){

: CDialog(CSample4017::IDD, pParent)//{{AFX_DATA_INIT(CSample4017)m_valuech0 = 0.0;m_valuech1 = 0.0;m_valuech2 = 0.0;

} m_valuech3 = 0.0;m_counter = 0;//}}AFX_DATA_INIT recbuf[0]=0;recbuf[1]=0;recbuf[2]=0;recbuf[3]=0;recbuf[4]=0;recbuf[5]=0;recbuf[6]=0;recbuf[7]=0;len=0;count=0;void CSample4017::OnBUTTONStartCANSys(){

// TODO: Add your control notification handler code here cfg.iCardType=4;//使用usbcan2接线口 cfg.iCardInd=0;//卡序号

cfg.iCANInd=0;//CAN通道选择(0表示0通道;1表示1通道)cfg.wCANBaud=0x001c;//波特率的设定0x001c(500kbps)cfg.iMasterCycle=500;//主站循环周期 cfg.wMasterID=0;//主站ID

Mgr_AddRoute(cfg,&hRoute);//添加iCAN网络

if(Mgr_StartSys()!=ICANOK)//调用Mgr_StartSys()函数对CAN网络是否启动进行判断,返回为ICANOK

{

} } else { } MessageBox(”系统启动失败“);MessageBox(”CAN网络已启动“);void CSample4017::OnButtonLink4017(){

// TODO: Add your control notification handler code here if(Mgr_IsStarted()!=1){

MessageBox(”系统未启动或启动失败,请先启动CAN网络“);

} else { // TODO: Add your control notification handler code here Route_AddSlave(hRoute,3,&hSlave4017);if(Slave_Connect(hSlave4017)!=ICANOK){ } MessageBox(”4017连接失败“);

else

{ }

SetTimer(1,1000,NULL);} MessageBox(”4017连接成功");} void CSample4017::OnTimer(UINT nIDEvent){

// TODO: Add your message handler code here and/or call default if(nIDEvent==1){

Slave_GetAIData(hSlave4017,recbuf,&len);

m_valuech0=((double)(recbuf[0]*16*16+recbuf[1])-0x8000)*10/(double)0x8000;

m_valuech1=((double)(recbuf[2]*16*16+recbuf[3])-0x8000)*10/(double)0x8000;

m_valuech2=((double)(recbuf[4]*16*16+recbuf[5])-0x8000)*10/(double)0x8000;

m_valuech3=((double)(recbuf[6]*16*16+recbuf[7])-0x8000)*10/(double)0x8000;

}

篇5:北邮-信息与网络实验报告一

信息网络应用基础实验报告

实验一

静态网页的设计

学院:电子工程学院

班级:

姓名:

学号:

一、实验主题

1、设计主题:本次实验我设计的该网页主题是围绕当前热门的多人联机在线网游DOTA2进行的。并对该游戏的由来、背景及其内容做了一些简要的描述。

2、功能:在主页中可以观看该游戏的宣传视频以及该游戏的一些精美的图片,并且通过选择相应选项可以了解更多的游戏内容。

3、运行流程:

① 首先打开主页时可以选择播放视频,并且看到丰富的图片;

② 然后点击相应的选项可以进入到分别的附页中查看内容;

③ 并且在主页点击最下的图片可以回到主页顶部,在其他页面点击最下的图片也可以回到主页。

4、实现功能的html技术:

① 在主页中观看视频利用的是html多媒体中的标签插入一个视频的URL进行播放;

② 在页面中的图片是利用了html多媒体中的标签进行图片的加入;

③ 设置页面的背景图片是在标签中加入background参数即可;

④ 在页面内、本机页面间及本机文档连接互联网页面时则是利用了超链接的三种方法建立;

⑤ 在页面中显示表格则是利用了相关的表格创建的语句来建立一个表格,并且可以对表格中插入图片并且可以改变表格的背景颜色以及背景图片。

二、实验内容运行结果

① 打开主页可以看到插入的图片以及背景图片

② 点击页面中插入的视频,点击播放即可以进行播放

插入视频的html代码如下:

③ 点击主页中的超链接则可以跳转到相应的页面。如:

点击英雄介绍链接

则可以显示英雄介绍页面

当选择一个类型的英雄时可以在本页面跳转到对应类型的介绍

当选择某个英雄时则可以链接到互联网上的详细介绍页面

④ 当在副页面点击最下面的图片则可以跳转到主页面

⑤ 在页面中建立的表格并且改变表格背景颜色并且插入图片

三、实验心得与感受

本次实验真正的了解到了如何设计一个最基本的网页,也是将所学的html语言的知识进行了充分的应用,也对这些知识有了更加可视化的了解。由于是第一次进行网页的设计,我选择的是利用记事本来编辑html代码来进行设计的,由于代码都是利用各种标签手动输入的,所以对语句有了深刻的记忆,包括在以后的学习中也会很好的利用它们。我认为这样相对于利用dreamweaver来设计有很多的好处,因为这样第一次可以让我们了解页面的每一部分是怎么实现的,不过在了解过后可以选择软件来设计,因为那样更加具有可视化且方便。

在设计的过程中,也遇到了不少的困难。首先感觉就是对于一个网页的背景图片选择来说比较困难,因为在网页中不会对一个图片进行伸缩,显示的是图片本身的大小,所以只好找到与页面较符合的图片。而且在插入视频时,我利用书中的代码写入时不能在页面中无法播放视频。后来我在网上查阅相关资料,后来直接利用视频网站中的分享视频的代码加入即可在页面中显示一个可播放的视频。

上一篇:江西三支一扶考试:法律常识模拟题下一篇:机械类专业求职的简历