C语言试题
//编程环境32位机器
Ps:会做的题目,简要写出分析过程;不会的度娘写出思路!
一、选择题(15题,共30分)
1. 假设目录中存在若干文件file_num.txt(num表示文件编号,1~10),使用以下( )通配符可以挑选出其中的编号为1、3、5的文件。
[A] file_*.txt [B] flie_?.txt [C] file_[135].txt [D] file_[^135].txt
答案是C
[135]里边只识别一位的字符,并按顺序识别
- 文件权限 r-x-wxr–对应的八进制表示形式为( )
[A] 0536 [B] 0654 [C] 0656 [D] 0534
答案是D最多不超过7所以原样输出
- 在C语言中,要求运算数必须是整型的运算符是( )。
[A] / [B] ++ [C] != [D] %
答案是D
取余只对整数有用 - C语言中,逻辑“真”等价于( )。
[A] 大于零的数 [B] 大于零的整数 [C] 非零的数 [D] 非零的整数
答案是D
这个就没啥说的 - 下面函数的功能是( )。
int fun (char*x)
{
char*y=x;
while(*y++);
return(y-x-1);
}
[A] 求字符串的长度
[B] 比较两个字符串的大小
[C] 将字符串x复制到字符串y
[D] 将字符串x连接到字符串y后面
答案是A
找另外一个指针指向字符串的头,再依次相加,减去末尾的结束符。
- C语言程序的三种基本程序是( )。
[A] 顺序结构,选择结构,循环结构
[B] 递归结构,循环结构,转移结构
[C] 嵌套结构,递归结构,顺序结构
[D] 循环结构,转移结构,顺序结构
答案是A
C语言是从上到下依次执行的,(顺序结构)
C语言是有判断的,(选择结构)
C语言是有重复动作的,(循环结构)
- 执行下面语句后的输出结果为( )。
int i = -1;
if (i < =0)
printf(“**\n”);
i = 2;
else
printf(“%%%%\n”);
[A] ** [B] %% [C] %%%% [D] 有语法错误。不能正确执行
答案是D
没有对应的if和else匹配,if后面应该加花括号
- 下面的程序运行结果为( )。
#include <stdio.h>
int main(void)
{
int x = 3, y = 1, z = 0;
if(x = y + z)
printf(“****”);
else
printf(“####”);
}
[A] 语法有错误,不能编译 [B] ** [C] #### [D] 能编译,不能连接
答案是B
非零为真
- 下述程序的输出结果是( )。
int main(void)
{
int Y=100;
while(Y–);
printf(“Y=%d”,Y);
}
[A] Y=0 [B] Y=1 [C] Y=-1 [D] Y=随机数
答案是C
判断为零退出循环时0–为负一
- 结构体DATA定义如下,则sizeof(struct DATA)的值为( )。
struct DATA
{
float f1;
int i;
char c2;
};
[A] 6 [B] 8 [C] 12 [D] 16
答案是C
空间上对齐,所以char最后由于计算机结构体的补齐机制最后为4字节大小(实际还是一个字节,计算机不会使用剩下的三个字节的空间)。
- 下述程序第二次的输出结果为( )。
int main(void)
{
extern int a;
int b=0;
static int c;
a+=3;
other();
b+=3;
other();
}
int a=5;
other()
{
int b=3;
static int c=2;
a+=5; b+=5; c+=5;
printf(“%d,%d,%d\n”,a,b,c);
c=b;
}
[A] 13,0,13 [B] 18,8,13 [C] 13,8,13 [D] 18,8,0
答案是B
12. 以下程序的功能是将字符串s中所有的字符c删除,那么空白处缺少的语句为:( )。
#include <stdio.h>
int main(void)
{
char s[80] ;
int i, j ;
gets(s) ;
for ( i = j = 0 ; s [i] != ‘\0’ ; i++ )
if ( s [i] != ‘c’ )
;
s [ j ] = ‘\0’ ;
puts ( s ) ;
return 0 ;
}
[A] s [ j++] = s [ i ] [B] s [ ++j ] = s [ i ]
[C] s [ j ] = s [ i ]; j++ [D] s [ j ] = s [ i ]
答案是A
将所有的非c的字符在原字符串中依次的存储,最后加个结束标志,造成后面的数据丢失,打到最后去c的目的。
- 下面程序的功能是将已按升序排好序的两个字符串a和b中的字符,按升序归并到字符串c中,请为程序中的空白处选择适当的语句。 ( )
#include <stdio.h> int main(void) { char a[ ] = “acegikm”; char b[ ] = “bdfhjlnpq”; char c[80], *p; int i = 0, j= 0, k = 0; while( a[i] != '\0' && b[j] != '\0' ) { if ( a[i] < b[j] ) { ( ) } else { ( ) } k++; } c[k] = ‘\0’; if ( ) p = b + j; else p = a + i; strcat ( c , p ); puts ( c ); }
① [A] c[k] = a[i]; i++; [B] c[k] = b[j]; i++;
[C] c[k] = a[i]; j++; [D] c[k] = a[j]; j++;
② [A] c[k] = a[i]; i++; [B] c[k] = b[j]; i++;
[C] c[k] = a[i]; j++; [D] c[k] = b[j]; j++;
③ [A] a[i] = ‘\0’ [B] a[i] != ‘\0’
[C] b[j] = ‘\0’ [D] b[j] != ‘\0’答案为 ADD
按顺序排大小,a[i]>b[j],a[i]进去之后,i++。反之,a[j]进去之后j++;最后给字符串长度较长的字符串判断,不断进入。在一个C源程序文件中,若要定义一个只允许本源文件中所有函数使用的全局变量,则该变量需要使用的存储类别是( )。
[A] extern [B] register [C] auto [D] static
答案是D
度娘说,静态变量用于全局变量。
- 以下程序的运行结果为( )。
void sub(int x, int y, int *z)
{ *z = y – x ; }
int main(void)
{
int a,b,c ;
sub(10, 5, &a) ;
sub(7, a, &b) ;
sub(a, b, &c) ;
printf( “%4d,%4d, %4d\n”,a,b,c);
}
[A] 5, 2, 3 [B] -5, -12, -7 [C] -5, -12, -17 [D] 5, -2, -7
答案是B
首先sub(10, 5, &a) ;调用a,把a修改;a = -5;
之后sub(7, -5, &b) ;调用b,把b修改;b = -12;
最后sub(-5, -12, &c) ;调用c,把c修改;c = - 7;
二、填空题(6题,第5题4分,其余每空2分,共16分)
- 条件“2 < x < 3或x < -10”的C语言表达式为( )。
答案是//(x > 2 && x < 3) || x < -10
简单的逻辑判断,不过注意(x > 2 && x < 3)需要括号括起来。
- 若有以下定义和语句,则p[0]引用的是a数组元素中的( ),(p[1]+1)引用的是a数组元素中的( )。
int *p[3], a[6], i;
for( i = 0; i < 3; i++) p[i] = &a[2*i];
答案是 //a[0],a[4]
首先是p[0]指向指针数组的第一个指针(指针数组的首地址),(p[1]+1)是将指针在*p[1]的基础上,将指针加一,最后指向*p[2],也就是a[4]
3 若有以下输入(代表回车换行符),则下面程序的运行结果为( )。
1,2
int main(void)
{
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4], i, j;
p = a;
scanf(“%d,%d”,&i,&j);
printf(“%d\n”, ((p+i)+j));
return 0;
}
答案是7
指针*(p+i)指向p[i]也就是指针数组的第i个元素,之后加就j是将指针指向的地址在之前(指针数组的第i个元素)的基础之上再往右移j个指针所指元素字节大小的地址(相当于指针所指的地址的地址值加上 j*sizeof(int))也就是a[1][2] = 7;
- shell脚本的本质是( )。
shell脚本的本质是shell命令的有序集合。
- gcc的编译步骤按先后顺序分别为( )。
1.预处理,生成预编译文件(.文件):
Gcc –E hello.c –o hello.i
2.编译,生成汇编代码(.s文件):
Gcc –S hello.i –o hello.s
3.汇编,生成目标文件(.o文件):
Gcc –c hello.s –o hello.o
4.链接,生成可执行文件:
Gcc hello.o –o hello
- make工程管理器根据( )来自动发现更新过的文件从而减少编译的工作量。
make工程管理器是一个“自动编译管理器”,这里的“自动”是指它能够根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入makefile文件的内容来执行大量的编译工作。用户只需编写一次简单的编译语句就可以了。它大大的提高了实际的工作效率。
三、简答题(1题4分,第2题10分,共15分)
1. 请写出定义一个求最小的宏(5分)
2. 写出1~20偶数的和,用do…while编程来实现(10分)
答:
1。
#include<stdio.h>
#define S(a,b) (((a)< (b)) ? ((a)): ((b)))
int main(void)
{
int a = 0,b = 0;
scanf("%d%d", &a, &b);
printf("%d", S(a,b));
}
2。
#include<stdio.h>
int main(void)
{
int a = 0;
int i = 1;
do{
if(!(i%2))
a += i;
i++;
}while(i <= 20);
printf("%d", a);
}
四、编程题(3题,每题12分,共39分)(编程题写出思路并且正确可以得一半分)
1. 下面findmax函数将计算数组中的最大元素及其下标值,请编写该函数。(13分)
int findMax(int * array, int len, int * pData);
#include<stdio.h>
int findMax(int array[], int len, int *pData)
{
int max = 0;
int a;
int i = 0;
max = array[0];
for(i =1; i<len; i++)
{
if(array[i]>max)
{
max = array[i];//找到最大值,记录下标
a = i;
pData = &a;
}
}
return max;
}
int main(void)
{
int a[99]= {0};
int i =0;
int n;
int *data;
int p;
scanf("%d", &n);//数组实际长度
for(i=0;i<n;i++)
scanf("%d", &a[i]);
p = findMax(a, n, data);
printf("最大数为:%d,下标为:%d", p,data);
}//下标不知道为啥总是取不出来。
- char * stringcat(char * dest, const char * str); (13分)
功能:把src所指空间的字符连接到dest所指字符串的后面。
#include<stdio.h>
char * stringcat(char * dest, const char * str)
{
char *s;
s = dest;
while(*s != '\0')
s++;
while(*str != '\0')
{
*s = *str;
s++;
str++;
}
*s = '\0';
return s;
}
int main(void)
{
char *s = "jkjdkla";
char *s1 = "dasd";
s = stringcat(s,s1);
puts(s);
}//不会,- -。
- 写一个接口,把去年1月份的每天的平均温度进行排序。(13分)
Void sort(int * array, int len);
#include <stdio.h>
void sort(int * array, int len)
{
int i,j,k;
int a;
for(i = 0;i<len-1;i++)
{
for(j =i+1; j<len;j++)
if(array[i] > array[j])
{
a = array[i];
array[i] = array[j];//按照从小到大的顺序排序
array[j] = a;//a[j] > a[i]交换顺序,
}
}
}
int main(void)
{
int a[5]={5,4,3,2,1};
sort(a,5);
for(int i = 0; i<5; i++)
printf("%d", a[i]);
return 0;
}