求解答一下C语言编程题,万分感谢

Python011

求解答一下C语言编程题,万分感谢,第1张

1)原代码x没声明,算法有错误。

#include "stdio.h"

int main(void){

    int i,n

    float s=0.0,x,t1=0.0,t2=1.0

    printf("x,n=?")

    scanf("%f,%d",&x,&n)

    for(i=1i<=ni++){

        t1=t1+x

        t2=t2/i

        s=s+t1*t2

    }

    printf("s=%f\n",s)

    return 0

}

2)原代码书写不规范,过不了编译;注意间隔,改一下就行。余无错。

3)问题同2)。余无错。

4)

#include "stdio.h"

#include "stdlib.h"

#include "time.h"

int main(void){

    int a[50],i

    float av=0//平均数一般不是整数

    srand((unsigned)time(NULL))//要加上这一句,不然随机数千篇一律

    for(i=0i<50i++){

        a[i]=rand()%90+10//C的随机函数是rand

        av=av+a[i]

        printf("%4d",a[i])

    }

    printf("\n")

    av=av/20

    for(i=0i<20i++)

        if(a[i]<av)

    printf("%5d",a[i])

    return 0

}

你的代码书写很不规范,造成编译不过问题,比如chara[10]、#defineN 20等,间隔上哪去了?要注意一下。

逻辑运算和判断选取控制

1、编制程序要求输入整数a和b,若a2+b2大于100,则输出a2+b2百位以上的数字,否则输出两数字之和。

#include<stdio.h>

int main()

{

int a,b

printf("input two number:")

scanf("%d %d",&a,&b)

if((a*a+b*b)>=100)

printf("\n %d",(a*a+b*b)/100)

else

printf("\n %d",a+b)

getch()

}

2、试编程判断输入的正整数是否既是5又是7的整数倍数。若是,则输出yes;否则输出no。

#include<stdio.h>

int main()

{

int a

printf("input a number:")

scanf("%d",&a)

if(a%5==0 &&a%7==0)

printf("yes")

else

printf("no")

getch()

}

指针

1、编一程序,将字符串computer赋给一个字符数组,然后从第一个字母开始间隔的输出该串,请用指针完成。

#include<stdio.h>

int main()

{

char string[]="computer"

char *p=string

while(*p)

{

printf("%c",*p)

p++

p++

}

getch()

}

2、输入一个字符串string,然后在string里面每个字母间加一个空格,请用指针完成。

#include<stdio.h>

#include<CONIO.H>

#include<STDLIB.H>

#define max 100

char * copyString

void copy(char *,char*)

void insert(char *)

int main()

{

char * string

string = (char *)malloc(max*sizeof(char))

scanf("%s",string)

insert(string)

printf("%s",string)

getch()

return 0

}

void copy(char * c,char * s)

{

while(*s!='\0')

{

*c=*s

s++

c++

}

*c='\0'

}

void insert(char * s)

{

copyString = (char*)malloc(2*max*sizeof(char))

copy(copyString,s)

while(*copyString!='\0')

{

*s=*copyString

s++

copyString++

*s=' '

s++

}

*s='\0'

}

一.选择:

1.给出以下定义:

char acX[ ]= "abcdefg"

char acY[ ]= {'a','b','c','d','e','f','g'}

则正确的叙述为( )

A) 数组acX和数组acY等价 B) 数组acX和数组acY的长度相同

C) 数组acX的长度大于数组acY的长度D) 数组acX的长度小于数组acY的长度

答案:C

2.

void example(char acHello[])

{

printf("%d", sizeof(acHello))

return

}

void main()

{

char acHello[] = "hello"

example(acHello)//数组名称作参数,传的是地址,一个地址占四个字节

return

}

的输出是

A 4 B 5 C 6 D不确定

答案:A

3. 有以下程序段

char acArr[]= "ABCDE"

char *pcPtr

for(pcPtr = acArrpcPtr <acArr + 5pcPtr++)

{

printf("%s\n", pcPtr)

}

return

输出结果是( )

A) ABCD B) A C) E D) ABCDE

B D BCDE

C C CDE

D B DE

E A E

答案:D

4.在中断中,不能同步获取信号量,但是可以释放信号量。

