实验5(2) 参考答案

实验5(2)  参考答案
实验5(2)  参考答案

实验5(2) 类的继承与派生

参考答案

一、实验目的与实验要求

(1)掌握单继承和多重继承下派生类的定义方法,理解基类成员在不同的继承方式下不同的访问属性。

(2)正确定义派生类的构造函数与析构函数,理解定义一个派生类对象时构造函数、析构函数的调用次序。

(3)理解同名冲突的产生原因,会使用虚基类来解决第三类同名冲突问题,并理解引入虚基类后构造函数、析构函数的调用顺序。

(4)理解赋值兼容的相关使用方法。

二、实验内容

题目1:定义一个车基类,派生出自行车类和汽车类,并以自行车类和汽车类为基类共同派生出摩托车类,每个类都要定义带有参数的构造函数。自行车类分别使用private、protected、public三种方式来继承车基类,观察基类成员在派生类中的访问属性;观察自行车类、汽车类和摩托车类对象定义时构造、析构函数的调用顺序。最后将车基类定义为虚基类再观察程序运行结果。题目的具体要求如下。

①定义基类V ehicle,它具有两个保护成员变量:MaxSpeed、Weight,有3个公有的成员函数:Run( )、Stop( )、Show( ),以及带参数的构造函数、析构函数;再定义一个从Vehicle 公有继承的Bicycle类,增加保护属性的成员变量Height,定义Bicycle类的构造函数、析构函数,改造Show函数,用于输出本类中的完整信息。main( )函数中定义Bicycle类对象,观察构造函数和析构函数的执行顺序,以及各成员函数的调用。使用跟踪的方法观察程序运行的每一步究竟调用的是哪一个函数。

②在上一步基础上,将继承方式分别修改为protected和private,再重新编译,观察这时的报错信息并进行分析。

③将Bicycle类的继承方式恢复为public,代码回到①的状态,再在Bicycle类下面增加一个第二层汽车类Car的定义,Car也是公有继承基类Vehicle,其中增加了一个保护成员变量SeatNum,表示汽车有几个座位,其定义方式与类Bicycle类似。主函数中定义该类对象,观察运行结果。

④在上一步的基础上,再定义一个第三层类MotorCycle,该类以公有方式继承了第二层的Bicycle和Car类。定义其构造函数,要调用两个直接基类的构造函数,再改造函数Show( ),输出所有四个成员变量的信息。主函数中只定义类MotorCycle的对象并调用相应的函数,代码请参考实验指导1的④。程序进行编译,会产生4个错误、8个警告,因为存在二义性问题,在同名成员前增加“基类名::”以消除二义性直到程序正确,观察运行结果。

⑤再将代码恢复至上一步未修改前,即存在4个错误、8个警告的状态,再作一定的修改,将Vehicle声明为虚基类以消除二义性,同时修改第三层类的构造函数,其余代码不变,具体请参考实验指导1的⑤。观察运行结果,理解此时构造函数、析构函数的调用顺序及用虚基类消除二义性的原理。

参考程序如下:

#include

using namespace std;

class Vehicle //定义基类

{

protected:

int MaxSpeed; //最大速度

int Weight; //重量

public:

Vehicle(int m, int w) //初始化成员变量的值

{

MaxSpeed=m;

Weight=w;

cout << "Constructing Vehicle...\n";

}

~Vehicle( )

{

cout << "Destructing Vehicle...\n";

}

void Run( )

{

cout << "The vehicle is running!\n";

}

void Stop( )

{

cout << "Please stop running!\n";

}

void Show( )

{

cout << "It\'s maxspeed is:" << MaxSpeed << endl;

cout << "It\'s weight is:" << Weight << endl;

}

};

class Bicycle: public Vehicle //定义派生类,公有继承{

protected:

int Height; //高度,单位:厘米public:

Bicycle(int m, int w, int h):Vehicle(m,w) //调用基类构造函数

{

Height=h; //为本类中新增成员提供初始值

cout << "Constructing Bicycle...\n";

}

~Bicycle( )

{

cout << "Destructing Bycycle...\n";

}

void Show( ) //改造基类的Show函数

{

Vehicle::Show();//调用基类Show输出MaxSpeed和Weight值

cout<<"It\'s Height is:"<

};

int main( )

{

Bicycle b(120,2,4); //定义派生类对象

b.Run ( ); //观察构造、析构函数调用顺序

b.Stop( );

b.Show ( );

return 0;

}

运行结果:

Constructing Vehicle...

Constructing Bicycle...

The vehicle is running!

Please stop running!

It's maxspeed is:120

It's weight is:2

It's Height is:4

Destructing Bycycle...

Destructing Vehicle...

Press any key to continue

②在上一步基础上,将继承方式分别修改为protected和private,再重新编译,观察这时的报错信息并进行分析。

答:继承方式是private或protected后,main函数中的语句:b.Run ( ); b.Stop( );等均不能通过编译,因为基类中的成员函数都是派生类的私有的或保护的成员函数,类外用派生类对象都不能再调用。

③将Bicycle类的继承方式恢复为public,代码回到①的状态,再在Bicycle类下面增加一个第二层汽车类Car的定义,Car也是公有继承基类Vehicle,其中增加了一个保护成员变量SeatNum,表示汽车有几个座位,其定义方式与类Bicycle类似。主函数中定义该类对象,观察运行结果。

指导:在Bicycle类下面增加Car类的定义,参考以下代码,划线部分自己完成。

class Car: public Vehicle //定义派生类Car,公有继承

{

public:

int SeatNum; //座位数

Car (int m, int w, int s) : (8)//调用基类构造函数

{

(9)//为本类中新增成员提供初始值cout << "Constructing Car...\n";

}

~Car( )

{

cout << "Destructing Car...\n";

}

void Show( ) //改造基类的Show函数

{

(10)//调用基类Show输出MaxSpeed和Weight值

(11)//输出本类座位数

}

};

在主函数增加Car类对象的定义并调用相应函数,主函数代码如下。

int main( )

{

Bicycle (12)//定义自行车类对象

b.Run( );

b.Stop( );

b.Show ( );

Car (13)//定义汽车类对象

c.Run ( );

c.Stop( );

c.Show ( );

return 0;

}

参考程序如下:

class Car: public Vehicle //定义派生类Car,公有继承{

protected:

int SeatNum; //座位数public:

Car (int m, int w, int s) : Vehicle(m,w) //调用基类构造函数

{

SeatNum=s; //为本类中新增成员提供初始值

cout << "Constructing Car...\n";

}

~Car( )

{

cout << "Destructing Car...\n";

}

void Show( ) //改造基类的Show函数

{

Vehicle::Show(); //调用基类Show输出MaxSpeed和Weight值

cout<<"It\'s SeatNum is:"<

}

};

int main( )

{

Bicycle b(50,2,400); //定义自行车类对象

b.Run( );

b.Stop( );

b.Show ( );

Car c(120,2000,5); //定义汽车类对象

c.Run ( );

c.Stop( );

c.Show ( );

return 0;

}

运行结果为:

Constructing Vehicle...

Constructing Bicycle...

The vehicle is running!

Please stop running!

It's maxspeed is:50

It's weight is:2

It's Height is:400

Constructing Vehicle...

Constructing Car...

The vehicle is running!

Please stop running!

It's maxspeed is:120

It's weight is:2000

It's SeatNum is:5

Destructing Car...

Destructing Vehicle...

Destructing Bycycle...

Destructing Vehicle...

Press any key to continue

