C语言基础练习9.15

一、选择题(每题2分,共 10 分)

1  "以下程序的运行结果是(B )

#include <stdio.h>

int func(int a,int b);

void  main()

  { int k=4,m=1,p;

    p=func(k,m); printf(""%d, "",p);

    p=func(k,m); printf(""%d\n"",p);  }

int func(int a,int b)

  { static int m=0,i=2;

i+=m+1;

    m=i+a+b;

    return m;  }

A: 8,17,                            B: 8,17

C: 8,8                              D: 4,1

2 设已有定义: int a[10]={15,12,7,31,47,20,16,28,13,19},*p; 下列语句中正确的是(B)

A: for(p=a;a<(p+10);a++);                      B: for(p=a;p<(a+10);p++);

C: for(p=a,a=a+10;p<a;p++);                  D: for(p=a;a<p+10; ++a);

3.设数组a[5]={10,20,30,40,50},已知指针p指向a[1];则表达式*++p的值是(C)

 A,20     B,21     C.30    D.31

解析:++p使指针指向p[2],加*则是获取指针指向位置的值则为p[2]的值为30。

4.以下语句不能正确赋值的是(A)

A.char s1[10];s1=”china”

B.char s2[]={‘c’,’h’,’i’,’n’,’a’}

C.char s3[20]=”china”

D.char *s=”china”

解析:不能直接将一个字符串赋值给一个字符数组名,因为字符串字面量是一个常量指针,指向一个以 null 结尾的字符数组。

5.下面语句输出结果是(C)

       Printf(“%d\n”,strlen(“\t\”\065\xff\n));

A.14           B.8               C.5               D.输出项不合法,无正常输出

解析:strlen遇到\0就计数结束。

二、简答题  40

1.请简述字符串长度和字符数组长度的区别? 5分

答:字符串长度是指从字符串起始位置到\0结束符之前的字符数。字符数组长度是数组中包含的所有字符的数量。

2.break和continue有什么区别?  5分

答:break用于立即跳出最近的循环或者switch语句。continue则是结束本次循环,直接进入下一次循环。

3.下面的代码输出是什么?为什么?  5分

       void foo(void)

{

   unsigned  int a=6;

       int b=-20;

       (a+b>6)?puts(“>6”):puts(“<=6”);

}

输出为“>6”,因为unsigned类型比和int类型做运算默认将int提升为unsigned类型。所以原本b=-20的符号位变为真值使得-20成为一个很大的正数,两者相加>6为真所以输出“>6”

4.类型定义    7分

 用变量a给出下面的定义

  1. 一个整形数  int a;
  2. 一个指向整形数的指针  int *a;
  3. 一个指向指针的指针它指针的指针是指向一个整形数  int **a;
  4. 一个有10个整形输入的数组  int a[10];
  5. 一个有10个指针的数组,该指针是指向一个指向整型数的  int *a[10];
  6. 一个指向有10个整形数组的指针  int(*a)[10];
  7. 一个指向参数为int,float,返回值是int的函数指针int (*fun)(int,float);

5,请简述static ,const关键字的含义,需要说明const和指针的结合?  10分

static 为静态变量,具有延长生命周期的作用,静态局部变量定义时分配内存,程序结束才释放内存,只赋初值一次。限制作用域 静态全局变量和静态函数只能在该文件内使用,不能被外部文件引用。定义未赋初值,默认值是0。

const为为修饰变量,表示为常量。不会轻易改变。

const修饰指针,需要观察 const 与 * 的位置关系,位置不同,作用不同。

1.cont int *p; 或者 int const *p 可以修改地址、不可以修改值

2.int * conts p; 不可以修改地址、可以修改值

3.conts int * const p; 值和地址都不可以修改

6.解读程序,请问执行Test函数会有什么执行结果? 8分

     char *GetMemory(void)

     {

            char p[]=”hello world”;

            return p;

     }

     void Test(void)

{

       char *str=NULL;

       str=GetMemory();

       puts(str);

}

输出乱码字符串。函数GetMemory返回的是局部数组的地址,数组在函数结束后会被释放,指针指向的地址会失效成为野指针。

三、编程题(共5题,每题10分)

1.已知strcmp的函数原型int strcmp(const char *s1,const char *s2)不调用C字符串函数库,请编写函数strcmp。

int Newstrcmp(char *s1,char *s2){
        while(*s1==*s2){
// 如果当前字符是字符串的结束符'\0',则两个字符串相等或同时到达末尾  
            if(*s1=='\0'||*s2=='\0'){
//跳出循环
                    break;
                    }
                    s1++;
                    s2++;
                  }
  // 循环结束后,返回两个字符串当前字符的差值  
    // 如果s1的当前字符小于s2的当前字符,返回负数  
    // 如果s1的当前字符大于s2的当前字符,返回正数  
    // 如果两者都是'\0',即同时到达字符串末尾,则返回0
                return *s1-*s2;
}

     2.编写程序,实现字符串逆置,char *strrev(char *str),参数str是要逆置字符串的首地址,返回逆置后字符串首地址。

char *nz(char *str);
int main(int argc, const char *argv[])
{
	printf("请输入一个字符串:");
	char str[100];
	scanf("%s",str);
	nz(str);
	printf("逆序排列后的字符串为:%s",str);
	return 0;
}


char *nz(char *str){
	int len =strlen(str);
	for(int i=0;i<len/2;i++){
		char temp;
		temp=str[i];
		str[i]=str[len-1-i];
		str[len-1-i]=temp;
	}
	return str;
}

3.通过二维数组实现杨慧三角void  YangHui(int n,int (*p)[n])

    

4.请简述什么是冒泡排序,并变成实现冒泡排序?void  Bubble(int n,int *p)

    冒泡排序:相邻两个元素,比较,两两比较逆序交换位置,每一趟确定一个数的位置。假设有n元素则需走n-1趟才能排序完成。

void maopao(int n,int *p);
int main(int argc, const char *argv[])
{
	printf("请输入您要输入的数组元素个数:\n");
	int n;
	scanf("%d",&n);
	int a[100];
	printf("请输入数组元素中间用空格隔开:\n");
	for(int i=0;i<n;i++){
	scanf("%d",&a[i]);
	}
	maopao(n,a);
	for(int i=0;i<n;i++){
	printf("%2d",a[i]);
	}
	return 0;
}
void maopao(int n,int *p){
	for(int i=0;i<n-1;i++){
		for(int j=0;j<n-1-i;j++){
			int temp;
			if(p[j]>p[j+1]){
				temp = p[j];
				p[j]=p[j+1];
				p[j+1]=temp;
			}
		}
	}
}

5.请递归实现n!

      

int fun(int n) {
    if (n == 0 || n == 1) {
        return 1;
    }
    return n *fun(n - 1);
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
	int n=5;
	int jiech;
	jiech=fun(n);
	printf("%d的阶乘值为%d",n,jiech);
	return 0;
}

           

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值