A.正确 B.错误

答案:A

5.以下叙述中不正确的是( )

A) 在不同的函数中可以使用相同名字的变量

B) 函数中的形式参数是局部变量

C) 在一个函数内定义的变量只在本函数范围内有效

D) 在一个函数内的复合语句中定义的变量在本函数范围内有效(复合语句指函数中的成对括号构成的代码)

答案:D

6.设有如下定义:

unsigned long pulArray[] = {6, 7, 8, 9, 10}

unsigned long *pulPtr

则下列程序段的输出结果为( )

pulPtr = pulArray

*(pulPtr + 2) += 2

printf ("%d,%d\n", *pulPtr, *(pulPtr + 2))

A)8,10 B)6,8C)7,9 D)6,10

答案:D

7. 定义结构体时有下面几种说法,请指出正确的(多选):______

A、结构体中的每个部分,最好进行四字节对齐;

B、结构体的总长度最好是四字节对齐;

C、结构中成员的存放不用考虑字节对齐情况;

答案:A、B

8.void example()

{

int i

char acNew[20]

for(i = 0i <10i++)

{

acNew[i] = '0'

}

printf("%d\n", strlen(acNew))

return

}

的输出为( )

A 0 B 10 C 11 D不确定

答案:D

9.switch(c)中的c的数据类型可以是char、long、float、unsigned、bool. ()

A. 正确 B. 错误

答案:B

10. 网络上传输的字节序默认是大字节的,如果主机是小字节序,在网络通信时则须进行字节序转换;如果主机是

大字节序,为了程序的一致性及可移植性,最好也在程序中加上字节序转换的操作(空操作)。

A. 正确 B.错误

答案:A

11. struct stu

{

int num

char name[10]

int age

}

void fun(struct stu *p)

{

printf("%s\n", (*p).name)

return

}

void main()

{

struct stu students[3]={ {9801,"Zhang",20},

{9802,"Wang",19},

{9803,"Zhao",18} }

fun(students + 2)

return

}

输出结果是( )

A) ZhangB)ZhaoC) Wang D) 18

答案:B

12.以下程序运行后,输出结果是( )

void main( )

{

char *szStr = "abcde"

szStr += 2

printf("%lu \n",szStr)

return

}

A cdeB 字符c的ASCLL码值

C "abcde"这个常串中字符c所在的地址 D 出错

答案:C

13. 在X86下,有下列程序

#include <stdio.h>

void main()

{

union

{

int k

chari[2]

}*s,a

s = &a

s->i[0] = 0x39

s->i[1] = 0x38

printf("%x\n", a.k)

}

输出结果是( )

A) 3839B) 3938C) 380039 D) 不可预知

答案:D

14. 全局变量可以定义在被多个.C文件包含着的头文件中。

A. 正确 B. 错误

答案:B

15.void example()

{

int i

char acNew[20] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}

for(i = 0i <10i++)

{

acNew[i] = '0'

}

printf("%d\n", strlen(acNew))

return

}

的输出为:

A 0 B 10 C 11 D不确定

答案:B

16.下列定义正确的有(多选):( )

A: char *pcPtr = "abcd"

B: char pc[4]= "abcd"

C: char pc[] = "abcd"

D: char pc[] = 'abcd'

E: char pc[] = {'a','b','c','d','\0'}

F: char pc[] = 'a' 'b' 'c' 'd'

答案:ACE

17.在函数内部定义的变量(静态变量、寄存器变量等特殊变量除外)的内存是在栈内存中,所以在定义函数内部的变量的时候,一定要保证栈不能够溢出。如果临时变量

占用空间较大,应该使用内存申请的方式,这样该变量指向的内存就是在堆内存中了。

A. 正确 B. 错误

答案:A

18.局部变量可以和全局变量重名,编译的时候不会出现错误,但一旦不小心,就可能导致使用错误变量,所以在定时局部变量的时候,不要和全局变量重名。

A. 正确 B. 错误

答案:A

19.设有以下宏定义:

#define N 3

#define Y(n) ((N+1)*n) /*这种定义在编程规范中是严格禁止的*/

则执行语句:z = 2 * (N + Y(5 + 1))后,z的值为( )

