C/C++ 练习题

来源:互联网 发布:微信群营销软件 编辑:程序博客网 时间:2024/06/05 10:54

一,选择题 人生就是一条选择题,有时候不是不会走路,而是不知道怎么走路

1.以下能正确定义字符串的语句是(D)
A.char str[ ]={′\064′}; 
B.char str="kx43";
C.char str="; 
D.char str[ ]="\0";


char 声明字符变量字符变量的规格:占用一个字节的内存空间(字符串根据它的长度来确定它在内存中占用的字节数,只有空字符串为1个字节。),一般以字符型或者整型数据处理。

所以char str = "kx43"只能把字符 'k'放进去。而不是字符串

B应该用字符串指针指向字符串常量的形式(char* str = "kx43";)才能正确引用字符串。


A)定义的是字符数组,这个数组只有一个元素.字符串必须以'\0'结束,因此A定义的不属于字符串.若改为下面形式,则是正确的.

char str[2]={'\064'}; //没有赋值的第二个元素str[1]被初始化'\0',符合字符串定义.

char str[]={'\064','\0'};


二,判断题 生活有时候就像计算机只认识二进制那样,不是0,就是1;是非曲直,对错黑白,往往就在一念之间

三,描述题 描述就是说出问题的本质

1 解释一下为什么?
 main() { 
    char str[]={"65"}; printf("%c",str[0]);
  } 这程序输出的是6. 
而 
main() { 
    char str[]={"\064"}; printf("%s",str); 
} 输出的是4

  •      第一个题中的字符串为"65",它的第一个字符是6,所以输出str[0]结果为6
  •      第二个字符串为"\064",其中的\064是一个转义字符,为八进制数64,换算成十进制数6*8+4,为52,也就是说此字符串由ASCII码为52的字         符和结束符组成。而ASCII52的是字符'4',所以字符串"\064"相当于"4",因此输出结果为4
  •     想把65作为ASCII码赋值给str[0],方法为char str[]="A";或 char str[] = {65};

