金山软件2009年中南大学笔试题(JAVA)

 1,请指出下面程序的错误,并尝试修改之
#define countof(a) {sizeof(a)/sizeof(a[0]))}

int sum(int[] values)
{
   int s;
   for(int i=0;i<countof(values);++i)
      s+=values[i];
   return s;
}

int wmain()
{
   const int[] values={7,5,6,3,3,3,5,6,8,8};
   int s=sum(values);
   std::wcout<<L"Sum="<<s<<std::endl;
   return 0;
}

2,阅读以下程序,请指出程序中存在哪些不正确或者危险的操作:

class ShapeCollection;
extern ShapeCollection g_Shapes;

class Shape
{
  public:
      Shape()
      {
         g_Shapes.Add(this);
      }
      virtual ~Shape()
      {
          Dispose();
      }
  private: void Dispose()
          {
            FreeResources();
            g_Shapes.Remove(this);
          }
          virtual void FreeResources()=0;
};

class Rectangle:public Shape
{
  int left,top,right,bottom;
public:
  Rectangle()
  {
       memset(this,o,sizeof(this));
  }
private:
   void FreeResources(){}

};


3,请解释C++中以下语法特征,其用法、作用和使用场合。
使用const关键字修饰方法;
关键字mutable;
重载new/delete操作符(全局和类),提供定制的对象分配、释放行为;
4,为了保存一分不相同的字符串表,我们可以使用以下数据结构(在实际的情况中,它并非最优方案):
std::set<std::wstring>MyStringTable;
如果现在的需求是,在比较字符串时不区分大小写,请写出如何修改以上的定义。提示,set类的模板参数为:
template<class _Key,class _Pr=less<_Key>,class _Al=allocator<_Key>>
class set;

第二部分
1,结构RECT可以表示一个平面上的矩形区域
struct RECT
{
   int left,top,right,bottom;
};
如果给定两个区域A和B,请构造一个函数,给出区域A被B切掉之后剩余的区域。需要注意的是,剩余的区域可能不止一个。例如,区域(0,0)-(2,2)被(2,2)-(3,3)切掉之后,剩余的两个区域可以表示为(0,0)-(2,1)和(0,2)-(2,1)(两种表示方式均可)。

2,给定一个介于0与1之间的小数,以及分母的最大位数(1-6位)。请构造一个程序,寻找分母在指定位数之内,与给定小数最接近的分子——分母对(显然,分子、分母须为整数)。例如,黄金分割比0.618...,分母限定为2位时,最接近的分数为55/89;分母限定为3位时,为610/987。

3,一个64*64的单色位图,可以保存在如下一个BYTE数组中:
BYTE buffer[64*8]
其中,每个字节按照从低位到高位的顺序保存8个点,8个字节构成一行;按照从左到右,逐行向下的顺序存放。
试完成一个函数,其声明:
void Transpose(const * pSource,BYTE* pTarget)
它完成点阵的转置,亦即,原来在位置(x,y)的点保存到(y,x)上。

第三部分
1,给丁一组坐标点{(xi,yi)|i},用最小二乘法进行线性拟和,标准的拟合公式为:

但是,由于浮点数计算误差的存在,如果完全按照此公式进行的计算,其结果误差将可能达到不可接受的程度。通过对公式进行变形,可以大幅度减小计算的误差。
实际上,误差产生的原因是两个大数相减(上面公式中每个分子和分母都是这样的结构)。
试给出一个方案,通过对公式进行调整以消除由此带来的误差,请写出思路和结果公式,不需要书写程序。