A) 出错B) 42 C) 48D)54

答案:C

20. int *(*ptr)()

则以下叙述中正确的是( )

A) ptr是指向一维组数的指针变量

B) ptr是指向int型数据的指针变量

C) ptr是指向函数的指针,该函数返回一个int型数据

D) ptr是指向函数的指针,该函数的返回值是指向int型数据的指针

答案:D

21. 0x12345678 在采用BigEndian中内存的排列顺序是______,在采用LittleEndian内存中的排列顺序是_______.

(答案从左到右内存地址依次增加)

A.12 34 56 78 B.34 12 78 56

C.78 56 34 12 D.56 78 12 34

答案:A C

二、填空:

1. .struct tagAAA

{

unsigned char ucId:1

unsigned char ucPara0:2

unsigned char ucState:6

unsigned char ucTail:4

unsigned char ucAvail

unsigned char ucTail2:4

unsigned long ulData

}AAA_S

问:AAA_S在字节对齐分别为1、4的情况下,占用的空间大小是多少?

答案:9 12

2.typedef struct tagTest

{

UCHAR ucFlag

ULONG ulLen

}TEST_S

TEST_S test[10]

四字节对齐方式时: sizeof(TEST_S) = ______, sizeof(test)________.

答案:8 80

3

char acHello[] = "hello\0world"

char acNew[15] = {0}

strcpy(acNew,acHello)

strlen(acNew) = _____

sizeof(acHello) = ______

答案:5 12

4.#pragma pack(4)/*编译选项,表示4字节对齐*/

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

{

struct tagTest1

{

short a

char d

long b

long c

}

struct tagTest2

{

long b

short c

char d

long a

}

struct tagTest3

{

short c

long b

char d

long a

}

struct tagTest1 stT1

struct tagTest2 stT2

struct tagTest3 stT3

printf("%d %d %d", sizeof(stT1), sizeof(stT2), sizeof(stT3))

return 0

}

#pragma pack()(编译选项结束)

请问输出结果是:_________

答案:12 12 16

5. enum ENUM_A

{

X1,

Y1,

Z1 = 5,

A1,

B1

}

enum ENUM_A enumA = Y1

enum ENUM_A enumB = B1

请问 enumA = ____enumB = ______

答案:1 7

6.以下程序的输出结果是________.

#include <stdio.h>

int fun(int x,int y)

{

static int m = 08

static int i = 23

i += m + 112

m = i + x + y

return m

}

void main()

{

int j = 4

int m = 1

int k

k = fun(j, m)

printf("%d,", k)

k=fun(j, m)

printf("%d\n", k)

return

}

答案:8 17

7.以下程序的输出结果为________

#define CIR(r) r*r /*请注意这种定义的缺陷,不允许这么定义*/

void main()

{

int a = 1

int b = 2

int t

t = CIR(a + b)

printf("%d\n", t)

return

}

答案:5

8.在VRP中,实现了strncpy类似的函数,定义如下:

#define CHAR char

#define ULONG unsigned long

#define VOID void

#define MACRO_COPYWORLDLENGTH 4

CHAR *VOS_strncpy(CHAR *pcDest, const CHAR *szSrc, ULONG ulLength)

{

CHAR *pcPoint = pcDest

if(( NULL == szSrc ) || ( NULL == pcDest ) ))

{

return NULL

}

while(ulLength &&(*pcPoint = *szSrc))/*这里采用了在判断语句中赋值的方式(*pcPoint = *szSrc),建议尽量不使用*/

{

pcPoint++

szSrc++

ulLength--

}

if(!ulLength)

{

*pcPoint = '\0'

}

return pcDest

}

VOID main(VOID)

{

CHAR szStrBuf[ ] = "1234567890"

CHAR szStrBuf1[ ] = "1234567890"

CHAR *szHelloWorld = "Hello World!"

strncpy(szStrBuf, szHelloWorld, MACRO_COPYWORLDLENGTH)

VOS_strncpy(szStrBuf1, szHelloWorld, MACRO_COPYWORLDLENGTH)

printf("%s %s", szStrBuf, szStrBuf1)

}

程序的输出结果为________

答案:Hell567890 Hell

