您好,欢迎来到年旅网。
搜索
您的当前位置:首页程序设计基础习题

程序设计基础习题

来源:年旅网
7.8习题

1.编制一个 C 程序,从键盘输入一个正整数,如果该数为素数,则输出该素数,否则输 出该数的所有因子 (除去 1 与自身 )。

2.编制一个 C 程序,从键盘输入一个正整数

1

2

|N |

N,然后计算并输出

S=1 2

最后计算并输出

1 1 T= 1

2 3

S 的整数部分。

2 2

K 1 1 ( 1) K

其中 K

3.编制一个 C 程序,计算并输出多项式的值

S

n

5. ( 0.5 1)

2

05. ( 0.5 1)( 05. x

2)

3

1 05. x

2!

x

3!

5. ( 0.5 1) ( 0.5 n 1) n x

n!

的值,直到 |Sn-Sn-1|<0.000001 为止。其中 x 从键盘输入。

4. 编制一个 C 程序,计算下列级数和: sn=1+(2/1)+(3/2)+(5/3)+(8/5)+(13/8)+ , +(an/an-1) 其中 n≥ 1,由键盘输入;s1=1。

5.编制一个 C 程序,计算并输出下列级数之和:

x

2

3

n

e

2! 3! n! 其中 n 与 x 从键盘输入。

6.编制一个 C 程序,输出能写成两个数平方之和的所有三位数。 7.如果一个数恰好等于它的所有因子 出 1000 以内的所有“完数”之和。

8.编制一个 C 程序,从键盘输入 30 个实数,分别计算并输出以下 和,所有负数之和,所有数的绝对值之和,正数的个数,负数的个数。 定买鸡方案。

10.设A,B, C, D,E 五人,每人额头上贴了一张或黑或白的纸。五人对坐,每人都可以 看到其他人额头上的纸的颜 ,色但都不知道自己额头上的纸的颜 。色五人相互观察后开始说 话:

A 说:我看见有三人额头上贴的是白纸,一人额头上贴的是黑纸。 B 说:我看见其他四人额头上贴的都是黑纸。

C 说:我看见有一人额头上贴的是白纸,其他三人额头上贴的是黑纸。 D 说:我看见四人额头上贴的都是白纸。 E 什么也没说。

现在已知额头上贴黑纸的人说的都是真话,额头上贴白纸的人说的都是假话。编制一个 程序,确定这五人中谁的额头上贴白纸,谁的额头上贴黑纸?

C

5 个量:所有正数之

(包括 1 但不包括自身 )之和, 则称之为 “完数”。 例

如, 6 的因子为 1、2、3,且 1+2+3=6 ,即 6 是一个“完数” 。编制一个 C 程序,计算并输

1 x

x

x x

9. 100 元钱买 100 只鸡,母鸡 3 元/只,公鸡 2 元/只,小鸡 0.5 元/只。编制一个 C 程序,制

7.9 寻找 1000 以内最小的

这 20 个素数之和。 具体要求:

10 个素数与最大的 10 个素数(去掉重复的素数) ,计算并输出

(1) 画出计算过程的结构化流程图。

(2) 虽然 1000 以内素数个数超过 20 个, 但仍要求考虑 1000 以内不够 10 个最小素数与 10 个最大素数,以及最小的

10 个素数与最大的 10 个素数有重复的情况。

(3) 输出要有文字说明。输出形式为 zuixiaosushu:素数 1,素数 2,, ,素数 10 zui da sushu:素数 1,素数 2,, 素数 10 sushuzhi he:和的具体值

(4) 在程序内部加必要的注释(至少有三处) 方法说明:

对于某个(从小到大与从大到小)自然数

k,开始时置标志 flag 为 0,然后对 2 到 k 中的

自然数 j 进行检测,当发现 j 是 k 的因子,就置 flag 为 1,表示不必再对别的自然数进行检 测,因为此时已经可以确定

k 不是素数了,只有当 2 到 k 中的所有自然数都不是

k 的因子

(即 flag 保持为 0)时,说明 k 为素数,输出 k,并进行累加。

7.10 A 、B、C、D、E 五人分苹果。 A 将所有的苹果分为五份,将多余的一个苹果吃掉后再

拿走自己的一份苹果; B 将剩下的苹果分为五份, 将多余的一个苹果吃掉后再拿走自己的一 份苹果; C、D、E 依次按同样的方法,将剩下的苹果分为五份,吃掉多余的一个苹果后拿 走自己的一份苹果。 编程计算原来至少有多少个苹果? 具体要求:

(1) 画出计算过程的结构化流程图。 (2) 输出要有文字说明。

