for( j=0; j
{ a[i][j] ++ ;
if( i == j ) t *= a[i][j] ;
}
return t ;
}
6.#include
void test1( int *a1 )
{ a1 = new int( 5 ) ;
cout << "*a1 = " << *a1 << endl ;
}
void test2(int * & a2)
{ a2 = new int( 5 ) ;
cout << "*a2 = " << *a2 << endl ;
}
void main()
{ int *p = new int( 1 ) ;
test1( p ) ;
cout << "test1: *p1 = " << *p << endl ;
test2( p ) ;
cout << "test2: *p2 = " << *p << endl ;
}
7.#include
void main()
{ char s[] = "abccda" ;
int i ; char c ;
for( i = 1 ; ( c=s[i] ) != '\0'; i ++ )
{ switch( c )
{ case 'a' : cout << '%' ; continue ;
case 'b' : cout << '$' ; break ;
case 'c' : cout << '*' ; break ;
case 'd' : continue ;
}
cout << '#' << endl ;
}
}
8.#include
void main()
{ char *str[] = { "c++", "basic", "pascal" } ;
char **p ;
int i ;
p = str ;
for( i=0 ; i<3 ; i++ )
cout << *( p+i ) << endl ;
}
9.#include
void main()
{ char s1[] = "Fortran" , s2[] = "Foxpro" ;
char *p , *q ;
p = s1 ; q = s2 ;
while( *p && *q )
{ if ( *p == *q )
cout << *p ;
p ++ ;
q ++ ;
}
cout << endl ;
}
10.#include
#include
void main()
{ char str[][10] = { "vb", "pascal", "c++" }, s[10] ;
strcpy( s , ( strcmp( str[0] , str[1] ) < 0 str[0] : str[1] ) ) ;
if( strcmp( str[2], s ) < 0 ) strcpy( s, str[2] ) ;
cout << s << endl ;
}
4.2 思考题
1.数组说明语句要向编译器提供什么信息?写出一维数组、二维数组说明语句的形式。
2.数组名、数组元素的区别是什么?归纳一维数组元素地址、元素值不同的表示形式。有说明
int aa [3], *pa=aa;
使用aa或pa,写出3个以上与aa[2] 等价的表达式。
3.要把一维数组 int a[n*n] 的元素传送到二维数组 int b[n][n] 中,即在程序中要执行
b[i][j]=a[k];
写出k->i,j的下标变换公式,并用程序验证之。
4.有以下函数
void query()
{ int *p;
p=new int[3];
//……
delete []p;
p=new double[5];
//……
delete []p;
}
出现了编译错误。请分析错误的原因,并把上述程序补充完整,上机验证你的判断。
5.有以下程序根据输入值,调用函数create建立并初始化动态数组,令a[i]=i。该程序运行后,主函数不能返回期望值。请分析程序的错误原因并修改之。
#include
void create(int *, int);
void main()
{ int *a, len;
cin>>len;
create(a,len);
for( int i = 0; icout << endl;
delete []a;
}
void create(int *ap, int n)
{ ap=new int[n];
for(int i=0; i}
1.数组说明语句要向编译器提供什么信息?请写出一维数组、二维数组说明语句的形式。
【答案】
数组说明语句要向编译器提供数组名(标识符),数组元素的类型、数组长度(元素的个数)等信息。一维数组说明语句为:类型数组名[表达式]
二维数组说明语句为:类型数组名[表达式1] [表达式2]
2.数组名、数组元素的区别是什么?归纳一维数组元素地址、元素值不同的表示形式。若有说明int aa [3], *pa=aa;
请使用aa或pa,写出3个以上与aa[2] 等价的表达式。
【答案】
数组名是一个标识符,执行代码中代表数组的地址,即指向数组起始位置的指针;而数组元素是下标变量,性质相当于普通变量。
对一维数组aa第i个元素的地址可以表示为: &aa[i] aa+i;
对一维数组aa第i个元素的值可以表示为:a[i] *(a+i);
与aa[2]等价的表达式:
*(aa+2) *(&a[2]) *(pa+2) pa[2]
3.要把一维数组 int a[m*n] 的元素传送到二维数组 int b[m][n] 中,即在程序中要执行b[i][j]=a[k];
请写出k→i,j的下标变换公式,并用程序验证。
【答案】
转换公式 i=k/n j=k%n
验证程序:
#include
using namespace std;
int main()
{ const int M=3,N=4;
int k,a[M*N]={1,2,3,4,5,6,7,8,9,10,11,12},b[M][N];
int i,j;
cout<<"array a:"<for(k=0;kb[k/N][k%N]=a[k];
for(k=0;kcout<cout<<"**After convert**"<cout<<"array b:"<for(i=0;i{ for(j=0;jcout<}
}
4.有以下函数
void query()
{ int *p;
p=new int[3];
//……
delete []p;
p=new double[5];
//……
delete []p;
}
出现了编译错误。请分析错误的原因,并把上述程序补充完整,上机验证你的判断。
【答案】
在语句p=new double[5]; 中企图把动态浮点型数组的地址写入整型指针p,造成错误。错误为error C2440: “=”: 无法从“double *”转换为“int *”。
改正方法:增加一个double*q指针。
void query()
{ int *p;
p=new int[3];
delete [] p;
//……
double *q;
q=new double[5];
//……
delete []q;
}
5.有以下程序根据输入值,设计功能是调用函数create建立并初始化动态数组,令a[i]=i。但该程序运行后不能得到期望结果,请分析程序的错误原因并修改之。
#include
using namespace std;
void create(int *, int);
int main()
{ int *a = NULL, len;
cin>>len;
create(a,len);
for( int i = 0; i< len; i++ ) cout << a[i] << " ";
cout << endl;
delete []a;
a = NULL ;
}
void create(int *ap, int n)
{ ap=new int[n];
for(int i=0; i}
【答案】
函数create中,指针参数int*ap是地址值的参数。调用函数时接受实际参数a的地址值作为初制值。ap仅是局部变量,ap=new int[n]获得新的地址值,函数执行完毕返回,ap被释放,完全与实际参数ap无关。程序没有编译错误,但main不能获得动态数组。修改方法是把ap改为指针引用参数。
void create(int *&,int); //函数原型声明,使用引用参数
void create(int *&ap,int n) //函数定义
{ ap=new int[n];
for(int i=0;i}
4.3 编程题
1.已知求成绩的平均值和均方差公式: ,,其中n为学生人数,为第i个学生成绩。求某班学生的平均成绩和均方差。
答案 4.3-1
#include
#include
void main()
{ double s[] = { 76, 85, 54, 77, 93, 83, 90, 67, 81, 65 };
double sum1=0,sum2=0,ave,dev;
int n, i;
n = sizeof( s )/sizeof( double ); //求数组元素的个数
for( i=0; isum1 += s[i];
ave = sum1/n;
for( i=0; isum2 += pow( s[i]-ave, 2 );
dev = sqrt( sum2/n );
cout << "rve=" << ave << '\t' << "dev=" << dev << endl;
}
第四章 练习题及参考答案
第四章 静态场的解 练习题 1、设点电荷q 位于金属直角劈上方,其坐标如右图所示,求 (1) 画出镜像电荷所在的位置 (2) 直角劈内任意一点),,(z y x 处的电位表达式 (3) 解:(1)镜像电荷所在的位置如图1所示。 (2)如图2所示任一点),,(z y x 处的电位为 ??? ? ??-+-= 4321011114r r r r q πεφ 其中, ()()()()()()()()2 22422 232 2222 22121212121z y x r z y x r z y x r z y x r +-++= ++++=+++-=+-+-= 2、 两个点电荷Q +和Q -位于半径为a 的接地导体球的直径延长线上,距球心均为 d 。证明镜像电荷构成一位于球心的电偶极子,且偶极矩大小为232d Q a 。 证明:由点电荷的球面镜像法知,+Q 和-Q 的镜像电荷Q Q ''',分别位于球内+Q 和- Q 连线上大小分别为Q D a μ,且分别距球心为D a 2(分别位于球心两侧)。可见Q Q ''',构 成电偶极子,由电偶极距的定义式得偶极距的大小为: 图1 图2 q - q +q -
2 322D Q a D a Q D a ql p =?==。结论得证。 3、已知一个半径为a 的接地导体球,球外一个点电荷q 位于距球心O 为d 处。利用镜像法求球外空间任意点的电位分布。 解:由点电荷的球面镜像法可知,q 的像电荷q '必定位于球内,且在q 与球心0连线上,位置在距离球心设为f 处。建立直角坐标系,由边界条件(?球)=0可取球面上两个特殊点B A ,讨论。B A ,是q 与球心0连线所对应的直径与球面的两个交点。由图示及点电荷的电位公式得: 0)(4)(4)(00=+' ++= f a q a d q A πεπε?, 0) (4)(4)(00=-' +-= f a q a d q B πεπε?。 解此方程组得:d a f q d a q 2 ,=-='。 所以任意场点),(y x P 处的电位为: r q r q ' '+ = 0044πεπε?。 其中r r ',分别是点电荷q 和q ' 到场点P 的距离。 值分别为21 2221 22])[(,])[(y f x r y d x r +-='+-=。 4、半径为a 的不接地导体球附近距球心O 为d (?d a )处有一点电荷q ,用镜像法计算 球外任一点的电位。 解:由点电荷的球面镜像法可知,q 的像电荷除了有q '(即导体球接地时对应的结果, q d a q -=',其位置为d a f 2=),还在球心处有另外一个镜像电荷q '',以保证导体球面电 势不为零的边界条件成立,且可知q q '-=''。 所以任意场点P 处的电位为: r q r q r q ' '''+ ' '+ = 000444πεπεπε?
第四章课后习题答案
4-8 一个半径为r =1m ,转速为1500r/min 的飞轮,受到制动,均匀减速,经时间t =50s 后静止,求:(1)飞轮的角加速度和飞轮的角速度随时间的关系;(2)飞轮到静止这段时间内转过的转数;(3)t =25s 时飞轮边缘上一点的线速率和加速度的大小。 解 (1)由于均匀减速,所以角加速度不变为 2015000.5/6050r r s s s β-= =-? 由角速度和角加速度的关系得 25/0 t r s d dt ω ωβ=? ? 得 250.5(/)t r s ω=- (2) d d d d dt dt d d ωωθωω βθθ = == 25/r s d d θβθωω=? ? 解得 625r θ= 所以转数为625 (3)由于250.5(/)t r s ω=- 所以t=25s 时 12.5/25(/)r s rad s ωπ== 所以线速率为 25(/)v r m s ωπ== 角加速度大小不变 4-9 某电机的转速随时间的关系为ω=ω0(1-e -t/τ ),式中,ω0=s ,τ=,求:(1) t =时的转速;(2)角加速度随时间变化的规律;(3)启动6s 后转过的圈数。 解 (1)t=60s 代入得 39(1)(/)8.6/e rad s rad s ω-=-= (2)由d dt ω β= 得 2 4.5t e β- = (3)由6 d dt θθω=?? 33618e θ-=+ [/2][5.87]5n θπ===
4-10 一个圆盘绕穿过质心的轴转动,其角坐标随时间的关系为θ(t )=γt+βt 3 ,其初始转速为零,求其转速随时间变化的规律。 解 由d dt θ ω= 得 23t ωγβ=+ 由于初始时刻转速为零,γ=0 23t ωβ= 4-11 求半径为R ,高为h ,质量为m 的圆柱体绕其对称轴转动时的转动惯量。 解 建立柱坐标,取圆柱体上的一个体元,其对转轴的转动惯量为 2 222 m m dJ dV d d dz R h R h ρρρρθππ== 积分求得 23220001 2 R h m J d d dz mR R h πρρθπ= =??? 4-12一个半径为R ,密度为ρ的薄板圆盘上开了一个半径为R/2的圆孔,圆孔与盘边缘相切。求该圆盘对通过圆盘中心而与圆盘垂直的轴的转动惯量。 解:把圆孔补上,取圆盘上一面元dS ,到转轴的距离为r ,则其转动惯量为 22dJ r dS r rdrd ρρθ== 积分得绕轴转动惯量为 23410 1 2 R J r drd R π ρθπρ==? ? 圆孔部分的绕轴转动惯量可由平行轴定理得 4 422213()()()222232 R R R R J πρπρρπ=+= 总的转动惯量为 4 121332 R J J J πρ=-= 4-13电风扇在开启电源后,经过t 1时间达到额定转速ω,当关闭电源后,经过t 2时间后停止转动,已知风扇转子的转动惯量为J ,并假定摩擦力矩和电动机的电磁力矩均为常量,求电动机的电磁力矩。 解:由转动定理得
C++程序设计基础课后答案 第八章
8.1 阅读下列程序,写出执行结果 1.#include class Bclass { public: Bclass( int i, int j ) { x = i; y = j; } virtual int fun() { return 0 ; } protected: int x, y ; }; class Iclass:public Bclass { public : Iclass(int i, int j, int k):Bclass(i, j) { z = k; } int fun() { return ( x + y + z ) / 3; } private : int z ; }; void main() { Iclass obj( 2, 4, 10 ); Bclass p1 = obj; cout << p1.fun() << endl; Bclass & p2 = obj ; cout << p2.fun() << endl; cout << p2.Bclass :: fun() << endl; Bclass *p3 = &obj;
cout << p3 -> fun() << endl; } 2.#include class Base { public: virtual void getxy( int i,int j = 0 ) { x = i; y = j; } virtual void fun() = 0 ; protected: int x , y; }; class A: public Base { public: void fun() { cout<<"x = "<
|