ForFisrtWork--No.4:编程题专页

来源:互联网 发布:阿里云服务器 知乎 编辑:程序博客网 时间:2024/06/07 13:22

持续更新中,所以暂时比较乱,敬请谅解!

1.实现一个类,该类不可以被继承,同时该类只可以定义有限个对象

        在C++ 中没有final 这个关键字,要实现这个要求还是需要花费一些精力。首先想到的是在C++ 中,子类的构造函数会自动调用父类的构造函数。同样,子类的析构函数也会自

动调用父类的析构函数。要想一个类不能被继承,我们只要把它的构造函数和析构函数都定义为私有函数。

#include<iostream>using namespace std;class FinalClass1{    public :            static int count ;//实例化次数            static FinalClass1* GetInstance()            {                if(count<=0)                    return NULL;                count--;                return new FinalClass1;            }            static void setCount(int n)            {                count  = n;            }            static void DeleteInstance( FinalClass1* pInstance)            {                delete pInstance;                pInstance = 0;            }     private :           FinalClass1()    {   cout<<"con"<<endl;   }           ~FinalClass1()    {   cout<<"decon"<<endl;   }};int FinalClass1::count=0;void main(){    FinalClass1::setCount(3);    FinalClass1 *f1 = FinalClass1::GetInstance();    FinalClass1 *f2 = FinalClass1::GetInstance();    FinalClass1 *f3 = FinalClass1::GetInstance();    if (f3==NULL)    {        printf("f3 NULL\n");    }    else    {        printf("f3 Not NULL\n");    }FinalClass1::DeleteInstance(f3);    FinalClass1 *f4 = FinalClass1::GetInstance();    if (f4==NULL)    {        printf("f4 NULL\n");    }    FinalClass1 *f5 = FinalClass1::GetInstance();    if (f5==NULL)    {        printf("f5 NULL\n");    }}
结果:这个好好解释必须看专业书籍啊,待回看。


2.实现字符串中空格的去除,不能用系统函数现在只能想到比较常规的方法,见:http://wenku.baidu.com/view/60fa79380912a216147929a1.html

3.实现字节的逆序  现在只能想到比较常规的方法,更好的方法见:http://log4think.com/reverse_byte_bit/?replytocom=24

4.求两个时间的时间差,不能用系统函数。

  类似的poj--acm题,见:http://blog.csdn.net/dscyw/article/details/8766968本题的参考程序也在其中。

5.请不用任何c runtime函数实现以下函数:Inter trim_str(char *pstr)

   函数功能如下:

   1) 滤掉字符串头尾的空格、回车、tab

   2) 输出字符串通过输入字符串指针返回

   3) 如果成功则返回0否则返回非0

参考程序如下:回车和题目要求的返回值问题我没有处理好,以后完善。

#include<iostream>using namespace std;int trim_str(char *pstr){int beg=0,end=0,i=0;while(pstr[i]==' ' || pstr[i]==13 || pstr[i]=='\t')i++;beg=i;while(pstr[i]!='\0') i++;while(pstr[i]==' ' && pstr[i]==13 && pstr[i]=='\t')i--;end=i;cout<<beg<<endl<<end<<endl;for(i=0;i<=end-1-beg;i++){pstr[i]=pstr[i+beg];}pstr[i]='\0';return 0;}int main(void){char strTemp[]="I absolutely Love China";char *str=strTemp;//必须这样处理下,奥妙见:http://blog.csdn.net/dscyw/article/details/8759438if(!trim_str(str)) cout<<str<<endl;return 1;}
运行结果:


6.N个大小不等的自然数(123…..N)请将它们从小到大排列。算法要求:时间复杂度为On),空间复杂度为O1)。

 请简要说明你采用的排序算法并写出c的伪代码。

 本题用快速排序算法,排序算法有必要复习下了,见:http://blog.csdn.net/dscyw/article/details/8763754


7.裴波那絜数列的形式如下: 1 1 2 3 5 8 13……. n,编写一个函数计算数列中第n个元素的值。

参考程序:

int Fibonax(int n){if(n==1 || n==2)    return 1;else    return Fibonax(n-1)+Fibonax(n-2);}int main(){cout<<Fibonax(9)<<endl;return 1;}


8.不调用任何系统函数,实现在一个字符串中查找子串的函数,如果包含子串,则返回该子串的位置值。(7分)

参考程序如下:

#include<iostream>#include<cstring>using namespace std;int GetCommon(char *s1, char *s2){int loca;int len1 = strlen(s1);int len2 = strlen(s2);for(int i = 0; i < len1; i++){if(s1[i] == s2[0]){int as = i, bs = 0, count = 1;while(as + 1 < len1 && bs+ 1 < len2 && s1[++as] == s2[++bs])count++;if(count == len2){loca = i;return loca;}}    }}int main(void){char *str1="I absolutely Love China";char *str2="Love";cout<<GetCommon(str1,str2)<<endl;return 1;}
运行结果:



9.用算法实现将一个输入的数字颠倒,要求不调用任何系统函数,也不能将输入数字转换为字符串作为中间过渡。(8分)

方法1:(字符数组,借鉴)

#include <stdio.h>

#include <string.h>

#include <dos.h>

int main()

{

charstr[] = "ABCD1234efgh";

intlength = strlen(str);

char* p1 = str;

char* p2 = str + length - 1;

while(p1< p2)

{

char c = *p1;

*p1 = *p2;

*p2 = c;

++p1;

--p2;

}

printf("strnow is %s\n",str);

system("pause");

return0;

}

方法2:递归或栈

void reverse()

{

    stack s;

    int x;

    while (cin>>x)

    {

       s.push(x);

    }

    while (!s.empty())

    {

       x = s.pop();

       cout<<x;

    }

}

原创粉丝点击