专项练习:数组和字符串(一)

来源:互联网 发布:php类的实例化关键字 编辑:程序博客网 时间:2024/06/18 17:42

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+bint 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 字符串拷贝时, 未检测是否有足够空间, 可能造成程序崩溃.

0 0
原创粉丝点击