C语言程序设计习题答案(613) .

有以下程序

#include <stdio.h>

#include <string.h>

void fun(char s[][10],int n)

{ char t;int i,j;

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

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

/* 比较字符串的首字符大小,并交换字符串的首字符 */

if (s[i][0] > s[j][0]) {t=s[i][0];s[i][0]=s[j][0];s[j][0]=t;}

}

main()

{ char ss[5][10]={"bcc","bbcc","xy","aaaacc","aabcc"};

fun(ss,5); printf("%s,%s\n",ss[0],ss[4]);

}

程序运行结果是

A)xy,aaaacc

B)aaaacc,xy

C) xcc,aabcc

D) acc,xabcc


正确答案:D


●试题五

阅读下列程序说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。

【程序5说明】

著名的四色定理指出任何平面区域图均可用四种颜色着色,使相邻区域着不同的颜色。本程序对给定的区域图找出所有可能的不超过四种颜色的着色方案。

程序中用1~4表示四种颜色。要着色的N个区域用0~N-1编号,区域相邻关系用adj[][]矩阵表示,矩阵的i行j列的元素为1,表示区域i与区域j相邻;矩阵的i行j列的元素为0,表示区域i与区域j不相邻。数组color[]用来存储着色结果,color[i]的值为区域i所着颜色。

【程序5】

#include<stdio.h>

#define N 10

void output(int color[])/*输出一种着色方案*/

{int i;

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

printf("%4d",color[i]);

printf("\n");

}

int back(int*ip,int color[])/*回溯*/

{int c=4;

while(c==4){

if(*ip<=0)return 0;

--(*ip);

c= (1) ;

color[*ip]=-1;

}

return c;

}

/*检查区域i,对c种颜色的可用性*/

int color0k(int i,int c,int[][N],int color[]}

{int j;

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

if( (2) )

return 0;

return 1;

}

/*为区域i选一种可着的颜色*/

int select(int i,int c,int adj[][N],int color[])

{int k;

for(k=c;k<=4;k++)

if(colorOK( (3) ))

return k;

return 0;

}

int coloring(int adj[][N])/*寻找各种着色方案*/

{int color[N],i,c,cnt;

for(i=0;i<N;i++)color[i]=-1;

i=c=0;cnt=0;

while (1) {

if((c= (4) )==0){

c=back(&i,color);

if(c==0)return cnt;

}else{ (5) ;i++;

if(i==N){

output(color);

++cnt;

c=back(&i,color);

}else c=0;

}

}

}

void main()

{int adj[N][N]=

{{0,1,0,1,1,1,1,1,1,1},

{1,0,1,1,0,1,1,1,1,0},

{0,1,0,1,0,1,1,0,1,1},

{1,1,1,0,1,1,0,0,1,1},

{1,0,0,1,0,1,0,0,0,0},

{1,1,1,1,1,0,1,0,0,1},

{1,1,1,0,0,1,0,0,1,0},

{1,1,0,0,0,0,0,0,1,1},

{1,1,1,1,0,0,1,1,0,1},

{1,0,1,1,0,1,0,1,1,0}

};

printf("共有%d组解.\n",coloring(adj));

}


正确答案:

●试题五

