《高级语言程序设计(C++I)》练习题参考答案
一.单项选择题(每小题2分,共20分)
1.下列字符列中,合法的浮点型常量是:
??? (A) 457??????? (B) 6e5.3????????? (C) e7???????? (D) 123e6
2.字符串常量 ”w\x42\\\nx\103y” 的长度是:
(A) 7?????? (B) 11????? (C) 15????? (D) 16
#include<iostream>
using namespace std;
void main()
{
??? cout << strlen("w\x42\\\nx\103y");
}
上机为7
\x42
\\
\n
\103
都是一个
3.以下运算符中,自右向左结合的运算符是:
??? (A) []???????? (B) <=???????? (C) *=? ??????? (D) <<
4.表达式4/8*100/2.0的值是:
??? (A) 25???????? (B) 25.0?????????? (C) 0????????? (D) 0.0
5.设变量int a = 5; 下列哪个表达式计算后,使得变量b的值不为2 ?
(A) b=a/2????? (B) b=6-(--a)????? (C) b=a%2? ???? (D) b=a<3?3:2
6.设a是整型变量,不能表达数学关系式11<a<15的C++表达式是:
(A) a>11&&a<15???????????????????? (B) a==12||a==13||a==14
(C) !(a<=11)&&!(a>=15)? ?????????? (D) 11<a<=14
对C++表达式? 11<a<15 的计算:
① 11<a è 0 或1
② 0<15 è 1 或 1<15 è 1?
原因:C++的逻辑判断结果为整型值
7.下列C++代码中,不能正确对字符串s1置串值的代码是:
(C) char s1[5]=”name”;????? (D) char s1[]={”name”};
8.一个具有6个整型指针元素的一维数组的正确定义是:
(A) int **p[6]???????????? (B) int (*p)[6]
(C) int *p[6]????????????? (D) *(*(p)[6])
试比较以下几种说明形式:
??? int * p;?????? // p是指向整型变量的指针(p是关联类型为整型的指针)
??? int *pa[10];?? // pa是数组,元素类型是整型指针
??? int (*pb)[10]; // pb是指针,指向(关联类型)长度为10的整型数组
??? int * f();???? // f是返回整型指针的函数名
??? int (*f)();??? // f是指针,指向(关联类型)是返回整型值的无参函数
??? 例:有声明
?????? int (*f)(int int);? int max(int,int);? int min(int, int);
??? 则:f=max;? f(a,b);???? //等价于 (*f)(a,b);??? max(a,b);
??????? f=min;? f(a,b);???? //等价于 (*f)(a,b);??? min(a,b);
9.执行语句 x=1; while(x++<7)cout<<’*’; 后输出结果是:
(A) **???????? (B) ****?????? (C) ******???? (D) *******
(x++<7)? ?? ① x<7????? ② x=x+1
10.若用一维数组名作为调用函数时的实参,则传递给形参的是:
(A) 数组首元素的地址?? ??? ??? (B) 数组首元素的值
(C) 数组元素的个数??? ????????? (D) 数组中全部元素的值
二.简答题(每小题2分,共20分)
1.设整型变量x为任何一个整数,表达式 –2<x<2 的值是? ????? 1?
2.调用函数时,希望从提供的实参变量中得到函数的结果,则对应的形参应该是??
指针或引用类型参数
注意使用方法:
函数定义?????????????????? 调用
void fun1(int x1);???????? int a1; fun1(a1);????? //传数据值参数
void fun2(int * x2);?????? int a2; fun2(&a2);???? //指针参数,传地址值
void fun3(int & x3);?????? int a3; fun3(a3);????? //引用参数,传名
以上参数用于操作数据对象
void fun4(int * &x4);????? int *a4; fun3(a4);???? //指针引用参数,传名
以上参数用于操作指针对象
3.设有变量定义 char *s[]={“Beijing”,”Shanghai”,”Guangzhou”}; 执行语句cout<<*(s+1)+1; 输出是? ? hanghai
??? s是字符指针数组
S[0] S[1] S[2] |
Beijing\0 |
Shanghai\0 |
Guangzhou\0 |
s+1 == &s[1]?????? //s是二级指针 *(s+1) == &s[1][0] *(s+1)+1 == &s[1][1]? // 一级指针 输出字符指针是输出所指串值 |
4.表述“变量x的值等于3”和“变量y的值等于5”其中有且只有一种情况成立的表达式是???????? x==3&&y!=5||x!=3&&y==5 ??或 ??(x==3)!=(y==5)
5.设有变量定义int a[4][3],*p=a[2]; 表达式 p+2 指向的元素是???? a[2][2]
a[0][0]?? a[0][1]??? a[0][2] a[1][0]?? a[1][1]??? a[1][2] a[2][0]?? a[2][1]??? a[2][2] a[3][0]?? a[3][1]??? a[3][2] |
6.将字符串str2拷贝到字符数组str1[]中,应调用函数???? strcpy(str1,str2)
7.说明语句 char *w(); 的含义是?? 函数原型。w是函数名,返回字符型指针
8.表达式new int[10] 的含义是?分配长度为10的整型数组堆内存,返回首地址
??? 分配堆要用指针记录地址
??? int *p=new int[10], *q;
??? *p = 10; p[1] = 20;???? //对动态数组的两种访问方式
??? *q = 10; q[0]=12; ????? //错误,指针没有关联对象
9.设有函数调用语句 Count(a ,num,max,min,average); 功能是由参数max, min, average返回整型数组a前num个元素中的最大值,最小值和平均值。对应的函数原型是?
void Count(int[], int, int &,int &, double &);
若调用语句为? Count(a ,num, &max, &min, &average);
则函数原型为? void Count(int[], int , int* , int* , double * );
10.有说明 struct link{ int code; link *next; }; link *head,*p;已知head为单链表的头结点,在*head之后插入*p结点操作的语句是?
??? p->next=head->next; head->next=p;????? // p->next == (*p).next
q=head; while(q->next)q=q->next; q->next=p; p->next=NULL;
q=head; while(q->next){cout<<q->code; q=q->next;}
(4)删除一个结点*(q->next)如何操作?
??? t = q->next; q ->next = t->next; delete t;
三.分析程序,写输出结果(每小题5分,共20分)
1.求>0的元素和;>0的元素个数。
#include<iostream.h>
void main()
{ int a[10]={2,4,0,-5,10,6,-8,9,6,7};
? int i,s=0,count=0;
? for(i=0;i<10;i++)
??? if(a[i]>0) s+=a[i],count++;
????? else continue;
? cout<<"s="<<s<<"? count="<<count<<endl;
}???
s=44? count=7
2. 测试静态变量和自动变量。静态变量第一次自动初始化为0,再调用时不改变。
#include<iostream.h>
a | b | a+=3 | a+b | |
① | 0 | 2 | ||
3 | 5 | |||
② | 3 | 2 | ||
6 | 8 | |||
③ | 6 | 2 | ||
9 | 11 | |||
④ | 9 | 2 | ||
12 | 14 |
void fun();
void main()
{int i;
?for(i=1;i<5;i++) ?fun(); ?cout<<endl;
}
void fun()
{static int a; ?int b=2;
?cout<<(a+=3,a+b)<<'\t';
}?
5??? 8?? 11?? 14
3.求最小公倍数
#include<iostream.h>
int lcm(int m, int n)
{ int r,a,b;
? a=m; b=n; r=m;
? do??????????????? //辗转相除法,求最大公约数
? ?{ m=n; n=r; r=m%n;
? ?} while(r);
? return a*b/n;???? //求最小公倍数
}
void main()
{ cout<<lcm(3,7)<<'\t'<<lcm(4,6)<<endl;
}?
21???? 12
4.输出数字三角型,以递归方式建立程序。
#include <iostream.h>
void printN(int n)
{ if(n)
??? { printN(n-1);
????? cout << n << ends ;
??? }
}
void print(int w)
{ if( w )
??? { print( w-1 );
????? printN(w);
????? cout << endl;
??? }
}
void main()
{? print( 5 ); }
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
四.根据程序功能填空。(每空2分,共20分)
1.本程序按以下公式计算e的值,精度为1e-6。
???
#include<iostream.h>
void main()
{ double e,t,n;
??e=0;
t=n=_____(1)_____;??????? 1.0
??while(_____(2)_____)????? t>=1e-6
??{ e+=t;
??? _____(3)_____;? ?????? t=t/n
? ??n=n+1.0;
??}
?cout<<"e="<<e<<endl;
}
2.本程序由主函数输入一字符串,调用函数,把该字符串中的数字0~9转换成小写字母a~j;所有小写字母转换成大写字符。然后在主函数输出转换后的字符串。
#include<iostream.h>
#include<ctype.h>
_____(4)_____?????????? void change(char*, char*);
void main()
{char str1[20], str2[20];
?cin>>str1;
?change(str1,str2);
?cout<<str2<<endl;
}
void change(char *s1, char *s2)
{ while(_____(5)_____)????? *s1
?{if(*s1>='0'&&*s1<='9')
???? *s2=_____(6)_____;???? *s1 + 'a' -' 0'
?? else *s2=toupper(*s1);
? _____(7)_____???????????? s1++ ; s2++;
?}
?*s2='\0';
}
3.函数create从键盘输入整数序列,以输入0为结束。按输入逆序建立一个以head为表头的单向链表。例如,输入序列为1 2 3 4 5 0,建立的链表是5 4 3 2 1。
struct node{int data; node * next;};
void create(node * &head)
{node *p;
?_____(8)_____; ??????? p = new node
?cin>>p->data;
?while(p->data!=0)
?{if(head==NULL)
??? { head=p; head->next=NULL; }
? else
{ _____(9)_____ ??? p->next = head;
_____(10)_____ ?? head = p;
}
? p=new node;
? cin>>p->data;
?}
}
五.程序设计(第1小题6分,第2、3小题各7分,共20分)
#
#?? #
#?????? #
#?????????? #
# # # # # # # # #
答案:
#include<iostream.h>
#include<iomanip.h>
void print_figure(int row, char tag)????? //行参数和符号参数
{int i;
?cout<<setw(row-1)<<" "<<tag<<endl;?????? //输出第1行
?for(i=2;i<row;i++)?????????????????????? //输出第2行到row-1行
?? cout<<setw(row-i)<<" "<<tag<<setw(2*(i-1)-1)<<" "<<tag<<endl;
?for(i=1;i<=2*row-1;i++)cout<<tag;??????? //输出最后1行
?cout<<endl;
}
void main() { print_figure(5,'*');}
(1)输入k(<100)个整数到数组x[100]中;
(2)计算k个数的平均值及大于平均值的元素个数。
答案:
#include<iostream.h>
void main()
{int x[100],k,i,n;
?double sum=0.0,ave;
?cout<<"How many Data ?\n";
?cin>>k;
?for(i=0;i<k;i++)??????? //求和
?{ cin>>x[i]; sum+=x[i];}
?ave=sum/k;????????????? //求平均值
?n=0;
?for(i=0;i<k;i++)??????? //求大于平均值的元素个数
?? if(x[i]>ave) n++;
?cout<<"average="<<ave<<"\n";
?cout<<"There are "<<n<<" elements large than average.\n";
}
(1)从键盘输入a op b。其中a, b为数值;op为字符,限制为+、-、*、/ 。
(2)调用函数count(op,a,b),计算表达式a op b的值。由主函数输出结果。
答案:
#include<iostream.h>
double count(char, double, double);
void main()
{double a,b; char op;
?cout<<"Begin count:\n";
?do
?{ cin>>a>>op>>b;
?? if(op!='+'&&op!='-'&&op!='*'&&op!='/')
????? cout<<"input error,please again:\n";
?? else break;
?}while(1);
?cout<<a<<op<<b<<"="<<count(op,a,b)<<endl;
}
double count(char op, double a, double b)
{ switch(op)
? { case '+': return a+b;
??? case '-': return a-b;
??? case '*': return a*b;
??? case '/': return a/b;
? }
}
世间温柔,不过是芳春柳摇染花香,槐序蝉鸣入深巷,白茂叶落醉故乡。