④在上一步的基础上,再定义一个第三层类MotorCycle,该类以公有方式继承了第二层的Bicycle和Car类。定义其构造函数,要调用两个直接基类的构造函数,再改造函数Show( ),输出所有四个成员变量的信息。主函数中只定义类MotorCycle的对象并调用相应的函数,代码请参考实验指导1的④。程序进行编译,会产生4个错误、8个警告,因为存在二义性问题,在同名成员前增加“基类名::”以消除二义性直到程序正确,观察运行结果。

指导:增加的第3层类MotorCycle及修改以后的main( )函数。

class MotorCycle: public Bicycle, public Car //第3层类,从第2层两个类公有继承{

public:

MotorCycle(int m, int w, int h, int s): (14)//调用两基类构造函数

{

cout << "Constructing MotorCycle...\n";

}

~MotorCycle( )

{

cout << "Destructing MotorCycle...\n";

}

void Show( ) //输出4个成员变量的信息,需消除二义性{

cout << "It\'s maxspeed is:" << MaxSpeed << endl; //错误

cout << "It\'s weight is:" << Weight << endl; //错误

cout << "It\'s height is:" << Height << endl;

cout << "It\'s seatnum is:" << SeatNum << endl;

}

};

int main( )

{

MotorCycle (15)//定义摩托车类对象

mc.Run ( ); //错误

mc.Stop( ); //错误

mc.Show ( );

return 0;

}

程序为:

class MotorCycle: public Bicycle, public Car //第3层类,从第2层两个类公有继承{

public:

MotorCycle(int m, int w, int h, int s): Bicycle(m,w,h),Car(m,w,s)

//调用两基类构造函数{

cout << "Constructing MotorCycle...\n";

}

~MotorCycle( )

{

cout << "Destructing MotorCycle...\n";

}

void Show( ) //输出4个成员变量的信息,需消除二义性

{

cout << "It\'s maxspeed is:" << MaxSpeed << endl; //错误

cout << "It\'s weight is:" << Weight << endl; //错误

cout << "It\'s height is:" << Height << endl;

cout << "It\'s seatnum is:" << SeatNum << endl;

}

};

int main( )

{

MotorCycle mc(120,1000,2,2);//定义摩托车类对象

mc.Run ( ); //错误

mc.Stop( ); //错误

mc.Show ( );

return 0;

}

编译出错:

E:\2012-2013(2)\C++教学\教案\Text1.cpp(113) : error C2385: 'MotorCycle::MaxSpeed' is ambiguous

E:\2012-2013(2)\C++教学\教案\Text1.cpp(113) : warning C4385: could be the 'MaxSpeed' in base 'Vehicle' of base 'Bicycle' of class 'MotorCycle'

E:\2012-2013(2)\C++教学\教案\Text1.cpp(113) : warning C4385: or the 'MaxSpeed' in base 'Vehicle' of base 'Car' of class 'MotorCycle'

E:\2012-2013(2)\C++教学\教案\Text1.cpp(114) : error C2385: 'MotorCycle::Weight' is ambiguous

E:\2012-2013(2)\C++教学\教案\Text1.cpp(114) : warning C4385: could be the 'Weight' in base 'Vehicle' of base 'Bicycle' of class 'MotorCycle'

E:\2012-2013(2)\C++教学\教案\Text1.cpp(114) : warning C4385: or the 'Weight' in base 'Vehicle' of base 'Car' of class 'MotorCycle'

E:\2012-2013(2)\C++教学\教案\Text1.cpp(125) : error C2385: 'MotorCycle::Run' is ambiguous

E:\2012-2013(2)\C++教学\教案\Text1.cpp(125) : warning C4385: could be the 'Run' in base 'Vehicle' of base 'Bicycle' of class 'MotorCycle'

E:\2012-2013(2)\C++教学\教案\Text1.cpp(125) : warning C4385: or the 'Run' in base 'Vehicle' of base 'Car' of class 'MotorCycle'

E:\2012-2013(2)\C++教学\教案\Text1.cpp(126) : error C2385: 'MotorCycle::Stop' is ambiguous

E:\2012-2013(2)\C++教学\教案\Text1.cpp(126) : warning C4385: could be the 'Stop' in base 'Vehicle' of base 'Bicycle' of class 'MotorCycle'

E:\2012-2013(2)\C++教学\教案\Text1.cpp(126) : warning C4385: or the 'Stop' in base 'Vehicle' of base 'Car' of class 'MotorCycle'

执行cl.exe 时出错.

即输出MaxSpeed、Weigh和调用函数Run()和Stop()函数时出现二义性问题。修改程序中主要是为数据成员和成员函数限定其所属类即可。

程序为:

class MotorCycle: public Bicycle, public Car //第3层类,从第2层两个类公有继承{

public:

MotorCycle(int m, int w, int h, int s): Bicycle(m,w,h),Car(m,w,s)

//调用两基类构造函数

{

cout << "Constructing MotorCycle...\n";

}

~MotorCycle( )

{

cout << "Destructing MotorCycle...\n";

}

void Show( ) //输出4个成员变量的信息,需消除二义性

{

cout << "It\'s maxspeed is:" << Bicycle::MaxSpeed << endl; //修改后

cout << "It\'s weight is:" << Car::Weight << endl; //修改后

cout << "It\'s height is:" << Height << endl;

cout << "It\'s seatnum is:" << SeatNum << endl;

}

};

int main( )

{

MotorCycle mc(120,1000,2,2); //定义摩托车类对象

mc.Bicycle::Run ( ); //修改后

mc.Bicycle::Stop( ); //修改后

mc.Show ( );

return 0;

}

运行结果:

Constructing Vehicle...

Constructing Bicycle...

Constructing Vehicle...

Constructing Car...

Constructing MotorCycle...

The vehicle is running!

Please stop running!

It's maxspeed is:120

It's weight is:1000

It's height is:2

It's seatnum is:2

Destructing MotorCycle...

Destructing Car...

Destructing Vehicle...

Destructing Bycycle...

Destructing Vehicle...

Press any key to continue

⑤再将代码恢复至上一步未修改前,即存在4个错误、8个警告的状态,再作一定的修改,将Vehicle声明为虚基类以消除二义性,同时修改第三层类的构造函数,其余代码不变,具体请参考实验指导1的⑤。观察运行结果,理解此时构造函数、析构函数的调用顺序及用虚基类消除二义性的原理。

指导:将Vehicle声明为虚基类以消除二义性,具体要在上面的基础上修改以下地方。

?将class Bicycle: public Vehicle 修改为class Bicycle: virtual public Vehicle。

?将class Car: public Vehicle 修改为class Car: virtual public Vehicle。

?在第3层类的构造函数MotorCycle(int m,int w,int h,int s): (16)的初始化列表中增加对虚基类构造函数的调用。

?原来注释出错的地方将类名的限制去掉,恢复原样。如:

cout << "It\'s maxspeed is:" << Bicycle::MaxSpeed << endl; //错误

恢复为:cout << "It\'s maxspeed is:" << MaxSpeed << endl;

按题意,将Vehicle声明为虚基类以消除二义性,具体修改;

?将class Bicycle: public Vehicle 修改为class Bicycle: virtual public Vehicle。

?将class Car: public Vehicle 修改为class Car: virtual public Vehicle。

程序修改为:

class MotorCycle: public Bicycle, public Car //第3层类,从第2层两个类公有继承{

public:

MotorCycle(int m, int w, int h, int s): Vehicle(m,w),Bicycle(m,w,h),Car(m,w,s)//调用两基类构造函数

{

cout << "Constructing MotorCycle...\n";

}

~MotorCycle( )

{

cout << "Destructing MotorCycle...\n";

}

void Show( ) //输出4个成员变量的信息,需消除二义性