(3) 在程序内部加必要的注释(至少有三处) 方法说明:

采用逐步试探的方法。 设当前试探的苹果数为

n。如果 n 满足下列条件:

5 整除;

则试探的 n 即为原来的

4*(n-1)/5 。

如果每次分配时均满足其中的条件,

n-1(多余的一个被吃掉)后要能被 拿走一份后,余下的四份苹果数为 按上述策略连续进行五次分配, 苹果数 x。

为了第一次能分配,试探从 如下公式依次计算:

a=(x-1)/5 b=(4*a-1)/5 c=(4*b-1)/5 d=(4*c-1)/5 e=(4*d-1)/5

6 开始。

根据分配策略,最后 A ,B,C,D,E 五人得到的苹果数(不包括吃掉的一个苹果)可以按

A、B、C、D、E 各得到多少个苹果?

7.11 某单位要在

A,B,C,D,E,F 六人中选派若干人去执行一项任务,选人的条件如下:

(1) 若 C 不去,则 B 也不去; (2) C 和 D 两人中去一个;

(3) D 和 E 要么都去,要么都不去; (4) A,B,F 三人中要去两个; (5) C 和 F 不能一起去: (6) E 和 F 两人中至少去一个。 问应该选哪几个人去? 具体要求:

(1) 画出计算过程的结构化流程图。 (2) 输出要有文字说明。

(3) 在程序内部加必要的注释(至少有三处)

8.5习题

4. 编写一个函数 sabc(),根据给定的三角形三条边长a,b,c,函数返回三角形的面积。 5. 编写一个计算阶乘值的函数 盘输入两个正整数

p()(该函数为双精度实 )型

;再编写一个主函数,从键

m! n )。 (m n)! 的值 (即求 A m

m 与 n(m≥ n),通过调用函数 p(),计算

6. 编写一个函数,计算并返回给定正整数 7. 编写一个主函数,调用例 8. 编写一个主函数,调用例

示成两个素数之和。

m 与 n 的最大公约数。

8.3 中的函数 sushu(),输出小于1000 的最大五个素数。 8.3 中的函数 sushu(),验证6 到 1000 中的所有偶数均能表

Fibonacci)数列中第 n 项的值。菲波那

9. 编写一个递归函数,计算并返回菲波那契(

契数列的定义如下:

Fib(1)=1 ,Fib(2)=1

Fib(n)=Fib(n-1)+Fib(n-2)

10. 编写一个递归函数, 计算并返回阿克玛 (Ackermann) 函数值。 阿克玛函数的定义如下:

x 1 x

Ack (n,x,y)

0 1

n 0 n 1 y 0

且 n 2 y

且 n 3 y

0 0

2

Ack( n 1, Ack( n, x, y 1), x)

n 4 y 0

n 0 y 0

其中 n, x,y 均为非负整数。

11. 编写计算 n!的递归函数。

12. 编写一个递归函数,其功能是将一个正整数 个空格分隔)输出。例如,输入的正整数为 函数中从键盘输入,要求判断其输入的合理性。

13. 计算并输出 500 以内的所有“亲密数”对,并输出所有“完数”之和。 具体要求:

(1) 编写一个函数 facsum(n),返回给定正整数 和。

(2) 编写一个主函数,调用 数”对以及计算所有“完数”之和。

(1)中的函数 facsum(n),寻找并输出 500 以内的所有“亲密

