c语言第四章作业,C语言程序设计 第四章 习题详解

原标题:C语言程序设计 第四章 习题详解

第四章:数组 第一题:选择题

1.若有下列说明,则数值为 4 的表达式是( ) int a[12]={ l,2,3,4,5,6,7,8,9,10,11,12 };char c=‘a’,d, g; ①a[g-c] ②a[4] ③a[‘d’-‘c’] ④a[‘d’-c]

2.设有定义:“char s[12]={”string“};” 则 printf(“%dn”,strlen(s));的输出是( ) ① 6 ② 7 ③11 ④ 12

3.下列语句中,正确的是( ) ① char a[3][]={‘abc“ , ’1‘} ; ② char a[][3]={’abc‘,’l‘}; ③char a[3][]={‘a’,“1”}; ④char a[][3]={“a”, “1”};

4.合法的数组定义是( ) ①int a[]={“string”} ②int a[5]={0,1,2,3,4,5}; ③char a={“string”} ④char a[]={0,1,2,3,4, 5}; 5.语句“printf(”%dn“,strlen(”atsnol21“));”的输出结果是( ) ①11 ②10 ③ 9 ④ 8

1~5解析:1.「解」数组元素的下标自 0 开始顺序编号,值为 4 的元素是 a[3].所以只有下标表达式的值为 3 的 才是正确的。下标表达式 g-c 中的的变量 g 和 c 的值是还未被设定的,其值不确定。a[4]的值为 5,下标为 4 是不对的。‘d’-‘c’的值为 1,a[l]的值是 2,所以也是不对的。变量 c 的值为‘a’ ,‘d’-c=3,所以正确解答是④。 2.「解」在 C 语言中,字符串是指在有效字符之后有字符列结束标记符的字符列,并约定字符串的长度是指字符列中有效字符个数,不包括字符串的结束标记符。存放于字符数组 s 中的字符串是“string”,该字符串的长度为 6,所以输出该字符串的长度应是 6.正确的解答是①。 3.「解」如定义数组时有初始化,其最高维的长度可以省缺,由系统根据初始化时的初值个数确定,而其它维的长度是不可以缺省的。对二维字符数组的初始化,可以按行用字符串对其初始化,也可以按二维数组元素的存储顺序逐一用字符对其元素初始化。在供选择解答①和③中,有不是最高维的长度被缺省,所以是错误的。在供选择解答①和②中,还将字符串常量写作‘abc’,这也是错误的。只有④,用字符列按行给二维字符数组初始化,这才是正确的。正确构解答是④。 4.「解」①错误的原因是整数数组不可以用字符串对其初始化。②错误的原因是,数组初始化时,初始化指定的值的个数多于数组的元素个数。③错误的原因是,能用字符串初始化的只;有字符指针变量,或字符数组。字符率不能对其它类型的变量初始化,包括字符变量。④是正确的,因为字符数组可以用小整数(作为字符的 ASCII 代码值)对其元素初始化。 5.「解」字符串中的字符可以是一般的普通字符,也可以是由反斜杠字符开头的转义字符。在字符串“absno121” 中,有三个转义字符,它们是n、1、,所以该字符串的有效字符个数是 9.所以正确的回答是③。

6.函数调用“strcat(strcpy(strl,str2),str3)”的功能是( ) ①将字符串 strl 复制到字符串 str2 中后再连接到字符串 str3 之后 ②将字符串 strl 连接到字符串 str2 中后再复制到字符率 str3 之后 ③将字符串 str2 复制到字符串 strl 中后再将字符串 str3 连接到字符串 strl 之后 ④将字符串 str2 连接到字符串 strl 之后再将字符串 strl 复制到字符串 str3 中.

7.设有如下定义,则正确的叙述为( ) char x[]={“abcdefg”}; char y[]={‘a’,‘b’,‘c’,‘d’,‘e’,‘f’,‘g’}; ① 数组 x 和数组 y 等价② 数组 x 和数组 y 长度相同③ 数组 x 的长度大于数组 y 的长度④ 数组 x 的长度小于数组 y 的长度

