程序设计基础习题

精度要求为eps=0.0001。

要求主函数与函数fun(x)放在同一个文件中。

(3) 编写另一个主函数以及计算被积函数值的函数fun(x),在主函数中调用(1)中的函数st(a, b, eps),计算并输出下列积分值

11s?dx

?1x2?1精度要求为eps=0.00001。

同样要求主函数与函数fun(x)放在同一个文件中。 方法说明:

变步长梯形求积法的基本步骤如下: ①利用梯形公式计算积分。即取 n=1,h=b-a 则有

?hTn?2?[f(xk?0n?1k)?f(xk?1)]

其中xk=a+kh。

②将求积区间再二等分一次(即由原来的n等分变成2n等分),在每一个小区间内仍利用梯形公式计算。即有 T2nhn?1f(xk)?f(xk?0.5)f(xk?0.5)?f(xk?1)?[?] 2k?022?h =

4?h[f(xk)?f(xk?1)]?2k?0n?1?f(xk?0n?1k?0.5)

1h =Tn?22?f(xk?0n?1k?0.5)

③判断二等分前后两次的积分值之差的绝对值是否小于所规定的误差。若条件

|T2n-Tn|

成立,则二等分后的积分值T2n即为结果;否则作如下处理: h=h/2,n=2*n,Tn=T2n 然后重复②。

9.6 习题

1. 编写一个C程序,从键盘为一个长度为10的整型一维数组输入数据。最后按逆序输出数组中的元素,并输出数组中最大元素的下标值。

2. 编写一个C程序,将两个长度相同的一维数组中各下标相同的对应元素相乘,并将结果存放到另一个一维数组中。

3. 编写一个C程序,从键盘为5×5的一个整型二维数组输入数据。最后输出该二维数组中的对角线元素。

4. 编写一个C程序,从键盘为4×6的一个整型二维数组输入数据。最后输出该二维数组中最小元素的行下标与列下标。

5. 从键盘输入5行5列二维整型数组的数据。编制一个函数,计算二维数组中每一行中的最小值,并将此最小值顺序存放在一个长度为5的一维数组中。最后按矩阵形式输出二维数组中的各元素,且各行中的最小值(即一维数组中的元素)输出到相应行的右边。 6. 编写一个C函数,将一个一维数组中的元素逆转。逆转是指将数组中的第一个元素与最后一个元素进行交换,第二个元素与倒数第二个元素进行交换,以此类推,直到数组的中间一个元素为止。

7. 编写一个C函数,将矩阵进行转置后输出。

8. 设有两个整型一维有序数组(即数组中的元素按从小到大进行排列),编写一个C函数,将这两个有序数组合并存放到另一个一维数组中,并保证合并后的一维数组也是有序的。 9. 编制一个C程序,从键盘输入一个由5个字符组成的单词,然后判断该单词是否是China。要求给出判断结果的提示信息。

10. 编写一个C程序,从键盘输入50个字符,并统计其中英文字母(不分大小写)与数字字符的个数。

11. 中国有句俗语叫“三天打鱼,两天晒网”。现某人从2000年1月1日起开始“三天打鱼,两天晒网”,请编程判断此人在以后的某年某月某日是在“打鱼”还是在“晒网”。其中以后的某年某月某日从键盘输入。

12. 一辆汽车在开始出发前其里程表上的读数是一个对称数95859,后匀速行驶两小时后,发现里程表上是一个新的对称数。问该新的对称数是多少?汽车的速度是多少? 注:所谓对称数是指从左向右读与从右向左读完全一样。 13. 计算多项式函数

P6(x)=1.5x6+3.2x5-0.8x4+1.4x3-6.5x2+0.5x-3.7 在x=-2.3,-1.1,-0.6,0.8,2.1,3.6处的函数值。 具体要求:

(1) 编写一个函数,其功能是:给定一个x值,返回多项式函数值。 (2) 编写一个主函数,定义两个一维数组,分别存放多项式的系数和需要计算的各x值。然后在主函数中调用(1)中的函数逐个计算各x值时的多项式值。 (3) 在主函数中的输出形式为 P(x值)=具体的多项式值 ?