n 的所有因子 (包括 1 但不包括自身) 之 n 转换成字符串(要求各字符之间用一

735,应输出字符串“ 7 3 5”。其中正整数在主

(3) 分别画出函数 facsum(n)和主函数计算过程的结构化流程图。

(4) 在输出每对“亲密数”时,要求小数在前、大数在后,并去掉重复的数对。例如, 220 与 284 是一对 “亲密数”,而 284 与 220 也是一对 “亲密数” ,此时只要求输出 220 与 284 这对“亲密数” 。

(5) 输出要有文字说明(英文或汉语拼音) 。输出时每对“亲密数”用一对圆括号括起 来,两数之间用逗号分隔,且所有的“亲密数”对占一行。输出形式为 各对“亲密数” “完数”之和

(6) 在程序内部加必要的注释(至少有三处)

(7) 将两个函数分别放在两个文件中进行编译、连接并运行。 (8) 将两个函数放在一个文件中进行编译、连接并运行。 方法说明:

如果自然数 M 的所有因子(包括

1 但不包括自身,下同)之和为

N,而 N 的所有因子之和 1+2+3=6,因此, 6 与它 1+2+4+71+142=220 ,因

。例如, 6 不仅

为 M ,则称 M 与 N 为一对“亲密数” 。例如, 6 的所有因子之和为 自 身 构 成 一 对 “ 亲 密 数 ” ; 又 如 , 220 此, 220 与 284 为一对“亲密数” 。

如果一个自然数的所有因子之和恰好等于它自身,则称该自然数为“完数” 与它自身构成一对“亲密数” ,且 6 是一个“完数” 。

的 所 有 因 子 之 和 为

1+2+4+5+10+11+20+22+44+55+110=284 ,而 284 的所有因子之和为

7.12 计算并输出

具体要求:

k !的值。

(1) 编写一个计算 k!的递归函数,其函数名返回 (2) 编写一个主函数,首先从键盘输入 函数计算

k! 的值。

k!的值。

m 和 n 的值(要求 n≥ m≥ 0),然后调用 (1)中的

(3) 在计算 k!的递归函数中,要检查形参k 的合理性,当 k<0 时,应输出出错信息,并 返回 0 值。

(4) 在主函数中应检查从键盘输入的数据的合理性,对于不合理的输入,应输出出错信 息,并不再调用计算。

(5) 分别输入 (m, n)=(-3, 7), (0, 0), (1, 7), (9, 13), (9, 4) 运行你的程序。 14. 利用变步长梯形求积法计算定积分。 具体要求:

(1) 编写一个函数 st(a, b, eps() 要求该函数放在的文件中) ,其功能是利用变步长梯 形求积法计算定积分

b

s

a

f (x) dx

其中 eps 为精度要求。

要求画出该函数处理的结构化流程图。

(2) 编写一个主函数以及计算被积函数值的函数 b, eps),计算并输出下列积分值

8

fun(x) ,在主函数中调用 (1)中的函数 st(a,

1 dx x

s

4

精度要求为 eps=0.0001。

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

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

1 dx 1 1 s

1

2

fun(x) ,在主函数中调用 (1)中的函数

x

精度要求为 eps=0.00001。 同样要求主函数与函数 方法说明:

变步长梯形求积法的基本步骤如下: ①利用梯形公式计算积分。即取

n=1,h=b-a

则有

n 1

fun(x) 放在同一个文件中。

h T

n

[ f (x ) f (x

k

)]

k 1

2

k 0

其中 xk=a+kh。

②将求积区间再二等分一次 (即由原来的 n 等分变成 2n 等分),在每一个小区间内仍利用梯 形公式计算。即有 T

2n

h

n 1

2 k

f (x ) f (x [ k

2 0

) f (x ) f 2

(x k )

1 ]

k 0.5

k

15.

n 1

n 1

h = 4

k 0

h

[f (x ) f (x

k

)]

2

k 0

f (x

k 0.5

)

k 1

n 1

1 = T

n

h

f (x

k 0.5

)

2 2

k 0

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

|T2n-Tn|成立,则二等分后的积分值 然后重复②。

T2n 即为结果;否则作如下处理:

h=h/2,n=2*n ,Tn=T2n

6. 习题

10 的整型一维数组输入数据。 最后按逆序输

6. 编写一个 C 程序, 从键盘为一个长度为

出数组中的元素,并输出数组中最大元素的下标值。

7. 编写一个 C 程序,将两个长度相同的一维数组中各下标相同的对应元素相乘,并将

结果存放到另一个一维数组中。

8. 编写一个 C 程序, 从键盘为 5× 5 的一个整型二维数组输入数据。 最后输出该二维数

组中的对角线元素。

7.13 编写一个 C 程序, 从键盘为 4× 6 的一个整型二维数组输入数据。

组中最小元素的行下标与列下标。

最后输出该二维数

7.14 从键盘输入

5 行 5 列二维整型数组的数据。编制一个函数,计算二维数组中每一行

5 的一维数组中。 最后按矩阵形式输出二

中的最小值, 并将此最小值顺序存放在一个长度为

维数组中的各元素,且各行中的最小值(即一维数组中的元素)输出到相应行的右边。

7.15 编写一个 C 函数,将一个一维数组中的元素逆转。逆转是指将数组中的第一个元素

与最后一个元素进行交换, 第二个元素与倒数第二个元素进行交换, 中间一个元素为止。

以此类推, 直到数组的

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

7.17 设有两个整型一维有序数组 (即数组中的元素按从小到大进行排列)

数,将这两个有序数组合并存放到另一个一维数组中,

,编写一个 C 函

并保证合并后的一维数组也是有序的。

7.18 编制一个 C 程序,从键盘输入一个由

China。要求给出判断结果的提示信息。

5 个字符组成的单词,然后判断该单词是否是

7.19 编写一个 C 程序,从键盘输入

数字字符的个数。

50 个字符,并统计其中英文字母(不分大小写)与

。现某人从 2000 年 1 月 1 日起开始“三天

。其

7.20 中国有句俗语叫“三天打鱼,两天晒网”

中以后的某年某月某日从键盘输入。

打鱼,两天晒网” ,请编程判断此人在以后的某年某月某日是在“打鱼”还是在“晒网”

7.21 一辆汽车在开始出发前其里程表上的读数是一个对称数

注:所谓对称数是指从左向右读与从右向左读完全一样。

95859,后匀速行驶两小时

后,发现里程表上是一个新的对称数。问该新的对称数是多少?汽车的速度是多少?

7.22 计算多项式函数

P6(x)=1.5x

6+3.2x 5-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 值,返回多项式函数值。

x 值。

(2) 编写一个主函数, 定义两个一维数组, 分别存放多项式的系数和需要计算的各 然后在主函数中调用 (1)中的函数逐个计算各 x 值时的多项式值。

(3) 在主函数中的输出形式为

P(x 值)=具体的多项式值

,

方法说明: 设多项式为 Pn(x)=anx

n+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)。