{

cout << "It\'s maxspeed is:" << MaxSpeed << endl; //正确

cout << "It\'s weight is:" << Weight << endl; //正确

cout << "It\'s height is:" << Height << endl;

cout << "It\'s seatnum is:" << SeatNum << endl;

}

};

int main( )

{

MotorCycle mc(120,1000,2,2); //定义摩托车类对象

mc.Run ( ); //正确

mc.Stop( ); //正确

mc.Show ( );

return 0;

}

运行结果为:

Constructing Vehicle...

Constructing Bicycle...

Constructing Car...

Constructing MotorCycle...

The vehicle is running!

Please stop running!

It's maxspeed is:120

It's weight is:1000

It's height is:2

It's seatnum is:2

Destructing MotorCycle...

Destructing Car...

Destructing Bycycle...

Destructing Vehicle...

Press any key to continue

题目2:定义Base类及它的公有派生类Derived类,两个类中均定义带参数的构造函数,基类中定义函数Show( ),派生类中也定义一个同名的Show( ),二者输出内容有所区别。主函数中定义基类的对象、指针、引用,也定义派生类的对象。(①中6个空各0.3分,②分析0.2分)

①对赋值兼容的4种情况作测试,对每行的输出结果进行观察,理解赋值兼容何时调用基类的成员函数,什么情况下才会调用派生类的成员函数。

②在主函数的return 0;语句前增加4条语句,观察并记下编译时的报错信息,理解赋值兼容的不可逆性。

程序如下:

#include

using namespace std;

class Base

{

public:

int i;

Base(int x): i(x)

{ }

void show( )

{

cout << "i in Base is: " << i << endl;

}

};

class Derived: public Base

{

public:

Derived(int x): Base(x)

{ }

void show( )

{

cout << "i in Derived is: " << i << endl;

}

};

int main( )

{

Base b1(1);//定义基类对象b1

cout << "基类对象b1.show( ):\n";

b1.show( );

Derived d1(2);//定义派生类对象d1

b1=d1; //用派生类对象给基类对象赋值

cout << "基类b1=d1, b1.show( ):\n";

b1.show( );

cout << "派生类对象d1.show( ):\n";

d1.show( );

Base & b2=d1; //用派生类对象来初始化基类引用

cout << "引用b2=d1, b2.show( ):\n";

b2.show( );

Base * b3=&d1; //派生类对象的地址赋给指向基类的指针

cout << "基类指针b3=&d1, b3->show( ):\n";

b3->show( );

Derived *d4=new Derived(3); //定义派生类指针并生成新对象

Base *b4 = d4 ; //派生类指针赋给指向基类的指针cout << "基类指针b4 = d4, b4->show( ):\n";

b4->show( );

cout << "派生类指针d4, d4->show( ):\n";

d4->show( );

delete d4;

return 0;

}

运行结果:

基类对象b1.show( ):

i in Base is: 1

基类b1=d1, b1.show( ):

i in Base is: 2

派生类对象d1.show( ):

i in Derived is: 2

引用b2=d1, b2.show( ):

i in Base is: 2

基类指针b3=&d1, b3->show( ):

i in Base is: 2

基类指针b4 = d4, b4->show( ):

i in Base is: 3

派生类指针d4, d4->show( ):

i in Derived is: 3

Press any key to continue

①对赋值兼容的4种情况作测试,对每行的输出结果进行观察,理解赋值兼容何时

调用基类的成员函数,什么情况下才会调用派生类的成员函数。

答:4种情况:

基类对象= 公有派生类对象

b1=d1;

b1.show( );调用的是基类Base的成员函数show;

指向基类对象的指针= 公有派生类对象的地址

Base * b3=&d1;

b3->show( ); 调用的是基类Base的成员函数show;

指向基类对象的指针= 指向公有派生类对象的指针

Base *b4 = d4 ;

b4->show( ); 调用的是基类Base的成员函数show;

基类的引用= 公有派生类对象,即派生类对象可以初始化基类的引用。

Base & b2=d1;

b2.show( ); 调用的是基类Base的成员函数show;

由此可知,只要是基类的对象或对象指针(引用)均调用的是基类的函数;只有在调用函数的对象或指针是派生类的时候才会调用派生类的成员函数。如d1.show( ); d4->show( ); 均调用的是派生类的成员函数。

②在主函数的return 0;语句前增加4条语句,观察并记下编译时的报错信息,理解赋

值兼容的不可逆性。

//增加4条语句,理解赋值兼容规则的不可逆性

Derived d5 = b1;

该语句编译不能通过,因为不能用基类对象对派生类对象初始化

Derived &d6 = b1;

该语句编译不能通过,因为派生类对象不能用来作为基类对象的别名

Derived *d7 = &b1;

该语句编译不能通过,因为派生类对象指针不能指向基类对象

d7 = b3;

该语句编译不能通过,因为派生类对象指针不能被赋值为基类对象指针

题目2指导:

①//赋值兼容原则

#include

using namespace std;

class Base

{

public:

int i;

Base(int x): i(x)

{ }

void show( )

{

cout << "i in Base is: " << i << endl;

}

};

class Derived: public Base

{

public:

Derived(int x): Base(x)

{ }

void show( )

{

cout << "i in Derived is: " << i << endl;

}

};

int main( )

{

Base (1)//定义基类对象b1

cout << "基类对象b1.show( ):\n";

b1.show( );

Derived (2)//定义派生类对象d1

(3)//用派生类对象给基类对象赋值cout << "基类b1=d1, b1.show( ):\n";

b1.show( );

cout << "派生类对象d1.show( ):\n";

d1.show( );

Base (4)//用派生类对象来初始化基类引用

cout << "引用b2=d1, b2.show( ):\n";

b2.show( );

Base (5)//派生类对象的地址赋给指向基类的指针cout << "基类指针b3=&d1, b3->show( ):\n";

b3->show( );

Derived *d4 = (6)//定义派生类指针并生成新对象

Base *b4 = d4 ; //派生类指针赋给指向基类的指针

cout << "基类指针b4 = d4, b4->show( ):\n";

b4->show( );

cout << "派生类指针d4, d4->show( ):\n";

d4->show( );

delete d4;

return 0;

}

②//增加4条语句,理解赋值兼容规则的不可逆性

Derived d5 = b1;

Derived &d6 = b1;

Derived *d7 = &b1;

d7 = b3;

MATLAB课后实验答案