方法说明: 设多项式为

Pn(x)=anxn+an-1xn-1+?+a1x+a0 可以表述成如下嵌套形式:

Pn(x)=(?((anx+an-1)x+an-2)x+?+a1)x+a0

利用上式的特殊结构,从里往外一层一层地进行计算,即按如下递推关系进行计算: u=an

u=ux+ak,k=n-1,?,1,0

最后计算得到的u即是多项式的值Pn(x)。

14. 产生100个0~1之间均匀分布的随机数,并将这些随机数按非递减顺序进行排序,存放到一个一维数组中。最后输出该有序数组。 具体要求:

(1) 在产生随机数的过程中,每产生一个随机数就将它插入到前面已经有序的数组中。

(2) 输出时要求每行输出10个数据,并上下对齐。 方法说明:

产生随机数pk(k=1,2,?,100)的公式为 rk=mod(2053rk-1+13849,216) pk=rk/216

其中初值r0=1。

解决本问题的流程图如图9.4所示。

定义数组a[100] r=1, k=0 k<100 r=mod(2053r+13849, 216) p=r/216 j=k-1 j≥0 且 p

a[j+1]=a[j] j=j-1 输出a[k], k=0, 1, ?, 99

15. 利用高斯(Gauss)消去法求解线性代数方程组。 具体要求:

(1) 编写一个用高斯(列选主元)消去法求解给定线性代数方程组的函数 gauss(a, b, x)

其中a为系数矩阵,b为常数向量,x为解向量。

(2) 编写一个主函数,调用(1)中的函数求解下列线性代数方程组: ?1.1161x1?0.1254x2?0.1397x3?0.1490x4?0.1582x?1.1675x?0.1768x?0.1871x?1234??0.2368x1?0.2471x2?0.2568x3?1.2671x4??0.1968x1?0.2071x2?1.2168x3?0.2271x4?1.5471?1.6471

?1.8471?1.7471其中系数矩阵与常数向量利用初始化赋初值。

(3) 在主函数中要求输出系数矩阵与常数向量。输出形式为 MAT A=

1.1161 0.1254 0.1397 0.1490 0.1582 1.1675 0.1768 0.1871 0.2368 0.2471 0.2568 1.2671 0.1968 0.2071 1.2168 0.2271 MAT B=

1.5471 1.6471 1.8471 1.7471 (4) 结果输出形式为 x(1)=具体值

x(2)=具体值 x(3)=具体值 x(4)=具体值

(5) 在函数gauss()中至少要求有五处加注释。 方法说明:

设线性代数方程组为AX=B。高斯消去法求解线性代数方程组的步骤如下: ①对于k从1到n-1,作如下操作: 进行列选主元

akj=akj/akk,j=k+1,?,n bk=bk/akk

这一步称为归一化。然后作

aij=aij-aikakj,i=k+1,?,n;j=k+1,?,n bi=bi-aikbk,i=k+1,?,n 这一步称为消去。 ②进行回代 xn=bn/ann

xi?bi?j?i?1?anijxj,i=n-1,?,2,1

列选主元的基本思想是在变换到第k步时,从第k列的akk以下(包括akk)的所有元素中选出绝对值最大者,然后通过行交换将它交换到akk的位置上。由于交换系数矩阵中的两行(包括交换常数向量中的两个相应元素),只相当于两个方程的位置被交换了,因此,列选主元不影响求解结果。

最后需要说明的是,在C语言中,数组的下标是从0开始的,不是从1开始的。另外,注意在函数gauss()中要将二维数组的下标转换成一维数组的下标。

10.8 习题

1. 阅读下列C程序: (1)

#include main()

{ int a[4][3]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; int (*ptr)[3]=a, *p=a[0];

printf(\}

输出结果为()。 (2)

#include main()

{ int a[5]={2, 4, 6, 8, 10};

联系客服:779662525#qq.com(#替换为@)