c语言错误分析

实验室第一次考核

一.选择题

1.在调用函数时,如果实参是简单变量,它与对应形参之间的数据传递方式是( ).
A、单向值传递
B、地址传递
C、由实参传给形参,再由形参传回实参
D、传递方式由用户指定

由实参传向形参,而形参值的改变不能改变实参的值。所以为单向值传递。
选A

2.在双向链表指针p的指针前插入一个指针q的结点,操作是___________.
A、q->next=p; q->prior =p->prior; p->prior->next=q; p->prior =q;
B、p->prior=q; q->next=p; p->prior->next=q; q->prior =q;
C、p->prior=q; p->prior->next=q; q->next=p; q->prior =p->prior;
D、q->prior =p->prior; q->next=q; p->prior=q; p->prior =q;

本题考的是双向链表,与单链表相比,多了一个指针域,分别指向结点的前一个结点和后一个结点。
在断开原始连接之前,我们应该先要将即将断开部分的前后连接保存下来,也就是链表插入的第一步,将q的前驱指向原始链表的中的P。然后,将q的前驱指向P的前驱节点,这样就保证了链表的前后部分不丢失。然后是第三步,将P结点的前驱节点的下一个指向q,将p的前驱节点指向q。
选A

在这里插入图片描述

3.struct student{
char name[10];
int age;
char gender;
}std[3], *p=std;
则以下各输入语句中错误的是:
A、scanf("%c" ,&std[0] .gender);
B、scanf("%d" ,&(*p) .age );
C、scanf("%c" ,&(p->gender));
D、scanf("%s" ,&std.name);

D:std是首地址,首地址里面没有成员name,错误
正确的写法应该是scanf(“%s”,&std[0].name)

4.以下字符中不是转义字符的是( ).
A、‘\c’
B、‘\b’
C、‘\a’
D、‘\’

转义字符作用
\a响铃
\b退格,将当前位置移到前一列
\代表一个反斜线字符“”
\f换页
\t水平制表,跳到下一个Tab位置
\v垂直制表
\n换行

因此选择A

二.多选题

在这里插入图片描述

先要知道[ ]的优先级是高于 * 的优先级的,因此A错误
x+ii 表示第ii行这个一位数组的地址, 解引用就是第ii行这个一位数组
x+ii+j 表示 第 ii+j 行这个数组的地址 这就不对了,B错误
a[i][j] == p[i][j] == *(a[i]+j) == *(p[i]+j) == ((a+i)+j) == ((p+i)+j)

三.填空题

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;
}
输出答案为____.(答案用单个空格分隔)

本题考的是一维数组指针
*(a+1) ==2
int *ptr = (int )(&a + 1)
(&a+1)先取变量a的地址,并根据a的地址获得下一个与a同类型的相邻地址
因此&a+1指向的地址为&a[5]
所以ptr指向&a[5],并且ptr是一个int类型的指针
所以(ptr - 1) == a[4] == 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;
}
输出答案为____.

二维数组初始化,还有逗号运算符。
这是圆括号,是逗号表达式
int a[3][2] = {(0,1),(2,3),(4,5)}我们会误认为是int a[3][2] = {{0,1},{2,3},{4,5}};
所以实际二维数组的初始化是int a[3][2] = {1,3,5};
输出的就是a[0][0] == 1;

简答题

1.简述结构体和共用体的区别。

两者最大的区别在于内存的分配,结构体和共用体的区别在于:结构体的各个成员会占用不同的内存互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员,结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。

2.下述三个定义有什么区别?
char * const p;
char const * p
const char *p

char * const p; //常量指针,p的值不可以修改
char const * p;//指向常量的指针,指向的常量值不可以改
const char *p; //和char const *p

螺旋矩阵

在这里插入图片描述

在这里插入图片描述

思路

当矩阵的方向为:“向右” ,此时坐标的纵坐标不变,横坐标++;
改变范围:0 ~ n - 1
当矩阵的方向为:“向下” ,此时坐标的纵坐标++,横坐标不变;
改变范围:0 ~ n - 1
当矩阵的方向为:“向左” ,此时坐标的纵坐标不变,横坐标–;
改变范围:n - 1 ~
当矩阵的方向为:“向上” ,此时坐标的纵坐标–,横坐标不变;
用四个for循环来完成对矩阵的值的输入

代码实现

#include<stdio.h>
int main(){
	int n,i,j;
	scanf("%d %d %d",&n,&i,&j);
	int x[300][300] = {1};// 将数组初始化为1,考虑了n = 1时的情况 
	int a,b;
	int num=1;
	for(a=0;a<=n/2;a++){
		// 上边框 
		for(b=a;b<=n-a-1;b++)
			x[a][b]=num++;
		// 右边框
		for(b=a+1;b<=n-a-1;b++)
			x[b][n-a-1]=num++;
		// 下边框
		for(b=n-a-2;b>=a;b--)
			x[n-a-1][b]=num++;
		// 左边框
		for(b=n-a-2;b>a;b--)
			x[b][a]=num++;
		// n为奇数的情况
		if(n%2==1)
			x[n/2][n/2]=n*n; 
	}
	printf("%d",x[i - 1][j - 1]);
	return 0;
}

运行结果

在这里插入图片描述

总结反思

通过本次考核发现对于许多基础的知识点掌握不牢固,对于书本上的有些边边角角的内容没了解到,基础知识不扎实。而且对于算法题要多加练习,在以后学习中要注意暴露出的这些问题加以改正,努力学习。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Anan.3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值