过关检测——C语言开发

1.C语言程序的基本单位是  C
A 程序行
B 语句
C 函数
D 字符

2.在宏定义 #define PI 3、14159中,用宏名PI代替一个
A 单精度数
B 双精度数
C 常量
D 字符串

3.设有以下语句:int a=3,b=6,c; c=a^b<<2; 则c的二进制值是
A 00011011
B 00010100
C 00011100
D 00011000
解析:<<的优先级高于^ 所以b先<<2 ,再与进行^运算
0000 0110
<<2
0001 1000
0000 0011 ^
0001 1011
4.执行下列程序段后,变量a,b,c的值分别是

int x=10,y=9;

int a,b,c;

a=(--x==y++)?--x:++y;

b=x++;

c=y;

A a=9,b=9,c=9 
B a=9,b=10,c=9
C a=1,b=11,c=10
D a=8,b=8,c=10

5.输出结果为__ _

int main(int argc, char *argv[])

{

    int i, n = 0;

for (i=1; i<argc; i++) { n = 10*n + *argv[i] – ‘0’; }

printf(“%d\n”, n);

}

./aout  12  345  678

A 123
B 136
C 678
D 58

6.设变量定义为“int x, *p=&x;”,则&*p相当于 ( )
A p
B *p
C x
D *&x
解析:
首先要看清题,int x , *p=&x;
相当于int x;int *p=&x;
就是把x的地址赋给指针变量p,既int *p;p=&x;
所以&*p等于x的地址,等于p的值。选A.

7.以下程序的输出结果是

void main()
{ 
int a=5,*p1,**p2;

p1=&a,p2=&p1;

(*p1)++;

printf("%d\n",**p2);

}

A 5
B 4

C 6 
D 不确定

8.整型变量x和y的值相等,且为非0值,则以下选项中,结果为0的表达式是 ( )

A x || y 
B x | y 
C x & y

D x ^ y
解析: ^运算规则,相同为0 不同为1

9.若已定义 char s[10]; 则在下面表达式中不表示s[1]的地址的是 ( )

A s+1
B s++
C &s[0]+1
D &s[1]

解析:数组名代表的是常量的地址,不能改变常量的地址值

10.以下程序的输出结果是 ( )

#define M(x,y,z) x*y+z

main()

{ int a=1,b=2, c=3;

printf("%d\n", M(a+b,b+c, c+a)); }

A 19
B 17 
C 15

D 12

11 int a[5][4], (p)[4]=a;,数组a的首地址为100,(p+2)+3等于 ( )

A 116
B 118

C 144
D 122
 

12 有两个字符数组a、b,则以下正确的输入语句是          

A  gets(a,b)

B  scanf(“%s%s”,a,b)

C  scanf(“%s%s”,&a,&b)

D  gets(“a”),gets(“b”)

13 以下对二维数组a的正确说明是 ( )

A int a[ ][3]={ 0 }
B int a[3][ ]={ {1},{2},{3} }
C int a[1][3]={ 1,2,3,4 }
D int a[2][3]={ {1,2},{3,4},{5,6} }

14 若有以下函数调用语句: fun(a+b,(x,y),fun(n+k,d,(a,b)));在此函数调用语句中实参的个数是

A 3
B 4
C 5
D 6

15 若有以下定义: char a; int b; float c; double d; 则表达式a*b+d-c值的类型为

A float
B int
C char

D double

16 设x、y、z和k都是int型变量,则执行表达式:x=(y=4,z=16,k=32)后,x的值为

A 4
B 16

C 32
D 52

17 下面程序的输出是

int w=3;

fun(int k) {

if(k==0) return w;

return(fun(k-1)*k);

}

main() {

int w=10;

printf("%d",fun(5)*w);

}

A 360
B 3600
C 1080
D 1200

18 下列说法中正确的是

A 在switch语句中一定要使用break语句
B 在switch语句中不一定要使用break语句
C break语句是switch语句的一部分
D break只能用于switch语句中

19 在C语言中,不正确的char类型的常数是
A 32768
B 0
C 037
D 0xAF

20.假定在32位机中,定义char a[20];char *p = a;那么sizeof(a),sizeof§输出的值是

A 20,1
B 80,4

C 20,4
D 40, 2

21.关键字static的作用是什么?
(1)设置变量的存储域,函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;
(2)限制变量的作用域,在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
(3)限制函数的作用域,在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;
(4)在类中的static成员变量意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见;
(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。
22.已定义一个变量num ,其值为5,简单编程函数实现下列位操作:

1)第二位清零;

