资源描述
第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" ) ;
展开阅读全文