1。输入正整数M、N,将M分成N个正整数的和,并且N个正整数各不相同,在屏幕上打印出分法个数。例如:M=5,N=2,那么,结果应该为2(有两种分法:5 = 1 + 4或者5 = 2 + 3)。 2。编程计算给定的整数在用二进制来表示时含有多少个1。例:十进制整数13用二进制表示为1101,含有3个1。 3。编程求整数区间[a,b]和[c,d]的交集例如:从键盘输入1,10,5,15这四个数表示[1,10],[5,15],输出结果:[5,10] 4。请编写一个字符串处理函数,其功能为:把字符串中的所有的字母A都移动到字符串末尾,处理完后字符串的长度应保持不变,新字符串保存与在原字符串相同的内存空间中。 5。给定一个介于0与1之间的小数,以及分母的最大位数(1-6位)。请构造一个程序,寻找分母在指定位数之内,与给定小数最接近的分子——分母对(显然,分子、分母须为整数)。例如,黄金分割比0.618...,分母限定为2位时,最接近的分数为55/89;分母限定为3位时,为 610/987。
/*先写第二三四五个, 第一个再想想,有难度*/
/*2*/
#include <stdio.h>

int main()
{
int n;
printf("enter a integer:");
scanf("%d", n

printf("the number'1' the integer is: %d /n", dtob(n));

return 0;
}

int dtob(int n)
{
int count = 0;

while (n != 0)
{
if (n % 2 == 1)
{
count++;
}
n /= 2;
}

return count;
}

/*3*/
#include <stdio.h>

int main(int argc, char *argv[])
{
int a, b, c, d, i;
printf("enter a:");
scanf("%d", a
printf("enter b:");
scanf("%d", b
printf("enter c:");
scanf("%d", c
printf("enter d:");
scanf("%d", d

if (a > b || c > d)
{
printf("input error");
exit(1);
}

if (b < c || d < a)
{
printf("no intersection/n");
return 0;
}

if (a < c & c)
{
printf("intersection:[");

for (i = c; i <= (b < d ? b : d); i++)
{
printf("%d, ", i);
}

printf("]/n");
}

if (c < a & a)
{
printf("intersection:[");

for (i = a; i <= (d < b ? d : b); i++)
{
printf("%d, ", i);
}

printf("]/n");
}

return 0;
}

/*请编写一个字符串处理函数,其功能为:
把字符串中的所有的字母A都移动到字符串末尾,处理完后字符串的长度应保持不变,
新字符串保存与在原字符串相同的内存空间中。*/

#include <stdio.h>

int main(int argc, char *argv[])
{
int i, j;
char ch;
char s[50];

printf("enter a string(no more than 50):/n");
scanf("%s", s);

printf("%d/n", strlen(s));

for (i = 0; i < strlen(s)-1; i++)
{
if (s[i] == 'A')
{
ch = 'A';

for(j = i; j < strlen(s)-1; j++)
{
s[j] = s[j+1];
}

s[strlen(s)-1] = ch;
}
}

puts(s);

return 0;
}

/*给定一个介于0与1之间的小数,以及分母的最大位数(1-6位)。请构造一个程序,寻找分母
在指定位数之内,与给定小数最接近的分子——分母对(显然,分子、分母须为整数)。例如,
黄金分割比0.618...,分母限定为2位时,最接近的分数为55/89;分母限定为3位时,
为 610/987。*/

#include <stdio.h>
#include <math.h>

int main(int argc, char *argv[])
{
int bit, m, n;
long i, j, max = 1;
double decimalFraction, t = 1.0, x;
printf("enter the decimal fraction(0<x<1):");
scanf("%lf", &decimalFraction);

printf("enter the bits:");
scanf("%d", b

for (i = 0; i < bit; i++)
{
max *= 10;
}

printf("%lf/n", decimalFraction);
printf("%d/n", bit);
printf("%ld/n", max);

for (i = 2; i < max; i++)
{
for (j = 1; j < i; j++)
{
x = (double)j / i;
if (t > fabs(x - decimalFraction))
{
t = fabs(x - decimalFraction);
m = i;
n = j;
}
}
}

printf("/n");
printf("分子:%d/n", n);
printf("分母:%d/n", m);

return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

do2jiang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值