一、选择
1.
#include<stdio.h>
void main()
{
int i,j;
scanf("%3d%2d",&i,&j);
printf("i=%d,j=%d\n",i,j);
}
如果从键盘上输入1234567<回车>,则程序的运行结果是______.
A.i=1234,j=567
B.i=123,j=45
C.i=123,j=4567
D.i=1,j=2
答案:B
错误答案:A
i以整数形式读取三个,j以整数形式读取两个
2.
已知char x[]=“hello”, y[]={‘h’,‘e’,‘a’,‘b’,‘e’};, 则关于两个数组长度的正确描述是( ) .
A.以上答案都不对
B.x小于y
C.x大于y
D.相同
答案:C
错误答案:D
x[]算六个元素,结尾换行符\n
y[]只有五个元素
3.(多选)
已知 ii,j 都是整型变量,下列表达式中,与下标引用X[ii][j]不等效的是( ).
A.((X+ii)+j)
B.(X+ii)[j]
C.(X[ii]+j)
D.*(X+ii+j)
答案:BD
错误答案:CD
二维数组做指针变量的概念没掌握好
二、填空
1.
以下代码:
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int *)(&a + 1);
printf("%d,%d", *(a + 1), *(ptr - 1));
system("pause");
return 0;
}
输出答案为____.(答案用单个空格分隔)
答案:2 5
错误答案:2 1
&a+1则表示数组a后边的下一个数组,这里它强制转换成(int*),则(&a+1)变为4字节,即5后边的四个字节,*(ptr-1)即是 5;
2.
以下代码:
int main()
{
int a[3][2] = { (0, 1 ), ( 2, 3 ), (4, 5 ) };
int *p;
p = a[0];
printf("%d\n", p[0]);
system("pause");
return 0;
}
输出答案为____
答案:1
错误答案:0
这里定义的数组里的(,)是运算符,先取右值,即1,3,5
再计算,应该是1
三、简答
1.简述结构体和共用体的区别。
答案:
两者最大的区别在于内存的分配,结构体和共用体的区别在于:
结构体的各个成员会占用不同的内存互相之间没有影响;
结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙)。
共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员;
共用体占用的内存等于最长的成员占用的内存;
共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。
2.通过键盘输入两整型变量a和b,定义两个指针变量p1和p2指向整型变量a和b,然后a和b之间相互比较,a若小于b,则调用函数swap,实现a和b两数交换,然后再按从小到大顺序输出。(拍照上传)
答案:
#include<stdio.h>
int swap(int *p1,int *p2)
{
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
int main()
{
int a,b;
int *x1,*x2;
scanf("%d %d",&a,&b);
x1=&a;
x2=&b;
swap(x1,x2);
printf("a=%d,b=%d\n",a,b);
if (a<b)
printf("%d,%d",a,b);
else
printf("%d,%d",b,a);
}
3.下述三个定义有什么区别?
char * const p;
char const * p
const char *p
答案:
char * const p; //常量指针,p的值不可以修改
char const * p;//指向常量的指针,指向的常量值不可以改
const char *p; //和char const *p
四、编程
螺旋矩阵
题目:
一个 nn 行 nn 列的螺旋矩阵可由如下方法生成:
从矩阵的左上角(第 11 行第 11 列)出发,初始时向右移动;如果前方是未曾经过的格子,则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入 11, 22 , 33, … , nn ,便构成了一个螺旋矩阵。
下图是一个 n = 4 时的螺旋矩阵。
输入格式
输入共一行,包含三个整数 n,i,jn,i,j ,每两个整数之间用一个空格隔开,分别表示矩阵大小、待求的数所在的行号和列号。
输出格式
输出一个整数,表示相应矩阵中第 ii 行第 jj 列的数。
数据范围
对于50%的数据:
1<=n<=100;
对于100%的数据: 1<=n<=30000,1<=i<=n,1<=j<=n
样例输入
4 2 3
样例输出
14
代码:
#include<stdio.h>
int f(int n,int x,int y)
{
if(x!=1&&y!=1&&x!=n&&y!=n)
{
return f(n-2,x-1,y-1)+(n-1)*4;
}
else
{
if(x==1)
{
return y;
}
if(y==n)
{
return (n-1)+x;
}
if(x==n)
{
return 3*n-y-1;
}
if(y==1)
{
return 3*(n-1)+(n-x+1);
}
}
}
int main()
{
int n,x,y;
scanf("%d%d%d",&n,&x,&y);
int p=f(n,x,y);
printf("%d\n",p);
return 0;
}
总结:
这次考核暴露出许多问题,前边学习的基础掌握的还不是很好,特别是指针,感觉没学懂,学的有点乱,之后还要再看看。平时还是要多实践,有些概念觉得懂了,其实不会用,等于没学!