实验室第一次考核(C语言)

一、选择

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;
}
总结:

这次考核暴露出许多问题,前边学习的基础掌握的还不是很好,特别是指针,感觉没学懂,学的有点乱,之后还要再看看。平时还是要多实践,有些概念觉得懂了,其实不会用,等于没学!

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值