2求高手解释一下这段程序
#include  
class Test 
{int x,y; 
public: 
Test(int i,int j=0) 
{x=i;y=j;} 
int get(int i,int j) 
{return i+j;} 
}; 
void main() 
{Test t1(2),t2(4,6); 
int (Test::*p)(int,int=10); 
p=Test::get; 


这代码我感觉完全是为了考人准备的,要不谁去写这东西,类对象也有,成员函数也有,费要搞个成员函数指针,不麻烦么,

int (Test::*p)(int,int=10); 

p=Test::get;2句就是错的,定义成员函数指针要求形参返回类型完全一致,怎么还能设置个默认值呢.

---------------------------------------------------------

#include 

using namespace std;

class Test 

{int x,y; 

public:

Test(int i,int j=0) 

{x=i;y=j;

int get(int i,int j) 

{return i+j;

}; 

int main() 

{Test t1(2),t2(4,6); 

int (Test::*p)(int,int); 

p=&Test::get; 

cout


四,程序题 在计算机的世界里,没有什么问题是不可以用一段代码解释的,如果真不可以,那就来两段



   13以下程序

    main()

    {

        int p[8]={11,12,13,14,15,16,17,18},i=0,j=0;

        while(i++<7) if(p[i]%2)   j+=p[i];

        printf("%d\n",j);

    }

    13+15+17=45;

    程序运行后的输出结果是_B____。

    A)42 B)45 C)56 D)60

    (23有以下程序

    main()

    {

        int p[8]={11,12,13,14,15,16,17,18},i=1,j=1;

        while(i++<7) if(p[i]%2)   j+=p[i];

        printf("%d\n",j);

    }

    13+15+17+1=46;

    程序运行后的输出结果是__46___。

    A)42 B)46 C)56 D)60

    

    (33有以下程序

    main()

    {

        int p[8]={11,12,13,14,15,16,17,18},i=0,j=1;

        while(i++<7) if(p[i]%2)   j+=p[i];

        printf("%d\n",j);

    }

    程序运行后的输出结果是___46__。

    A)42 B)46 C)56 D)60

    (43有以下程序

    main()

    {

        int p[8]={11,12,13,14,15,16,17,18},i=1,j=0;

        while(i++<7) if(p[i]%2)   j+=p[i];

        printf("%d\n",j);

    }

    程序运行后的输出结果是__45___。

    A)42 B)45 C)56 D)60

    

    (5)以下叙述中错误的是 __C___。

    A)对于double类型数组,不可以直接用数组名对数组进行整体输入或输出

    B)数组名代表的是数组所占存储区的首地址,其值不可改变

    C)当程序执行中,数组元素的下标超出所定义的下标范围时,系统将给出“下标越界”的出错信息

    D)可以通过赋初值的方式确定数组元素的个数

    

    (63有以下程序

    main()

    { int p[7]={11,13,14,15,16,17,18},i=0,k=0;

        while(i<7&&p[i]%2){k=k+p[i];i++;}

        printf("%d\n",k);

    }

    11+13 ,当执行了p[2]=14.不满足条件,就终止循环了

    执行后输出结果是___24__。

    A) 58 B) 56 C)45 D)24

    

    (73有以下程序

    main()

    { int p[7]={11,13,14,15,16,17,18},i=1,k=1;

        while(i<7&&p[i]%2

        {k=k+p[i];i++;}

        printf("%d\n",k);

    }

    13 + 1

    执行后输出结果是__14___。

    A) 58 B) 56 C)45 D)14

    

    

    (81假定int类型变量占用两个字节,其有定义:int  x[10]={0,2,4};,则数组x在内存中所占字节数是__20___。

    A) 3      B) 6         C)10       D)20

    

    (91假定float类型变量占用四个字节,其有定义:float  x[10]={0.5,2.5,2.4};,则数组x在内存中所占字节数是___40__。

    A) 3      B) 6         C)10       D)40

    

    (101假定int类型变量占用两个字节,其有定义:int  x[5]={0,2,4};,则数组x在内存中所占字节数是____10_。

    A) 3      B) 6         C)10       D)20

    

    (131以下程序的输出结果是_____。

    main()

    {   int   i, a[10];

        for(i=9;i>=0;i--)  a[i]=10-i;

        printf(“%d%d%d”,a[1],a[3],a[5]);

    }

    A) 258      B) 741   C) 852          D) 975

    

    (141以下程序的输出结果是_____。

    main()

    {   int   i, a[10];(162当调用函数时,实参是一个数组名,则向函数传送的是___B__。

        A) 数组的长度               B)数组的首地址

        C) 数组每一个元素的地址             D)数组每个元素中的值

        

        (192若有以下调用语句,则不正确的fun函数的首部是_D___。

        A) void fun(int m,int x[])

        B) void fun(int s,int h[41])

        C) void fun(int p,int *s)

        D) void fun(int n,int a)

        main()

        {   …

            int a[50],n;

            …

            fun(n, &a[9]);

            …

        }

        

        (203以下程序的输出结果是B_____。

        //顺序执行

        main()

        {  int   i,k,a[10],p[3]:

            k=5;

            for (i=0;i<10;i++)  a[i]=i;

            for (i=0;i<3;i++)  p[i]=a[i*(i+1)];

            for (i=0;i<3;i++)  k+=p[i]*2;

            printf("%d\n",k);

        }

        A) 20           B) 21              C) 22             D)23

        

        21. 设变量定义为“int s[ ]="hello\nworld\n";”,则数组s中有___B___个元素。

          A、12 B、13 C、14 D、15

        

        22. 设变量定义为“int a[4];”,则表达式_D_____不符合C语言语法。(为何)

          A、*a B、a[0] C、a D、a++

        (25)有以下程序

        //编程

#include  <stdio.h>

        main()

        {

            int s[12]={1,2,3,4,4,3,2,1,1,1,2,3},c[5]={0},i;

            for(i=0;i<12;i++)

                c[s[i]]++;

            for(i=1;i<5;i++)printf("%d",c[i]);

            printf("\n");

        }

        程序的运行结果是(   C  )。

        A)1 234    B)234 4

        C)4 332    D)112 3

        

        (26)若有定义语句:int m[]={5,4,3,2,1},i=4;,则下面对 m数组元素的引用中错误的是

        (  C) 。

        A)m[--i] B)m[2*2] C)m[m[0]] D)m[m[i]]

        

        (27)以下能正确定义一维数组的选项是(C )

        

          A)int a[5]={0,1,2,3,4,5};

        

          B)char a[]={0,1,2,3,4,5};

        

          C)char a={'A','B','C'};

        

          D)int a[5]="0123";


//利用指针,输入10个数到数组中,再输出

//指针实现数组逆序

//练习:编写函数 replace,在一个字符数组里面查找指定字符,并用相应的字符替代。函数原型如下:

//void replace(char *array, char old, char new, int length)

//练习:编写函数 insert,向一个字符数组指定位置插入一个字符,面的字符依次向后移动。函数原型如下:

//void insert(char *array, int index, char new, int length)

  1. 指针基础知识(理解指针概念)

1.已知有以下的说明,

int a[]={8,1,2,5,0,4,7,6,3,9};

那么a[*(a+a[3])]的值为__0_.


2.下列程序运行后的结果为:D

A.10 0    B.0 10     C.10 10     D.以上结果都不对

int main()

{

int a = 10;

int *p,**q;

p = &a;

q = &p;

printf("%d %d",*p,*q);

}