%实验一MATLAB运算基础 %第一题%(1) z1=2*sin(85*pi/180)/(1+exp(2)) %(2) x=[2,1+2i;-0.45,5]; z2=0.5*log(x+sqrt(1+x.^2)) %(3) a=-3.0:0.1:3.0; z3=(exp(0.3*a)-exp(-0.3*a))/2.* sin(a+0.3)+log((0.3+a)/2) %(4) t=0:0.5:2.5; z4=t.^2.*(t>=0&t<1)+(t.^2-1).*( t>=1&t<2)+(t.^2-2*t+1).*(t>=2&t <3)%第二题 A=[12 34 -4;34 7 87;3 65 7]; B=[1 3 -1;2 0 3;3 -2 7]; A+6*B A-B+eye(size(A)) A*B A.*B A^3 A.^3 A/B B\A [A,B] [A([1,3],:);B^2]%第三题 A=[1 2 3 4 5;6 7 8 9 10;11 12 13 14 15;16 17 18 19 20;21 22 23 24 25] B=[3 0 16;17 -6 9;0 23 -4;9 7 0;4 13 11] C=A*B F=size(C) D=C(F(1)-2:F(1),F(2)-1:F(2)) whos%第四题 %(1): A=100:999; B=rem(A,21); C=length(find(B==0)) %(2): A='lsdhKSDLKklsdkl'; k=find(A>='A'&A<='Z'); A(k)=[] %实验二MATLAB矩阵分析与处理 %第一题 E=eye(3); R=rand(3,2); O=zeros(2,3); S=diag([2,3]);%判断AB是否相等 A=[E,R;O,S];A^2 B=[E,(R+R*S);O,S^2] %第二题 H=hilb(5) P=pascal(5) Hh=det(H) Hp=det(P) Th=cond(H) Tp=cond(P) %第三题: A=fix(10*rand(5)) H=det(A)Trace=trace(A) Rank=rank(A)Norm=norm(A) %第四题: A=[-29,6,18;20,5,12;-8,8,5] [V,D]=eig(A)%数学意义略 %第五题方法一: %(1): A=[1/2,1/3,1/4;1/3,1/4,1/5;1/4, 1/5,1/6]; b=[0.95,0.67,0.52]'; x=inv(A)*b %(2): B=[0.95,0.67,0.53]'; x=inv(A)*B %(3): cond(A) %第五题方法二: A=hilb(4) A(:,1)=[] A(4,:)=[] B=[0.95,0.67,0.52]'; X=inv(A)*B B1=[0.95,0.67,0.53]'; X1=inv(A)*B1 N=cond(B) N1=cond(B1) Na=cond(A) %矩阵A为病态矩阵 %第六题 A=[1,4,9;16,25,36;49,64,81] B=sqrtm(A) C=sqrt(A) %sqrtm函数是以矩阵为单位进行计算,sqrt函数是以矩阵中的元素进行计算 %实验三选择程序结构设计 %第一题程序一 x=[-5.0,-3.0,1.0,2.0,2.5,3.0,5. 0]; y=[]; %建立存放所有y值的矩阵

C语言实验报告参考答案(原)

C语言实验报告参考答案 实验一熟悉C语言程序开发环境及数据描述 四、程序清单 1.编写程序实现在屏幕上显示以下结果: The dress is long The shoes are big The trousers are black 答案: #include<> main() { printf("The dress is long\n"); printf("The shoes are big\n"); printf("The trousers are black\n"); } 2.编写程序: (1) a=150,b=20,c=45,编写求a/b、a/c(商)和a%b、a%c(余数)的程序。 (2)a=160,b=46,c=18,d=170, 编写求(a+b)/(b-c)*(c-d)的程序。 答案: (1) #include<> main() { int a,b,c,x,y;

a=150; b=20; c=45; x=a/b; y=a/c; printf("a/b的商=%d\n",x); printf("a/c的商=%d\n",y); x=a%b; y=a%c; printf("a/b的余数=%d\n",x); printf("a/c的余数=%d\n",y); } (2) #include<> main() { int a,b,c,d; float x; a=160; b=46; c=18; d=170; x=(a+b)/(b-c)*(c-d);

printf("(a+b)/(b-c)*(c-d)=%f\n",x); } 3. 设变量a的值为0,b的值为-10,编写程序:当a>b时,将b赋给c;当a<=b时,将0赋给c。(提示:用条件运算符) 答案: #include<> main() { int a,b,c; a=0; b=-10; c= (a>b) b:a; printf("c = %d\n",c); } 五、调试和测试结果 1.编译、连接无错,运行后屏幕上显示以下结果: The dress is long The shoes are big The trousers are black 2、(1) 编译、连接无错,运行后屏幕上显示以下结果: a/b的商=7 a/c的商=3

汇编语言程序设计实验教程第二章实验报告

汇编语言程序设计实验教程第二章 实验报告

实验2.1 用表格形式显示字符 1.题目:用表格形式显示ASCII字符SMASCII 2.实验要求: 按15行*16列的表格形式显示ASCII码为10H-100H的所有字符,即以行为主的顺序及ASCII码递增的次序依次显示对应的字符。每16个字符为一行,每行中的相邻两个字符之间用空白符(ASCII为0)隔开。 3.提示: (1)显示每个字符可使用功能号为02的显示输出功能调用,使用方法如下:mov ah,02h mov dl,输出字符的ASCII码 int 21h (2)显示空白符时,用其ASCII码0置入dl寄存器。每行结束时,用显示回车(ASCII 为0dh)和换行符(ASCII为0ah)来结束本行并开始下一行。 (3)由于逐个显示相继的ASCII字符时,需要保存并不断修改dl寄存器的内容,而显示空白、回车、换行符时也需要使用dl寄存器,为此可使用堆栈来保存相继的ASCII字符。具体做法是:在显示空白或回车、换行符前用指令 push dx 把dl的内容保存到堆栈中去。在显示空白或回车、换行符后用指令 pop dx 恢复dl寄存器的原始内容。 4.程序清单: code segment assume cs:code start: mov dx,0010h next: mov cx,10h loop1: mov ah,02h int 21h inc dx push dx

int 21h pop dx loop loop1 push dx mov dl,0ah int 21h mov dl,0dh int 21h pop dx cmp dx,100h jb next mov ah,4ch int 21h code ends end start 5.运行结果如下: 6.实验总结: 通过本次实验我深刻的知道用汇编语言编译程序的方法,掌握了如何合理的利用各个寄存器进行程序的控制操作,初步了解到循环程序的控制方法,以及dos中断调用的基本要领对学习汇编语言有了非常好的帮助作用! 汇编语言实验二查找匹配字符串 一、目的 查找匹配字符串SEARCH

实验5(答案)