【答案】(1color*ip](2adji][j != 0 && colorj == c

3i,k,adj,color4select i,c+l,adj,color)(5colori=c

【解析】(1Back()函数将color数组中紧邻*ip位置的,颜色值为4的一个连续区域的元素赋值为-1。(2colorOK()判断区域i对其之前的所有区域是否可以着色c。该句是检查i的相邻区域是否已有颜色为c的。(3)这是colorOK的参数列表。Select为区域i选择一种颜色,使用colorok函数对各种颜色(值为c4的一种,不一定是所有颜色)分别进行检查。(4Coloring()函数寻找各种着色方案。它先从区域0开始,检查颜色,并着色(着色的顺序总是从小色值的颜色开始的)。当发现某一区域无法着色时,就使用back()函数,将该区域之前的一个连贯区域进行洗色(对应color数组中赋值为-1)并回溯,并从回溯后的位置,重新开始进行颜色检查和赋色,但使用的色值比该位置洗色前的颜色值更大。若所有区域均已着色,则输出该着色方案。然后,使用back函数,重新进行着色。当所有颜色方案均已找到后,函数结束。(5)该句对区域i赋颜色cc为之前select函数所选出的可以用的颜色。


阅读下列程序说明和C代码,将应填入(n)处。

【程序5说明】

著名的四色定理指出任何平面区域图均可用四种颜色着色,使相邻区域着不同的颜色。本程序对给定的区域图找出所有可能的不超过四种颜色的着色方案。

程序中用1~4表示四种颜色。要着色的N个区域用0~N-1编号,区域相邻关系用 adj[][]矩阵表示,矩阵的i行j列的元素为1,表示区域i与区域j相邻;矩阵的i行j列的元素为0,表示区域i与区域j不相邻。数组color[]用来存储着色结果,color[i]的值为区域i所着颜色。

【程序5】

include<stdio.h>

define N 10

void output(int color[])/*输出一种着色方案*/

{ int i;

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

printf("%4d",color[i]);

printf("\n");

}

int back (int * ip,int color[])/*回溯*/

{ int c=4;

while(c==4){

if(*ip<=0)return 0;

--(*ip);

c=(1);

color[*ip]=-1;

}

return c;

}

/*检查区域i,对c种颜色的可用性*/

int colorOk(int i,int c,int [][N],int color[]}

{ int j;

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

if((2))

return 0;

return 1;

}

/*为区域i选一种可着的颜色*/

int select (int i,int c,int adj[][N],int color[])

{ int k;

for(k=c;k<=4;k++)

if(colorOK((3)))

return k;

return 0;

}

int coloring(int adj[][N])/*寻找各种着色方案*/

{ int color[N],i,c,cnt;

for(i=0;i<N;i++)color[i] =-1;

i=c=0;cnt=0;

while(1){

if((c=(4))==0){

c=back(&i,color);

if(c==0)return cnt;

}else{(5);i++;

if(i==N){

output(color);

++cnt;

c=back(&i,color);

}else c=0;

}

}

}

void main()

{ int adj[N][N]=

{{0,1,0,1,1,1,1,1,1,1},

{1,0,1,1,0,1,1,1,1,0},

{0,1,0,1,0,1,1,0,1,1},

{1,1,1,0,1,1,0,0,1,1},

{1,0,0,1,0,1,0,0,0,0},

{1,1,1,1,1,0,1,0,0,1},

{1,1,1,0,0,1,0,0,1,0},

{1,1,0,0,0,0,0,0,1,1},

{1,1,1,1,0,0,1,1,0,1},

{1,0,1,1,0,1,0,1,1,0}

};

printf("共有%d组解.\n",coloring(adj));

}


正确答案:(1)color[*ip](2)adj[i][j]!=0 && color[j]==c (3)ikadjcolor(4)select(ic+1adjcolor) (5)color[i]=c
(1)color[*ip](2)adj[i][j]!=0 && color[j]==c (3)i,k,adj,color(4)select(i,c+1,adj,color) (5)color[i]=c 解析:(1)Back()函数将color数组中紧邻*ip位置的,颜色值为 4的一个连续区域的元素赋值为-1。(2)colorOK()判断区域i对其之前的所有区域是否可以着色c。该句是检查i的相邻区域是否已有颜色为c的。(3)这是colorOK的参数列表。Select为区域i选择一种颜色,使用colorok函数对各种颜色(值为c~4的一种,不一定是所有颜色)分别进行检查。(4)Coloring()函数寻找各种着色方案。它先从区域0开始,检查颜色,并着色(着色的顺序总是从小色值的颜色开始的)。当发现某一区域无法着色时,就使用back()函数,将该区域之前的一个连贯区域进行洗色(对应color数组中赋值为-1)并回溯,并从回溯后的位置,重新开始进行颜色检查和赋色,但使用的色值比该位置洗色前的颜色值更大。若所有区域均已着色,则输出该着色方案。然后,使用back函数,重新进行着色。当所有颜色方案均已找到后,函数结束。(5)该句对区域i赋颜色c。c为之前select函数所选出的可以用的颜色。


请阅读以下技术说明和C代码,将程序段中(1)~(5)空缺处的语句填写完整。

【说明】

著名的四色定理指出任何平面区域图均可用4种颜色着色,使相邻区域着不同的颜色。以下C程序对给定的区域图找出所有可能的不超过4种颜色的着色方案。该程序中用1~4分别表示4种颜色。要着色的N个区域用0~-1编号,区域相邻关系用adj[][]矩阵表示,矩阵的i行j列的元素为1,表示区域i与区域了相邻;矩阵的i行j列的元素为0,表示区域i与区域j不相邻。数组color[]用来存储着色结果,color[i]的值为区域i,所着颜色。

【C程序】

include <stdio.h>

define N 10

void output(int color[]) { /*输出一种着色方案*/

int i ;

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

printf( "%4d" , color[i] ) ;

printf ("\n") ;

}

int back(int *ip ,int color[] ) { /*回溯*/

intc = 4 ;

while ( c == 4 ) {

if ( *ip <= 0 )

return 0 ;

-- (*ip) ;

c =(1);

color[*ip] =-1 ;

}

return c ;

}

/*检查区域i,对c种颜色的可用性*/

int colorOk(int i , intc , int [] [N] ,int color[ ] ) {

int j ;

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

if ( (2) )

return 0 ;

return 1 ;

}

/*为区域i选一种可着色的颜色*/

int select (int i ,int c ,int adj [] [N] ,int color[ ] ){

int k ;

for(k = c ; k <= 4 ; k++ )

if( colorOK( (3) ))

return k ;

return 0 ;

}

int coloring(int adj [] [N]) { /*寻找各种着色方案*/

int color[N] , i , c , cnt ;

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

color[i] =-1 ;

i = c = 0 ;

cnt = 0 ;

while(1) {

if((c =(4) ) == 0 {

c = back( &i , color);

if( c == 0 )

return cnt;

}

else {

(5);

i++ ;

if i == N) {

output(color);

++cnt ;

c = back( &i , color ) ;

}

else c = 0 ;

}

}

}

void main()(

int adj[N] [N] =

{ {0,1,0,1,1,1,1,1,1,1},

{1,0,1,1,0,1,1,1,1,0},

{0,1,0,1,0,1,1,0,1,1},

{1,1,1,0,1,1,0,0,1,1},

{1,0,0,1,0,1,0,0,0,0},

{1,1,1,1,1,0,1,0,0,1},

{1,1,1,0,0,1,0,0,1,0},

{1,1,0,0,0,0,0,0,1,1},

{1,1,1,1,0,0,1,1,0,1},

{1,0,1,1,0,1,0,1,1,0},

} ;

printf("共有%d组解.\n",coloring(adj));

}


正确答案:(1)color[*ip] (2)adj[i][j]!=0 && color[j]==c (3)Ikadjcolor (4)select(Ic+1adjcolor) (5)color[i]=c
(1)color[*ip] (2)adj[i][j]!=0 && color[j]==c (3)I,k,adj,color (4)select(I,c+1,adj,color) (5)color[i]=c 解析:这是一道要求考生用C语言解决着色问题的编程题。本题的解答思路如下。
认真阅读程序说明部分和所给出的C程序段可知,该C程序由6个函数组成,即主函数main()、输出一种着色方案函数void output(int color[])、回溯操作函数int back(int *ip,int color[])、检查区域i对c种颜色的可用性函数int colorok(int I,int c,int[][N],int color[]、为区域i选一种可着的颜色函数int select(int I,int c,int adj[][N],int color[])和寻找各种着色方案函数int coloring(int adj[][N])。
1)空缺处在回溯操作子函数back()中,其中形参用指针指向记录当前考查区域号的变量。整个回溯过程是一个循环过程,当循环条件成立时,进行回溯。如果当前区域*ip已是0号区域,则不再回溯,函数返回0值,表示已穷尽了所有可能方案。否则,当前区域*ip减1,取出*ip区域的着色方案color[*ip]存放在c中,并置*ip区域为未着色。如果*ip区域的着色方案不是最后一种颜色,则回溯结束,函数返回该区域原来的着色方案。因此(1)空缺处所填写的内容是“color[*ip]”。
2)空缺处在检查区域i对c种颜色的可用性子函数colorok()中,根据程序的意义可以看出,(2)空缺处应填入的是判断该颜色不可取的条件,根据题干说明,相邻区域不能着相同的颜色,即和区域i相邻的区域不能着c种颜色。而当adj[i][j]为1时,表示区域j和区域i相邻。如果区域j着c种颜色,则颜色不可取。所以(2)空缺处所填写的内容是“adj[i][j]!=0 && color[j]==c”。
3)空缺处在为区域i选一种可着的颜色子函数select()中,依次选定一种颜色,调用colorok()函数,测试该颜色是否可以着在i区域上。(3)空缺处应为该函数colorok()填上实参“I,k,adj,color”,即(3)空缺处所填写的内容是“I,k,adj,color”。
4)(5)空缺处在寻找各种着色方案子函数coloring()中,该程序中定义了用于存放一种着色方案的数组color[],并对数组进行了初始化。该函数执行部分的程序结构是由一个while循环完成,循环的主体是一个if...else语句。该if...else体的else部分又包含一个if...else语句。在嵌套的内层if...else语句中,当 if(i==N)中条件成立时,表示为每一区域都找到了合适的颜色,则该方案是成功的,之后输出一种着色方案,再进行回溯。如果有一个区域找不到合适的颜色,则该方案就是失败的,这时也需要进行回溯操作。
由以上分析可知,寻找全部着色方案在while循环中进行,每次循环首先是为i号区域寻找一种方案。因为select()函数的功能就是为i区域选一种可能的颜色,同时可选的初始颜色是c+1号颜色,邻接矩阵是 adj[][],选定的颜色存于数组color[]中,所以(4)空缺处所填写的内容是“select(I,c+1,adj,color)”。
根据if(c=select(I,c+1,adj,color))==0)能够证实对函数back()的第一次调用肯定是在一种方案失败的情况下,而紧接着的else后面的语句则显然表示为区域i找到了一种可用的颜色c,所以应将颜色c存储在数组color[]中,即(5)空缺处所填写的内容是“color[i]=c”。


