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

本文详细介绍了如何在C++中创建一个不可继承的类,并实现了特定的功能,包括实例计数、构造与析构过程的私有化,以及如何通过静态方法管理类实例。此外,还提供了字符串处理、字节逆序、时间差计算、字符串裁剪、自然数排序及裴波那契数列计算等实用示例。

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

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/8759438
	if(!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;

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值