2)第二位置1;
 

int setbit(int num,int n){
        return  num | (1<<(n-1));
}
 
int clearbit(int num ,int n){
        return num & ~(1 << (n-1));
}

23.用变量a给出下面的定义

a) 一个整型数(An integer)

b) 一个指向整型数的指针(A pointer to an integer)

c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer)

d) 一个有10个整型数的数组(An array of 10 integers)

e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers)

f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)

g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)

h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an integer argument and return an integer )
 

                                    答案参考:
a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer

24 给定一个整型变量a,写两个函数,第一个设置a的bit 3位,第二个清除a 的bit 3,在以上两个操作中,要保持其它位不变

#include <stdio.h>
void set_bit(int *p, int n){
    *p |= 1<<3;
}
void clean_bit(int *p, int n){
    *p &= ~(1<<3);
}
int main(void){
    int a = 3;
    int *p = &a;
    printf("a = %d \n", a);
    set_bit(p, 3);
    printf("a = %d \n", a);
    clean_bit(p, 3);
    printf("a = %d \n", a);
    return 0;
}</stdio.h>

25.题目:利用递归方法分别求1!,2!,3!,4!,5!。
程序分析:递归公式:fn=fn_1*4!

include "stdio.h"
int fact(int j);
int main()
{
    int i;
    for(i=0;i<5;i++){
        printf("\40:%d!=%d\n",i+1,fact(i+1));
    }
    return 0;
}
int fact(int j){
    int sum;
    if(j==0){
        sum=1;
    }else{
        sum=j*fact(j-1);
    }
    return sum;
}

26.主观题(每道题10分)收藏 |纠错
给定一个字符串“I love china”,编写程序完成以单词为单位的逆序,如“china love i”,并要求不允许使用第三方变量保存数据,但可以使用辅助指针变量等。
答案参考:

方法一:

#include <stdio.h>
#define N 32
int swap(char *head, char *tail);
int main()
{
    char buff[N] = "I love China";
    char *head = buff,
         *tail = buff;
    //先讲尾指针定位到字符串尾部。
    while('\0'!= *tail)
        tail ++;
    //调用swap函数将整个字符串倒置。
    swap(buff,tail - 1);
    //主函数开始扫描遍历整个倒置后的字符串。
    while('\0' != *head)
    {//查找单词头。
        while(32 == *head)
            head ++;
        //找到头后将尾定位到头,开始找单词尾。
        tail = head;
        while(32 != *tail && '\0' != *tail)
            tail ++;
        //前两步找到头之后将单词倒置(因为循环结束后tail指向‘\0’,所以tail -1)。
        swap(head,tail - 1);
        //单词倒置后将头指向尾,为下次找单词做准备。
        head = tail;
    }
    puts(buff);
    return 0;
}
//swap函数,完成指定字符串倒置。
int swap(char *head, char *tail)
{
    while(head < tail)
    {//异或法进行交换数据
        *head ^= *tail;
        *tail ^= *head;
        *head++ ^= *tail--;
    }
}</stdio.h>

方法二:

#include <stdio.h>
void swap(char *head,char *tail)  //倒置字符串子函数,参数为字符串的头尾地址
{
	char t;
	while(head<tail)
	{
		t=*head;
		*head=*tail;
		*tail=t;
		head++;
		tail--;
	}
}

int main(int argc, const char *argv[]) //主函数
{
	char a[]="i love china";
	char *Head=a,*Tail=a;//开始头尾指针均指向a[]的首地址

	while(*Tail)			//将尾指针指向a[]的尾地址
		Tail++;				//此时Tail指向a的最后一个字符\0
	swap(Head,Tail-1);//Tail-1让其指向a[]最后一个字母a,将a[]整体倒换,变成anihc evol i  
	
	while(*Head!='\0')  //每个单词倒换
	{
		Tail=Head;
		while(*Tail!=' ' && *Tail!='\0')//找到每个单词的最后一位,即找到单词间的空格。最后一个单词找到\0
			Tail++;  					//此时Tail即为空格的位置
		swap(Head,Tail-1);		//单词倒置
		Head=Tail;					//将尾指针给下一个单词的头指针,此时指向的是空格
		if(*Head==' ')				//判断头指针如果是空格,加一,使其指向下一个单词的头字母
			Head++;
	}
	
	printf("%s\n",a);		//打印出来验证一下
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值