6~7解析:6.「解」函数调用 strcat(s1,s2)是将 s2 字符串复制连接到 s1 字符串之后,使 s1 字符串变得更长。函数调用strcpy(s1,s2)是将 s2 字符串复制到 s1,使 s1 字符串的内容与 s2 字符串的内容相同。函数调用 strcat(strcpy(strl,str2) ,str3) 是先执行 strcpy(strl,str2),然后再执行 strcat(strl,str3),所以其功能是将字符串 str2 复制到字符串 strl中,然后再将字符串 str3 复制连接到字符串 strl 之后。正确的选择是③。 7.「解」不指定数组长度的字符数组定义,其所需要的字节数可由初始化中给出的值的个数确定。字符数组可以用字符串初始化,也可用字符逐个给字符数组的元素初始化。但用字符初始化时,尽管给出了字符串中的全部字符,还是不会自动有字符率结束字符。但字符串初始化自动会含有字符串的结束标记符,字符串初始化所需要的字节个数会比用同样多的字符初始化多 1 个字节。所以只有③才是正确的。第二题:填空题

1.根据变量定义“static int b[5], a[][3]={1,2,3,4,5,6};”,b[4]=_______,a[1][2]=_______. 2.设有定义语句“static int a[3][4]={{1},{2},{3}};”则 a[l][l]值为_______,a[2][1]的值为_______。 3.若在程序中用到“putchar( )”函数时,应在程序开头写上包含命令_______,若在程序中用到“strlen( )”函数时,应在程序开头写上包含命令_______。 4.下面程序的功能是输出数组 s 中最大元素的下标,请填空。

main()

{

int k, p ;

int s[]={1,-9,7,2,-10,3};

for(p=0, k=p;p<6; p++)

if(s[p]>s[k])____________

printf(“%dn” ,k);

}

5.下面程序的功能是将一个字符串 str 的内容颠倒过来,请填空。

main()

{int i, j,_____________;

char str[]={“1234567”};

for(i=0,j=strlen(str) ; i< j;i++,j--)

{ k=str[i]; str[i]=str[j]; str[j]=k; }

printf(“%sn”, str);

}

6.以下程序可把输入的十进制数以十六进制数的形式输出,请填空。

main( )

{

char b[17]={“0123456789ABCDEF”};

int c[64],d,i=0,base=16;

long n;

printf(“Enter a number:n”);

scanf(“%ld”, &n):

do { c[i]=________;i++;n=n/base;}

while(n!=0);

printf(“Transmite new base:n”);

for(--i; i>= 0;--i)

{d=c[i]; printf(“%c”, );}

printf(“n”);

}

1~6解析:1.「解」系统规定,静态变量定义时,若末初始化,系统自动给定二进制代码全 0 的值。所以静态数组 b 的元素全为 0,当然包括 b[4]也为 0。 静态数组 a 是二维数组,每行有三个元素,在初始化中结出了六个初值,所以数组 a 有 2 行。由于数组的元素按行顺序存储,并按行顺序初始化。前三个值是第一行,后三个值是第二行。a[1][2]是第二行的第三列元素,也是 a 的最后一个元素,所以其值是6. 2.「解」给二维数组初始化时,可按行给出初值,并且每行可以只给前面部分的元素给出初值。系统规定,对那些未给出初值的部分元素,系统自动置二进制代码全 0 的值。由于定义语句只给 a[0][0]给定初值 l、a[l][0]给定初值 2、a[2][0]给定初值 3.这 样,其它元素都为 0 值。所以,a[1][1]= 0,a[2][1]= 0. 3.「解」putchar()是系统提供的头文件 stdio.h中定义的宏,所以程序要使用它,必须写上包含命令:#include . 函数 strlen()是系统提供的字符串处理函数之一,字符串处理函数的函数原型说明和它们用到的有关常量、数据结构等,在系统提供的头文件 string.h 中定义,所以使用该函数的程序应在程序开头写上包含命令 #include . 4.「解」为要寻找数组中的最大元素的下标,需先预设 1 个临时最大元素的下标,并顺序逐一考察数组的元素,当发现当前元素比临时最大元素更大时,就用当前元素的下标更新临时最大元素下标。直至考察了数组的全部元素后,这临时最大元素下标就是数组的最大元素下标。通常预设的最大元素下标是数组的首元素下标,考察是从首元素开始顺序向后继元素考察。程序中,存储临时最大元素下标的变量是 k,变量 p 控制顺序考察的循环控制变量。当发现当前元素 s[p]比临时最大元素 s[k]更大时,应该用 p 更新 k.所以在空框处应填入代码“k=p;”。 5.「解」颠倒一个字符串中的字符,就是首尾对应的元素两两交换。简单地可用两个游标变量 i 和j, i 是前端元素的下标, j 是后端元素的下标, 交换以这两个变量值为下标的元素 str[i]和 str[j].开始时,i 的值为 0,j 的值为字符串末元素的下标(字符串长度减 1)。每次交换后,i 增 1,j 减 1.继续交换的条件是 str[i]还位于 str[j]的前面,即 i< j.字符串末元素的下标是它的长度减 1,所以在第二个空框处应填入-1.程序为了交换 str[i]和 str[j],使用了变量 k,该变量应在程序的变量定义部分中一起定义,所以在第一个空框处应填入 k 6.「解」程序中,字符数组 b 存储十六进制的 16个数字符,整型数组 c 存储译出的十六进制数的各位数值。从整数 n 译出它的各位十六进制数值,需采用除 16 取余的方法,即求 n 除 16 的余。得到它的十六进制的个位数,接着将 n 除以 16.在 n 不等 于 0 的情况下循环,能顺序求出 n 的十六进制的个位数、十位数、百位数等等。程序中变量 base 已预置 16,所以在第一个空框处可填代码 n%base。当 n的十六进制数的个位、十位、百位等数字依次存放于数组 c 中后,就从最高位至最低位,参照数组 c 的内容 d(以其内容为下标),取十六进制数字符表中的字符 b[d]输出。所以在第二个空框处可填入代码 b[d].第三题:程序分析题