实验五 连续系统分析 一、实验目的 1.深刻理解连续时间系统的系统函数在分析连续系统的时域特性、频域特性及稳定性中的重要作用及意义,掌握根据系统函数的零极点设计简单的滤波器的方法。 2.掌握利用MATLAB 分析连续系统的时域响应、频响特性和零极点的基本方法。 二、实验原理及内容 MATLAB 提供了许多可用于分析线性时不变连续系统的函数,主要包含有系统函数、系统时域响应、系统频域响应等分析函数。 1. 连续系统的时域响应 连续时间LTI 系统可用如下的线性常系数微分方程来描述: ) ()( )()(01)1(1)(t y a t y a t y a t y a n n n n ++++-- )()( )()(01)1(1)(t x b t x b t x b t x b m m m m ++++=-- 已知输入信号x (t )以及系统初始状态)0(,),0('),0()1(----n y y y ,就可以求出系统的响应。 MATLAB 提供了微分方程的数值计算的函数,可以计算上述n 阶微分方程描述的连续系统的响应,包括系统的单位冲激响应、单位阶跃响应、零输入响应、零状态响应和完全响应。 在调用MATLAB 函数时,需要利用连续系统对应的系数函数。对微分方程进行Laplace 变换即可得系统函数: 1110111)()()(a s a s a s a b s b s b s b s X s Y s H n n n n m m m m ++++++++==---- 在MATLAB 中可使用向量和向量分别保存分母多项式和分子多项式的系数: ],,,,[011a a a a a n n -= ],,,,[011b b b b b m m -= 这些系数均按s 的降幂直至s 0排列。 ● 连续系统的单位冲激响应h (t )的计算 impulse(sys)计算并画出系统的冲激响应。 参数:sys 可由函数tf(b,a)获得。其中: ],,,,[011a a a a a n n -= ],,,,[011b b b b b m m -= h=impulse(sys, t) 计算出系统在向量t 定义的区间上的冲激响应, 向 量h 保存对应区间的系统冲激响应的输出值。 ● 连续系统的单位阶跃响应g (t )的计算 step(sys)计算并画出系统的阶跃响应。

汇编实验报告(详细版)

计算机组成与汇编语言(实验报告) 内容: 实验一、六、七、八 院系专业:计算机学院计算机科学与技术 姓名:xxxxxxxxx 学号: 2011004xxxxx 完成时间:2012年12月1日

计算机组成与汇编语言实验报告 姓名xxxx 学号2011004xxxxx 计分 专业软件工程班级xxxx 实验日期2012年 12 月 1日实验名称实验一数制转换 实验目的 ●熟悉各种进制数据之间的相互转换方法。 ●掌握二-十进制数据的相互转换程序设计。 实验内容 1.将编写好的程序1输入、编译、连接并运行。 程序1清单 #include #include #include void main() { int i,l,s0=0,s=0; char a[17]; while(l!=16) { printf("请输入一个16位的二进制数:\n"); gets(a); l=strlen(a); for(i=0;i<16;i++) { if(a[i]!='0'&&a[i]!='1') {

printf("输入的二进制数不正确!!"); break; } } } if(a[15]=='1') s++; for(i=1;i<16;i++) { if(a[15-i]=='1') s+=(1<

说明:如果不是16位二进制则会提示错误。 2.将编写好的程序2输入、编译、连接并运行。 程序2清单 #include #include void main() { int t0,t1,t2,t3,i,j; int a[16]; printf("请输入一个十进制数:"); scanf("%d",&t0); t1=t0; for(i=0;i<16;i++) { t2=t1/2; if(t2>1) a[i]=t1%2; else if(t1==1) { a[0]=1; for(i=1;i<16;i++) a[i]=0; } else if(t1==2) { a[i]=0; a[i+1]=1; for(j=i+2;j<16;j++)

实验五数值积分参考答案

一 实验目的: 1 加深理解积分理论中分割、近似、求和、取极限的思想方法; 2 了解定积分近似计算的矩形法、梯形法与抛物线法; 3 会用MATLAB 语言编写求定积分近似值的程序,会用MALAB 中的命令求定积分。 二 实验准备素材 见附件。 三 实验内容 1.(不定积分)用int 计算下列不定积分,并用diff 验证 ?dx x x 2 sin ,?+x dx cos 1,?+1x e dx ,?xdx arcsin ,?xdx 3sec 2.(定积分)用trapz,int 计算下列定积分 ?10sin dx x x ,?10dx x x ,?π20)2sin(dx x e x ,?-102dx e x 3.(椭圆的周长) 用定积分的方法计算椭圆1492 2=+y x 的周长 4.(二重积分)计算积分??≤+++y y x dxdy y x 222)1( 5. (广义积分)计算广义积分 ?∞∞-+-dx x x 421)exp(,?10)tan(dx x x ,?-1021sin dx x x 7.1 syms x; g1=int(x.*sin(x).*sin(x)) g1 = x*(-1/2*cos(x)*sin(x)+1/2*x)+1/4*sin(x)^2-1/4*x^2

clear;syms x; d1=diff(x*(-1/2*cos(x)*sin(x)+1/2*x)+1/4*sin(x)^2-1/4*x^2) syms x; g2=int(1/(1+cos(x))) g2 = tan(1/2*x) clear;syms x; d2=diff(tan(1/2*x)) syms x; g3=int(1/(exp(x)+1)) g3 = log(exp(x))-log(exp(x)+1) clear;syms x; d3=diff(exp(x))-log(exp(x)+1)) syms x; g4=int(finverse(sin(x))) g4 = x*asin(x)+(1-x^2)^(1/2) clear;syms x; d4=diff(x*asin(x)+(1-x^2)^(1/2)) syms x; g5=int(sec(x).^3) g5 = 1/2/cos(x)^2*sin(x)+1/2*log(sec(x)+tan(x)) clear;syms x; d5=diff(1/2/cos(x)^2*sin(x)+1/2*log(sec(x)+tan(x))) 7.2 x=10e-100:0.001:1; y=sin(x)./x; trapz(x,y) clear all;syms x;

实验报告答案

实验2:MIPS指令系统和MIPS体系结构 一.实验目的 (1)了解和熟悉指令级模拟器 (2)熟悉掌握MIPSsim模拟器的操作和使用方法 (3)熟悉MIPS指令系统及其特点,加深对MIPS指令操作语义的理解 (4)熟悉MIPS体系结构 二. 实验内容和步骤 首先要阅读MIPSsim模拟器的使用方法,然后了解MIPSsim的指令系统和汇编语言。(1)、启动MIPSsim(用鼠标双击MIPSsim.exe)。 (2)、选择“配置”->“流水方式”选项,使模拟器工作在非流水方式。 (3)、参照使用说明,熟悉MIPSsim模拟器的操作和使用方法。 可以先载入一个样例程序(在本模拟器所在的文件夹下的“样例程序”文件夹中),然后分别以单步执行一条指令、执行多条指令、连续执行、设置断点等的方式运行程序,观察程序的执行情况,观察CPU中寄存器和存储器的内容的变化。 (4)、选择“文件”->“载入程序”选项,加载样例程序 alltest.asm,然后查看“代码”窗口,查看程序所在的位置(起始地址为0x00000000)。 (5)、查看“寄存器”窗口PC寄存器的值:[PC]=0x00000000。 (6)、执行load和store指令,步骤如下: 1)单步执行一条指令(F7)。 2)下一条指令地址为0x00000004,是一条有 (有,无)符号载入字节 (字节,半字,字)指令。 3)单步执行一条指令(F7)。 4)查看R1的值,[R1]= 0xFFFFFFFFFFFFFF80 。 5)下一条指令地址为0x00000008,是一条有 (有,无)符号载入字 (字节,半字,字)指令。 6)单步执行1条指令。 7)查看R1的值,[R1]=0x0000000000000080 。 8)下一条指令地址为0x0000000C ,是一条无 (有,无)符号载入字节 (字节,半字,字)指令。 9)单步执行1条指令。 10)查看R1的值,[R1]= 0x0000000000000080 。 11)单步执行1条指令。 12)下一条指令地址为0x00000014 ,是一条保存字 (字节,半字,字)指令。 13)单步执行一条指令。

实验五 连接查询参考答案

--创建学生视图 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[v_stu]') and OBJECTPROPERTY(id, N'IsView') = 1) drop view [dbo].[v_stu] go create view v_stu as select sid, sname, ssexy, sbdate, Datediff(year, sbdate, getdate()) as sage, stele, ugrade.gid, gname, gyear, udept.did, dname, daddr, dtele, demail, uteacher.tid, tname, tsexy, tbdate, tfield, tprof, tele, qq, email, msn from ustudent, ugrade, udept, uteacher where ustudent.gid=ugrade.gid and ugrade.did=udept.did and ugrade.tid=uteacher.tid --创建选修课程视图 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[v_sc]') and OBJECTPROPERTY(id, N'IsView') = 1) drop view [dbo].[v_sc] go create view v_sc as select ustudent.sname, usc.*, cname, credit, pcid, chour, cattr, cnum from ustudent, usc, ucourse where ustudent.sid=usc.sid and usc.cid=ucourse.cid --1、显示所有学生的详细信息,包括学号、姓名、性别、年龄、班级名称,入学年份select sid, sname, ssexy, sage, gname, gyear from v_stu --2、显示信息科学与技术系同学的名单,包括学号、姓名、性别、年龄、班级名称、入学年份 select sid, sname, ssexy, sage, gname, gyear from v_stu where dname='信息科学与技术系' --3、显示选修了“数据库”的所有同学的学号、姓名 select sid, sname from v_sc where cname='数据库' --4、显示白云同学的班主任老师的姓名、联系电话 select tname, tele from v_stu

