一. 单选
1. 十进制变量i的值为100,那么八进制的变量i的值为()
A.146
B 148
C 144
D 142
100/8=12 12/8=1 1/8=0100%8=4 12%8=4 1%8=1倒着算,即得144
2.执行下面语句后的输出为
int I=1;
if(I<=0)
printf("****\n") ;
else
printf("%%%%\n");
A %%
B ****
C 有语法错,不能正确执行
D %%%%
字符串有一定规定,%后跟上特性的字符才代表一定的格式化,比如:%d %f ...而%Q-->无效格式-->编译器会忽略%,printf("%Q);//直接输出Q以此类推,printf(" %% %% "\n);//打印%%
3. 对于下面的C语言声明描述正确的一项是()
char (*p)[16]
A p是长度为16的字符指针数组
B p是包含16个字符的字符串
C p是指向长度为16的字符数组的指针
D p是长度为16的字符数组
char* p[16]:p是长度为16的字符指针数组[ ]的优先级高于* ,所以加上()表示p与*先结合,所以char (*p)[16]是一个指针,p是指向长度为16的字符数组的指针
4.数组a的定义语句为“float a[3][4];”,下列()是对数组元素不正确的引用方法
A a[i][j]
B *(a[i]+j)
C *(*(a+i)+j)
D *(a+i*4+j)
a[i][j]是一个二维数组,其中a[i]指向第i行,*(a[i]+j)表示第i行的第j个元素;a+i,表示数组a中的第i个元素的地址,*(a+i)表明数组a中的第i个元素,所以*(*(a+i)+j)表示第i行的第j个元素;同理,a+i*4+j,表示数组a中的第i*4+j个元素的地址,*(a+i*4+j)则是它的元素,而数组float a[3][4]中并没有此元素,所以引用错误.
5. 下面程序的输出结果是__________。
#include < iostream.h>
#define SQR(A) A*A
void main() {
int x=6,y=3,z=2;
x/=SQR(y+z)/SQR(y+z);
cout< < x< < endl;
}
A 5
B 6
C 1
D 0
注意:#define语句中 A*A并未使用()x/=SQR(y+z)/SQR(y+z);x/=3+2*3+2/3+2*3+2-->x/=3+6+0+6+2-->x/=17-->6/=17所以x=0
6. 当n=5时,下列函数的返回值是()
i
int foo(int n){
if(n<2){
return n;
}
else
return 2*foo(n-1)+foo(n-2);
}
A 5
B 11
C 29
D 10
当n=5时,此函数进入递归调用
7. 以下对C语言的”指针“描述不正确的是()
A 32位系统下任何类型指针的长度都是4个字节
B 指针的数据类型声明的是指针实际指向内容的数据类型
C 野指针是指向未分配或者已释放的内存地址
D 当使用free释放掉一个指针内容后,指针变量的值被置为NULL
在64位系统下任何类型指针的长度都是8个字节int* pa; //pa将来指向的是int类型的空间int* p=(int*)malloc(4); free(p); //free只是将p指向的空间释放了,并不会将p指针置为空,这里需要手动p=NULL;
8. 数组定义为”int a[4][5];”, 引用”*(a+1)+2″表示()(从第0行开始)
A a[1][0]+2
B a数组第1行第2列元素的地址
C a[0][1]+2
D a数组第1行第2列元素的值
a+i:表示数组a中的第i个元素的地址;*(a+i):表明数组a中的第i个元素;a是一个二维数组,二维数组中的每个元素都是一维数组*(a+1):实际是个一维数组,*(a+1)+2,则表示a数组第i行第2列元素的地址
9. 有一个如下的结构体:
struct A{
long a1;
short a2;
int a3;
int *a4;
};
请问在64位编译器下用sizeof(struct A)计算出的大小是多少()
A 24
B 28
C 16
D 18
首先,在64位编译器下的结构体最大对齐数是8,,而结构体的整体大小为最大对齐数的整数倍,所以排除B D选项其次指针在64位编译器下所占大小为8个字节,其成员变量内存对应大小分别为4 2 4 8对其规则是第一个成员在与结构体变量偏移量为0的地址处,其他成员变量对齐到对齐数的整数倍地址处所以算得最后结果是28.
10.运行结果是()
#include <iostream>
using namespace std;
int f(int n){
if (n==1)
return 1;
else
return (f(n-1)+n*n*n);
}
int main(){
int s=f(3);
cout<<s<<endl;
return 0;
}
A 8
B 9
C 27
D 36
s=f(2)+3*3*3
f(2)=f(1)+2*2*2
f(1)=1
所以s=1+8+27=36
二. 编程
1. ACM编程题 标题:不要二 | 时间限制:1秒 | 内存限制:32768K
二货小易有一个W*H的网格盒子,网格的行编号为0~H-1,网格的列编号为0~W-1。每个格子至多可以放一
块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。
对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为:
( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根
思路,即 两个格子坐标(x1,y1),(x2,y2)的欧几里得距离不能为4,其中,4可由以下部分组成0+4=41+3=4 //不满足2+2=4 //不满足3+1=4 //不满足4+0=4即当x1==x2时,y1-y2=2,y1=y2-2当y1==y2时,x1-x2=2,x1=x2-2
#include <iostream>
#include<vector>
using namespace std;
int main() {
int w, h;
cin >> w >> h;
vector<vector<int>> a;
a.resize(w);
for (auto& e : a) {
e.resize(h, 1);//将二维数组初始化为1
}
int count = 0;
for (int i = 0; i < w; i++) {
for (int j = 0; j < h; j++) {
if (a[i][j]==1)
{
count++;
if(i+2<w)//防止数组越界
a[i+2][j]=0;
if(j+2<h)
a[i][j+2]=0;
}
}
}
cout<<count<<endl;
return 0;
}
2. 完善核心代码 标题:把字符串转换成整数 :将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为 0 或者字符串不是一个合法的数值则返回 0
class Solution {
public:
int StrToInt(string str) {
//getline(cin,str);
if(str.empty())
return 0;
int flag=1;//标记正负数
if(str[0]=='-')
{
flag=-1;
str[0]='0';
}
else if(str[0]=='+')
{
flag=1;
str[0]='0';
}
int sum=0;
for(int i=0;i<str.size();i++)
{
if(str[i]<'0'||str[i]>'9')
{
sum=0;
break;
}
sum=sum*10+str[i]-'0';//在ASCII中,'1'-'0'=1
}
return sum*flag;
}
};