7.23 产生 100 个 0~1 之间均匀分布的随机数,并将这些随机数按非递减顺序进行排序,存

放到一个一维数组中。最后输出该有序数组。 具体要求:

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

(2) 输出时要求每行输出 方法说明:

rk=mod(2053r k-1+13849,2

16) 16

pk=rk/2 其中初值r0=1。

10 个数据,并上下对齐。

产生随机数 pk(k=1, 2, , , 100)的公式为

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

定义数组a[100] r=1, k=0

k<100

r=mod(2053r+13849, 2 )

16

16

p=r/2 j=k-1

j≥ 0 且 pa[j+1]=a[j] j=j-1

a[j+1]=p k=k+1

输出 a[k], k=0, 1, , , 99

9.4实图验练习2 的流程图

7.24 利用高斯 (Gauss)消去法求解线性代数方程组。

具体要求:

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

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

(2) 编写一个主函数,调用 16. 1161x

1

(1)中的函数求解下列线性代数方程组:

0.1490 x

4 4

0.12 x

2 2

11.x

0.1397x

3 3

1.71

7.x

1.1675 x

1 1

0 .1768 x 0.2568x

2

0.1871x 1.2671 x

3 3

1.71 1.8471

4

9.x

0.1968x

1 0.2071x

2

1.2168x 0.2271 x

4

1.7471

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

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

1.1161 0.1582 0.2368 0.1968 MAT B=

1.71

1.71

1.8471

1.7471

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

0.12 1.1675 0.2471 0.2071

0.1397 0.1768 0.2568 1.2168

0.1490 0.1871 1.2671 0.2271

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-aik bk,i=k+1 ,, , n

这一步称为消去。 ②进行回代 xn=bn/ann

n

xi b

i

a x ,i=n-1 ,, , 2,1

ij

j i 1

j

列选主元的基本思想是在变换到第

k 步时,从第 k 列的 akk 以下 (包括 akk )的所有元素中选

akk 的位置上。 由于交换系数矩阵中的两行 (包

出绝对值最大者, 然后通过行交换将它交换到 不影响求解结果。

括交换常数向量中的两个相应元素) ,只相当于两个方程的位置被交换了,因此,列选主元

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

10.8 习题