大学物理实验报告答案大全(实验数据)

U 2 I 2 大学物理实验报告答案大全(实验数据及思考题答案全包括) 伏安法测电阻 实验目的 (1) 利用伏安法测电阻。 (2) 验证欧姆定律。 (3) 学会间接测量量不确定度的计算;进一步掌握有效数字的概念。 实验方法原理 根据欧姆定律, R = U ,如测得 U 和 I 则可计算出 R 。值得注意的是,本实验待测电阻有两只, 一个阻值相对较大,一个较小,因此测量时必须采用安培表内接和外接两个方式,以减小测量误差。 实验装置 待测电阻两只,0~5mA 电流表 1 只,0-5V 电压表 1 只,0~50mA 电流表 1 只,0~10V 电压表一 只,滑线变阻器 1 只,DF1730SB3A 稳压源 1 台。 实验步骤 本实验为简单设计性实验,实验线路、数据记录表格和具体实验步骤应由学生自行设计。必要时,可提示学 生参照第 2 章中的第 2.4 一节的有关内容。分压电路是必须要使用的,并作具体提示。 (1) 根据相应的电路图对电阻进行测量,记录 U 值和 I 值。对每一个电阻测量 3 次。 (2) 计算各次测量结果。如多次测量值相差不大,可取其平均值作为测量结果。 (3) 如果同一电阻多次测量结果相差很大,应分析原因并重新测量。 数据处理 (1) 由 U = U max ? 1.5% ,得到 U 1 = 0.15V , U 2 = 0.075V ; (2) 由 I = I max ? 1.5% ,得到 I 1 = 0.075mA , I 2 = 0.75mA ; (3) 再由 u R = R ( 3V ) + ( 3I ) ,求得 u R 1 = 9 ? 101 &, u R 2 = 1& ; (4) 结果表示 R 1 = (2.92 ± 0.09) ?10 3 &, R 2 = (44 ± 1)& 光栅衍射 实验目的 (1) 了解分光计的原理和构造。 (2) 学会分光计的调节和使用方法。 (3) 观测汞灯在可见光范围内几条光谱线的波长 实验方法原理

汇编实验报告2-1

《汇编语言程序设计》第二次上机2-1实验报告 院系:计算机科学与技术 专业:信息安全 班级:0903班 姓名: 学号: 时间:2011-6-6 地点:南一楼808

一、实验目的 (3) 二、题目与实验要求 (3) 三、寄存器分配和变量定义说明: (3) 四、流程图 (5) 五、源程序及注释 (7) 六、实验步骤 (13) 七、实验记录 (13) 八、体会 (16)

一、实验目的 1、加深对一些常用的汇编指令的理解; 2、加深对常用DOS功能调用指令的理解; 3、进一步熟悉TD的使用。 二、题目与实验要求 1、《80X86汇编语言程序设计》教材中 P95的 3.7 题。 要求:(1)将该题改成一完整的程序(可以省略实验报告中的程序框图)。 (2)请事先指出依次执行每条程序指令后(AX)的内容。 (3)请事先指出执行ADD、SUB、SAL、RCL指令后,CF、ZF的值。 (4)记录上机执行后与(2)、(3) 中对应的内容。 2、《80X86汇编语言程序设计》教材中 P94的 3.3 题。 要求:(1)将该题改成一完整的程序,其中数据段的定义为习题3.1中的数据段(可以省略实验报告中的程序框图)。 (2)请事先画出数据段中数据的存储形式。 (3)请事先指出依次执行每条程序指令后相应寄存器中的内容。 (4)请事先给出各调指令在汇编后的形式。 (5)比较上机执行后,看到的各项内容是否与(2)、(3) ,(4)内容一致。 不一致的应分析错误原因。 3、《80X86汇编语言程序设计》教材中 P96的 3.11 题。 要求:(1)请事先指出程序运行结束后,显示器显示的内容。 (2)若将NUM的定义改成如下形式: NUM DB 35 显示的结果是什么? (3)若将NUM的定义改成如下形式: NUM DB 59 显示的结果是什么? (4)指出程序运行后看到的结果,若不一致,分析产生错误的原因。 4. 从键盘输入两串字符分别存入BUF1和BUF2区,比较两串内容是否相等,相等显示“MATCH !”, 不相等显示“NO MATCH !”。 要求:(1) 使用10号功能调用输入字符串; (2) 使用9号功能调用输出提示信息; 提示:先比较长度是否相等。 5 选做题 输入一个无符号的数字串,然后以16进制形式显示出串的值。 例如: INPUT A NUMBER : 59 RESULT : 3BH 其中下划线上的内容(59)为程序运行时输入的串。 三、寄存器分配和变量定义说明:

2010C语言实验报告参考答案

2010C语言实验报告参考答案

长沙理工大学2010C语言实验报告参考答案 实验一熟悉C语言程序开发环境及数据描述四、程序清单 1.编写程序实现在屏幕上显示以下结果: The dress is long The shoes are big The trousers are black 答案: #include main() { printf("The dress is long\n"); printf("The shoes are big\n"); printf("The trousers are black\n"); } 2.改错题(将正确程序写在指定位置) 正确的程序为: #include main() {

printf("商品名称价格\n"); printf("TCL电视机¥7600\n"); printf("美的空调¥2000\n"); printf("SunRose键盘¥50.5\n"); } 2.编写程序: a=150,b=20,c=45,编写求a/b、a/c(商)和a%b、a%c(余数)的程序。 答案: #include main() { int a,b,c,x,y; a=150; b=20; c=45; x=a/b; y=a/c; printf("a/b的商=%d\n",x); printf("a/c的商=%d\n",y);

x=a%b; y=a%c; printf("a/b的余数=%d\n",x); printf("a/c的余数=%d\n",y); } 4. 设变量a的值为0,b的值为-10,编写程序:当a>b时,将b赋给c;当a<=b时,将a赋给c。(提示:用条件运算符) 答案: #include main() { int a,b,c; a=0; b=-10; c= (a>b) ? b:a;

C实验报告1参考答案范文

《高级语言程序设计》实验报告 班级: 学号: 姓名: 成绩: 实验1熟悉Visual C++6.0环境及运行C 程序 一、实验目的 1.掌握在Visual C++6.0环境下C 程序的建立、编辑、编译和执行过程。 2.掌握C 程序的最基本框架结构,完成简单程序的编制与运行。 3.了解基本输入输出函数scanf()、printf ()的格式及使用方法。 4.掌握发现语法错误、逻辑错误的方法以及排除简单错误的操作技能。 二、实验内容 1.下列程序的功能是:从键盘输入两个数a 和b ,求它们的平方和,并在屏幕上输出。输入该C 程序,编译并运行之,记下屏幕的输出结果,以文件名sy1_1.c 保存。 #include main() { int a,b,sum; /*定义整型变量a 、b 、sum */ printf("Please Input a,b \n "); /*输出提示信息*/ scanf("%d%d",&a,&b); /*从键盘输入两个整数分别赋予a 和b*/ sum=a*a+b*b; /*赋值语句,把a 2+b 2的结果赋给变量sum*/ printf("%d*%d+ %d*%d=%d\n",a,a,b,b,sum); /*输出语句*/ } (1)下列程序的功能为:计算x*y 的值并将结果输出。试纠正程序中存在的错误,以实现其功能。程序以文件名sy1_2.c 保存。 #include main main () { int x=2;y=3;a int x=2;y=3;a ;

