收藏 分销(赏)

C语言程序与设计第5章实验及习题答案.doc

上传人:精*** 文档编号:9807331 上传时间:2025-04-09 格式:DOC 页数:22 大小:141.54KB 下载积分:10 金币
下载 相关 举报
C语言程序与设计第5章实验及习题答案.doc_第1页
第1页 / 共22页
C语言程序与设计第5章实验及习题答案.doc_第2页
第2页 / 共22页


点击查看更多>>
资源描述
第5章 实验及习题答案 5.6 实 验 实验任务1 一维数组程序设计 二、实验内容 1.验证性实验 (1)验证【例5-2】程序(输入10个整数,存入数组中,分别按原序、逆序输出),回答题后问题。 ① 运行程序时如何输入数据?请举例: 1 2 3 4 5 6 7 8 9 10↙(也可用回车符间隔数据) 。 ② 输入的10个数据分别存放在 a[0]~ a[9] 中。 ③ 若要计算10个整数的与,请写出此程序段并验证。 (2)验证【例5-4】程序(选择法排序),回答题后问题。 ① 语句“if ( w != i ) { t = a[i] ; a[i] = max ; a[w] = t ; }” 实现的操作是 在第i趟排序中,如果找出的最大数a[w]不在最前面,则与a[i]交换,否则不交换 。 ② 请将随机产生的数据改为从键盘输入。 ③ 请修改程序实现从小到大排序。 2.设计性实验 (1)把一组数{ 3,4,6,7,1,8,9,13,2,5,11,14 }中的所有奇数找出,放在另一个数组中并输出,数据由初始化方式提供。 参考程序: # include <stdio.h> main( ) { int a[12] = { 3 , 4 , 6 , 7 , 1 , 8 , 9 , 13 , 2 , 5 , 11 , 14 } , b[12] , i , j , m ; for( i = 0 ; i < 12 ; i++ ) /* 输出原始数据 */ printf( " %4d " , a[i] ) ; printf( " \n " ) ; m = 0 ; for( i = 0 ; i < 12 ; i++ ) /* 找奇数 */ if( a[i]%2==1 ) { b[m] = a[i] ; m++ ; } for( j = 0 ; j < m ; j++ ) /* 输出奇数 */ printf( " %4d " , b[j] ) ; (2)利用随机数函数产生20个三位数,将这20个数从小到大排列并输出。 参照【例5-4】P127页选择法排序程序,只需做下列修改: ² 将N 的值改为20 ² 将语句:a[i] = rand ( ) % 100 ; 改为:a[i] = rand ( ) % 900+100 ; 也可参照【例5-4】与【例5-5】写出用冒泡法排序的程序。 (3)已知一个有序数列{ 3,5,6,8,11,14,19,23,25,35,41 },要求从键盘输入一个任意数,将其插入到合适位置仍使数列有序,输出插入前、后的数列。 参照【例5-7】,参考程序如下: # include <stdio.h> # define N 11 main( ) { int i , b[N+1] = { 3 , 5 , 6 , 8 , 11 , 14 , 19 , 23 , 25 , 35 , 41 } , x ; printf(" the source order is : \n" ) ; for( i = 0 ; i < N ; i++ ) /* 输出插入前的数列 */ printf( " %4d " , b[i] ) ; printf("\n" ) ; printf(" Please input insert data : " ) ; /* 提示信息 */ scanf("%d" , &x ) ; /* 输入插入的数据 */ for( i = N-1 ; i >=0 ; i-- ) /* 后移数据 */ if ( x < b[i] ) b[i+1 ]= b[i] ; else break; b[i+1] = x ; /* 插入数据 */ printf( " the result is : \n ") ; for( i = 0 ; i < N+1 ; i++ ) /* 输出插入后的数列 */ printf( " %5d " , b[ i ] ) ; (4)输入一个十进制数,将其转换成八进制数后输出结果。 参照【例5-8】只需将程序中的2 改为8即可,也可用别的方法实现。 实验任务2 二维数组程序设计 二、实验内容 1.验证性实验 (1)验证【例5-10】程序(二维数组求最小值及所在的位置),回答题后问题。 ① “printf( "\n" ) ; ”语句的作用是 按行输出或输出换行 。 ② 不给min赋初值或给min 赋初值为0,程序的运行结果会是什么?(有时会出现错误结果) ③ 输出时为什么要用row +1 , col +1?(因为在数组中,行、列是从0数起的) (2)验证【例5-13】程序(杨辉三角形),回答题后问题。 ① 语句“y[m][0] = 1 ; y[m][m] = 1 ; ”实现的操作是 给第1列与对角线上的元素赋值为1 。 ② 语句“if ( n == 0 || n == m ) y[m][n] = 1 ; ”实现的操作是 作用同① 。 ③ 语句“y[m][n] = y[m-1][n-1] + y[m-1][n] ; ”实现的操作是 给第1列与对角线上之外的元素赋值 。 2.设计性实验 (1)设有二维数组如下:{ { 1 , 11, 19 , 9 , 12 } , { 2 , 5 , 20 , 1 , 18 } , { 3 , 4 , 16 , 6 , 10 } , { 4 , 15 , 2 , 17 , 3 } , { 5 , 14 , 7 , 13 , 8 } ,请按行(第2~5行)、按列(第2~5列)求与及总与,然后以二维表形式输出数据及求与结果,数据由初始化方式提供。 参照【例5-11】,参考程序如下: # include <stdio.h> main( ) { int a[5+1][5+1] = { { 1 , 11, 19 , 9 , 12 } , { 2 , 5 , 20 , 1 , 18 } , { 3 , 4 , 16 , 6 , 10 } , { 4 , 15 , 2 , 17 , 3 } , { 5 , 14 , 7 , 13 , 8 }} , i , j , sum ; for( i = 1 ; i <= 4 ; i++ ) /* 按行求与 */ { sum = 0 ; for( j = 1 ; j <= 4 ; j++ ) sum += a[i][j]; a[i][5] = sum; for( j = 1 ; j <= 5 ; j++ ) /* 按列求与及总与 */ { sum = 0 ; for( i = 1 ; i <= 4 ; i++ ) sum += a[i][j]; a[5][j] = sum; /*—————————————— 输出结果 —————————————*/ for( i = 0 ; i <= 5 ; i++ ) { printf( " \n " ) ; for( j = 0 ; j <= 5 ; j++ ) printf( " %4d " , a[i][j] ) ; (2)对一个m×n的矩阵,分别求两个对角线上的所有元素之与,然后输出这个矩阵及计算结果。矩阵的数据由键盘输入。 参考程序: # include <stdio.h> # define M 5 # define N 5 main( ) { int a[M][N] , i , j , sum1=0 , sum2=0 ; printf(" 请输入M行N列的矩阵: \n " ) ; for( i = 0 ; i < M ; i++ ) { for( j = 0 ; j < N ; j ++ ) scanf( "%d" , &a[i][j] ) ; for( i = 0 ; i < M ; i++ ) { sum1 += a[i][i] ; sum2 += a[i][M-1-i] ; for( i = 0 ; i < M ; i++ ) { for( j = 0 ; j < N ; j++ ) printf( " %4d " , a[i][j] ) ; printf( " \n" ) ; printf( " sum1 = %d , sum2 = %d " , sum1 , sum2 ) ; (3)对一个m×n的矩阵,交换指定的两列元素。交换的两列列号由用户从键盘指定。输出交换前后的矩阵。矩阵的数据由初始化方式提供。 参考程序: # include <stdio.h> # define M 3 # define N 5 main( ) { int a[M][N] ={ { 1 , 11, 19 , 15 , 2} , { 2 , 5 , 20 , 14 , 7} , { 3 , 4 , 16, 4 , 5 } }, i , j , m1 , m2 , t ; printf("输出M行N列的矩阵: \n " ) ; for( i = 0 ; i < M ; i++ ) { for( j = 0 ; j < N ; j ++ ) printf( "%4d" , a[i][j] ) ; printf( " \n" ) ; printf("请输入要交换的两列列号: " ) ; scanf( "%d,%d" , &m1 , &m2 ) ; for( i = 0 ; i < M ; i++ ) { t = a[i][m1-1] ; a[i][m1-1] = a[i][m2-1] ; a[i][m2-1] = t ; printf( " 输出交换列后的矩阵\n" ) ; for( i = 0 ; i < M ; i++ ) { for( j = 0 ; j < N ; j ++ ) printf( "%4d" , a[i][j] ) ; printf( " \n" ) ; 实验任务3 字符串及数组综合程序设计 二、实验内容 1.验证性实验 (1)验证【例5-17】程序(输出一个字符串),回答题后问题。 ① 输入字符串使用语句: scanf( "%s" , s3 ) ; 。 ② 输出字符串使用语句: printf( " %s " , s3 ) ; 。 ③ 数组名s3代表 数组s3的首地址 。 (2)验证【例5-21】程序(输入/输出多个字符串),回答题后问题。 ① 输入字符串使用语句: gets( city[i] ) ; 。 ② 输出字符串使用语句: prints( " %s \t " , city[i] ) ; 。 ③ city[i]代表 二维数组city每行的首地址 。 2.设计性实验 (1)从键盘输入自己的QQ号与密码,进行保存,并将密码加密(加密规则自定),然后将QQ号与加密后的密码输出。 设加密规则为:按密码字母顺序依次加1,2,3…… 参考程序: # include <stdio.h> # include <string.h> # define M 10 /* M代表字符串的最大长度 */ main( ) { char user[M] , pass1[M] , pass2[M] ; int i ; printf( "请输入用户名:" ) ; gets( user ) ; printf( "请输入用户名密码:" ) ; gets( pass1) ; for( i = 0 ; i <strlen(pass1 ) ; i ++ ) pass2[i] = pass1[i] + i+1 ; pass2[i]= '\0' ; puts( user ) ; puts( pass1 ) ; puts( pass2 ) ; (2)删除一个字符串中的所有空格字符,使非空格字符连续存放。(算法提示1:借助一个数组存放非空格字符。算法提示2:借助两个变量,在本字符串中进行删除、移动) 算法1参考程序: # include <stdio.h> # include <string.h> # define M 40 /* M代表字符串的最大长度 */ main( ) { char s1[M] , s2[M] ; int i , n = 0 ; printf( "请输入带空格的字符串:" ) ; gets( s1 ) ; for( i = 0 ; i <strlen(s1 ) ; i++ ) if ( s1[i] != ' ' ) { s2[n] = s1[i] ; n++ ; } s2[n]= '\0' ; puts( s1 ) ; puts( s2 ) ; (3)期末班级成绩处理。设有学生5人,每人5科成绩,统计每个学生的总分、不及格课程门数,并按总分排名次,按下面格式输出排名后的成绩单。数据由初始化方式提供。 学号 姓名 科目1 科目2 科目3 科目4 科目5 总分 名次 不及格门数 实现的程序可参考(P164~165) 习 题 5 一、选择题 1.以下关于数组描述正确的是( C )。 A.数组的大小是固定的,但可以有不同类型的数组元素。 B.数组的大小是可变的,但所有数组元素的类型必须相同。 C.数组的大小是固定的,所有数组元素的类型必须相同。 D.数组的大小是可变的,可以有不同类型的数组元素。 2.以下不能正确定义一维数组的选项是( D )。 A.int a[5] = { 1 , 2 , 3 , 4 , 5 } ; B.int a[ ] = { 1 , 2 , 3 , 4 , 5 } ; C.int a[5] ; D.int n = 5 , a[n ] ; 3.设有“int i , a[10] ; 且0< i < 10”,不能正确引用a数组元素的是( A )。 A.a[10] B.a[i] C.a[2] D.a[10-i] 4.设有语句“int a[10] = { 1 , 2 , 3 , 4 } , i = 0 ; ”,则a[i + 1]的值为( B )。 A.1 B.2 C.3 D.4 5.若有“int a[ 8 ] = { 1 , 3 , 5 , 7 , 9 , 11 } ; ”,则a数组中的元素个数是( D )。 A.不确定 B.6 C.7 D.8 6.若有“int a[10] = { 0 , 1 , 2 , 3 , 4 , 5 } ; ”,则对 a数组元素的引用范围是( D )。 A.a[10] B.a[1] ~ a[10] C.0 ~ 5 D.a[0] ~ a[9] 7.设有语句“int a[10] = { 1 , 3 , 5 , 7 , 9 , 11 } ; ”,则a[1]的值为( C )。 A.1 B.2 C.3 D.4 8. 设有“int a[6] = { 1 , 2 , 3 , 4 } , i ; ”,不能正确输出a中所有元素值的语句是( A )。 A. B. for ( i = 0 ; i < 6 ; i++) printf(" %3d " , a[i] ) ; for ( i = 1; i < 6 ; i++) printf(" %d " , a[i] ) ; C. D. for ( i = 1; i < 6 ; i++) printf(" %d " , a[i-1] ) ; for ( i = 0 ; i <= 5 ; ) printf(" %3d " , a[i++] ) ; 9.设有“int a[ ][2] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 } ; ”,则值为3的数组元素是( C )。 A.a[1][3] B.a[2][1] C.a[1][0] D.a[3][1] 10.以下数组定义有错误的语句是( B )。 A.int x[ ][3] = { 0 } ; B.int x[2][3] = { { l , 2 } , { 3 , 4 } , { 5 , 6 } } ; C.int x[ ][3] = { { l , 2 , 3 } , { 4 , 5 , 6 } } ; D.int x[2][3] = { l , 2 , 3 , 4 , 5 , 6 } ; 11.若有“int x[ ][2] = { 1 , 3 , 5 , 7 , 9 , 11 , 13 } ; ”,则x数组的行数为( C )。 A.2 B.3 C.4 D.无确定值 12.设有“int x[3][4] = { { 1 } , { 2 } , { 3 } } ; ”,那么元素x[1][1]的取值是( A )。 A.0 B.1 C.2 D.不确定 13.执行下面程序后的输出结果是( D )。 main( ) { int i , b[ ][3] = { 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 } ; for ( i = 0 ; i < 3 ; i++ ) printf( " %d " , b[i][i] ) ; A.9 8 7 B.3 5 7 C.9 6 3 D.9 5 1 14.以下不能正确初始化字符数组的选项是( D )。 A.char str[10] = "abcdef" ; B.char str[ ] = {" abcdef " } ; C.char str[10] = "abc\0def " ; D.char str[ ] = { abcdef } ; 15.设有“char str[ ] = "ABCDE" ; ”,则能够正确输出str中字符串的语句是( C )。 A.printf( " %c " , str[0] ) ; B.printf( " %s " , str[0] ) ; C.printf( " %s " , str ) ; D.printf( " %s " , &str ) ; 16.有两个字符数组x、y,则能够正确对x、y进行输入的语句是( B )。 A.gets( x , y ) B.scanf( " %s %s " , x , y ) ; C.scanf( " %s %s " , &x , &y ) ; D.gets( " x " ) ; gets( " y " ) ; 17.下面程序运行后的输出结果是( C )。(注:请此题中p、q改为s1、s2) main( ) { char s1[ ] = { 'a' , 'b' , 'c' } , s2[ ] = "abc" ; printf( " %d %d \n " , sizeof ( s1 ) , sizeof ( s2 ) ) ; A.4 4 B.3 3 C.3 4 D.4 3 18.判断字符串a与b是否相等,应当使用( D )。 A.if ( a == b ) B.if ( a = b ) C.if ( strcpy ( a , b ) ) D.if ( strcmp ( a , b ) ) 19.以下程序的输出结果是( A )。 main( ) { char str[20] = "hello\0OK" ; printf( " %d , %s " , strlen ( str ) , str ) ; A.5 , hello B.9 , hello C.5 , helloOK D.7 , helloOK 10 20.设有“char s1[20]= "abc", s2[20] = "123" ; ”,能将s2连接到s1后面的语句是( D )。 A.strcmp ( s1 , s2 ) ; B.strcpy ( s1 , s2 ) ; C.s1 = s1 + s2 ; D.strcat ( s1 , s2 ) ; 二、阅读下面程序,写出运行结果,并回答题后问题 1.下面程序的输出结果为 s = 25 。程序实现的功能是:求x数组中第1,3,5,7,9个整数的与。 main( ) { int x[10] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ,10 } , s = 0 , i ; for ( i = 0 ; i < 10 ; i++ , i++ ) s += x[i] ; printf(" s = %d \n " , s ) ; 2.下面程序的输出结果为 4 , 3 , 2 , 1 , 。程序实现的功能是:逆序输出x数组中的内容 main( ) { int x[4] = { 1 , 2 , 3 , 4 } , i ; for ( i = 3 ; i >= 0 ; i-- ) printf( " %d , " , x[ i ] ) ; 3.下面程序的输出结果为 4 2 4 。程序实现的功能是:统计a数组中各种元素值的个数,即统计1的个数,2的个数,3的个数. main( ) { int a[10] = { 1 , 2 , 3 , 2 , 3 , 1 , 3 , 1 , 3 , 1 } , n[4] = { 0 } , i ; for ( i = 0 ; i < 10 ; i++ ) n[a[i]]++; for ( i = 1 ; i <= 3 ; i++ ) printf(" %d " , n[i] ) ; 4.下面程序的输出结果为 4 8 2 。程序实现的功能是:输出二维数组中每行第4列的元素。(注:此题初始化时多了数字,请去掉最后的3,4) main( ) { int a[3][4] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 1 , 2 } , i ; for ( i = 0 ; i < 3 ; i++ ) printf( " %d " , a[i][3] ) ; 5.下面程序的输出结果为 21 。程序实现的功能是: 求a数组第1列与第1行的累加与。 main( ) { int a[3][3] = { { 1 , 2 , 9 } , { 3 , 4 , 8 } , { 5 , 6 , 7 } } , i , s = 0 ; for ( i = 0 ; i < 3 ; i++ ) s += a[i][0] + a[0][i] ; printf( " %d \n " , s ) ; 6.下面程序的输出结果为 cdefg c abcdefg 。 main( ) { char str[10] = "abcdefg" ; printf( " %s \t" , &str[2] ) ; printf( " %c \t" , str[2] ) ; printf( " %s " , str ) ; ① 输出整个字符串使用语句 printf( " %s " , str ) ; 。 ② 输出字符串中的一个字符,使用语句: printf( "%c" , str[2] ) ; 。 7.下面程序的输出结果为 12+34 , abcdef abcdef , 12+34 。 main( )  { char  sa[ ] = "12+34" , sb[ ] = "abcdef " , sc[10]; printf(" %s , %s \n" , sa , sb ) ;   strcpy( sc , sa ) ; strcpy( sa , sb ) ; strcpy( sb , sc ) ; printf(" %s , %s \n" , sa , sb ) ;   ① 初始化时数组sa中存放的是 字符串12+34\0 ,sb中存放的是 字符串abcdef\0 。 ② 程序实现的功能是 交换两个字符串,即 sa 与sb 中的内容 。 三、程序设计题 1.随机产生并输出20个100以内不重复的整数。 参考程序: # include "stdio.h" # include "stdlib.h" /* 函数rand( )的头文件 */ # include "time.h" /* 函数time( )的头文件 */ # define N 20 main( ) { int a[N] , i , j , x ; srand( ( unsigned )time ( NULL ) ) ; /* 随机数种子数 */ for( i = 0 ; i <20 ; i ++ ) { do { x = rand ( ) % 100 ; for ( j = 0 ; j < i ; j ++ ) if ( x == a[j] ) break ; if ( j>=i ) { a[i] = x ; break ; } } while(1) ; for( i = 0 ; i <= N-1 ; i++ ) /* 输出*/ printf( " %5d" , a[i] ) ; printf( " \n" ) ; 2.把一个一维组数中{ 3 ,4 , 6 , 7 , 1 , 8 , 9 , 13 , 2 , 5 , 11 , 14 }的所有偶数剔除,保留奇数并连续存放在本数组中,输出剔除前、后组数内容,数据由初始化方式提供。 参考程序: # include "stdio.h" main( ) { int a[12] ={ 3 ,4 , 6 , 7 , 1 , 8 , 9 , 13 , 2 , 5 , 11 , 14 }, i , k ; for( i = 0 ; i < 12 ; i++ ) /* 输出剔除前的数组 */ printf( " %5d" , a[i] ) ; printf( " \n" ) ; k =0 ; for( i = 0 ; i < 12 ; i++ ) /* 剔除偶数 */ if ( a[i]%2==1 ) { a[k]=a[i] ; k++ ; } for( i = 0 ; i < k ; i++ ) /* 输出剔除后的数组 */ printf( " %5d" , a[i] ) ; 3.随机产生20个100以内的整数,从键盘输入一个要查找的数据,若找到,输出整个数列,并输出查找到的位置(可能有多个);若没有找到,也输出整个数列,并给出一个未找到的信息。 参考程序: # include "stdio.h" # include "stdlib.h" /* 函数rand( )的头文件 */ # include "time.h" /* 函数time( )的头文件 */ main( ) { int a[20] , i , x , F = 0 ; srand( ( unsigned )time ( NULL ) ) ; for( i = 0 ; i <20 ; i ++ ) /*产生20个数 */ a[i] = rand ( ) % 100 ; printf( "请输入一个要找的数:" ) ; scanf("%d" , &x ) ; for( i = 0 ; i <20 ; i ++ ) printf( " %5d" , a[i] ) ; printf( " \n找到的位置是:" ) ; for( i = 0 ; i <20 ; i ++ ) /*找数据 */ if ( a[i] ==x ) { printf("%d , " , i+1 ) ; F = 1 ; } if ( F == 0 ) printf(" \n查无此数!\n") ; 4.随机产生100个整数,找出其中的素数,统计出素数的个数,每行输出10个素数。 参考程序: # include "stdio.h" # include "stdlib.h" /* 函数rand( )的头文件 */ # include "time.h" /* 函数time( )的头文件 */ # include "math.h" /* 函数time( )的头文件 */ # define N 100 main( ) { int a[N] , b[N]= { 0 } , i , j , m= 0 , F ; srand( ( unsigned )time ( NULL ) ) ; for( i = 0 ; i <N ; i ++ ) /*产生20个数 */ a[i] = rand ( ) % 200 ; for( i = 0 ; i <N ; i ++ ) { if ( ( i )%20==0 ) printf( " \n" ) ; printf( "%5d" , a[i] ) ; printf( " \n" ) ; for( i = 0 ; i <N ; i ++ ) { F = 1 ; for( j = 2 ; j <= sqrt(a[i] ) ; j ++ ) if ( a[i]%j==0 ) { F = 0 ; break ; } if ( F == 1 ) { b[m] = a[i] ; m++ ; } printf( "素数的个数是:%d , 素数是: \n" , m ) ; for( i = 0 ; i <m ; i ++ ) { printf( "%5d" , b[i] ) ; if ( (i+1)%10 == 0 ) printf( " \n" ) ;
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服