若有说明:int a[][3]={0,0};则不正确的叙述是( )

A.数组a的每个元素的初值都是0

B.数组a的第一维大小为1

C.数组a的行数为1

D.只有元素a[0][0]和a[0][1]可得到初值0,其余元素均得不到初值0


正确答案:D
解析:本题考查给二维数组元素赋值。给二维数组元素赋值时应注意下列两点:①在对二维数组元素赋初值时,可以只对部分元素赋初值,未赋初值的元素自动取0。②二维数组第一维的大小由下列规则确定:当初值的个数能被第二维的常量表达式的值除尽时,所得商数就是第一维的大小;当初值的个数不能被第二维的常量表达式的值除尽时,第一维的大小等于所得商数加1。


C语言程序设计习题答案习题六 数组一、 选择题110: BDBCD CDBAB1120:BCDCC DABBC2130:CCADC ABBCB3141:BDDDD CDCCB A二、 填空题1 9 、 0 2 先行后列 3 连续的存储空间中 4 QuickC 5. (c=getchar( ) 、 A+i或65+i 6. 0 、 str1i-str2i 7 CDABC 8 10 14 9 6 10 1 0 0 0 00 1 0 0 00 0 1 0 00 0 0 1 00 0 0 0 111 600 12 AzyD 13 4 some string *test 三、 编程题1. 定义一个有20个元素的整型数组,分别求出下标为奇数和偶数的元素的平均值。 答:程序参见文件Cprogramxt6_3_01.c #include stdio.h#include math.hmain()int i,s0=0,s1=0,a20; for(i=0;i20;i+) ai=rand()%100; for(i=0;i20;i+=2)printf(%3d,ai); s0=s0+ai; printf( sum is:%d ave=%fn,s0,s0/10.0); for(i=1;i20;i+=2)printf(%3d,ai); s1=s1+ai; printf( sum is:%d ave=%fn,s1,s1/10.0); 2. 设有一个整型数组,另输入一个整数,编程查找这个整数是否在数组中出现过,若出现,则输出第一次出现的位置,否则,输出no found。 答:程序参见文件Cprogramxt6_3_02.c #include stdio.h#include math.hmain()int i,s,a20; for(i=0;i20;i+) ai=rand()%100; scanf(%d,&s); for(i=0;i20;i+)if(ai=s)printf(found:a%d=%dn,i,ai); break; if(i=20) printf(no foundn); for(i=0;i20;i+)printf(%3d,ai); printf(n);3. 设有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入到数组中。 答:程序参见文件Cprogramxt6_3_03.c #include stdio.h#define N 10main()int i, j, s, aN=17,15,13,11,9,7,5,3,1; /int aN=1,3,5,7,9,11,13,15,17; scanf(%d,&s); i=0; if (a0ai) i+; else while(si;j-)aj=aj-1; aj=s; for(i=0;iN;i+)printf(%3d,ai); printf(n);4. 编一程序,从一个已排好序的数组中删去某个位置上的元素。 答:程序参见文件Cprogramxt6_3_04.c #include stdio.h#define N 10main()int i, j, aN=1,3,5,7,9,11,13,15,17,19; for(i=0;iN;i+) printf(%3d,ai); printf(n); scanf(%d,&i); for(j=i;jN-1;j+) aj=aj+1; aj=0; for(i=0;iN;i+) printf(%3d,ai); printf(n);5. 将一个二维数组的行、列互换后存到另一个二维数组中并输出结果。 答:程序参见文件Cprogramxt6_3_05.c #include stdio.hmain()int i,j; int a34=1,3,5,7,9,11,13,15,17,19,21,23,b43; for(i=0;i4;i+)for(j=0;j3;j+) bij=aji; printf(array a:n); for(i=0;i3;i+)for(j=0;j4;j+) printf(%5d,aij); printf(n); printf(array b:n); for(i=0;i4;i+)for(j=0;j3;j+) printf(%5d,bij); printf(n); 6. 编一程序,在一个二维数组中,查找第一次出现的负数,并输出该数及其所在的行、列号。 答:程序参见文件Cprogramxt6_3_06.c #include stdio.hmain()int i,j,flag; int a34=1,3,5,7,9,11,13,-15,17,19,-21,23; flag=0; for(i=0;i3;i+) for(j=0;j4;j+) if(aij0)flag=1; printf(found:a%d%d=%dn,i,j,aij); i=j=100;/可使双重循环提前结束 if(flag=0) printf(no found !); printf(array a:n); for(i=0;i3;i+)for(j=0;j4;j+) printf(%5d,aij); printf(n);7. 编程将一个字符数组中的字母,按由大到小的顺序进行排序。 答:程序参见文件Cprogramxt6_3_07.c #include stdio.h#include string.hmain()char t,s=ABCDIVBHFBVCNLKFDB; int i,j,n; puts(s); n=strlen(s); for(i=0;in-1;i+) for(j=i+1;jn;j+) if(sisj) t=si;si=sj;sj=t; puts(s);8. 输入一行字符,统计其中有多少个英语单词,单词之间用空格隔开。 答:程序参见文件Cprogramxt6_3_08.c #include stdio.h#include string.hmain()char s81; int w,i,n; gets(s); i=0;n=0;w=0; while(si!=0) if(si= )w=0; /*end of a word*/ elseif(w=0)w=1;n+; /*begin of a word*/ i+; printf(number of word:%dn,n);9. 编程将两个一维数组中的对应元素的值相减后进行输出。 答:程序参见文件Cprogramxt6_3_09.c #include stdio.h#include math.hmain()int i,a10,b10; for(i=0;i10;i+)ai=rand()%100; printf(%4d,ai); printf(n); for(i=0;i10;i+)bi=rand()%100; printf(%4d,bi); printf(n); for(i=0;i10;i+) printf(%4d,ai-bi); printf(n);10. 有n个无序的数放在数组a中,请将相同的那些数删得只剩得一个,输出经过删除后的数据。 答:程序参见文件Cprogramxt6_3_10.c #include stdio.hmain()int i,j,k,a10=90,20,40,30,50,50,50,50,20,80; for(i=0;i10;i+) printf(%4d,ai); printf(n); for(i=0;i9;i+) for(j=i+1;j10;j+) if(aj=ai)aj=-888;k=0;for(i=0;i10;i+) if(ai!=-888) printf(%4d,ai); ak+=ai; /不相同的有效元素只有K个了 printf(n); 11. 求二维数组中这样一个元素的位置:它在行上最小,在列上也最小。如果没有这样的元素则输出相应的信息。 答:程序参见文件Cprogramxt6_3_11.c #include stdio.h#include math.hmain()int j,i,k,flag,fz=0,a45; for(i=0;i4;i+) for(j=0;j5;j+) aij=rand()%100; printf(%4d,aij); printf(n); for(i=0;i4;i+) for(j=0;j5;j+) flag=1; for(k=0;k5;k+) if(aikaij) flag=0;break; for(k=0;k4&flag;k+) if(akjaij) flag=0;break; if(flag) fz+; printf(min a%d

( 24 )在窗体上画 1 个命令按钮,并编写如下事件过程:

Private Sub Command1_Click()

Dim a(3,3)

For m=1 To 3

For n=1 To 3

If n=m Or n=4-m Then

a(m,n)=0

End If

Print a(m,n);

Next n

Print

Next m

End Sub

运行程序,单击命令按钮,窗体上显示的内容为

A )