A=x*y a =x*y ; print ('a=%d",A); print f ("a=%d",a ); printf("\n"); } (2)下程序的功能为:求两数中的较大数据并输出。纠正程序中存在的错误,以实现其功能。程序以文件名 sy1_3.c 保存。 #include viod main() void main() { int a ,b , max; Scanf(“%d,%d ”,&a,&b); s canf(“%d,%d ”,&a,&b); Max=a; m ax=a; If (max main() { int x,y,total; /* 定义整型变量x,y,total*/ printf("Please input x,y ! "); /* 输出提示信息 */ scanf(“%d%d ”,&x,&y); /* 由键盘输入两个数分别赋予x 和y*/ total=x+y; /* 赋值语句 */ printf("%d + %d=%d\n",x,y,total); /* 输出两个整数的和 */ }

计算机汇编上机实验报告

实验报告 1 二、实验题目:顺序程序设计 三、实验类型:必做 四、实验目的: 1.了解汇编语言的程序结构。 2.理解汇编语言中由源程序文件到可执行文件的过程。 五、实验内容和步骤: 1、实验内容: 编程实现:当X=5时,求Y=3X4+5X3+6X2+4X+2. 2、实验步骤: (1)首先对a1.asm进行汇编连接生成a1.exe文件。 (2)进行DEBUG程序并装入要调试的程序a1.exe。 如:DEBUG a1.exe;进入DEBUG并装配a1.exe (3)反汇编,确定每条指令的地址。 -U ;从当前地址进行反汇编 -U200;从CS:200处开始反汇编 反汇编可以确定断点地址,如:把断点地址设置在0120H处,则可以打入以下命令 (4)G命令来设置断点。 -G120 此时程序在0120H处停下,并显示出所有寄存器以及各标志位的当前值,在最后一行还给出下一条将要执行的指令的地址、机器语言和汇编语言,程序员可以从显示的内容来以解程序运行是否正确。 (5)观察数据段的内容,即观察内存的内容 -D DS:0000;从数据段的0单元开始显示128个字节。 -D DS:00000001;从数据段的0单元、1单元显示2个字节。 (6)退出DEBUG命令 -Q 六、实验结果: 145A:001E 83C002 ADD AX,+02 -u 145A:0021 A30100 MOV [0001],AX 145A:0024 B44C MOV AH,4C 145A:0026 CD21 INT 21 145A:0028 7509 JNZ 0033 145A:002A E83F26 CALL 266C 145A:002D 8946E8 MOV [BP-18],AX 145A:0030 E80D97 CALL 9740 145A:0033 F6065C3601 TEST BYTE PTR [365C],01 145A:0038 7405 JZ 003F

实验二实验报告

上海建桥学院本科《数据结构》实验报告(二) 课程名称:数据结构 实验类型:综合 实验室名称:机房 开课系:信息技术系 学生姓名: 专业: 学号: 指导老师:

实验二:线性表应用——顺序表 实验日期:2011 年9 月日评阅成绩: 实验目的及要求 1. 熟练掌握线性表的基本操作在顺序存储上的实现; 2. 以线性表的各种操作(建立、插入、删除、遍历等)的实现为重点; 3. 掌握线性表的顺序存储结构的定义和基本操作的实现; 4. 通过本实验加深对C语言的使用(特别是函数调用的参数传递、指针类型的应用)。 实验内容 已知程序文件seqlist.cpp已给出学生身高信息顺序表的类型定义和基本运算函数定义。(1)顺序表类型定义 typedef struct { int xh; /*学号*/ float sg; /*身高*/ int sex; /*性别,0为男生,1为女生*/ } datatype; typedef struct{ datatype data[MAX]; /*存放顺序表元素的数组*/ int last; /*表示data中实际存放元素个数*/ }Seqlist; (2)基本运算函数原型 void initList(Seqlist *lp);/*置一个空表*/ void createList(Seqlist *lp);/*建一个学生顺序表*/ void sort_xh(Seqlist *lp);/*按学号排序*/ void Error(char *s);/*自定义错误处理函数*/ void pntList(Seqlist *lp);/*输出学生表*/ void save(Seqlist *lp,char strname[]);/*保存学生顺序表到指定文件*/ 任务一 阅读程序seqlist.cpp(见电子文档),理解顺序表类型Seqlist和基本运算函数。 任务二 1.题目要求 创建一个新的程序文件sy2.cpp,请调用seqlist.cpp提供的功能函数(以#include

实验报告5答案

实验报告 课程名称:高级语言程序设计 实验五:循环结构程序设计 班级: 学生姓名: 学号: 专业: 指导教师: 学期:2010-2011学年上学期 云南大学信息学院

一、实验目的 1、理解循环的概念 2、理解并掌握循环结构相关语句的含义、格式及使用 3、学会循环的应用及控制,包括: ① 掌握使用循环输入多个数据的方法 ② 掌握在多个数据中有选择地输出数据的方法 ③ 掌握在多个数据中对某种数据进行计数的方法 ④ 掌握求多个数据中最大值、最小值的方法 ⑤ 掌握使用break 、continue 语句终止循环 4、掌握循环的嵌套 二、知识要点 1、循环变量、循环条件、循环体的概念 2、三种循环语句的一般格式、执行过程 3、理解选择结构与循环结构中“条件表达式”之不同含义 4、二重循环的执行过程 三、实验预习 (要求做实验前完成) 1、循环变量的主要用途是: 2、用循环求多个数的和之前,先要把和的初始值赋为: 3、用循环求多个数的乘积之前,先要把乘积的初始值赋为: 4、字符变量能否作为循环变量? 5、循环过程中,如果循环条件成立,但需要结束循环,可采用什么办法? 6、什么叫循环的嵌套? 四、实验内容 (要求提供:① 算法描述或流程图 ② 源程序 ) 1、编程,利用循环计算以下表达式的值: (5+52)*(4+42)*(3+32)*(2+22)*(1+12)*(1/2+1/3+1/4+1/5)(for 循环) 2、编程,从键盘输入若干个整数,当输入0时,输入停止。统计并输出总共输入了几个 数,以及所有输入数的和。(while 循环) 3、输入一行字符,分别统计其中的英文字母、数字、空格和其他字符的个数。 4、使用二重循环编程,绘制如下图形: *****A ****B ***C **D *E 5. 输入10个整数,输出最大值、最小值和平均分。 6. 编写程序,其功能是:根据以下公式求π的值(要求精度0.0005,即某项小于0.0005时停止迭代)。程序运行后,若输入精度0.0005,则程序应输出为3.14…。 () 1121231234121233535735793521n n π?????????=++++++?????????+………… 五、实验结果(要求写出运行界面及输出的运行结果)

汇编实验报告

汇编语言程序设计 实验报告 学号:100511530 班级:电气信息类1005 姓名:陆淑琴 指导老师:李诗高

实验一、汇编语言上机的基本过程及环境 【实验目的】 (1)熟悉汇编语言的编辑、汇编、连接及调试的全过程,重点掌握使用DEBUG调试程序的方法。 (2)了解汇编语言的程序结构。 【实验内容】 (1)在数据段中定义两个数(数据自拟,包含有正数和负数),要求编写程序分别计算出这两个数的和、差、积、商,并用Debug的相关命令查询计算结果(包括对CF,OF,SF,ZF的影响)。 (2)首先对AX,BX,CX寄存器赋初值(数据自拟),再将AX寄存器的中间八位,BX的低四位和CX的高四位拼接成一个新的字,并把结果存入偏移地址为0000H的存储单元。其中BX的低四位作为结果字的高四位,CX的高四位作为结果字的低四位。并用Debug的相关命令查询内存单元的结果字。 源代码: DA TA SEGMENT val1 DW 1000h val2 DW 2000h maxv DW ? DA TA ENDS STACK SEGMENT STACK 'STACK'

DB 100H DUP(?) STACK ENDS CODE SEGMENT 'CODE' ASSUME CS:CODE, DS:DATA,SS:STACK .386 MAIN: MOV AX, DATA; MOV DS, AX PUSH val1 PUSH val2 CALL MAX ; POP maxv ;栈顶返回值出栈 MOV AX, 4c00H INT 21H MAX PROC PUSH BP ;执行该指令前堆栈情况 MOV BP, SP ;执行后堆栈情况 MOV AX, [BP+4] CMP AX, [BP+6] JA EXIT MOV AX, [BP+6] EXIT: MOV [BP+6], AX ;用栈顶返回值 POP BP RET 2 ;执行后堆栈情况 MAX ENDP CODE ENDS END MAIN 【实验步骤】 (1)用编辑软件(记事本、UltraEdit等)编辑一个扩展文件名为ASM的汇编语言源程序。 (2)用汇编程序MASM汇编上述的汇编语言源程序,形成目标代码文件。(扩展名为OBJ) (3)用连接程序LINK连接目标代码文件,形成可执行文件。(扩展名为EXE)(4)用DEBUG32调试可执行文件,观察执行结果,以验证其正确性。

单片机实验报告2

实验报告 二、实验地点:图书馆816-2 三、实验目的:掌握中断控制单元的设置方法及中断的编程方法。 四、实验内容 1.内容及要求: (1)用单次脉冲信号申请中断,在中断处理程序中对输出信号进行翻转,在此实验中使用P1.0口接一发光二极管显示。程序如下: ORG 0000H LJMP START ORG 0013H LJMP INT ORG 1000H START: SETB P1.0 SETB EX1 SETB PX0 SETB IT1 SETB EA INT: CPL P1.0 RETI END (2)用单次脉冲信号申请中断,要求程序中对每次中断进行计数,并将计数结果显示在发光二极管上。在本实验中用P1口接了八个发光二极管来实现。程序如下: ORG 0000H LJMP START ORG 0013H LJMP INT ORG 1000H START: MOV A,#00H MOV P1,A

SETB EX1 SETB PX0 SETB IT1 SETB EA INT: INC P1 RETI END 2.流程图如下: 图1 信号翻转流程图

图2 计数器加1流程图 3.实验步骤 (1.1)将P3.2与单脉冲用导连接,P1.0接一个发光二极管,用二极管的亮、灭来显示翻转。 (1.2)打开试验箱,编写中断程序。 (1.3)编译、运行中断程序并观测试验箱。若试验箱中的发光二极管随着单脉冲按键进行着亮灭亮灭,即说明实现了输出信号的翻转,实验成功。 (2.1)关闭试验箱,将P1.0至P1.7对应连接八个发光二极管,单脉冲连接P3.3。(2.2)打开试验箱,编写中断和累加的程序。 (2.3)编译、运行实验程序并观测试验箱。若八个发光二极管显示的数值等于按下单脉冲键的次数,则实验成功。 五、实验中遇到的问题及解决方法 问题1:实验时,将P3.2口接单脉冲,编写程序时,却写成了0013H,允许中断

C语言实验参考答案11

C语言实验参考答案 实验一 5、输入并运行自已编写的程序(教材第一章P14 三编程题)。 实验二 1、编写一个程序,从键盘接收3个实数(分别为10.0、20.0、5.0),输出这3个数的和s、乘积t和平均值a。 #include main() {float x,y,z,s,t,a; printf(“x,y,z=”); scanf(“%f,%f,%f”,&x,&y,&z); s=x+y+z; t=x*y*z; a=s/3; printf(“s=%f,t=%f,a=%f\n”,s,t,a); } 2、编程。要求用户输入两个整数a、b(分别为20、10),读取用户从键盘输入的值,然后: 1)用整数输出这两个数的和、差; 2)用长整型输出这两个数的积,用float输出商; 3)用整数输出这两个数的余数,用float输出平均值。 #include

{int a,b,he,cha,yu; long ji; float shang,aver; printf(“a,b=”); scanf(“%d,%d”,&a,&b); he=a+b; cha=a-b; ji=(long)a*b; shang=1.0*a/b; yu=a%b; aver=(a+b)/2.0; printf(“a+b=%d,a-b=%d,a*b=%ld\n”,he,cha,ji); printf(“a/b=%f,a%%b=%d,aver=%f\n”,shang,yu,aver); } 3. 再次运行程序第2题中的程序,使整数a、b的值分别为10、20,分析程序运行结果,并给出说明。 程序同上。 实验三 1、编写一个程序,从键盘接收一个一位的整型数,经转换,用字符函数putchar输出。例如,输入整数5,程序运行后输出字符5。 #include

实验报告5

实验5 配置MSTP 组名:C组 组长:程达 组员:陈婉丽张佳莉张文倩张青邢留洋郝亚磊 【实验名称】 配置MSTP 【实验目的】 在接入和分层交换机上配置MSTP并进行验证。 【背景描述】某企业网络管理人员认识到,传统的生成树协议(stp)是基于整个网络产生一个树形拓扑结构,所有的VLANs都共享一个生成树,这种结构不能进行网络流量的负载均衡,使得有些交换设备比较繁忙,而另一些设备又很空闲,为了克服这个问题,他决定采用基于VLAN的多生成树协议MSTP,现要在交换机上做适当配置来完成这一任务。【需求分析】 利用MSTP除了可以实现网络中的冗余链路外,还能还能够在实现网络冗余和 可靠性的同时实现负载均衡(分担)。 【实验拓扑】 【实验设备】 二层交换机2台 三层交换机2台

【预备知识】 交换机基本配置、MSTP技术原理。

【实验原理】 MSTP技术可以认为是STP和RSTP技术升级版本,除了保留低级版本的特性外,MSTP 考虑到网络中VLAN技术的使用,引入了实例和域的概念。实例为VLAN的组合,这样可以针对一个或多个VLAN进行生成树运算,从而不会阻断网络中应保留的链路,同时也可以让各实例的数据经由不同路径得以转发,实现网络中的负载分担。 【实验步骤】 步骤1 在交换机SA上划分VLAN并配置trunk端口 SWA(config)#vl 10 SWA(config-vlan)#vl 20 SWA(config-vlan)#vl 40 SWA(config-vlan)#int f 0/1 SWA(config-if-FastEthernet 0/1)#sw acc vl 10 SWA(config-if-FastEthernet 0/1)#int f 0/2 SWA(config-if-FastEthernet 0/2)#sw acc vl 20 SWA(config-if-FastEthernet 0/2)#int f 0/23 SWA(config-if-FastEthernet 0/23)#sw m t SWA(config-if-FastEthernet 0/23)#int f 0/24 SWA(config-if-FastEthernet 0/24)#sw m t 步骤2在SA上设置MSTP SWA(config)#span Enable spanning-tree. SWA(config)#span m mstp SWA(config)#span mst conf SWA(config-mst)#instance 1 vl 1,10 %Warning:you must create vlans before configuring instance-vlan relationship SWA(config-mst)#instance 2 vl 20,40 %Warning:you must create vlans before configuring instance-vlan relationship SWA(config-mst)#name region1 SWA(config-mst)#revision 1 在SWA上验证MSTP SWA(config-mst)#sho span mst conf Multi spanning tree protocol : Enable Name : region1 Revision : 1 Instance Vlans Mapped -------- -------------------------------------------- 0 : 2-9, 11-19, 21-39, 41-4094 1 : 1, 10 2 : 20, 40

相关文档
最新文档