9.

char acHello[] = "hello\0world"

char acNew[15] = {0}

memcpy(acNew,acHello,12)

strlen(acNew) = _____

sizeof(acHello) = _____

答案:5 12

10. typedef struct Head

{

UCHAR aucSrc[6]

ULONG ulType

} HEAD_S

在强制一字节对齐情况下,请指出sizeof(HEAD_S) = ________

在强制二字节对齐情况下,请指出sizeof(HEAD_S) = ________

在强制四字节对齐情况下,请指出sizeof(HEAD_S) = ________

答案:10 10 12

11.union tagAAAA

{

struct

{

char ucFirst

short usSecond

char ucThird

}half

long lI

}number

struct tagBBBBB

{

char ucFirst

short usSecond

char ucThird

short usForth

}half

struct tagCCCC

{

struct

{

char ucFirst

short usSecond

char ucThird

}half

long lI

}

在字节对齐为1下,sizeof(union tagAAAA)、sizeof(struct tagBBBBB)、sizeof(struct tagCCCC)是____ ____ _____

在字节对齐为4下,sizeof(union tagAAAA)、sizeof(struct tagBBBBB)、sizeof(struct tagCCCC)是____ ____ _____

答案:4 6 8

8 8 12

12.struct tagABC

{

char cB

short sC

char cD

long lA

}*pAbc

pAbc = 0x100000

那么pAbc+0x100 = 0x_________(ULONG)pAbc + 0x100 = 0x_________(ULONG *)pAbc + 0x100 = 0x_________(char *)pAbc + 0x100 = 0x_______

答案:100C00 100100 100400 100100

13.unsigned long FUNC_C ( unsigned long ulAction )

{

unsigned long ulResult = 0

switch ( ulAction )

{

case ACTION_A:

{

ulResult += 1

break

}

case ACTION_B:

{

ulResult += 1

}

default:

{

ulResult += 1

}

}

printf( "ulResult = %u", ulResult )

return ulResult

}

当输入为ACTION_B时,输出结果为: ulResult = _________

答案:2(因为此分支没有break分支)

14.下面的代码中,函数Test执行完毕后,打印的结果是 _____。

unsigned long g_ulGlobal = 0

void GlobalInit(unsigned long ulArg)

{

ulArg = 0x01

return

}

void Test()

{

GlobalInit(g_ulGlobal)

printf("%lu", g_ulGlobal)

return

}

答案:0

15.以下程序的输出的结果是___________

int x = 3

void incre()

void main()

{ int i

for (i = 1i <xi++)

{

incre()

}

return

}

void incre()

{

static int x = 1

x *= (x + 1)

printf("%d ",x)

return

}

答案:2 6

16.以下程序的输出的结果是___________

#pragma pack(4)/*四字节对齐*/

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

{

unsigned char puc[4]

struct tagPIM

{

unsigned char ucPim1

unsigned char ucData0:1

unsigned char ucData1:2

unsigned char ucData2:3

}*pstPimData

pstPimData = (struct tagPIM *)puc

memset(puc, 0, 4)

pstPimData->ucPim1 = 1

pstPimData->ucData0 = 2

pstPimData->ucData1 = 3

pstPimData->ucData2 = 4

printf("%02X %02X %02X %02X\n", puc[0], puc[1], puc[2], puc[3])

return 0

}

#pragma pack()/*恢复缺省对齐方式*/

答案:01 26 00 00

17.

char *pcColor = "blue1"

char acColor[] = "blue1"

strlen(pcColor) = _____

strlen(acColor) = _____

sizeof(pcColor) = _____

sizeof(acColor) = _____

答案:5 5 4 6

18.

char str[] = "\\\0"

char *p = str

int n = 1000

请计算

sizeof (str ) = ____________

sizeof ( p ) = ______________

sizeof ( n ) = ______________

答案:3 4 4

19.UCHAR *pucCharArray[10][10]

typedef union unRec

{

ULONG ulIndex

USHORT usLevel[6]

UCHAR ucPos

}REC_S

REC_S stMax,*pstMax

四字节对齐方式时: sizeof(pucCharArray) = __指针的数组,每个指针的地址都是4字节____, sizeof(stMax)=_______, sizeof(pstMax)=__地址______,sizeof(*pstMax)=________.

