1. 程序输出的结果
#include<stdio.h>
int f (char x){
return x*x%10;
}
main(){
char a;
int b=0;
for (a=0; a<5; a+=1){
b =f(a);
printf("%d",b);
}
}
主函数中for循环,
a=0,满足条件a<5,执行循环体,b=0*0%10,输出b,a+=1;
a=1,满足条件a<5,执行循环体,b=1*1%10,输出b,a+=1;
a=2,满足条件a<5,执行循环体,b=2*2%10,输出b,a+=1;
a=3,满足条件a<5,执行循环体,b=3*3%10,输出b,a+=1;
a=4,满足条件a<5,执行循环体,b=4*4%10,输出b,a+=1;
a=5,不满足条件a<5,执行完。
2.假设要存储一个数据集,数据维持有序,对其的操作只有插入、删除和顺序遍历,综合存储效率和运行速度,下列哪种数据结构是最适合的是?
链表
3.下面有关空指针和未初始化指针,说法错误的是?
A.对0x0这个地址取值是非法的。
正确
B.空指针可以确保不指向任何对象或函数; 而未初始化指针则可能指向任何地方。
正确
C.空指针与任何对象或函数的指针值都不相等。
正确
D.mallc在其内存分配失败时返回的是一个未初始化的指针
错误,mallc分配内存失败时返回的是空指针。
4.程序的输出结果
main()
{
int x;
scanf(“ % d”, &x);
if (x-- < 5) printf(“ % d”, x);
else printf(“ % d”, x++);
}
程序运行后,如果从键盘上输入5,则输出结果是 :4
条件x–<5中,先进行x<5的判断,再进行x–运算;(不是只有x<5为真时才x–)
输入5后,判断,5不满足x<5的判断条件,x–后,x=4;
进行else后面语句,由于输出变量是x++,先输出x,x=4,再进行x++,此时x=5;
若输出语句换成++x,就先进行++x,再输出x。
5.程序输出的是
#define add(a,b) a+b
int main()
{
printf(“ % d\n”, 5 * add(3, 4));
return 0;
}
#define add(a,b) a+b
即在程序中出现add(a,b)的地方全用a+b代替,只是简单替换;(重在理解简单替换)
程序中出现 5 * add(3, 4),通过替换变为 5* 3+4,即为19。
6.说法正确的是
A 一个空类默认一定生成构造函数,拷贝构造函数,赋值操作符,引用操作符,析构函数。
争议:
空类中有六个默认的成员函数: 1:构造函数 2:拷贝构造函数 3:析构函数 4:=运算符重载函数 5:取址运算符重载 6:const修饰的取址运算符重载(并返回const指针)
B 可以有多个析构函数。
错误:一个类只能有一个析构函数
C 析构函数可以为virtual,可以被重载。
错误:析构函数没有参数列表,无法重载,但是可以重写 。
D 类的构造函数如果都不是public访问属性,则类的实例无法创建。
错误:单例模式下,成员函数私有可以实例化。
7.程序的输出
int FindSubString( char* pch )
{
int count = 0;
char * p1 = pch;
while ( *p1 != '\0' )
{
if ( *p1 == p1[1] - 1 )
{
p1++;
count++;
}else {
break;
}
}
int count2 = count;
while ( *p1 != '\0' )
{
if ( *p1 == p1[1] + 1 )
{
p1++;
count2--;
}else {
break;
}
}
if ( count2 == 0 )
return(count);
return(0);
}
void ModifyString( char* pText )
{
char * p1 = pText;
char * p2 = p1;
while ( *p1 != '\0' )
{
int count = FindSubString( p1 );
if ( count > 0 )
{
*p2++ = *p1;
sprintf( p2, "%i", count );
while ( *p2 != '\0' )
{
p2++;
}
p1 += count + count + 1;
}else {
*p2++ = *p1++;
}
}
}
void main( void )
{
char text[32] = "XYBCDCBABABA";
ModifyString( text );
printf( text );
}
FindSubString函数功能:
指针p1后字母上升(每次加1)的次数和字母下降(每次减1)的次数相同,则return(count),否则return 0;
text[32] = “XYBCDCBABABA”,p1指向X,X后面元素只升一次,没有降则return 0;指针向后移动,
p1指向Y,Y后面元素没有升则return 0;*p2++ = *p1++;指针向后移动,
p1指向B,B后面元素升两次降三次,则return 0;*p2++ = *p1++;指针向后移动,
p1指向C,C后面元素升一次降三次,则return 0;*p2++ = *p1++;指针向后移动,
p1指向D,D后面元素没有升,则return 0;*p2++ = *p1++;指针向后移动,
p1指向C,C后面元素没有升,则return 0;*p2++ = *p1++;指针向后移动,
p1指向B,B后面元素没有升,则return 0;*p2++ = *p1++;指针向后移动,
p1指向A,A后面元素升一次降一次,count=1,则return (count);
进入ModifyString函数:
count =1,
此时p1指向第一个A,经过*p2++ = *p1,p2指向第一个A后面的B;
sprintf( p2, “%i”, count );语句是将count转化为字符串(带’\0’),即将p2指向的B用1代替,并将’\0’添加到1的后面;
while ( *p2 != ‘\0’ ){p2++;}语句执行完,此时p2指向第二个A的位置;
p1 += count + count + 1;后,p1指向第二个A后面的B的位置;
此时,在函数ModifyString继续执行 while ( *p1 != ‘\0’ )的循环体,这之后没有对称回文子串,则执行*p2++=*p1++,直到p1到达串尾,即用倒数第二个字符替换倒数第三个,用倒数第一个字符替换倒数第二个,即B换A,A换A。
最后输出为 :XYBCDCBA1BAA
8.char (*p)[16]
p是指向长度为16的字符数组的指针
9.内联函数,说法正确的是:
A 一般用于加快程序执行速度
B 可能减小可执行文件大小
C 可能增加可执行文件大小
10.程序哪有问题
class CBuffer
{
char * m_pBuffer;
int m_size;
public:
CBuffer()
{
m_pBuffer=NULL;
}
~CBuffer()
{
Free();
}
void Allocte(int size) (1) {
m_size=size;
m_pBuffer= new char[size];
}
private:
void Free()
{
if(m_pBuffer!=NULL) (2)
{
delete[] m_pBuffer;
m_pBuffer=NULL;
}
}
public:
void SaveString(const char* pText) const (3)
{
strcpy(m_pBuffer, pText); (4)
}
char* GetBuffer() const
{
return m_pBuffer;
}
};
void main (int argc, char* argv[])
{
CBuffer buffer1;
buffer1.SaveString("Microsoft");
printf(buffer1.GetBuffer());
}
1 3 4 有问题。
1 分配内存时, 未检测m_pBuffer是否为空, 容易造成内存泄露;
3 常成员函数不应该对数据成员做出修改, 虽然可以修改指针数据成员指向的数据, 但原则上不应该这么做;
4 字符串拷贝时, 未检测是否有足够空间, 可能造成程序崩溃.