实验四数组
实验课程名:高级语言程序设计(C)
专业班级:电气本二学号:20姓名:吴琛
实验时间:2012-5-9实验地点:K4-202指导教师:吴建设
一、实验目的和要求
1.掌握一维数组和二维数组的定义、赋值和输入输出的方法;
2.掌握字符数组和字符串函数的使用;
3.掌握与数组有关的算法(特别是排序算法)。
二、实验内容
1、任务名称1.调试下列程序,使之具有如下功能:输入10个整数,按每行3个数输出这些整数,最后输出10个整数的平均值。写出调试过程。
#inclue
#define N 10
void main( )
{ int i,a[N],av;
for(i=0;i scanf("%d",a[i]); for(i=0;i { printf("%d",a[i]); if(i%3==0) printf("\n"); } for(i=0;i!=N;i++) av+=a[i]; printf("av=%f\n",av); } 上面给出的程序是完全可以运行的,但是运行结果是完全错误的。调试时请注意数组元素的输入问题、输出格式问题等。请使用前面实验所掌握的调试工具,判断程序中的错误并改正。 相关知识:①数组元素值的输入;②求和求平均值的相关变量初始化问题; ③输出格式符的正确使用。④数组元素的格式化输出。 源代码: #inclue #define N 10 void main( ) { int i,a[N],av; for(i=0;i scanf("%d",a[i]); for(i=0;i { printf("%d",a[i]); if(i%3==0) printf("\n"); } for(i=0;i!=N;i++) av+=a[i]; printf("av=%f\n",av); } 改正后程序: #include void main( ) { int i,n,a[10]。 float avg。 n = 10。 for(i=0。i scanf("%d",&a[i])。 for(i=0。i { printf("%d ",a[i])。 if((i+1)%3==0) printf("\n")。 } avg=0。 for(i=0。i avg+=a[i]。 avg/=10。 printf("\navg = %f\n",avg)。 printf("学号:20 姓名:吴琛实验四第一题")。} 运行结果:(需要截图) 运行结果分析:①数组元素值的输入②求和求平均值的相关变量初始化问题③输出格式符的正确使用④数组元素的格式化输出。 2、任务名称 下面程序是输入5个数据,然后求它们的和并输出结果。 源代码:#include void main( ) {int i, a[5], sum = 0。 scanf("%d,%d,%d,%d,%d", a )。 for (i = 0。i <= 4。i ++) sum += a[i]。 printf("sum = %d \n", sum)。 } 该程序中有哪些错误?如何修改?写出正确运行后的结果。 相关知识:数组元素的输入和输出只能逐个元素操作,而不能以数组名作整体操作。改正后的程序: #include void main( ) {int i,a[5],sum=0。 for (i=0。i<=4。i++) scanf("%d", &a[i])。 sum = a[0]+a[1]+a[2]+a[3]+a[4]。 printf("sum=%d\n",sum)。 printf("学号:20 姓名:吴琛实验四第二题")。 } 运行结果:(需要截图) 运行结果分析:数组元素的输入和输出只能逐个元素操作,而不能以数组名作整体操作。 3、任务名称 有一个3行4列的距阵,现要求编程求出其中最大的那个元素的值,以及它所在的行号与列号。程序的初始说明和输出语句如下所示,请补充完成该程序。 源代码: #include void main( ) { int i, j, row, colum, max。 static int a[3][4] = {{1,2,3,4}, {9,8,7,6}, {-10,10,-5,2}}。 …… printf(" Max = %d, Row = %d, Colum = %d \n", max, row, colum)。 } 编程点拨: ①初始化row、colum及max。 ②使用for循环的双重循环逐行把元素值与max值进行比较,比较结果如 果元素值比max值大,则改变max值,同时改变row和colum的值。 ③最后输出max,row和colum的值。 相关知识:①二维数组的定义和初始化;②使用二重循环对二维数组元素的访问; ③求最值时相关变量初值的设定。 #include void main { int i,j row=0,colum=0,max。 int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}}。 max=a[0][0]。 for(i=0。i<=2。i++) for(j=0。j<=3。j++) if(a[i][j]>max) { max=a[i][j]。 row=i。 colum=j。 } printf("max=%d,row=%d,colum=%d\n",max,row,colum)。 printf("学号:20 姓名:吴琛实验四第三题")。 } 运行结果:(需要截图) 运行结果分析:初始化row、colum及max,再使用for循环的双重循环逐行把元素值与max值进行比较,比较结果如果元素值比max值大,则改变max值,同时改变row和colum的值。 4、任务名称 数组中已存互不相同的10个整数,从键盘输入一个整数,输出与该值相同的数组元素下标。 编程点拨: ①输入要查找的变量x的值; ②使用循环将输入的数和数组元素逐个进行比较,若找到,则提前退出循环; ③根据循环是正常结束还是提前结束来判断是否找到x。 部分源代码: #include void main( ) { int i, x, a[10]={1,2,3,4,5,6,7,8,9,10}。 /*输入x变量的值*/ for ( i=0。i<10。i++ ) printf("%4d",a[i])。 printf("\n")。 /* 循环查找与x相等的元素*/ if () printf("%d\n",i)。/* 输出查找结论,输出下标值*/ else printf("Not found %d\n",x)。 } 源代码: #include void main( ) { int i, x, a[10]={1,2,3,4,5,6,7,8,9,10}。 printf("请输入一个整数:")。 scanf("%d",&x)。 for ( i=0。i<10。i++ ) printf("%2d\n",a[i])。 for ( i=0。i<10。i++ ) if (x==a[i]) {printf("i=%d\n",i)。break。} if(i>=10) printf("Not found %d\n",x)。 printf("学号:20 姓名:吴琛实验四第四题")。 } 运行结果:(需要截图) 运行结果分析:输入要查找的变量x 的值,使用循环将输入的数和数组元素逐个进行比较,若找到,则提前退出循环,根据循环是正常结束还是提前结束来判断是否找到x 。 5、任务名称 编写程序,任意输入10个整数的数列,先将整数按照从大到小的顺序进行排序,然后输入一个整数插入到数列中,使数列保持从大到小的顺序。 编程点拨: ① 定义数组时多开辟一个存储单元; ② 找合适的插入位置; j=0 a[j] ≥k? 即20 ≥15 ? 是 j++ j=1 a[j] ≥k? 即18 ≥15 ? 是 j++ j=2 a[j] ≥k? 即16 ≥15 ? 是 j++ j=3 a[j] ≥k? 即14 ≥15 ? 不是,结束循环 while( a[j]>=k && j<10 ) j++。 k 小的元素时也要退出循环 ③ 向右移动插入点后的元素;先把a[9]移到a[10],a[8]移到a[9],…a[i]移到a[i+1],直到把a[j]移到a[j+1],即:i=j 停止移动元素。 for(i=9。i>=j 。i-- ) a[i+1]=a[i]。 a 0 1 2 3 4 5 6 7 8 9 下标= 10 j=3 部分源代码: #include #define N 11 void main() { int i,j,a[N]。 printf(“Please input 10 numbers:”)。 for (i=0。 i scanf(“%d ”,&a[i])。 /*乱序输入10个整数*/ …… } 相关知识:①比较排序法、选择排序法和冒泡排序法;②数据元素的插入。 源代码: # include #define N 11 void main() { int i,j,t,x,temp1,temp2,a[N]。 printf("Please input 10 numbers:\n")。 for (i=0。 i scanf("%d",&a[i])。for(j=0。j<9。j++) for(i=0。i<9-j 。i++) if (a[i] {t=a[i]。a[i]=a[i+1]。a[i+1]=t 。} printf("the sorted numbers:\n")。 for(i=0。i<10。i++) printf("%d ",a[i])。 printf("\n")。 scanf("%d",&x)。 t=a[9]。 if (x a[10]=x 。 else {for (i=0。i<10。i++) {if (a[i] 0 1 2 3 4 5 6 7 8 9 下标= 10 k=0。 for ( i=1。i<10。i++ ) if ( a[k] {temp1=a[i]。 a[i]=x。 for (j=i+1。j<11。j++) {temp2=a[j]。 a[j]=temp1。 temp1=temp2。 } break。 } } } printf("Now array a:\n")。 for (i=0。i<11。i++) printf("%5d",a[i])。 printf("\n")。 printf("学号:20 姓名:吴琛实验四第五题")。 } 运行结果:(需要截图) 运行结果分析:编辑程序运行即可,通过冒泡法编写。 6、任务名称 输入十个互不相同的整数并存在数组中,找出最大元素,并删除。 编程点拨: ①求最大值所在元素下标:不必用max记住最大值,只要用k记住最大值所在的元素 下标; ②删除最大值:从最大值开始将其后面元素依次前移一个位置。 部分源代码: k=0。 if ( a[k] k=1。 执行 if ( a[k] a 0 1 2 3 4 5 6 7 8 9 下标= 10 k=2。不执行