答案:400 12 4 12

20.typedef union unHead

{

UCHAR aucSrc [6]

struct tagContent

{

UCHAR ucFlag[3]

ULONG ulNext

}Content

}HEAD_S

32CPU,VC编译环境下:

在强制一字节对齐情况下,请指出sizeof(HEAD_S) = ________

在强制二字节对齐情况下,请指出sizeof(HEAD_S) = ________

在强制四字节对齐情况下,请指出sizeof(HEAD_S) = ________

答案:7 8 8

21.

UCHAR *pszTest = "hello"

UCHAR aucTest[] = "hello"

请问 sizeof(pszTest) = _____ , sizeof(*pszTest) = ______, sizeof(aucTest) = ______.

答案:4 16

22. struct BBB

{

long lNum

char *pcName

shortsDate

char cHa[2]

shortsBa[6]

}*p

p = 0x100000

p + 0x1 = 0x____

(unsigned long)p + 0x1 = 0x______

(unsigned long *)p + 0x1 = 0x______

(char *)p + 0x1 = 0x______

答案:100018 100001 100004 100001

23.在4字节对齐的情况:

typedef struct tagRec

{

long lA1

char cA2

char cA3

long lA4

long lA5

} REC_S

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

{

REC_S stMax

printf("\r\n sizeof(stMax)= %d",sizeof(stMax))

return

}

输出结果为:

sizeof(stMax)=____

答案:16

24.void main ()

{

unsigned long ulA = 0x11000000

printf("\r\n%x",*(unsigned char *)&ulA)

return

}

输出结果为:

答案:0

三、指出下列程序中导致不能出现预期结果的唯一错误(不考虑编程规范错误)

1.下面程序用于输出用户输入的字符串。请指出其中的问题

#define OK 0

#define ERR 1

#define ERROR (-1)

#define BUFFER_SIZE 256

int GetMemory(char **ppszBuf, int num)

{

if( NULL == ppszBuf )

{

ASSERT(0)

return ERROR

}

*ppszBuf = (char *)malloc(num)

if(NULL == *ppszBuf)

{

return ERROR

}

return OK

}

void Test(void)

{

char *pcStr = NULL

if(OK == GetMemory(&pcStr, BUFFER_SIZE))

{

scanf("%s",pcStr)/*这里假定BUFFER_SIZE足够大,不会导致越界*/

printf(pcStr)

free(pcStr)

}

return

}

答案:要采用printf("%s", str)的形式打印,否则如果输入为%s, %d等形式可能会导致不可知现象。

2.此函数实现把32位IP地址(主机序)以字符串的方式打印出来,请找出代码中的错误:

char *IpAddr2Str(unsigned long ulIpAddr)

{

char szIpAddr[32]

(void)VOS_sprintf(szIpAddr, "%d.%d.%d.%d", ulIpAddr >>24,

(ulIpAddr >>16) &0xff, (ulIpAddr >>8) &0xff, ulIpAddr &0xff)

return szIpAddr

}

答案:函数的局部变量是存放在堆栈中的,此函数返回了堆栈中的地址,函数退出后堆栈中的内容不可用。

3.如下程序用于输出"Welcome Home"。请指出其中的错误:

void Test(void)

{

char pcArray[12]

strcpy(pcArray,"Welcome Home")

printf("%s!", pcArray)

return

}

答案:数组越界。

4.如下程序用于把"blue"字符串返回,请指出其中的错误:

char *GetBLUE(void)

{

char* pcColor

char* pcNewColor

pcColor = "blue"

pcNewColor = (char*)malloc(strlen(pColor))

if(NULL == pcNewColor)

{

return NULL

}

strcpy(pcNewColor, pcColor)

return pcNewColor

}

答案:申请内存空间不足,字符串结尾还有'\0'。

5.下面程序期望输出str = hello world,请指出其中的错误:

char * GetStr(char *p)

{

p = "hello world"

return p

}

void main()

{

char *str = NULL

if(NULL != GetStr(str))

{

printf("\r\n str = %s",str)

}

return

}

答案:无法返回字符串,参数使用错误。