单选
在双向链表指针p的指针前插入一个指针q的结点,操作是___________.
A、q->next=p; q->prior =p->prior; p->prior->next=q; p->prior =q;
B、q->prior =p->prior; q->next=q; p->prior=q; p->prior =q;
C、p->prior=q; q->next=p; p->prior->next=q; q->prior =q;
D、p->prior=q; p->prior->next=q; q->next=p; q->prior =p->prior;
正确答案: A
以下字符中不是转义字符的是( ).
A、‘\b’
B、‘\’
C、‘\a’
D、‘\c’
正确答案: D
解析:
样式 | 含义 |
---|---|
\n | 换行 ,将当前位置移到下一行开头 |
\’ | 单引号 |
\\ | 反斜杠 |
\r | 回车 |
\t | 水平制表 |
\v | 垂直制表 |
\a | 响铃 |
\b | 退格 ,将当前位置 |
在调用函数时,如果实参是简单变量,它与对应形参之间的数据传递方式是( ).
A、单向值传递
B、地址传递
C、传递方式由用户指定
D、由实参传给形参,再由形参传回实参移到前一列
正确答案: A
解析:
调用自定义函数时有两种数据传递方式:
(1)值传递:
实参向形参的数据传递是“值传递”,单项传递,只能由实参传向形参,不能由形参传向实参。
(2)址传递:
用数组元素作实参时,向形参变量传递的是数组元素的值,而用数组名作函数参数时,向形参(数组名或指针变量)传递的是数组首元素的地址。
对二维数组的正确定义是( ).
A、int a[2,3]={1,2,3,4,5,6};
B、int a[2] [ ]={1,2,3,4,5,6};
C、int a[ ] [3]={1,2,3,4,5,6};
D、int a[ ] [ ]={1,2,3,4,5,6};
正确答案: C
解析:这个题错的非常不应该;二维数组的初始化,行可以省略但列不能省略。
则以下各输入语句中错误的是:
A、scanf("%c" ,&std[0] .gender);
B、scanf("%s" ,&std.name);
C、scanf("%c" ,&(p->gender));
D、scanf("%d" ,&(*p) .age );
正确答案: B
解析: scanf输入结构体数组时要使用结构体数组的下标;
A:是取std[0].gender的地址;
B:std是首地址,首地址里面没有成员name,所以是错误的;
C:是指针变量p引用成员name,然后取地址;
D:指针变量p指向std[0],然后引用成员age,再取地址。
阅读下面的程序
#include<stdio.h>
void main(){
int i,j;
scanf("%3d%2d" ,&i, &j);
printf(“i=%d j=%d\n”,i,j);}
如果从键盘上输入1234567<回车>则程序的运行结果是( )
A.=1234,j=567.
B.i=1,j=2.
C.i=123,j=45.
D.i=123,j=4567.
正确答案: C
解析:%3d 表示的是输出3位整型数, 不够3位向右对齐;%2d 表示则表示输出2位整型数,同时不够2位也向右对齐。
有枚举类型定义:enum weekday {Sun,Mon,Tue=0,Wed,Thu,Fri,Sat}; 则枚举值Fri对应的整数值为( ).
A.2
B.1
C.3
D.4
正确答案: C
解析:在定义枚举类型是默认为0,1,2,3,4…。但是如果将某一常量赋初值则后面每一个常量值是前一个常量值+1.
题目下面程序的输出结果是______.
#include<stdio.h>
void main()
{
int a=-1, b=4, k;
k=(++a<=0)&&(b–<=0);
printf("%d,%d,%d\n",k,a,b);
}
A.1,0,3
B.1,1,2
C.0,1,2
D.0,0,3
正确答案: D
解析:这道题考察的是++a和a++的意义,我是这样记的+在前就先加,++a是a先自增再做其他运算,a++是a先进行运算再自增。
多选题
已知 ii,j 都是整型变量,下列表达式中,与下标引用X[ii][j]不等效的是( ).
A、*(X+ii+j)
B、*(X+ii)[j]
C、*( *(X+ii)+j)
D、*(X[ii]+j)
正确答案: AB
解析:
对二维数组下标的引用 一般情况下:都是使用a[i][j],和*(*(a+i)+j)的形式。对上述题目由于a[i]等价于 * (a+i), 所以 C. * ( *(X+ii)+ j) 与 D. * (X[ii]+ j) 等效。
填空题
解析:这是一道易错题,我最开始的答案是0;后来发现其中的问题。
表面上是考二维数组的指针,其实考的是二位数组的初始化,以及逗号运算符。
首先定义一个二维数组是 int a[3][2]={{1,2,3},{4,5,6}}使用的都是花括号,而本题使用的是()代替{ },就要考虑到里面的逗号运算符,即从左到右运算,但是最后取值只取最右面的值,所以答案是1。
简答题
解析:
char * const p 中的const限定的是指针p,所以p是常量指针;
char const * p 中的const限定的是(*p),即指针p指向一个常量;
const char *p 与char const *p同义。
解析:
结构体和共用体的区别在于:
结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。
3、通过键输入两整型量a和b定义两个指针变量p1相p2指向整型变量a和b,然后a和b相互比较大小,a若小于b,则调用函数swap实现a和b两数交换然后再按从小到大数序输出。(拍照上传)
算法题
思路:本题就是计算时间的差值以及时间单位的换算,第一点是秒钟相互减如果是负值则向前借一位(即+60),同时分钟也是一样,只要在小时互相减为负时改为(+24)。
代码运行:
#include<stdio.h>
int main()
{
int h1,m1,s1,h2,m2,s2;
int k=0;
scanf("%d:%d:%d",&h1,&m1,&s1);
scanf("%d:%d:%d",&h2,&m2,&s2);
if(s2>s1)
{
s2=s1-s2+60;
m1-=1;
}
else
{
s2=s1-s2;
}
if(m2>m1)
{
m2=m1-m2+60;
h1-=1;
}
else
{
m2=m1-m2;
}
if(h2>h1)
{
h2=h1-h2+24;
}
else
{
h2=h1-h2;
}
k=s2+m2*60+h2*3600;
printf("%d",k);
return 0;
}
解析:这个矩阵可以用四个for循环来完成
代码运行:
#include<stdio.h>
int main()
{
int i,j,n;
scanf("%d %d %d",&n,&i,&j);
int a[1000][1000]={1};
int m=1;
int y1,y2;
for(y1=0;y1<=n/2;y1++)
{
for(y2=y1;y2<=n-y1-1;y2++)//向上填充数
a[y1][y2]=m++;
for(y2=a+1;y2<=n-y2-1;y2++)//向右填充数
a[y2][n-y1-1]=m++;
for(y2=n-y1-2;y2>=y1;y2--)//向下填充数
a[n-y1-1][y2]=m++;
for(y2=n-y1-2;y2>y1;y2--)//向左填充数
a[y2][y1]=m++;
if(n%2==1)// 防止当n为奇数
a[n/2][n/2]=n*n;
}
printf("%d",a[i - 1][j - 1]);
return 0;
}
总结反思:这次考核,发现自己还是存在很多问题的,首先对于基础知识学习不是很扎实,导致在简单的题目上失误,以及对于答案的不确定恍惚而丢分;其次算法题部分,思维理解不到位,同时平时练习过少,还是有点吃力,这次考核让我意识到仅仅是书本的片面学习往往是不够的,不多加练习是没有办法熟练应用和掌握这门语言,也让我知道应该更加努力去学习,也是给自己一个鞭策。