1、二级 C+笔试 17 及答案解析(总分:88.00,做题时间:90 分钟)一、B选择题/B(总题数:30,分数:60.00)1.有如下程序: #include iostream.h class x protected: int a; public: x() a=1; ; class x1 : virtual public x public: x1() a+=1; couta; ; class x2 : virtual public x public: x2() a+=2; couta; ; class y : public xl,public x2 public: y() coutaend1;
2、 ; int main() y obj; return O; 该程序运行后的输出结果是( )。(分数:2.00)A.1B.123C.242D.2442.以下程序的输出结果是 ( )。 #include iostream using namespace std; int f(int b,int m, int n) int i,s = O; for(i = m;in;i+=2) s+=b i; return s; int main ( ) int x a = 1,2,3,4,5,6,7,8,9; x = f(a,3,7); coutxend1; return 0; (分数:2.00)A.10B.1
3、8C.8D.153.已知二叉树的前序序列为 ABDCEFG,中序序列为 DBCAFEG,则其后序序列为( )。(分数:2.00)A.DCBAFGEB.DCBFGEAC.DCBFEGAD.DCBGFEA4.设有如下程序: #include iostream using namespace std; class A public: int i; display() cout“class A/n“; ; class B public: int i; display() cout“class B/n“; ; class C : public A, public B int j; public: int
4、 i; show ( ) j = i * i; display(); ; int main() C demo; demo.show(); return O; 则主程序运行时将( )。(分数:2.00)A.因为变量 i 的重复定义而报错B.因为对象 demo 间接调用 display()函数时产生二义性而报错C.因为类定义的语法错误而不能运行D.没有语法错误,能够正常输出结果5.下列关于多继承二义性的描述中,错误的是( )。(分数:2.00)A.一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员的访问可能出现二义性。B.解决二义性的最常用的方法是对成员名的限定法C.基类和派生类中同时出
5、现的同名函数,也存在二义性问题D.一个派生类是从两个基类派生出来的,而这两个基类又有一个共同的基类,对该基类成员进行访问时,可能出现二义性6.有以下程序: #include iostream using namespace std; char *x=“First“, “Second“, “Third“ ; void f(char *z ) cout*z+end1; int main ( ) char *y; y=x; f(y); return 0; (分数:2.00)A.产生语法错误B.FirstC.SecpndD.Third7.常用的关系运算是关系代数和( )。(分数:2.00)A.集合代数
6、B.逻辑演算C.关系演算D.字段8.下列数组的定义中,会产生错误的是( )。(分数:2.00)A.int a=0,1,2,3,4,5,6;B.int a10=0,1,2,3,4,5,6;C.char a5=“hello“;D.char a5=h,e,1,1,o;9.在一个单链表 HL 中,若要向表头插入一个由指针 p 指向的节点,则需要执行语句序列( )。(分数:2.00)A.HL=p;p-next=HL;B.p-next=HL;HL=p;C.p-next=HL;p=HL;D.p-next=HL-next;HL-next=p10.下列 for 循环执行的次数为( )。 for(int i=0,
7、j=10;i=j=10;i+,j-)(分数:2.00)A.0B.11C.10D.无数次11.下面类的定义,有( )处错误。 class MyClass public: void MyClass(); MyClass(int Value);private: int i=0; ;(分数:2.00)A.1B.2C.3D.412.有以下程序: #include iostream using namespace std; class Point public: void SetPoint(int x,int y); void Move(int xOff,int yOff); int GetX() ret
8、urn X; int GetY() return Y; private: int X,Y; ; void Point:SetPoint(int x, int y) X=x; Y=y; void Point: :Move(int xOff, int yOff) X+=xOff; Y+=yOff; int main () Point p1; p1.SetPoint(1,2); p1.Move (5, 6); cout“Point1 is (“p1.GetX(),p1.GetY()“)“end1; return 0; 执行后的输出结果是( )。(分数:2.00)A.Point1 is (6,8)B.
9、Point1 is (1,2)C.Point1 is (5,6)D.Point1 is (4,4)13.在一个长度为 n 的线性表中删除一个元素,最坏情况下需要移动的数据元素数目为 ( )。(分数:2.00)A.1B.n-1C.n+1D.n214.以下程序的功能是:按顺序读入 10 名学生 4 门课程的成绩,计算出每个学生的平均分数并输出,程序如下: #includeiostream using namespace std; int main( ) int n,k; float score,sum,ave; sum = 0.0; for(n = 1;n =10; n+) for(k =1;k=
10、4;k+) cinscore; sum += score; ave=sum/4.0; cout“NO“n“ave:“aveend1; return 0; 上述程序运行后结果不正确,调式中发现有一条语句出现在程序中的位置不正确。 这条语句是非曲直( )。(分数:2.00)A.sum=0.0;B.sum+=score;C.ave= sum/4.0D.cout“N“n“ave:“aveend1;15.下列关于 getline() 函数的描述中,不正确的是( )。(分数:2.00)A.getline()函数是用来从键盘上读取字符串的B.getline()函数读取字符串长度是受限制的C.getline(
11、)函数读取字符串时,遇到终止符时就停止D.getline()函数中所使用的终止符只能是换行符16.若有定义: int*p; 则下列各选项中,不同于表达式“*p=*p+1;”的是( )。(分数:2.00)A.*p+;B.+*p;C.*p+=1;D.+(*;17.一组记录的排序码为(46,79,56,38,40,84),则利用快速排序的方法,以第一个记录为基准得到的一次划分结果为( )。(分数:2.00)A.38,40,46,56,79,84B.40,38,46,79,56,84C.40,38,46,56,79,84D.40,38,46,84,56,7918.下列关于 goto 语句的描述中,正确
12、的是( )。(分数:2.00)A.goto 语句可在一个文件中随意转向B.goto 语句后面要跟一个它所转向的语句C.goto 语句可以同时转向多条语句D.goto 语句可以从一个循环体内转到循环体外19.下面不属于软件设计原则的是( )。(分数:2.00)A.抽象B.模块化C.自底向上D.信息隐蔽20.为使下列程序的正确输出结果为: Now is 2004-7-6 12:12:12 那么应该在程序划线处填入的语句是( )。#include iostream using namespace std; class TIME; class DATE public: DATE(int y=2004,
13、int m=1,int d=1) year=y; month=m; day=d; void DateTime(TIME private: int year,month, day; ; class TIME public: TIME(int h=0,int m=0,int s=0) hour=h; minute=m; second=s; _; /将类 DATE 中成员函数 DateTime 声明为类 TIME 的友元函数 private: int hour,minute, second; ; void DATE: :DateTime(TIME int main ( ) DATE d(2004,7
14、,6); TIME t (12, 12, 12); d. DateTime (t); return 0; (分数:2.00)A.friend void DateTime(TIME &;B.friend void DATE:DateTime(TIME C.void DateTime(TIME &;D.friend void DateTime(TIME &;21.定义如下枚举类型: enumMonday,Tuesday,Wednesday,Thursday,Friday=2; 则下列语句正确的是( )。(分数:2.00)A.表达式 Wednesday=Friday 的值是 trueB.Dayday
15、;day=3;C.Dayday;day=Monday+3;D.Dayday;day=Tuesday+10;22.在 C+语言中,函数形参的默认存储类型是( )。(分数:2.00)A.autoB.registerC.staticD.extem23.有如下程序: #includeiostream using namespace std; class base public: virtual void f1() cout“F1Base“; virtual void f2() cout“F2Base “; ; class derive : public base void f1 ( ) cout“F1
16、Derive“; void f2( int x ) cout“F2 Derive“; ;int main () base objl, * p; derive obj2; p = p - f1(); p - f2(); return 0; 执行后的输出结果是( )。(分数:2.00)A.F1Derive F2BaseB.F1Derive F2DeriveC.F1Base F2BaseD.F1Base F2Derive24.有以下程序: #include iostream using namespace std; class MyClass int m; publ i c: static int
17、n; MyClass ( ) m = 0; void setvalue() m+; n+; void output () cout“m=“m , n=“nend1; ; int MyClass : n=0; int main() MyClass obj1, obj2; obj1.setvalue(); objl.output(); obj2.setvalue(); obj2.output(); return 0; (分数:2.00)A.m= 1 ,n= 1 换行m= 1 ,n=1B.m= 1 ,n= 1 换行m=1 ,n=2C.m=1,n=1换行m=2,n=1D.m=1,n=1换行m=2,n=
18、225.要把高级语言编写的源程序转换为目标程序,需要使用( )。(分数:2.00)A.编辑程序B.驱动程序C.调试程序D.编译程序26.源程序中应包含一些内部文档,以帮助阅读和理解源程序,源程序的内部文档通常包括选择合适的标识符、注解和( )。(分数:2.00)A.程序的视觉组织B.尽量不用或少用 GOTO 语句C.检查输入数据的有效性D.设计良好的输出报表27.下列叙述中,正确的是( )。(分数:2.00)A.入栈运算只需将新元素插到栈顶指针指向的位置B.出栈运算只需将栈顶元素赋给一个指定变量C.出栈运算与读栈顶元素是相同的操作D.读栈顶元素不删除栈顶元素28.下列关于严格控制 goto 语
19、句使用的理解中,错误的是( )。(分数:2.00)A.用一个非结构化的程序设计语言实现一个结构化的构造B.若不使用 goto 语句会使功能模糊C.在某种可以改善而不是损害程序可读性的情况下D.goto 语句可以完全不用29.规范化理论中消除其中多余的数据相关性是靠分解( )。(分数:2.00)A.关系运算B.内模式C.外模式D.视图30.以下选项中,合法的字符常量是( )。(分数:2.00)A.“N“B./010C.68D.D二、B填空题/B(总题数:14,分数:28.00)31.对待排序文件的初始状态作要求的排序方法是U 【1】 /U。(分数:2.00)填空项 1:_32.Jackson 方
20、法是一种面向U 【2】 /U的结构化方法。(分数:2.00)填空项 1:_33.软件工程的 3 个要素是工具、过程和U 【3】 /U。(分数:2.00)填空项 1:_34.数据的物理独立性是指当数据的U 【4】 /U改变时,通过系统内部的自动映象或转换功能,保持了数据的逻辑结构不变。(分数:2.00)填空项 1:_35.软件测试的常用方法通常可分为白盒测试和U 【5】 /U。前者是根据程序的内部逻辑来设计测试用例,后者是根据软件的规格说明来设计测试用例。(分数:2.00)填空项 1:_36.假定输入的 10 个整数为:32,64,53,87,54,32,98,56,98,83。那么下列程序的运
21、行结果是U 【6】 /U。 #include iostream using namespace std; int main() int a,b,C,X; a = b = C = 0; for(int i = 0;i10;i+) cinx; switch(x%3) case 0 :a+=x; break; case 1 :b+=x; break; case 2 : C+=x; break; couta“,“b“,“Cend1; return 0; (分数:2.00)填空项 1:_37.以下程序中的 select()函数功能是:在 N 行 M 列的二维数组中选出一个最大值作为函数值返回,并通过形参
22、传回此最大值的行下标。请填空完成此程序。 #includeiostream #define N 3 #define M 3 using namespace std; int select(int aNM,int *n) int i,j,row=0,colum=0; for(i=0;iN;i+) for(i=0;jM;j+) if(aijarowcolum) row=i; colum=j; *n=U 【7】 /U; returnU 【8】 /U; int main() int aNM=9,11,23,6,1,15,9,17,20; int max,n; max=select(a, templat
23、eclass T void f(U 【12】 /U) T t; for (int i=0;in/2;i+) t=a Ii; a i=an-1-i; a n-1-i=t; int main ( ) int x=6,7,8,9; f(x,4); for (int i=0;i4;i+) coutxi; coutend1; return 0; (分数:2.00)填空项 1:_42.有以下程序: #include iostream using namespace std; class A public: virtual void show() cout“A“; ; class B : public A
24、public: void show() cout “B“; ; void display( A * obj ) obj- show(); int main ( ) A demol; B demo2; display( display( return 0; 执行后的输出结果为U 【13】 /U。(分数:2.00)填空项 1:_43.如下程序执行后的输出结果是U 【14】 /U。 #include iostream using namespace std; class Base public: Base(int x,int y) a=x; b=y; void Show() cout“Base: “
25、a , b“ “; private: int a,b; ; class Derived : public Base public: Derived(int x, int y, int z) : Base(x,y),c(z) void Show() cout“Derived:“cend1; private: int c; ; int main() Base b(100,100),*pb; Derived d(10,20,30); pb= pb-Show(); pb= pb-Show(); return 0; (分数:2.00)填空项 1:_44.以下程序设计功能是:将结构体变量 time 中的内
26、容写到文件中。 #include iostream using namespace std; struct date int year; int month; int day; int main ( ) date time = 2005, 1, 1 ; ofstream outdate; outdate.open( “d:/date.txt“, ios : binary ); outdate.write(_, sizeof( tt ) ); outdate.close(); return 0; 则程序中空白处应该填入的语句为U 【15】 /U。(分数:2.00)填空项 1:_二级 C+笔试 1
27、7 答案解析(总分:88.00,做题时间:90 分钟)一、B选择题/B(总题数:30,分数:60.00)1.有如下程序: #include iostream.h class x protected: int a; public: x() a=1; ; class x1 : virtual public x public: x1() a+=1; couta; ; class x2 : virtual public x public: x2() a+=2; couta; ; class y : public xl,public x2 public: y() coutaend1; ; int mai
28、n() y obj; return O; 该程序运行后的输出结果是( )。(分数:2.00)A.1B.123C.242D.244 解析:解析 本题程序中引入了虚基类。在主函数 main 中,执行语句“y obj;”时,先执行虚基类 x的构造函数,使 a=1;然后执行类 x1 的构造函数,使 a=2,并输出值 2;再执行类 x2 的构造函数,使a=4,并输出值 4;最后执行类 y 的构造函数,输出值 4。2.以下程序的输出结果是 ( )。 #include iostream using namespace std; int f(int b,int m, int n) int i,s = O; f
29、or(i = m;in;i+=2) s+=b i; return s; int main ( ) int x a = 1,2,3,4,5,6,7,8,9; x = f(a,3,7); coutxend1; return 0; (分数:2.00)A.10 B.18C.8D.15解析:解本题考查对数组以及数组作为函数参数的掌握程度。本题通过参数传递将数组 a 传给 f()函数中的数组 b,并由 s 传递返回值给主函数中的 x。主函数中, x=f(a,3,7),即把数组 a 传给 f()函数中的数组 b,把 3 传给 m,把 7 传给 n。所以函数 f()中的 for 循环中,是从 3 开始循环,经
30、过两次循环后,实现 a3和 a5值的累加,并存入 s 中,然后返回给主函数中的 x。所以 x 的值为 10。 故本题答案是 A。3.已知二叉树的前序序列为 ABDCEFG,中序序列为 DBCAFEG,则其后序序列为( )。(分数:2.00)A.DCBAFGEB.DCBFGEA C.DCBFEGAD.DCBGFEA解析:解析 本题先可用排除法,由二叉树的前序序列为 ABDCEFG 可知:二叉树的根节点为 A,因此选项 A 错误。通过分析可知,B、E 是 A 的左右子节点,D、C 是 B 的左右子节点,F、G 是 E 的左右子节点。4.设有如下程序: #include iostream using
31、 namespace std; class A public: int i; display() cout“class A/n“; ; class B public: int i; display() cout“class B/n“; ; class C : public A, public B int j; public: int i; show ( ) j = i * i; display(); ; int main() C demo; demo.show(); return O; 则主程序运行时将( )。(分数:2.00)A.因为变量 i 的重复定义而报错B.因为对象 demo 间接调用
32、 display()函数时产生二义性而报错 C.因为类定义的语法错误而不能运行D.没有语法错误,能够正常输出结果解析:解析 本题主要考察 C+中多继承的工作方式和二义性的解决办法。在 C+中,允许一个派生类从多个基类派生,这种继承方式称为多继承。多继承的定义格式如下: class派生类名:继承方式基类名 1,继承方式 2基类名 2, 派生类类体; 但是,如果一个派生类的两个或多个基类中有某个同名成员,在派生类中对这个成员的访问就可能出现二义性;同时,如果一个派生类是由两个或多个基类派生出来的,而这几个基类又有一个共同的基类,对该基类进行访问时,也可能会出现二义性。本题程序中,类 C 是由类 A
33、 和类 B 多继承得到的派生类,但其自身函数 show()中调用了display()函数,而这个函数是同时出现在类 C 的两个基类中的,因此程序会出现二义性,编译器将无法确定调用哪一个 display()函数来执行操作,因此报错。 解决二义性的通常办法是通过作用域运算符“:”进行限定。5.下列关于多继承二义性的描述中,错误的是( )。(分数:2.00)A.一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员的访问可能出现二义性。B.解决二义性的最常用的方法是对成员名的限定法C.基类和派生类中同时出现的同名函数,也存在二义性问题 D.一个派生类是从两个基类派生出来的,而这两个基类又有一个
34、共同的基类,对该基类成员进行访问时,可能出现二义性解析:解析 本题考核多继承中出现的二义性问题。在多重继承的情况下,派生类具有两个以上的直接基类,而这些直接基类的一部分或全部又是从另一个共同基类派生而来时,这些直接基类中从上一级继承来的成员就拥有相同的名称。在派生类的对象中,这些同名成员在内存中同时有多个复制件,所以派生对这些同名成员的访问存在二义性。所以选项 A 和 D 的说法是正确的。 解决二义性的方法有两种:一是使用作用域分辨符来惟一标识并分别访问它们:二是可以将共同基类设置为虚基类。而第一种方法最常用。所以选项 B 的说法是正确的。 基类和派生类中同时出现同名函数,符合支配规则,不存在
35、二义性问题。所以选项 C 的说法不正确。6.有以下程序: #include iostream using namespace std; char *x=“First“, “Second“, “Third“ ; void f(char *z ) cout*z+end1; int main ( ) char *y; y=x; f(y); return 0; (分数:2.00)A.产生语法错误B.First C.SecpndD.Third解析:解析 程序首先定义全局指针数组 x,并赋初值。在函数 f()中,语句“cout*z+end1;”是输出*z 指向的字符串,然后指向下一个指针。由于在主函数中,
36、指针 y已初始化指向指针数组 x,所以执行 f(y)后,程序输出指针数组 x 中的第一个字符串“First“。7.常用的关系运算是关系代数和( )。(分数:2.00)A.集合代数B.逻辑演算C.关系演算 D.字段解析:解析 本题考核关系代数运算。关系运算包括关系代数和关系演算。8.下列数组的定义中,会产生错误的是( )。(分数:2.00)A.int a=0,1,2,3,4,5,6;B.int a10=0,1,2,3,4,5,6;C.char a5=“hello“; D.char a5=h,e,1,1,o;解析:解析 本题考核数组的定义以及字符串数组方面的基础知识。下面逐项进行分析:选项 A 中
37、,数组 a 的定义和初始化符合数组的定义和初始化语法,故正确:选项 B 中,数组 a 初始化的值虽然没有 10个,但对于少的部分,系统会自动补 0,所以选项 B 中数组的定义也是正确;选项 C 中,数组 a 的长度为5,但字符串“hello“,的长度为 5+1=6,字符串结束符,10,无法存储在数组中,所以是错误的;选项 D中,数组 a 的定义是正确的。9.在一个单链表 HL 中,若要向表头插入一个由指针 p 指向的节点,则需要执行语句序列( )。(分数:2.00)A.HL=p;p-next=HL;B.p-next=HL;HL=p; C.p-next=HL;p=HL;D.p-next=HL-n
38、ext;HL-next=p解析:解析 HL 为链表的头指针。HL 指示链表中第一个节点的存储位置,在表头插入一个由指针 p 指向的节点后,头指针指向 p,p 的指针域指向原链表中第一个节点10.下列 for 循环执行的次数为( )。 for(int i=0,j=10;i=j=10;i+,j-)(分数:2.00)A.0B.11C.10D.无数次 解析:解析 本题考核 for 循环。for 语句的循环条件部分为“i=j=10”,这是一个赋值表达式,永远为真,即 for 循环是死循环,将执行无数次。11.下面类的定义,有( )处错误。 class MyClass public: void MyCla
39、ss(); MyClass(int Value);private: int i=0; ;(分数:2.00)A.1B.2C.3 D.4解析:解析 该类的定义共有 3 处错误。 类的成员变量不能在定义时进行初始化: 类的构造函数不能有返回值(包括 void 类型); 类的析构函数不能有参数。12.有以下程序: #include iostream using namespace std; class Point public: void SetPoint(int x,int y); void Move(int xOff,int yOff); int GetX() return X; int GetY
40、() return Y; private: int X,Y; ; void Point:SetPoint(int x, int y) X=x; Y=y; void Point: :Move(int xOff, int yOff) X+=xOff; Y+=yOff; int main () Point p1; p1.SetPoint(1,2); p1.Move (5, 6); cout“Point1 is (“p1.GetX(),p1.GetY()“)“end1; return 0; 执行后的输出结果是( )。(分数:2.00)A.Point1 is (6,8) B.Point1 is (1,2
41、)C.Point1 is (5,6)D.Point1 is (4,4)解析:解析 本题考核对象的定义与使用。程序中定义了一个类 Point,在主函数中定义了一个 Point类的对象 p1,然后通过对象 p1 调用其成员函数 SetPoint()和 Move()实现移位的操作。13.在一个长度为 n 的线性表中删除一个元素,最坏情况下需要移动的数据元素数目为 ( )。(分数:2.00)A.1B.n-1 C.n+1D.n2解析:解析 在一般情况下,要删除第 i 个元素时,首先是从第 i+1 个元素开始,直到第 n 个元素之间共 n-i 个元素依次向前移动一个位置,删除结束后,线性表的长度减 1。最
42、坏情况指的是删除线性表的第一个元素,则需要移动表中第 1 个元素以外所有的元素,答案为 B。14.以下程序的功能是:按顺序读入 10 名学生 4 门课程的成绩,计算出每个学生的平均分数并输出,程序如下: #includeiostream using namespace std; int main( ) int n,k; float score,sum,ave; sum = 0.0; for(n = 1;n =10; n+) for(k =1;k=4;k+) cinscore; sum += score; ave=sum/4.0; cout“NO“n“ave:“aveend1; return 0
43、; 上述程序运行后结果不正确,调式中发现有一条语句出现在程序中的位置不正确。 这条语句是非曲直( )。(分数:2.00)A.sum=0.0; B.sum+=score;C.ave= sum/4.0D.cout“N“n“ave:“aveend1;解析:解析 本题中 sum 用来保存每位学生的总成绩,所以在计算不同学生的总成绩时,应将 sum 重新赋值初值 0,即语句“sum=0.0;”应该包含在第 1 个 for 循环体内,并在第 2 个 for 语句前执行。15.下列关于 getline() 函数的描述中,不正确的是( )。(分数:2.00)A.getline()函数是用来从键盘上读取字符串的
44、B.getline()函数读取字符串长度是受限制的C.getline()函数读取字符串时,遇到终止符时就停止D.getline()函数中所使用的终止符只能是换行符 解析:解析 本题主要考察 C+中输入流成员函数的使用。输入流的成员函数主要包括 open()、get()、getline()、read()、seekg()、tellg()和 close()等函数。其中,getline()函数从输入流中读取多个字符,并且允许指定输入终止符,其原形为: getline(char*line,int size,char=/n)。 其中:函数的第 1 个参数是字符数组,用于放置读取的文本:第 2 个参数是本次
45、读取的最大字符个数,通过改变该参数可以设置读入的最大字节数即字符串长度:第 3 个参数是分隔字符,作为读取一行结束的标志,默认为换行符/n,通过改变该参数,可以自定义输入形式和结束标志。 因此可以判断,题目选项 D 的叙述是错误的,可以通过改变参数修改 getline()函数中所使用的终止符。16.若有定义: int*p; 则下列各选项中,不同于表达式“*p=*p+1;”的是( )。(分数:2.00)A.*p+; B.+*p;C.*p+=1;D.+(*;解析:解析 题目中的语句“*p=*p+1;”是将指针变量 p 所指向的存储单元的值加 1,然后再放入 p 所指向的存储单元中。选项 A 中,语句“*p+;”,当把该表达式赋给一整型变量 k 时,就会发现,原语句可变为“k=*p;p=p+1;”,即语句“*p+”最后所执行的是 p 的值(即 p 中存放的地址)加 1,与题中语句“*p=*p+1;”的意思不同。再来看选项 B,C,D,选项 B 中的语句可表示为“*p=*p+1;”。选项 C 中的语句可表示为“*p=*p+1;”。选项 D 中的语句也可表示为“*p=*p+1;”。17.一组记录的排序码为(46,79,56,38,40,84),则利用快速排序的方法,以第一个记录为基准得到的一次划分结果为( )。(分数:2.00)A.38,40,46,56,79,84B.40,38,46