2 0 0

0 4 0

0 0 6

B )

2 0 4

0 4 0

4 0 6

C )

2 3 0

3 4 0

0 0 6

D )

2 0 0

0 4 5

0 5 6


正确答案:B


判断该地区居民的人均收入水平/A与去年的居民人均收入水平μ0(下标)相比是否有显著的差异,应选择的假设检验为( )。

A.H00:μ=μ0,H1:μ≠μ0

B.H0:μ=μ0,H1:μ≥μ0

C.H0:μ<μ0,H1:μ≥μ0

D.H0:μ≥μ0,H1:μ<μ0


正确答案:A
解析:若判断该地区居民的人均收入水平μ与去年的居民人均收入水平μ0相比是否有显著的差异,应采用双侧检验,其原假设与备择假设为:H0:μ=μ0,H1:μ≠μ0


阅读下列程序说明和C代码,将应填入(n)处的字句写在对应栏内。

【程序说明】

著名的四色定理指出任何平面区域图均可用4种颜色着色,使相邻区域着不同的颜色。本程序对给定的区域图找出所有可能的不超过4种颜色的着色方案。程序中用1~4表示4种颜色。要着色的N个区域用0~N-1编号,区域相邻关系用adj[][]矩阵表示,矩阵的i行j列的元素为1,表示区域i与区域j相邻:矩阵的i行j列的元素为0,表示区域i与区域j不相邻。数组color[]用来存储着色结果,color[i]的值为区域i所着颜色。