3.若有以下说明和语句,且0<=i<10,则下面哪个是对数组元素的错误引用?C

int a[]={1,2,3,4,5,6,7,8,9,0}, *p, i;

p=a;

A. *(a+i)   B. a[p-a]  C. p+i  D. *(&a[i])


4.若有以下说明和语句,且0<=i<10,则下面哪个是对数组元素地址的正确表示?  B

int a[]={1,2,3,4,5,6,7,8,9,0}, *p,i;

p=a;

A. &(a+1)   B. a++   C. &p   D. &p[i] 


5.以下程序的输出结果是哪一项?

#include <stdio.h>                D

main()

{ int a[12]={1,2,3,4,5,6,7,8,9,10,11,12}, *p[4],i;

  for(i=0;i<4;i++)

     p[i]=&a[i*3];

  printf("%d\n",*p[3]);

}

A.输出项不合法   B. 4    C. 7         D. 10


6.有以下说明和语句,,p2-p1的值为多少?(单选

int a[10], *p1, *p2;

p1=a;

p2=&a[5];        A

A. 5  B. 6  C. 10 D.没有指针与指针的减法


7.若有以下定义和语句:
 int s[4][5],(*ps)[5];C
 ps=s;
则对s数组元素的正确引用形式是
A) ps+1     B) *(ps+3)       C) ps[0][2]       D) *(ps+1)+3


8.若有以下的定义,int t[3][2];能正确表示t数组元素地址的表达式是C
A) &t[3][2] B) t[3] C) t[1]  D) *t[2]

9.以下程序的输出结果是a=  36_, b=   _,16   c= 19   _

#include <stdio.h>

int func(int a,int *p);

void main()

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

  c=func(a,&b); a=1,b=4,c=6;

  b=func(c,&a); c=6,a=9,b=16

  a=func(b,&c); b=16,c=19,a=36;

  printf("a=%d,b=%d,c=%d",a,b,c);   

}

int func(int a,int *p)

{   a++;

   *p=a+2;

   return(*p+a);

}


10.有以下程序
void fun(char *c,int d)
 {*c=*c+1;d=d+1;
 printf("%c,%c,",*c,d);
 }
 main()
 {char a='A',b='a';
 fun(&b,a); printf("%c,%c\n",a,b);
 }
程序运行后的输出结果是D。
A) B,a,B,a B) a,B,a,B C) A,b,A,b D) b,B,A,b


11.在说明语句:int *f();,标识符f代表的是 D
A)
一个用于指向整型数据的指针变量 
B)
一个用于指向一维数组的行指针 
C)
一个用于指向函数的指针变量 
D)
一个返回值为指针型的函数名 


12.以下程序段给数组所有元素输入数据,应在下划线处添入的是
Aa+(i++) B&a[i+1] Ca+i D&a[++i]
main( )
{ int a[10], i=0;
while(i<10) scanf(“%d”,__C___);
……
}


13.以下程序的输出结果是(B)
A17      B18     C19       D20
main( )
{

int a[ ]={2,4,6,8,10},y=1,x,*p;
p=&a[1];
for (x=0;x<3;x++) y+=*(p+x);
printf(“%d\n”,y);
}

14.下列程序段的输出结果是_______C_____

int i,x[3][3]={9,8,7,6,5,4,3,2,1},*p=&x[1][1];

for(i=0;i<4;i+=2)               C

   printf("%d  ",*(p+i));

A. 5  2       B. 5  1      C. 5   3       D. 9   7


15、若有函数声明"int sub(int (*x1)(),int *x2);",则形式参数x1是指向____ (4) ____的指针变量。

16.下列程序运行后的结果是:D

A.8     B.9    C.10     D.0

 int main()

{

int a[9][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};

printf("%d\n",**(a+8));======= a[8][0]=0

}


17.下列程序运行后的结果是:D

A.8     B.9    C.10     D.11

 int main()

{

int a[9][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};

int *q;

q = *a;

printf("%d ",*(q+10));

}


18.下列程序运行后的结果是:C

A.3     B.5    C.7     D.9

 int main()

{

int a[9][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};

int (*q)[4];

q = a;

printf("%d ",*(*(q+1)+2));

}


19.下列程序运行后的结果是:C

A.9     B.10    C.11     D.12

int main()

{

int a[9][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};

printf("%d ",*(*a + 10));

}


20.下面程序在编译或运行结果中会出现什么样的情况 D

A.输出:20            B.输出一个地址

C.编译出错                        D.运行后程序异常中止                      

int main()

{

int *p;

p = 20;

printf("%d ",*p);

}


二.编程题


1.编写函数int atoi(char s[ ]),将字符串s转化为整型数返回。注意负数处理方法。


2.分别编写下列字符串处理函数