17. 阅读下列 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(\"%d\\n\}

输出结果为 ()。

(2)

#include main()

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

int *p=a, **k, z;

k=&p; z=*p; p=p+1; z=z + **k; printf(\"%d\\n\}

输出结果为 ()。

(3)

#include

voidast(int x, int y, int*cp, int*dp)

{ *cp=x+y; *dp=x-y;

return; } main() { int a, b, c, d; a=4; b=3; ast(a, b, &c, &d); printf(\"%d\\n\}

输出结果为 ()。

2. 编写一个 C 程序,从键盘输入两个字符串,然后按先小后大的顺序显示输出。 3. 编写一个 C 程序,利用指针数组,显示输出如下信息:

File Edit Write Read Exit

4. 编写函数 void disp(char *s, int n) ,将在 s 指向的字符串中连续显示输出

n 个字符, 若

字符串中不够 n 个字符, 则输出到字符串结束符为止。 再编写一个主函数, 从键盘输入一个 字符串,调用函数 disp(),将该字符串中的第 4 到第 10 个之间的字符显示输出。

5. 编写一个函数,功能是计算给定字符串的长度。再编写一个主函数调用该函数来计 算字符串的长度,其中字符串在执行程序时的命令行中作为参数输入。

6. 利用指针数组实现矩阵相乘

C=AB 。其中矩阵相乘函数为通用的,在主函数中对矩

A 、B 与乘积矩阵 C。

阵 A 与 B 进行初始化,并显示输出矩阵

7. 编写一个 C 函数,将一个字符串连接到另一个字符串的后面。 8. 编写一个 C 函数,将两个有序字符串(其中字符按 另一个有序字符串中,要求合并后的字符串仍是有序的。

9. 编写一个 C 程序,从键盘输入一个月份号,输出与之对应的英文名称。例如,输入 “5”,则输出“ MAY ”。要求用指针数组处理。

10. 编写一个 C 函数 intstr_cmp(char *str1, char *str2) ,实现两个字符串的比较(即实现 strcmp(str1, str2) 的功能)。

11. 编写一个主函数, 其功能是将执行该程序时所输入的命令行中所有的字符串显示输 出。

z、对数 ln(z) 以及正弦 sin(z)、余弦 cos(z)。 12. 计算给定复数 z=x+jy 的指数 e

具体要求:

ASCII 码从小到大排列)合并到

(1) 分别编写计算给定复数的指数、对数、正弦和余弦的四个函数。这四个函数的形参

分别是给定复数的实部 x、虚部 y 以及计算结果的实部 u、虚部 v。并且,在每一个函数中

z=2+j3 的指数, 再

应允许存放计算结果的变量与给定复数的变量具有相同的存储地址。

(2) 编写一个主函数, 首先调用计算复数指数的函数计算并输出复数 调用复数对数的函数计算并输出该结果 果(为一个复数)的余弦。

(3) 在主函数中输出结果的形式为(其中 计算结果中实部与虚部的具体值) exp(x+jy)=u+jv ln(x+jy)=u+jv sin(x+jy)=u+jv cos(x+jy)=u+jv 方法说明:

设给定的复数为 z=x+jy 。则

(1) 复数 z 的指数为

w=u+jv=e

=e

x(cos(y)+jsin(y)) x

x

z=ex+jy

(为一个复数) 的对数, 然后调用计算复数正弦的函

数计算并输出新结果 (为一个复数) 的正弦, 最后调用计算复数余弦的函数计算并输出新结

x 与 y 为复数实部与虚部的具体值, u 与 v 为

即 u=e

cos(y),v=e sin(y) 。 (2) 复数 z 的对数为

w=u+jv=ln(z)=ln(x+jy)

=ln 2

x

y 2

+jArctg(y/x)

即 u=ln x 2

y 2 ,v=Arctg(y/x) 。

(3) 复数 z 的正弦为

w=u+jv=sin(z)=sin(x+jy)

=sin(x)(e +e )/2+jcos(x)(e -e )/2 y+e-y )/2,v=cos(x)(e y-e-y )/2。 即 u=sin(x)(e

y

-y

y

-y

=sin(x)cos(jy)+cos(x)sin(jy)

(4) 复数 z 的余弦为

w=u+jv=cos(z)=cos(x+jy)

=cos(x)cos(jy)-sin(x)sin(jy)

y+e-y)/2-jsin(x)(e y -e-y)/2

=cos(x)(e

z 与计算结果 w 存放在同一个存储地

x 与虚

x 与虚部 y 还没有使用完,不能直

u 值,也即改变了 x 值;

y+e-y)/2,v=-sin(x)(e y-e-y)/2。 即 u=cos(x)(e

特别要指出的是,根据题目的要求,应允许给定复数

址中,即在调用这些函数时, 计算结果的实部与虚部仍然存放在给定复数的实部变量 部变量 y 中。因此, 在每一个函数中,当给定复数的实部 同样,函数中如果改变了 具体要求:

(1) 编写一个函数,其功能是对由 指向。

v 值,也即改变了 y 值。

接将计算结果赋给 u 或 v,因为在这种情况下,函数中如果改变了

7.25 利用冒泡排序法对给定的单词序列进行排序。

n 个单词所构成的字符串序列按非递减顺序进行冒泡

排序。 其中单词序列中的各单词 (即字符串) 由长度为 n 的一维字符串指针数组中的各元素

(2) 编写一个主函数,调用 (1)中的函数,对下列单词序列进行排序:

zhang,gou,xu,zheng,mao,zhao,li,bai,qing 其中该单词序列中各单词以赋初值的方式用一维字符串指针数组的各元。 向指素

(3) 在主函数中,要求先输出原序列,换行后再输出排序后的序列。输出时各单词之间 用两个空格分隔。 方法说明:

使用字符串比较函数

strcmp() ,需要包含头文件string.h。

11.7习题

18. 编写一个 C 程序,要求定义一个有关日期的结构体类型变量(包括年、月、日)

键盘为该变量中的各成员输入数据,然后再将输入的日期显示输出。

19. 建立一个学生情况登记表的表格空间(学生人数最多为 课程的成绩与总分。在主函数中调用以下函数实现指定的功能:

(1) 输入 n 个学生的数据(不包括总分) 。其中 n(≤ 20)在主函数中从键盘输入。 (2) 计算每个学生的总分。 (3) 按总分进行排序。

(4) 显示输出给定学号学生的所有信息。其中学号在主函数中从键盘输入。 20. 编写一个 C 程序,根据键盘输入的非负整数值,显示输出颜文名称英的色。 21. 编制一个 C 程序,定义一个长 为度标志值为 0 时表示输入五分制成绩(整型) 型)。然后从键盘输入

10 的联合体类型数组。 首先从键盘输入一个标志, ,标志值为 1 时表示输入百分制成绩(单精 实度

,从

20),包括学号、姓名、五门

10 个成绩存放到数组中。最后输出这些成绩。

22. 编写一个 C 函数,功能是计算给定链表的长 。度23. 编写一个 C 函数,功能是逆转给定链表。 24. 设有两个有序线性单链表,头指针分别为 序链表合并为一个头指针为

ch 的有序链表。

ah 与 bh。编写一个 C 函数,将这两个有

25. 设有一个链表,其结点值均为正整数,且按值从大到小链接。编写一个 C 函数,将 该链表分解为两个链表, 其中一个链表中的结点值均为奇数, 而另一个链表中的结点值均为 偶数,且这两个链表均按值从小到大链接。

26. 设有一个链表,其结点值均为整数,且按绝对值从小到大链接。编写一个 将此链表中的结点按值从小到大链接。

27. 设有一个链表, 其结点值均为正整数。 编写一个 C 函数, 反复找出链表中结点值最 小的结点。并输出该值,然后将该结点从链表中删除,直到链表空为止。

28. 给定学生成绩登记表如表

11.4 所示。编写一个

C 程序,用冒泡排序对该学生成绩

表按成绩( grade)从低到高进行排序。

表 11.4 学生成绩登记表

C 函数,

学号 (num)

02 03 04

姓名 (name)

Lin Zhang Zhao

成绩 (grade)

92 87 72

05 09 11 12 13 16 17 20 21 22

具体要求:

Ma Zhen Wang Li Xu Mao Hao Lu Song Wu

91 85 100 86 83 78 95 82 76 88

(1) 定义一个结构体数组表示学生成绩登记表, 生的情况。 结构体类型为 struct student { intnum; char name[10]; int grade;

};

其中的每个元素依次存放表 11.4 中各学

(2) 在程序中另外定义一个结构体指针数组,在排序前,其中每一个数组元素依次指向 学生成绩登记表(为结构体类型数组)中的各学生情况。

(3) 在程序中, 首先输出排序前的学生情况, 然后输出排序后的结果。 输出形式如表 11.4 所示,但不要表中的框线。

(4) 将冒泡排序的功能编写成一个函数。 方法说明:

在实际排序的过程中, 并不需要交换学生成绩登记表中的各学生情况,

而只需要交换另一指

针数组中的各指针。 因此, 排序的最后结果, 学生成绩登记表中各学生情况之间的存储顺序 并没有改变,而只是按指针数组中各指针元素顺序指向的各学生情况是按成绩有序的。

7.26 链表基本操作。

具体要求:

(1) 定义一个结构体数组表示学生成绩登记表, 生的情况。 结构体类型为 struct student { intnum; char name[10]; int grade;

};

(2) 对于表 11.4 所示的学生成绩登记表, 依次将每个学生的情况作为一个结点插入到链 表的链头(即当前插入的结点将成为链表中的第一个结点) 头指针为空。

每个学生情况结点结构的结构体类型为 structstunode

。初始时链表为空,即该链表的

其中的每个元素依次存放表

11.4 中各学

{ intnum; char name[10]; int grade;

structstunode *next;

};

(3) 当所有学生情况都插入到链表后,从链头开始,依次输出链表中的各结点值(即每 个学生的情况) 。输出格式如同表 11.4 所示,但不要表中的框线。 方法说明:

为了给每个学生情况的结点

p 动态分配存储空间,可以用如下语句:

p=(structstunode *)malloc(sizeof(structstunode)); 其中 p 为结构体类型 structstunode 的指针。

另外,为了使用函数 malloc() ,应该包含头文件 stdlib.h 。

7.27 将表 11.4 所示的学生成绩登记表划分成三个子表,

之间的学生情况,子表 具体要求:

(1) 定义一个结构体数组表示学生成绩登记表, 生的情况。 结构体类型为 struct student { intnum; char name[10]; int grade;

};

70~79 之间的学生情况。

其中子表 1 登记的是成绩在 90~100

3 登记的是成绩在

2 登记的是成绩在 80~ 之间的学生情况,子表

其中的每个元素依次存放表 11.4 中各学

(2) 划分成的三个子表均采用链表结构,链表中各结点的数据域存放学生情况在原登记 表中的序号(即结构体数组元素的下标) 的结构体类型为 structstunode { struct student

};

(3) 最后输出原学生成绩登记表以及划分成的三个子表。 要表中的框线。 方法说明:

划分子表的方法如下:

对于表 11.4 中的各学生成绩 grade,计算

k=10-int(grade/10)

其中 int() 表示取整。根据 k 值将学生情况插入到相应的子表中: 若 k=0 或 1,则插入到子表 1 中; 若 k=2,则插入到子表 2 中; 若 k=3,则插入到子表 3 中。

初始时各子表均为空。当需要将一个学生情况插入到某子表时,首先动态申请一个结点

(structstunode 类型),将该学生情况在原表中的序号 (元素下标) 存放到结点的数据域中; 然后将该结点链接到相应链表的链头。

输出格式如表 11.4 所示, 但不

*data;

structstunode *next;

,而不是直接存放学生的成绩情况。即各链表结点

7.28 习题

29. 编写一个 C 程序,首先从键盘输入

20 个双精度实数,并写入文本文件

fd.dat 中。

然后将写入文件 fdata.dat 中的 10 个双精度实数显示输出。

30. 编写一个 C 程序,从键盘输入一个字符串(输入的字符串以“ 中的小写字母全部转换成大写字母, 出并显示输出。

31. 编写一个 C 程序,主函数从命令行得到一个文件名, 读入一字符串存放到字符数组

然后调用函数 fgets()从文件中

#”作为结束),将其

并写入到文件 upper.txt 中。然后再从该文件中的内容读

str 中(字符个数最多为 80 个)。在主函数中输出字符串与该

字符串的长度。 fgets 函数的格式为: char *fgets( char *string, int n, FILE *stream );

32. 编写一个 C 程序, 将源文件拷贝到目的文件中。 由命令行给出,并且源文件名在前,目的文件名在后。

33. 设二进制文件 student.dat 中存放着学生信息,这些信息由以下结构体描述: struct student { longintnum; char name[10]; int age; char sex; charsreciality[20]; charaddr[40];

};

请编写一个 C 程序,显示输出学号在 年龄 age 与性别 sex。 34.设有一学生情况登记表如表

12.1 所示。

表 12.1 学生情况登记表

两个文件均为文本文件, 文件名均

970101~970135 之间的学生学号 num、姓名 name、

学号(num)

101 102 103 104 105 106 107 108 109 110

姓名(name)

Zhang Wang Zhao Li Gao Lin Ma Zhen Xu Mao

性别(sex)

M F M M M M F M M F

年龄(age)

19 18 19 20 19 18 17 21 19 18

成绩(grade)

95.6 92.4 85.7 96.3 90.2 91.5 98.7 90.1 .5 94.5

编写一个 C 程序,依次实现以下操作:

(1) 定义一个结构体类型

struct student { charnum[7]; char name[8]; char sex[3]; char age[5]; char grade[9];

};

(2) 为表 12.1 定义一个结构体类型 (struct student)数组,并进行初始化。 (3) 打开一个可读写的新文件 (5) 关闭文件 stu.dat。 (6) 打开可读写文件 stu.dat。

(7) 从文件 stu.dat 中读出各学生情况并输出。输出格式如表 线。

(8) 关闭文件 stu.dat。

12.1 所示,但不要表格框

stu.dat。

stu.dat 中。

(4) 用函数 fwrite() 将结构体数组内容写入文件

7.29 将表 12.1 的内容按结构体类型写入文本文件

在 95.0 到 100 分之间的学生情况。 具体要求:

st.dat 中;然后对该文件按成绩从低到

高进行冒泡排序, 并输出排序结果; 最后, 在排序后的文件中用对分查找法查找并输出成绩

(1) 在定义的结构体类型中,各成员均为字符数组。即结构体类型的定义如下: struct student { charnum[8]; char name[8]; char sex[5]; char age[5]; char grade[10];

};

(2) 编写一个对文本文件(其中每一个记录的结构如 排序的函数 mudisk(fp ,n)。其中: fp 为文件类型指针,指向待排序的文件;

n 为长整型变量,存放待排序文件中的记录个数(即学生的个数) (3) 编写一个对按成绩 (grade)有序的文件(其中每一个记录的结构如 分查找的函数 nibsrch(fp ,n,a,b,m)。其中: fp 为文件类型指针,指向给定的有序文件;

n 为长整型变量,存放按成绩有序文件中的记录个数(即学生的个数) a 与 b 均为字符串指针,分别指向成绩( 成绩在 a 到 b 之间的学生) ;

m 为整型变量指针, 该指针指向的变量返回成绩在 素下标)。

(4) 在主函数外定义结构体类型,且主函数放在所有函数的前面。

(5) 在主函数中依次完成以下操作:

①为表 12.1 定义一个结构体类型( struct student)数组,并进行初始化。 ②打开可读写的新文本文件

st.dat。

st.dat 中。

③使用函数 fwrite() 将结构体数组内容写入文件

a 到 b 内的第一个记录号 (即数组元

grade 作为字符串)值的下限与上限(即查找

(1)中定义)进行对

(1)中定义)按成绩 (grade)进行冒泡

④关闭文件 st.dat。 ⑤打开可读写文件 st.dat。

⑥调用 (2)中的函数 mudisk(fp ,n),对文件 st.dat按成绩( grade)从低到高进行冒泡排序。 ⑦调用 (3)中的函数 nibsrch(fp ,n,a,b,m),查找成绩在 95.0 到 100 分之间的学生情况。 ⑧根据查找的返回结果,使用函数 情况并输出。输出格式如表 ⑨关闭文件 st.dat。

fread(),从文件中读出成绩在

95.0 到 100 分之间的学生

12.1 所示,但不要表格框线。

13.4 习题

35. 写出下列表达式的值: (1) 0x13 & 0x17 (3) 56 & 056 (5) 3^6<<2

(7) 0x00ff^(~(~0<<4)<<4) 数。

37. 阅读下列 C 程序: #include main() { int

a=0x95, b, c; b=(a & 0xf)<<4; c=(a & 0xf0)>>4; a=b | c;

printf(\"a=%x\\n\

}

运行上述程序后,输出结果是什么?

38. 阅读下列 C 程序: #include main() { char

a=0x95, b, c; b=(a & 0xf)<<4; c=(a & 0xf0)>>4; a=b | c;

printf(\"a=%x\\n\

}

(1) 如果系统为“算术右移” ,则运行上述程序后,输出结果是什么? (2) 如果系统为“逻辑右移” ,则运行上述程序后,输出结果是什么?

39. 编写一个 C 程序,分别计算并输出 C 语言中为一个整型、长整型、无符号整型和字符型 变量所分配存储空间的二进制位数。 具体要求:

(1) 编写四个函数,分别计算整型、长整型、无符号整型和字符型变量所分配存储空间

(2) 0x13 | 0x17 (4) ~ox13 (6) ~(~0<<4) (8) -1|0377

36. 编写一个 C 程序,计算并输出 C 语言中为一个整型变量所分配存储空间的二进制位

的二进制位数。

(2) 编写一个主函数,调用 (1)中的四个函数,输出整型、长整型、无符号整型和字符型 变量所分配存储空间的二进制位数。 方法说明: 以整型变量为例。

首先将该整型变量所占的存储空间中按位置

1,即为该整型变量赋值 -1。然后逐次将该值左

0)为止。最后的移位次

移 1 位,并对移位次数进行计数,直到该值变为非负(即符号位为 数即是为整型变量所分配存储空间的二进制位数。

利用这种方法也可以确定长整型、无符号整型与字符型变量所占的二进制位数。

6. 设有下列 C 程序: #include main() { int

a=0x95, b, c; b=(a & 0xf)<<4; c=(a & 0xf0)>>4; a=b | c;

printf(\"a=%x\\n\

} 具体要求:

(1) 首先阅读分析上述程序。

如果系统为“算术右移” ,则运行上述程序后,输出结果是什么? 如果系统为“逻辑右移” ,则运行上述程序后,输出结果是什么?

(2) 然后将上述程序输入进计算机,实际运行上述程序。根据实际输出结果,如果系统 为“算术右移” ,则编写一个实现“逻辑右移”的函数;如果系统为“逻辑右移” 个实现“算术右移”的函数。

(3) 将上述程序中实现“右移”的操作改为调用自己编写的“算术右移”函数,并运行 该程序。

(4) 将上述程序中实现“右移”的操作改为调用自己编写的“逻辑右移”函数,并运行 该程序。

,则编写一

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务