【程序】

include<stdio.h>

define N 10

void output(int color[])/*输出一种着色方案*/

{

int i;

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

printf("%4d", color[i]);

pfintf("\n");

}

int back(int *ip,int color[])/*回溯*/

{

int c=4;

while(c==4){

if(*ip<=0)return 0;

--(*ip);

c= (1);

color[*ip]=-1;

}

return c;

}

/*检查区域i,对c种颜色的可用性*/

int colorOK(int i, int c, int adj[][N], int color[])

{

int j;

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

if((2))return 0;

return 1;

}

/*为区域i选一种可着的颜色*/

int select(int i,int c,int adj[][N], int color[])

int k;

for(k = c; k<=4; k++)

if( (3) )return k;

return 0;

int coloring(int adj[][N])/*寻找各种着色方案*/

{

int color[N], i, c, cnt;

for(i=0; i<N; i++)cotor[i]=-1;

i=c=0;cnt=0;

while(1){

if((c=(4)==0){

c=back(&i, color);

if(c==0)return cnt;

}else{

(5); i++;

if(i==N){

output(color);

++cnt;

c=back(&i, color);

}else c = 0;

}

}

}

void main()

{

int adj[N][N]={

{0,1,0,1,1,1,1,1,1,1},

{1,0,1,1,0,1,1,1,1,0},

{0,1,0,1,0,1,1,0,1,1},

{1,1,1,0,1,1,0,0,1,1},

{1,0,0,1,0,1,0,0,0,0},

{1,1,1,1,1,0,1,0,0,1},

{1,1,1,0,0,1,0,0,1,0},

{1,1,0,0,0,0,0,0,1,1},

{1,1,1,1,0,0,1,1,0,1},

{1,0,1,1,0,1,0,1,1,0}

};

printf("共有%d组解.\n",coloring(adj));

}


正确答案:(1) color[*ip] (2) adj[i][j]!=0 && color[j]==c (3) ikadjcolor (4) select(ic+1adjcolor) (5) color[i]=c
(1) color[*ip] (2) adj[i][j]!=0 && color[j]==c (3) i,k,adj,color (4) select(i,c+1,adj,color) (5) color[i]=c 解析:本题考查著名的着色问题,相对难度较低,用到了回溯法的算法思想。
程序中,数组adj[][]存放所有区域的相邻情况,color[]存放着色方案。
程序中子程序较多,注释中比较清楚地说明了各个子程序的功能。从主函数看起,main函数中给数组adj赋值,即初始化所有区域的相邻情况,然后调用coloring函数。coloring函数是用来寻找各种着色方案的,注意是找所有的着色方案,而不是只找一个解,因此找到一个解后需要进行回溯;另外,当一个方案无法继续为剩余区域着色时也需要回溯。while循环中,是一个if-else结构,else块中也是一个if-else结构,其中if块调用到了output函数,说明找到了一个解,然后进行回溯。可见外层else块是可以继续分配颜色,空(5)处应该是保存着色方案,故空(5)应填color[i]=c。外层if块是尝试着色失败,进行回溯,故空(4)处应该尝试为区域i着色,应该调用select函数,又可选的初始颜色是c+1号颜色,故空(4)应填select(i, c+l,adj,color)。
函数select函数是用来为区域i选一种可着的颜色,依次选定一种颜色,然后判断是否可行,若可行返回颜色号,若不可行返回0。显然需要调用函数colorOK函数,对着函数原型易得,空(3)应填“i,k,adj,color”。
函数colorOK是用来判断区域i是否可着c号颜色。根据着色规则:相邻区域不能着相同的颜色”,即与区域i相邻的区域不能着c种颜色。空(2)条件成立返回0,结合函数select中的调用,返回0表示不可用,故空(2)应填“adj[i][j]!=0 && color[j]==c”。
最后来看back函数,空(1)是相对比较难的一空。其中形参ip指向记录当前考查区域号的变量。用指针形参是因为回溯时函数需要修正当前区域号。整个回溯过程是一个循环,如果当前区域*ip已选第四号颜色(颜色已经用尽),即while循环中的条件成立,则需要回溯。回溯时,若发现当前区域*ip已经是0号区域,当然不能再回溯了,函数返回0值,表示已经穷尽了所有可能的方案;否则,当前区域号减1,取出*ip区域的着色方案,并置*ip为未着色。 *ip的着色方案存储于color[*ip]中,如果*ip区域的着色方案不是最后一种颜色,则回溯结束,函数返回该区域原来的着色方案,让*ip区域选用编号更大的颜色。故空(1)应填“color[*ip]”。


在程序中添加一个命令按钮,并编写如下代码。己知程序的运行结果为如下矩阵,请在[ ]和[ ]处填上正确答案使程序完整。

1 0 0 0

0 1 1 0

0 1 1 0

1 0 0 1


正确答案:i=i Or j=4-i+l j=1 To 4
i=i Or j=4-i+l , j=1 To 4 解析:本题中第一个双重循环的功能是为一个二维数组赋初值。内层循环中if语句的功能是:使数组两条对角线上的元素值为1,其他元素为0;第二个双重循环的功能是打印数组,内层循环控制打印每行的每一列,外层循环控制打印4行。这样输出的结果为上面所述。空打印Print操作是换行。


下面语句中不能定义一个数组,元素值依次分别为1,1,1,0,0的是______。

A.static int a[5]={1,1,1,0,0};

B.static int a[5]={1,1,1};

C.static int a[]={1,1,1,0,0};

D.static int a[5]={1*2,0*3};


正确答案:D
解析:不可能用表达式的方式来给数组元素一一赋值。

更多 “C语言程序设计习题答案(613) .” 相关考题
考题 有以下程序:include main( ){int a[3][2]={0} ,( *ptr)[2],i,j;for(i=0;i有以下程序: #include <stdio.h> main( ) { int a[3][2]={0} ,( *ptr)[2],i,j; for(i=0;i<2;i++) {ptr=a+i; scanf("%d",ptr); ptr++;} for(i =0;i<3;i ++ ) } for(j =0;j<2;j ++ ) prinff( "%2d" ,a[i] [j] ); prinff(" \n" ); }}若运行时输入:1 2 3 <回车>,则输出结果是( )。A.产生错误信息B.10 20 00C.12 30 00D.10 20 30正确答案:B解析:程序中a[3)[2]={0}将数组元素全部初始化为0,指针变量ptr指向包含2个元素的一维数组。在第一个for语句的循环体中ptr=a+i;语句用于将指针变量ptr指向第i行的数组元素,通过两次循环,分别给二维数组a的第。行的第1个元素和第1行的第1个元素赋了值1和2,即a[0][0]=1,a[1][0]=2。

考题 单选题The Testking router is running RIP as the routing protocol, and the IP routing table is displayed below: Gateway of last resort is 10.1.2.2 to network 0.0.0.0 10.0.0.0/24 is subnetted, 2 subnets R 10.1.3.0 [120/1] via 10.1.2.2, 00:00:00, Serial0/0 C 10.1.2.0 is directly connected, Serial0/0 C 10.1.5.0 is directly connected, Serial0/1 C 10.1.6.0 is directly connected, FastEthernet0/0 R* 0.0.0.0/0 [120/1] via 10.1.5.5, 00:00:00, Serial0/1 Based on the output above, if an administrator pings host 10.1.8.5 from host 10.1.6.100, how will the router TestkingA process the ICMP packets?()A The packets will be discarded.B The packets will be routed out the S0/0 interface.C The packets will be routed out the S0/1 interface.D The packets will be routed out the Fa0/0 interface.E The packets will be routed through the 10.1.2.2 gateway.正确答案:C解析:暂无解析

考题 单选题《江苏省建设工程施工项目经理部和项目监理机构主要管理人员配备办法》从()开始实施。A 2015/7/1 0:00:00B 2015/5/1 0:00:00C 2015/8/1 0:00:00D 2015/6/1 0:00:00正确答案:C解析:暂无解析

考题 下列可用的MAC地址是: ()A、00-00-F8-00-EC-G7B、00-0C-1E-23-00-2A-01C、00-00-0C-05-1CD、00-D0-F8-00-11-0A参考答案:D

考题 若要定义一个具有5个元素的整型数组,以下错误的定义语句是( )。A.int a[5]={0;B.int b[]:{0,0,0,0,0};C.int c[2+3];D.int i=5,d[i];正确答案:D解析:选项A中,其他元素会自动以0填充。选项C中维数是常量表达式,故没错。

考题 《队列条令》规定,呼号的节奏分为_____。A.│一O│二0│三0│四0│B.│一二│三0│四0│00│C.│一二│00│三四│00│D.│一0│二0│三四│00│E.│一0│二三│四0│00│正确答案:ABCD

考题 《江苏省建设工程施工项目经理部和项目监理机构主要管理人员配备办法》从()开始实施。A、2015/7/1 0:00:00B、2015/5/1 0:00:00C、2015/8/1 0:00:00D、2015/6/1 0:00:00正确答案:A

考题 GiventhemulticastIPaddressof224.193.5.10,whatwouldthecorrespondingmulticastMACaddressbe?()A.00-00-0c-c0-05-0aB.00-00-0c-cl-05-0aC.01-00-5e-00-00-0cD.01-00-5e-41-05-0aE.00-00-0c-01-00-5eF.01-00-5e-cl-05-0a参考答案:D

考题 有以下程序#include <stdio.h>#include <string.h>void fun(char s[][10],int n){char t; int i,j;for(i=0;i<n-1;i++)for(j=i+1;j<n;j++)/*比较字符串的首字符大小 ,并交换字符串的首字符*/if(s[i][0]<s[j][0]) {t=s[i][0];s[i][0]=s[j][0];s[j][0]=t;}}main(){char ss[5][10]={“bcc”,”bbcc”,”xy”,”aaaacc”,”aabcc”};fun(ss,5); printf(“%s,%s\n”,ss[0],ss[4]);}程序的运行结果是( )。A.xy,aaaaccB.aaaacc,xyC.xcc,aabccD.acc,xabcc正确答案:D

考题 The Testking router is running RIP as the routing protocol, and the IP routing table is displayed below:Gateway of last resort is 10.1.2.2 to network 0.0.0.010.0.0.0/24 is subnetted, 2 subnetsR 10.1.3.0 [120/1] via 10.1.2.2, 00:00:00, Serial0/0C 10.1.2.0 is directly connected, Serial0/0C 10.1.5.0 is directly connected, Serial0/1C 10.1.6.0 is directly connected, FastEthernet0/0R* 0.0.0.0/0 [120/1] via 10.1.5.5, 00:00:00, Serial0/1Based on the output above, if an administrator pings host 10.1.8.5 from host10.1.6.100, how will the router TestkingA process the ICMP packets?()A. The packets will be discarded.B. The packets will be routed out the S0/0 interface.C. The packets will be routed out the S0/1 interface.D. The packets will be routed out the Fa0/0 interface.E. The packets will be routed through the 10.1.2.2 gateway.参考答案:C