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;
}
金山软件2009年中南大学笔试题(JAVA)
最新推荐文章于 2024-11-01 14:48:20 发布