1.阅读程序,写出程序运行结果。,

main()

{

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

int i,j,sl=0,s2=0;

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

for(j=0;j<3;j++)

{ if(i==j) s1=s1+a[i][j];

if(i+j== 2) s2=s2+a[i][j];

}

printf(“%dn%dn”, sl,s2);

}

2.说明下列程序的功能。

main()

{

int i,j;

float a[3][3],b[3][3],x;

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

for(j=0;j<3 ;j++)

{ scanf(“%f”,&x); a[i][j]= x;

}

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

for(j=0;j<3;j++)

b[j][i]=a[i][j];

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

{printf(“n”);

for(j=0;j<3;j++)

printf(“%f”,b[i][j]);

}

printf(“n”);

}

3.写出下列程序的运行结果。

main()

{

static char a[]={‘*’,‘*’,‘*’,‘*’,‘*’,‘*’};

int i,j,k;

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

{ printf(“n”);

for(j= 0;j< i;j++) printf(“%c”,‘ ’);

for(k=0;k<5 ;k++)printf(“%c”,a[k]);

}

printf( “n”);

}

4.说明下列程序的功能。

main()

{

int i,j ;

float a[3][3],b[3][3],c[3][3],x;

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

for(j=0;j< 3;j++)

{ scanf(“%f”, &x); a[i][j]= x;

}

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

for(j=0;j< 3;j++)

{scanf(“%f”,&x);b[i][j]=x;

}

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

for(j=0;j< 3;j++)

c[i][j]=a[i][j]+ b[i][j] ;

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

{ printf(“n”);

for(j=0;j< 3;j++)

printf(“%f”, c[i][j]);

}

printf(“n”);

}

1~4解析:1.「解」已知数组共有 3 行 3 列,第一行依次是9,7,5;第二行是 3,1,2;第三行是 4,6,8.程序引用数组元素的游标变量是 i 和 j,外循环控制变量 i 是数组的行下标,内循环控制变量 j 是数组的列下标。循环体的工作是将数组的某些元素累计到 sl,某些元素累计到 s2.将行下标 i 和列下标 j 相同的元素累计到 sl,sl=a[0][0]+a[l][1]+a[2][2].将行下标 i 与列下标 j 的和为 2 的元素累计到 s2,s2=a[0][2]+a[l][l]+a[2][0].所以 sl 是 18,s2 是 10.程序输出: 18 10 2.「解」程序第一段两重循环,实现按行顺序输入数组 a 的全部元素的值。程序第二段两重循环是将数组 a 转置复制到数组 b. 程序第三段两重循环实现按行输出数组 b 的全部元素。所以程序的功能是按行顺序输入 33 二维数组的全部元素,然后按列顺序输出。 3.「解」程序的外循环控制循环五次,每次开始先输出一个换行符,共输出 5 行信息。对于 i(自 0开始计算)行,先输出 i 个空白符,接着输出字符数组 a 中的五个字符,由于 a 中的五个字符都是字符。,所以输出五个字符。这样程序是输出以下形式的图案:

