C语言入门学习-C上机实验五要求 联系客服

发布时间 : 星期五 文章C语言入门学习-C上机实验五要求更新完毕开始阅读3d7cd0d130126edb6f1aff00bed5b9f3f80f7206

上机实验五 数组练习

【实验四参考答案见后】

目的和要求:

(1)熟悉查找、排序等算法的应用; (2)了解一维数组的插入、删除算法; (3)熟悉二维数组的基本操作。

实验内容: 一、编程题:

1.编程输出如下5阶方阵:

5 4 3 2 1 6 5 4 3 2 7 6 5 4 3 8 7 6 5 4 9 8 7 6 5

2.任意读入10个字符,采用选择法将它们降序排列后输出。

二、完善题:

1.以下程序使用“选择法变形”将任意读入的10个整数升序排列。请完善之。

【选择法变形的算法要领:n个数处理n-1趟,每趟处理:拿某元素后面的每一个元素与之比较,一旦比自己小,就交换……】

#include

________________________ main() {int a[N], k , i; for(k=0; k

for(i=0; i<=_______; i++) /*i兼做下标*/ for(k=______; k<=N-1; k++) if(_____________)

{int t; t=a[k]; a[k]=a[i]; a[i]=t ;} for(k=0; k

2.任意读入一个整数x,在升序数组a中使用二分法查找是否有与x等值的元素。请完善如下程序。

#include #define n 10 main()

{int a[n]={2,4,7,9,12,25,36,50,77,90}; int x, high, low, mid; /*x为比对关键值*/ scanf(\ high=n-1; low=0; mid=(high+low)/2;

while(_______________ &&a[mid]!=x) {if(x

printf(\ else

printf(\}

3.将任意读入的整数x插入到一个含有10个元素且已按升序排列的数列中后,使该数列仍按升序排列。 【算法要领是:

假设待插数据为x,数组a中数据为升序序列。

①先将x与a数组当前最后一个元素进行比较,若比最后一个元素还大,就将x放入其后一个元素中;否则进行以下步骤;

②先查找到待插位置。从数组a的第1个元素开始找到不比x小的第一个元素,设其下标为i ; ③将数组a中原最后一个元素至第i个元素依次一一后移一位,让出待插数据的位置,即下标为i的位置; ④将x存放到a[i]中。】

#include #define n 10 main()

{ int a[n+1]={-1,3,6,9,13,22,27,32,49,88}, x, j, k;

/*注意留一个空间给待插数,只给10个元素赋值*/ scanf(\ /*读入待插数*/

if(x>a[n-1]) a[n]=x ; /*比最后一个数还大就往最后一个元素中存放*/ else /*查找待插位置*/ {j=0;

while( j<=n-1 &&________) j++;

/*从最后一个数开始直到待插位置上的数依次后移一位*/ for(k=n-1; k>=j; k--) _____________; a[j]=x; /*插入待插数*/ }

for(j=0; j<=n; j++) printf(\ \}

4.数组a中有若干不同考试分数,任意读入一个分数,若与数组a中某一元素值相等,就将该元素删除。 【算法的要领是:首先要找到(也可能找不到)待删除元素在数组中的位置(即下标),然后将待删元素后的每一个元素向前移动一位,最后将数组元素的个数减1后输出。】

#include #define N 6 main()

{int fs[N]={69,90,85,56,44,80},x; int i, j, n; n=N;

scanf(\ /*任意读入一个分数值*/ /*以下查找待删分数的位置,即元素下标*/ for(i=0;i

if(fs[i]==x)__________; if(i==n) printf(\

else /*将待删位置之后的所有元素一一前移*/ {for(j=i+1;j

for(i=0; i<_____; i++)printf(\ \}

【实验四参考答案】 编程题:

1.编程计算1-1/2!+1/3!-1/4!+……+1/19!-1/20!的和。(参考运行结果:0.632121) 【思考】本题既可以用直接法又可以用间接法(递推法)求通项吗? 【提醒:20!=2432902008176640000】

/*double类型的有效数字是15~16位,而float只有6~7位*/

【间接法】

#include main() {double s,t; int i;

s=1.0; //已将第一项加上去 t=1.0; //t的初值为第一项的值 for(i=2;i<=20;i++)

{t= -t /i ; //计算出第2~第20项(前项的相反数除以当前项次得当前项) s=s+t; }

printf(\}

【直接法:注意不要中途溢出!】 #include #include main()

{double s,t,f; int i,j; s=0.0;

for(i=1;i<=20;i++) {f=1.0;

for(j=1;j<=i;j++) //内循环计算i! f=f*j;

printf(\ s=s+pow(-1,i-1)*1/f; }

printf(\}

2.编程计算1/2+2/3+3/5+5/8+8/13+……前20项的和。(double型数据的参考运行结果:12.278295) #include main()

{double fz,fm,s,t; int i; s=0.0;

fz=1; fm=2;

for(i=1;i<=20;i++) {s=s+fz/fm; t=fz;