(1char *strcat1(char *s,const char *ct);

将串ct接到串s的后面,形成一个长串。以数组为参数,现用指针为参数。

2int strlen1(const char * s);

求字符串长度的函数,返回串长(不包括串结束符)。

3char * reverse (char *);

反置字符串s,即可将“break”成为“kaerb”

4char * strchr( const char *cs,char c);

查找字符c在串cs中第一次出现的位置,返回指向该字符的指针,若没有出现则返回NULL


3.将整数n转换为十进制表示的字符串.

函数格式要如下:char *itoa (int n,char *string);


4.写一个函数,将N*N矩阵转置


5.求峰值,问题描述如下:有一个数组A,找出A中满足大于或小于左右两个元素的元素,首尾两个元素忽略,例如A={12,45,32,0,14,25,62,48,51},则结果为:45,0,62,48

6. 设计函数char *insert(s1,s2,n),用指针实现在字符串s1中的指定位置n处插入字符串s2


7.从键盘上输入10个整数存放到一维数组中,将其中最小的数与第一个数对换,最大的数与最后一个数对换。要求进行数据交换的处理过程编写成一个函数,函数中对数据的处理要用指针方法实现(例如:不能出现a[0] = 4之类的语句)


8.编写一个函数,函数的功能是移动字符串中的内容。移动的规则如下:把第1到第m个字符,平移到字符串的最后;再把第m+1到最后的字符移动到字符串的前部。例如,字符串中原由的内容为:ABCDEFGHIJKm的值为3,则移动后,字符串中的内容应该是DEFGHIJKABC。在主函数中输入一个长度不大于20的字符串和平移的值m,调用函数完成字符串的平移。要求用指针方法处理字符串。


9.不使用库函数,实现函数strcmp(char *s1,char *s2)的功能

 当s1s2相等时返回0,否则返回-1


10.使用指针作函数参数,编写用于交换两个参数值的函数。调用该函数用于从键盘输入的两个整数进行交换,交换结果需要在main函数中打印。函数原型为void exchange int *a,int *b

Input:x = 100,y = 200

Output:x = 200,y = 100.


11.用指针方法,编写一个函数,求矩阵主对角线元素之和


12.从两个数组的最后一个元素比较两个数组中不同元素的个数,如有s1[5] ={77,21,1,3,5},s2[3] = {1,3,5},s1[4]s2[2]开始比较,到s1[2]s2[0]比较结束。这样得出它们不同元素个数为0,若s1[6] = {77,21,1,3,5,7},那么他们不同元素为3.

函数原型为:void fun(int *s1,int *s2,int *result);

S1s2表示要比较的数组,result表示返回主函数的比较结果。

 

13.请编写一个函数,用指针实现将用户输入由数字字符和非数字字符组成的字符串中的数字提取出来,例如输入“asds23rt456,;789sf”,则产生的数字分别是123,456,789.


14.前后颠倒输入的英文中的单词位置,标点符号(只可以出现在句尾)位置不变,如输入“my name is guo hua!”输出应该为“hua guo is name my!”


15.函数void SumColum(int a[][N],int *sum)的功能是求出M行N列二维数组每列元素中的中的最小值,并计算它们的和值,将和值通过形参传回主函数输出。


16.设有N个人围坐一圈并顺时针方向从1到N编号,从第S个人开始进行1到M报数,报数到第M个人时,此人出圈,再从他的下一个重新开始1到M的报数,如此进行下去直到所有人都出圈为止。现要打印出圈次序。

要求实现函数:

Void fun(int n,int s,int m,int *p)

输入:n游戏总人数  s报数的起始编号  m报数的数值

输出:p指向向度为n的数组,出圈次序保存在p指向的数组中

示例:n = 7,s = 3,m = 3,出圈次序为:4 7 3 1 6 2 5


17.有一个数组int A[nSize],要求写一个函数:

Int *func(int *p,int nSize);将A中的0都移至数组末尾,将非0的移至开始(保持原顺序不变)

例如:

A原来是:1,0,3,4,0,-3,5 处理后为:1,3,4,-3,5,0,0


18.请在小于9999的正整数中找符合下列条件的数,它既是完全平方数,又有两位数字相同,如:144676(此题不必一定用到指针)


19.背包问题:给定n种物品和一个背包,物品i的重量是wi,背包的容量为C。如何选择装入背包的物品,使得背包中重量最大? 

例如:设有n=8个体积分别为544543292321141的物体和一个容积为C=110的背包(最优解:43+23+29+14+1=110)。

程序输出为:43+23+29+14+1=110


20.假如一个算式(算式中都为整数,只有加减法,没有小括号,如果时间充分,可以试试包含加减乘除的四则运算)是一个字符串,请编程得到这个算式的结果

例如算式字符串str = “4+2-4+3”,则结果为5




原创粉丝点击