* * * * * * * * * * * * * * * * * * * * * * * * *

4.「解」程序第一段的功能是按行顺序输入数组a 的元素。程序第二段的功能是按行顺序输入数组b 的元素。程序第三段的功能是顺序累加数组 a 和数组 b 的对应元素,并将和存于数组 c 的对应元素中。最后,按行顺序输出数组 c 的全部元素第四题:程序设计题

1.编程序,输入单精度型一维数组 a[10] ,计算并输出 a 数组中所有元素的平均值。 2.编程序,输入 10 个整数存入一维数组,再按逆序重新存放后再输出。 3.编程序,输入两个字符串(<40 个字符) ,连接后输出(不准用系统函数) . 4.编程序按下列公式计算 s 的值(其中 x1、x2、…、xn 由键盘输入): s=∑(xi-x0)(xi-x0)(其中 x0 是 x1、x2、…、 xn 的平均值) 5.输入一个 3X5 的整数矩阵,输出其中最大值、最小值和它们的下标。

1~5解析:1.「解」为了计算数组元素的平均值,首先要累计它的全部元素的和,然后除以数组元素的个数,即得数组元素的平均值。写成 C 程序如下:

# include

main()

{ int i, n=10;

float s,a[10] ;

printf(“Enter %d numbers! n”, n);

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

{ scanf(“%f”,&s); a[i]= s;

}

for(s=0.0,i=0;i< N;I++)

s+= a ;

s /=n;

printf(“平均值是%.2fn”, s);

}

2.「解」将数组的元素逆序重新存放,就是将数组的首尾对应元素两两交换。简单地可用两个游标变量 i 和 j,i 是前端元素的下标,j 是后端元素的下标,交换以这两个变量值为下标的数组元素。开始时,i 的值为 0,j 的值为末元素的下标。每次交换 后,i 增 1,j 减 1.继续交换的 条件是 i< J.程序如下:

# include

main()

{ int a[10], i,j,t,n=10;

printf(“Enter %d numbers! n”, n);

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

scanf(“%d”,&a[i]);

for(i=0,j=n-1;i< j;i++,j--) {

t= a[i]; a[i]=a[j] ;a[j] =t;

}

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

printf(“%dt”, a[i]);

printf(“n”);

}

3.「解」将字符串 s2 连接到字符串 s1 的计算过程可分两个步骤完成。首先找到字符串 s1 的末尾,然后参照字符串 s2,将字符串 s2 的全部有效字符逐一复制到字符串 s1,最后在字符串 s1 的末尾接上字符串结束标记符。完整程序如下:

# include

# define N 40

main()

{char s1[N] ,s2[N];

int i,j;

printf(“Enter stringl!n”);

scanf(“%s”,s1);

printf(“Enter string2! n”);

scanf(“%s”, s2);

for(i=0; sl[i]!=‘0’ ; i++);

for(j=0;s2[j]!=‘0’ ;i++,j++)

s1[i]=s2[j] ;

s1[i]=‘0’

printf(“sl=%sn” ,sl);

}

4.「解」输入数组 x 的 n 个元素的值,按公式计算。程序首先输入 n,设 n<100,然后输入 n 个数据,接着求它们的平均值,最后按计算公式求出 s,并输出。程序如下:

# include

# define N 100

main()

{ double x[N+1], s;

int i,n;

do {

printf(“Enter n(<100)”);

scanf(“%d”, &n);

} while(n<=0||n>=100);

for(i=1; i<=n;i++){

scanf(“%lf”, &s);

x[i]=s;

}

for(s=0.0,i=1;i<=n; i++)

s+=x ;

x[0] = s/n;

for(s=0.0,i=1;i<= n;i++)

s+=(x[i]-x[0])*(x[i]-x[0]);

printf(“s=%fn”, s);

}

5.「解」输入一个二维数组,寻找二维数组的最大值和最小值。其中寻找最大值和最小值的工作可用两重循环实现,即按行按列考察二维数组的元素。程序如下:

# include

main()

