在经过了全是数学与概率的笔试题之后,今天终于开始了编程类的题目,大题有两道,第一道为选择一种排序进行十个数字的排序。
第二题为,逆时针构造一个二维数组。
写了半天,没写出来,这个边界还是太难控制,刚刚才想通,写出来:
#include <iostream>
using namespace std;
void main()
{
int n;
cin>>n;
int *ar = new int[n*n];
int start = 0;
int end = n;
int flag = 0;
int len = 0;
int num = 0;
while(len < n*n)
{
while(len < n*n && start < end)
{
ar[start++] = ++len;
}
start--;
start += n;
end = (n-num)*n;
while(len < n*n && start < end)
{
ar[start] = ++len;
start += n;
}
start-=n;
start --;
end = (n-num-1)*n - 1;
while(len < n*n && start > end)
{
ar[start--] = ++len;
}
start++;
start -= n;
end = n*(num+1) - 1;
while(len < n*n && start > end)
{
ar[start] = ++len;
start -= n;
}
num++;
start++;
start += n;
end = n*(num+1)-(num);
}
for(int i = 0,j = 0; i < n*n; ++i)
{
cout<<ar[i]<<" ";
j++;
if(j == 4)
{
cout<<endl;
j = 0;
}
}
cout<<endl;
}
除了这个编程大题之外,有一道小题,很有坑:
#include <iostream>
using namespace std;
class A
{
private:
char *buf;
public:
A()
{
buf = new char[256];
printf("1");
}
virtual ~A()
{
delete []buf;
printf("2");
}
};
void main()
{
void *pa = new A;
delete pa;
}
程序的输出为1.
只输出一个1,并不是因为他是虚函数而不调用,而是因为这个void *指针,目测这个delete只是释放了指针本身,并没有调用指针所指对象的析构函数。可能也是因为他本身没有类型的原因吧。
还有一道对新手而言,可以好好练练同名隐藏与同名覆盖的问题,挺好的:
#include <iostream>
using namespace std;
class Base
{
public:
virtual void a(){cout<<"Base::a"<<endl;}
void b(int i){cout<<"Base::b(int)"<<i<<endl;}
void b(float i){cout<<"Base::b(float)"<<i<<endl;}
};
class child:public Base
{
public:
void a(){cout<<"chile::a"<<endl;}
void b(int i){cout<<"child::b(int)"<<i<<endl;}
};
void main()
{
child c;
Base *pb = &c;
child *pc = &c;
pb->a();
pb->b(1);
pb->b(3.14f);
pc->b(1);
pc->b(3.14f);
}
以上的代码,只需要说明两点,同名隐藏是函数名相同就可以的隐藏现象,而覆盖是发生在虚函数与继承当中的,函数名相同,参数列表与返回值也相同的现象。