《C程序设计》数组的定义与使用实验报告
一、实验目的: 1、掌握一维数组和二维数组的定义、初始化; 2、掌握一维数组和二维数组元素的赋值及输入/输出的基本方法; 3、掌握字符数组和字符串函数的使用。 |
二、实验内容: (一)程序填空 1.下列给定程序中,函数fun的功能是:把形参a所指数组中的奇数按原顺序依次存放到a[0]、a[1]、a[2]、……中,把偶数从数组中删除,奇数个数通过函数值返回。 例如:若a所指数组中的数据最初排列为:9、1、4、2、3、6、5、8、7,删除偶数后a所指数组中的数据为:9、1、3、5、7,返回值为5。 请在下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。 注意:部分源程序在文件BLANK1.C中。 不得增行或删行,也不得更改程序的结构! #include <stdio.h> #define N 9 int fun(int a[], int n) { int i,j; j = 0; for (i=0; i<n; i++) /**********found**********/ if (a[i]%2==1) { /**********found**********/ a[j] = a[i]; j++; } /**********found**********/ return j; } main() { int b[N]={9,1,4,2,3,6,5,8,7}, i, n; printf("\nThe original data :\n"); for (i=0; i<N; i++) printf("%4d ", b[i]); printf("\n"); n = fun(b, N); printf("\nThe number of odd : %d \n", n); printf("\nThe odd number :\n"); for (i=0; i<n; i++) printf("%4d ", b[i]); printf("\n"); } 2.下列给定程序中,函数fun的功能是:把形参a所指数组中的最小值放在元素a[0]中,接着把a所指数组中的最大值放在a[1]元素中;再把数组全部赋值为1a所指数组元素中的次小值放在a[2]中,把a所指数组元素中的次大值放在a[3],以此类推。 例如,若a所指数组中的数据最初排列为:9、1、4、2、3、6、5、8、7;则按规则移动后,数据排列为:1、9、2、8、3、7、4、6、5。形参n中存放a所指数组中数据的个数。 规定fun函数中的max存放当前所的最大值,px存放当前所最大值的下标。 请在下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。 注意:部分源程序在文件BLANK1.C中。 不得增行或删行,也不得更改程序的结构! #include<stdio.h> #define N 9 void fun(int a[], int n) { int i,j, max, min, px, pn, t; for (i=0; i<n-1; i+=2) { /**********found**********/ max = min = __a[i]___; px = pn = i; for (j=i+1; j<n; j++) { /**********found**********/ if (max<___a[j]__) { max = a[j]; px = j; } /**********found**********/ if (min>___a[j]__) { min = a[j]; pn = j; } } if (pn != i) { t = a[i]; a[i] = min; a[pn] = t; if (px == i) px =pn; } if (px != i+1) { t = a[i+1]; a[i+1] = max; a[px] = t; } } } main() { int b[N]={9,1,4,2,3,6,5,8,7}, i; printf("\nThe original data :\n"); for (i=0; i<N; i++) printf("%4d ", b[i]); printf("\n"); fun(b, N); printf("\nThe data after moving :\n"); for (i=0; i<N; i++) printf("%4d ", b[i]); printf("\n"); } 3.下列给定程序中,函数fun的功能是:将形参a所指数组中的前半部分元素中的值与后半部分元素中的值对换。形参n中存放数组中数据的个数,若n为奇数,则中间的元素不动。 例如:若a所指数组中的数据为:1、2、3、4、5、6、7、8、9,则调换后为:6、7、8、9、5、1、2、3、4。 请在下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。 注意:部分源程序在文件BLANK1.C中。 不得增行或删行,也不得更改程序的结构! #include<stdio.h> #define N 9 void fun(int a[], int n) { int i, t, p; /**********found**********/ p = (n%2==0)?n/2:n/2+ 1 ; for (i=0; i<n/2; i++) { t=a[i]; /**********found**********/ a[i] = a[p+__i___]; /**********found**********/ ___a[p+i]__ = t; } } main() { int b[N]={1,2,3,4,5,6,7,8,9}, i; printf("\nThe original data :\n"); for (i=0; i<N; i++) printf("%4d ", b[i]); printf("\n"); fun(b, N); printf("\nThe data after moving :\n"); for (i=0; i<N; i++) printf("%4d ", b[i]); printf("\n"); } 4.下列给定程序中,函数fun的功能是:逆置数组元素中的值。例如:若a所指数组中的数据为:1、2、3、4、5、6、7、8、9,则逆置后依次为:9、8、7、6、5、4、3、2、1。形参n给出数组中数据的个数。 请在下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。 注意:部分源程序在文件BLANK1.C中。 不得增行或删行,也不得更改程序的结构! #include <stdio.h> void fun(int a[], int n) { int i,t; /**********found**********/ for (i=0; i<n/2___; i++) { t=a[i]; /**********found**********/ a[i] = a[n-1-__i__]; /**********found**********/ ___a[n-1-i]__ = t; } } main() { int b[9]={1,2,3,4,5,6,7,8,9}, i; printf("\nThe original data :\n"); for (i=0; i<9; i++) printf("%4d ", b[i]); printf("\n"); fun(b, 9); printf("\nThe data after invert :\n"); for (i=0; i<9; i++) printf("%4d ", b[i]); printf("\n"); } (二)程序修改题 1.下列给定程序中函数fun的功能是:将tt所指字符串中的小写字母全部改为对应的大写字母,其它字符不变。 例如,若输入"Ab,cD",则输出"AB,CD"。 请改正程序中的错误,使它能得出正确的结果。 注意:部分源程序在文件MODI1.C中,不得增行或删行,也不得更改程序的结构! #include <stdio.h> #include <string.h> char* fun( char tt[] ) { int i; for( i = 0; tt[i]; i++ ) /**********found***********/ if(( 'a' <= tt[i] )&&( tt[i] <= 'z' ) ) /**********found***********/ tt[i] -= 32; return( tt ); } main( ) { char tt[81]; printf( "\nPlease enter a string: " ); gets( tt ); printf( "\nThe result string is:\n%s", fun( tt ) ); } 2.由N个有序整数组成的数列已放在一维数组中,下列给定程序中函数fun的功能是:利用折半查法查整数m在数组中的位置。若到,返回其下标值;否则,返回-1。 折半查的基本算法是:每次查前先确定数组中待查的范围low和high(low<high),然后用m与中间位置(mid)上元素的值进行比较。如果m的值大于中间位置元素的值,则下一次的查范围落在中间位置之后的元素中;反之,下一次的查范围落在中间位置之前的元素中。直到low>high,查结束。 请改正程序中的错误,使它能得出正确的结果。 注意:部分源程序在文件MODI1.C中,不得增行或删行,也不得更改程序的结构。 #include <stdio.h> #define N 10 /************found************/ int fun(int a[], int m ) { int low=0,high=N-1,mid; while(low<=high) { mid=(low+high)/2; if(m<a[mid]) high=mid-1; /************found************/ else if(m > a[mid]) low=mid+1; else return(mid); } return(-1); } main() { int i,a[N]={-3,4,7,9,13,45,67,89,100,180 },k,m; printf("a数组中的数据如下:"); for(i=0;i<N;i++) printf("%d ", a[i]); printf("Enter m: "); scanf("%d",&m); k=fun(a,m); if(k>=0) printf("m=%d,index=%d\n",m,k); else printf("Not be found!\n"); } 3.下列给定程序中函数fun的功能是:用选择法对数组中的n个元素进行升序排列。 请修改程序中的错误,使它能得出正确的结果。 注意:部分源程序在文件MODI1.C中,不得增行和删行,也不得更改程序的结构! #include <stdio.h> #define N 20 void fun(int a[], int n) { int i, j, t, p; for (j = 0 ;j < n-1 ;j++) { /************found************/ p = j; for (i = j;i < n; i++) if(a[i] < a[p]) /************found************/ p = i; t = a[p] ; a[p] = a[j] ; a[j] = t; } } main() { int a[N]={9,6,8,3,-1},i, m = 5; printf("排序前的数据:") ; for(i = 0;i < m;i++) printf("%d ",a[i]); printf("\n"); fun(a,m); printf("排序后的数据:") ; for(i = 0;i < m;i++) printf("%d ",a[i]); printf("\n"); } (三)编程题 1、在含有10个元素的数组中,出最小值和最大值。 2、输出以下的杨辉三角形(要求输出10行)。 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 3、编一个程序,将两个字符串s1和s2比较,若s1>s2,输出一个正数;若s1=s2,输出0;若s1<s2,输出一个负数。不要用strcmp函数。两个字符串用gets函数读入。输出的正数或负数的绝对值应是相比较的两个字符相应的ASCII码的差值。 |
三、实验过程与结论:(经调试正确的源程序(核心部分)和程序的运行结果) (三)编程题 1 2. 3. |
四、实验总结:(实验中遇到的问题及解决方法,心得体会等) 字符含义不够熟悉,有时候因为不懂字符含义而出错,导致代码无法运行,然后是不能熟练敲出相应代码。对数组的知识掌握不太全面,不能较好的应用,对不会做的题要积极问同学及老师。在今后学习中要更多的动脑,对于一些特殊字符要熟记,综合运用所学习的东西,让敲出来代码能够顺利运行。 |
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论