{ int a[3][5], i,j,t,n=3, m=5,min,

max, minrow, mincol, maxrow, maxcol;

printf(“Enter %d*%d numbers !n” , n,m);

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

for( j=0;j< m;j++){

scanf(“%d”, &t);

a[i][j]= t;

}

min=max=a[0][0];

minrow=mincol=maxrow=maxcol=0;

for(i=0;i< n;I++)

for(j=0;j< m; J++){

if( a[i][j]> max ){

max= a[i][j] ;maxrow= i;maxcol=j ;

}

if( a[i][j]< min) {

min=a[i][j]; minrow= i; mincol=j;

}

}

printf ( “MAX = a[%d][%d] = %d MIN =

a[%d][%d] =%d n”,maxrow,maxcol,max,

minrow,mincol,min) ;

}

6.输入一个字符串,将其中的所有大写字母改为小写字母,而所有小写字母全部改为大写字母,然后输出。 7.设某班 50 名学生的三科成绩表如下: 课程一 课程二 课程三 …… …… …… 试编一个程序,输入这 50 个学生的三科成绩,计算并输出每科成绩的平均分。 8.编一个程序,输入一个整型数据,输出每位数字,其间用逗号分隔。例如,输入整数为 2345,则输出应为: 2, 3, 4, 5. 9.编一个程序,输入一个字符串,将其中所有的大写英文字母的代码+3,小写英文字母的代码-3.然后输出加密后的字符串。

6~9解析:6.「解」程序先输入字符串,然后顺序考察输入字符串中的字符,当发现是大写字母时,将它改写成对应的小写字母,而当它是小写字母时,就将它改写成对应的大写字母。若变量 ch 中的字符是大写字母,则与它对应的小写字母的表达式可以写成ch- ‘A’+‘a’ ;类似地,若变量 ch 中的字符是小写字母,则与它对应的大写字母的表达式可以写成 ch-‘a’+‘A’ .完整程序如下:

# include

#include

# define N 200

main()

{ char s[N] ;

int i;

printf(“ Enter string! n”);

gets(s);

for(i=0; s!=‘0’;i++)

if(s [i] >=‘A’&&s[i]<=‘Z’ )

s[i]=s[i] -‘A’+‘a’ ;

else if(s [i]>=‘a’&& s [i]<=‘z’)

s= s-‘a’ +‘A’ ;

printf(“s=%sn”,s);

}

7.「解」程序定义一个 50 行 3 列的二维数组,用于存储全班学生的成绩。程序顺序输入各个学生的三科成绩,然后按列的顺序,累计各科总分,并计算平均分。完整程序如下:

# include

# define N 50

# define M 3

main()

{int score[N][M], i,j,t;

double a[M];

printf(“Enter scores!n”);

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

for(j=0;j< M;j++) {

scanf(“%d”,&t);

score[i][j]=t;

}

for(j=0;j< M;j++)a[j]=0.0;

for(j=0;j< M;j++){

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

a[j]+= score[i][j];

a[j]/= N;

}

for(j=0;j< M;j++)

printf(“课程%d 的平均分是%.2fn”, j+1,

a[j]);

}

8.「解」程序的主要工作是从输入整数分拆出它的十进制整数的各位数字,将分拆出来的各位数字存于数组中,然后将这些数字自高位到低位的顺序逐位输出。要将一个整数按十进制数的要求分拆,需用一个循环,每次循环求出被分拆数除以 10 的余数的办法来求出它的个位,每分拆出一位就将被分拆的数除以 10.循环过程直至被分拆的数为 0 结束。完整程序如下:

# include

main()

{int a[20],i,base=10;

int n;

printf(“Enter a number! n”);

scanf(“%d”, &n);/*整数输入*/

i=0;/*对 n 进行分拆,各位数字自低位到高

位存于数组 a*/

do{

a[i++]=n% base;

n/= base;

} while(n) ;

for(i--;i>=0;i--)/*自高位到低位输出*/

printf(“%d%c”,a[i] ,i>0?’,’:’n’);

}

9.「解」程序的主要工作是输入字符串,并顺序考察输入字符串中的字符,分别对其中大小写英文字母完成问题要求的更改,而跳过不是英文字母的字符。完整程序如下:返回搜狐,查看更多

# include

#include

# define N 200

main()

{char s[N];

int i;

printf(“Enter string! n”);

gets(s);

for(i=0;s[i]!=‘0’; i++)

if(s[i]>=‘A’ && s[i]

s[i]+=3;

else if(s[i]>=‘a’&& s[i]

s[i]+=3;

printf(“s=%sn”,s);

}

责任编辑:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值