程序设计基础习题_第1页
程序设计基础习题_第2页
程序设计基础习题_第3页
免费预览已结束,剩余15页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

;.7.8习题1. 编制一个c 程序,从键盘输入一个正整数,如果该数为素数,则输出该素数,否则输出该数的所有因子(除去 1 与自身 )。12| n|2. 编制一个c 程序,从键盘输入一个正整数n,然后计算并输出s=1222;.最后计算并输出t= 11123(1)k 1 1k其中 ks 的整数部分。3. 编制一个c 程序,计算并输出多项式的值sn10.5x0.5(0.51)2x2 !0.5(0.51)( 0.52)3x3!0.5( 0.51)( 0.5n!n1)nx的值,直到|sn-sn-1|0.000001为止。其中x 从键盘输入。4. 编制一个c 程序,计算下列级数和:sn=1+(2/1)+(3/2)+(5/3)+(8/5)+(13/8)+(a n/an-1)其中 n 1,由键盘输入;s1=1。5. 编制一个c 程序,计算并输出下列级数之和:23nex1xxxx2!3!n!其中 n 与 x 从键盘输入。6. 编制一个c 程序,输出能写成两个数平方之和的所有三位数。7. 如果一个数恰好等于它的所有因子(包括 1 但不包括自身) 之和,则称之为“完数”。例如, 6 的因子为1、2、3,且 1+2+3=6 ,即 6 是一个“完数” 。编制一个c 程序,计算并输出 1000 以内的所有“完数”之和。8. 编制一个c 程序, 从键盘输入30 个实数, 分别计算并输出以下5 个量: 所有正数之和,所有负数之和,所有数的绝对值之和,正数的个数,负数的个数。9. 100 元钱买100 只鸡,母鸡3 元/只, 公鸡 2 元/只,小鸡0.5 元/只。编制一个c 程序, 制定买鸡方案。10. 设 a ,b ,c,d ,e 五人,每人额头上贴了一张或黑或白的纸。五人对坐,每人都可以看到其他人额头上的纸的颜色,但都不知道自己额头上的纸的颜色。五人相互观察后开始说话:a 说:我看见有三人额头上贴的是白纸,一人额头上贴的是黑纸。b 说:我看见其他四人额头上贴的都是黑纸。c 说:我看见有一人额头上贴的是白纸,其他三人额头上贴的是黑纸。d 说:我看见四人额头上贴的都是白纸。e 什么也没说。现在已知额头上贴黑纸的人说的都是真话,额头上贴白纸的人说的都是假话。编制一个c 程序,确定这五人中谁的额头上贴白纸,谁的额头上贴黑纸?11. 寻找 1000 以内最小的出这 20 个素数之和。具体要求:10 个素数与最大的10 个素数(去掉重复的素数),计算并输(1) 画出计算过程的结构化流程图。(2) 虽然 1000 以内素数个数超过20 个, 但仍要求考虑1000 以内不够 10 个最小素数与10 个最大素数,以及最小的10 个素数与最大的10 个素数有重复的情况。(3) 输出要有文字说明。输出形式为zui xiao su shu:素数 1,素数zui da su shu :su shu zhi he :素数 1,素数和的具体值2,素数102,素数10(4) 在程序内部加必要的注释(至少有三处)。方法说明:对于某个 (从小到大与从大到小)自然数 k ,开始时置标志flag 为 0,然后对2 到k 中的自然数j 进行检测,当发现j 是 k 的因子,就置flag 为 1,表示不必再对别的自然数进行检测,因为此时已经可以确定k 不是素数了,只有当2 到k 中的所有自然数都不是k 的因子(即 flag 保持为 0)时,说明k 为素数,输出k,并进行累加。12. a、 b、c、d 、e 五人分苹果。a 将所有的苹果分为五份,将多余的一个苹果吃掉后再拿走自己的一份苹果;b 将剩下的苹果分为五份,将多余的一个苹果吃掉后再拿走自己的一份苹果;c、d 、e 依次按同样的方法,将剩下的苹果分为五份,吃掉多余的一个苹果后拿走自己的一份苹果。编程计算原来至少有多少个苹果?a 、b 、c、d、e 各得到多少个苹果?具体要求:(1) 画出计算过程的结构化流程图。(2) 输出要有文字说明。(3) 在程序内部加必要的注释(至少有三处)。方法说明:采用逐步试探的方法。设当前试探的苹果数为n。如果 n 满足下列条件:n-1(多余的一个被吃掉)后要能被5 整 除 ; 拿走一份后,余下的四份苹果数为4*(n-1)/5 。按上述策略连续进行五次分配,如果每次分配时均满足其中的条件,则试探的n 即为原来的苹果数x。为了第一次能分配,试探从6 开始。根据分配策略,最后a ,b ,c,d ,e 五人得到的苹果数(不包括吃掉的一个苹果)可以按如下公式依次计算:a=(x-1)/5 b=(4*a-1)/5 c=(4*b-1)/5 d=(4*c-1)/5 e=(4*d-1)/513. 某单位要在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习题1. 编写一个函数sabc(),根据给定的三角形三条边长a,b,c,函数返回三角形的面积。2. 编写一个计算阶乘值的函数p() (该函数为双精度实型);再编写一个主函数,从键盘输入两个正整数m 与 n(mn) ,通过调用函数p(),计算m!(mn)!的值(即求a n )。m3. 编写一个函数,计算并返回给定正整数m 与 n 的最大公约数。4. 编写一个主函数,调用例8.3 中的函数sushu(),输出小于1000 的最大五个素数。5. 编写一个主函数,调用例8.3 中的函数sushu(),验证 6 到 1000 中的所有偶数均能表示成两个素数之和。6. 编写一个递归函数,计算并返回菲波那契(fibonacci)数列中第n 项的值。菲波那契数列的定义如下:fib(1)=1 ,fib(2)=1fib(n)=fib(n-1)+fib(n-2)x1xnn01且y00n2且y01n3且y02n4且y0ack( n1, ack( n, x, y1), x)n0且y07. 编写一个递归函数,计算并返回阿克玛(ackermann) 函数值。 阿克玛函数的定义如下:ack (n, x, y )其中 n, x, y 均为非负整数。8. 编写计算n! 的递归函数。9. 编写一个递归函数,其功能是将一个正整数n 转换成字符串(要求各字符之间用一个空格分隔)输出。例如,输入的正整数为735,应输出字符串“7 3 5”。其中正整数在主函数中从键盘输入,要求判断其输入的合理性。10. 计算并输出500 以内的所有“亲密数”对,并输出所有“完数”之和。具体要求:(1) 编写一个函数facsum(n),返回给定正整数n 的所有因子 (包括 1 但不包括自身)之和。(2) 编写一个主函数,调用(1)中的函数facsum(n),寻找并输出500 以内的所有“亲密数”对以及计算所有“完数”之和。(3) 分别画出函数facsum(n) 和主函数计算过程的结构化流程图。(4) 在输出每对“亲密数”时,要求小数在前、大数在后,并去掉重复的数对。例如,220 与 284 是一对“亲密数”,而 284 与 220 也是一对 “亲密数”,此时只要求输出220 与 284这对“亲密数” 。(5) 输出要有文字说明(英文或汉语拼音)。输出时每对“亲密数”用一对圆括号括起来,两数之间用逗号分隔,且所有的“亲密数”对占一行。输出形式为各对“亲密数” “完数”之和(6) 在程序内部加必要的注释(至少有三处)。(7) 将两个函数分别放在两个文件中进行编译、连接并运行。(8) 将两个函数放在一个文件中进行编译、连接并运行。方法说明:如果自然数m 的所有因子(包括1 但不包括自身,下同)之和为n ,而 n 的所有因子之和为 m ,则称m 与 n 为一对“亲密数” 。例如, 6 的所有因子之和为1+2+3=6 ,因此, 6 与 它自 身构成一 对“亲密 数”;又如, 220的所有因 子之和为1+2+4+5+10+11+20+22+44+55+110=284 ,而 284 的所有因子之和为1+2+4+71+142=220 ,因此, 220 与 284 为一对“亲密数” 。如果一个自然数的所有因子之和恰好等于它自身,则称该自然数为“完数”。例如, 6不仅与它自身构成一对“亲密数”,且 6 是一个“完数” 。11. 计算并输出k ! 的值。具体要求:(1) 编写一个计算k! 的递归函数,其函数名返回k! 的值。(2) 编写一个主函数,首先从键盘输入m 和 n 的值(要求n m 0) ,然后调用 (1)中的函数计算k ! 的值。(3) 在计算k! 的递归函数中,要检查形参k 的合理性,当k0 时,应输出出错信息,并返回 0 值。(4) 在主函数中应检查从键盘输入的数据的合理性,对于不合理的输入,应输出出错信息,并不再调用计算。(5) 分别输入 (m, n)=(-3, 7), (0, 0), (1, 7), (9, 13), (9, 4)运行你的程序。3. 利用变步长梯形求积法计算定积分。具体要求:(1) 编写一个函数st(a, b, eps()形求积法计算定积分要求该函数放在独立的文件中),其功能是利用变步长梯bsf (x ) dxa其中 eps 为精度要求。要求画出该函数处理的结构化流程图。(2) 编写一个主函数以及计算被积函数值的函数fun(x) ,在主函数中调用(1)中的函数 st(a, b, eps),计算并输出下列积分值s8 14xdx精度要求为eps=0.0001。要求主函数与函数fun(x) 放在同一个文件中。(3) 编写另一个主函数以及计算被积函数值的函数st(a, b, eps),计算并输出下列积分值1fun(x) ,在主函数中调用(1) 中的函数s1x12dx1精度要求为eps=0.00001。同样要求主函数与函数fun(x) 放在同一个文件中。方法说明:变步长梯形求积法的基本步骤如下: 利用梯形公式计算积分。即取n=1, h=b-a则有tnh n 12 kf (x k )f (x k 1 )0其中 xk=a+kh 。 将求积区间再二等分一次(即由原来的利用梯形公式计算。即有n 等分变成2n 等分),在每一个小区间内仍t2 nh n 1f ( x k )f ( x k20. 5 )f (x k0.5 )f (x k 1 )2 k02=h n 14 k f ( x k )f ( x k 1 )0h n 12 k 0f (x k0.5 )=12tnh n2 k1f (x k0.5 )0 判断二等分前后两次的积分值之差的绝对值是否小于所规定的误差。若条件|t2n-t n|eps成立,则二等分后的积分值t2n 即为结果;否则作如下处理:h=h/2 ,n=2*n ,tn=t 2n然后重复。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.5x 6+3.2x 5-0.8x 4+1.4x 3-6.5x 2+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)=a nxn+an-1x n-1+a1x+a 0可以表述成如下嵌套形式:pn(x)=(anx+an-1)x+a n-2)x+a1)x+a 0利用上式的特殊结构,从里往外一层一层地进行计算,即按如下递推关系进行计算:u=anu=ux+a k , k=n-1 , 1, 0最后计算得到的u 即是多项式的值pn(x) 。14. 产生 100 个 0 1 之间均匀分布的随机数,并将这些随机数按非递减顺序进行排序, 存放到一个一维数组中。最后输出该有序数组。1.1161x 10.1254x 20.1397 x 30.1490x 41.54710.1582x 11.1675x 20.1768x 30.1871x 41.64710.2368x 10.2471x 20.2568x 31.2671x 41.84710.1968x 10.2071x 21.2168x 30.2271x 41.7471具体要求:(1) 在产生随机数的过程中,每产生一个随机数就将它插入到前面已经有序的数组中。(2) 输出时要求每行输出10 个数据,并上下对齐。方法说明:产生随机数pk(k=1 , 2, 100)的公式为16其中初值rk=mod(2053r k-1+13849 , 2)pk=rk/216r0=1。解决本问题的流程图如图9.4 所示。定义数组a100r=1, k=0k100r=mod(2053r+13849, 2 16)p=r/2 16j=k-1j 0 且 pajaj+1=aj j=j-1aj+1=pk=k+1输 出 ak, k=0, 1, 99图 9.4实验练习 2 的流程图15. 利用高斯 (gauss)消去法求解线性代数方程组。具体要求:(1) 编写一个用高斯(列选主元)消去法求解给定线性代数方程组的函数gauss(a, b, x)其中 a 为系数矩阵,b 为常数向量,x 为解向量。(2) 编写一个主函数,调用(1)中的函数求解下列线性代数方程组:其中系数矩阵与常数向量利用初始化赋初值。(3) 在主函数中要求输出系数矩阵与常数向量。输出形式为mat a=1.11610.12540.13970.14900.15821.16750.17680.18710.23680.24710.25681.26710.19680.20711.21680.2271mat b=1.54711.64711.84711.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-aik bk, i=k+1 , n这一步称为消去。 进行回代xn=bn/annx ibinaij x jj i 1, i=n-1 , 2, 1列选主元的基本思想是在变换到第k 步时,从第k 列的 akk 以下(包括akk )的所有元素中选出绝对值最大者,然后通过行交换将它交换到akk 的位置上。由于交换系数矩阵中的两行(包括交换常数向量中的两个相应元素),只相当于两个方程的位置被交换了,因此,列选主元不影响求解结果。最后需要说明的是,在c 语言中,数组的下标是从0 开始的,不是从1 开始的。另外, 注意在函数gauss()中要将二维数组的下标转换成一维数组的下标。10.8习题1. 阅读下列c 程序:(1)#include main() int a43=1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12;int (*ptr)3=a, *p=a0;printf(%dn, *(p+5) + *(*(ptr+1) + 2);输出结果为 ()。(2)#include main() int a5=2, 4, 6, 8, 10;int *p=a, *k, z;k=&p;z=*p;p=p+1;z=z + *k;printf(%dn, z);输出结果为 ( (3)#include )。void ast(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(%dn, c+d);输出结果为 ()。2. 编写一个c 程序,从键盘输入两个字符串,然后按先小后大的顺序显示输出。3. 编写一个c 程序,利用指针数组,显示输出如下信息:file edit write read exit4. 编写函数void disp(char *s, int n) ,将在 s 指向的字符串中连续显示输出n 个字符, 若字符串中不够n 个字符, 则输出到字符串结束符为止。再编写一个主函数,从键盘输入一个字符串,调用函数disp(),将该字符串中的第4 到第 10 个之间的字符显示输出。5. 编写一个函数,功能是计算给定字符串的长度。再编写一个主函数调用该函数来计算字符串的长度,其中字符串在执行程序时的命令行中作为参数输入。6. 利用指针数组实现矩阵相乘c=ab 。其中矩阵相乘函数为通用的,在主函数中对矩阵 a 与 b 进行初始化,并显示输出矩阵a 、 b 与乘积矩阵c。7. 编写一个c 函数,将一个字符串连接到另一个字符串的后面。8. 编写一个c 函数,将两个有序字符串(其中字符按ascii 码从小到大排列)合并到另一个有序字符串中,要求合并后的字符串仍是有序的。9. 编写一个c 程序,从键盘输入一个月份号,输出与之对应的英文名称。例如,输入“5”,则输出“ may ”。要求用指针数组处理。10. 编写一个c 函数 int str_cmp(char *str1, char *str2) ,实现两个字符串的比较(即实现strcmp(str1, str2) 的功能)。11. 编写一个主函数,其功能是将执行该程序时所输入的命令行中所有的字符串显示输出。12. 计算给定复数z=x+jy 的指数 ez、对数 ln(z) 以及正弦sin(z)、余弦 cos(z)。具体要求:(1) 分别编写计算给定复数的指数、对数、正弦和余弦的四个函数。这四个函数的形参分别是给定复数的实部x、虚部 y 以及计算结果的实部u、虚部v。并且,在每一个函数中应允许存放计算结果的变量与给定复数的变量具有相同的存储地址。(2) 编写一个主函数,首先调用计算复数指数的函数计算并输出复数z=2+j3 的指数, 再调用复数对数的函数计算并输出该结果(为一个复数) 的对数, 然后调用计算复数正弦的函数计算并输出新结果(为一个复数)的正弦, 最后调用计算复数余弦的函数计算并输出新结果(为一个复数)的余弦。(3) 在主函数中输出结果的形式为(其中x 与 y 为复数实部与虚部的具体值,u 与 v 为计算结果中实部与虚部的具体值)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 的指数为zx+jyw=u+jv=e=e=ex(cos(y)+jsin(y)即 u=ex cos(y), v=exsin(y) 。(2) 复数 z 的对数为w=u+jv=ln(z)=ln(x+jy)=lnx 2y 2+jarctg(y/x)即 u=lnx 2y 2, v=arctg(y/x) 。(3) 复数 z 的正弦为w=u+jv=sin(z)=sin(x+jy)=sin(x)cos(jy)+cos(x)sin(jy)=sin(x)(e y+e-y )/2+jcos(x)(e y-e-y )/2即 u=sin(x)(e y+e-y )/2, v=cos(x)(e y-e-y )/2。(4) 复数 z 的余弦为w=u+jv=cos(z)=cos(x+jy)=cos(x)cos(jy)-sin(x)sin(jy)y-yy-y=cos(x)(e +e )/2-jsin(x)(e-e )/2即 u=cos(x)(e y+e-y)/2 , v=-sin(x)(e y -e-y)/2 。特别要指出的是,根据题目的要求,应允许给定复数z 与计算结果w 存放在同一个存储地址中,即在调用这些函数时,计算结果的实部与虚部仍然存放在给定复数的实部变量x 与虚部变量y 中。因此, 在每一个函数中,当给定复数的实部x 与虚部 y 还没有使用完,不能直接将计算结果赋给u 或 v,因为在这种情况下,函数中如果改变了u 值,也即改变了x 值;同样,函数中如果改变了v 值,也即改变了y 值。13. 利用冒泡排序法对给定的单词序列进行排序。具体要求:(1) 编写一个函数,其功能是对由n 个单词所构成的字符串序列按非递减顺序进行冒泡排序。 其中单词序列中的各单词(即字符串) 由长度为n 的一维字符串指针数组中的各元素指向。(2) 编写一个主函数,调用(1)中的函数,对下列单词序列进行排序: zhang,gou, xu ,zheng, mao, zhao, li , bai, qing其中该单词序列中各单词以赋初值的方式用一维字符串指针数组的各元素指向。(3) 在主函数中,要求先输出原序列,换行后再输出排序后的序列。输出时各单词之间用两个空格分隔。方法说明:使用字符串比较函数strcmp() ,需要包含头文件string.h。11.7习题1. 编写一个c 程序,要求定义一个有关日期的结构体类型变量(包括年、月、日),从键盘为该变量中的各成员输入数据,然后再将输入的日期显示输出。2. 建立一个学生情况登记表的表格空间(学生人数最多为20),包括学号、姓名、五门课程的成绩与总分。在主函数中调用以下函数实现指定的功能:(1) 输入 n 个学生的数据(不包括总分)。其中 n( 20)在主函数中从键盘输入。(2) 计算每个学生的总分。(3) 按总分进行排序。(4) 显示输出给定学号学生的所有信息。其中学号在主函数中从键盘输入。3. 编写一个c 程序,根据键盘输入的非负整数值,显示输出颜色的英文名称。4. 编制一个c 程序,定义一个长度为10 的联合体类型数组。 首先从键盘输入一个标志, 标志值为0 时表示输入五分制成绩(整型),标志值为1 时表示输入百分制成绩(单精度实型)。然后从键盘输入10 个成绩存放到数组中。最后输出这些成绩。5. 编写一个c 函数,功能是计算给定链表的长度。6. 编写一个c 函数,功能是逆转给定链表。7. 设有两个有序线性单链表,头指针分别为ah 与 bh。编写一个c 函数,将这两个有序链表合并为一个头指针为ch 的有序链表。8. 设有一个链表,其结点值均为正整数,且按值从大到小链接。编写一个c 函数,将该链表分解为两个链表,其中一个链表中的结点值均为奇数,而另一个链表中的结点值均为 偶数,且这两个链表均按值从小到大链接。9. 设有一个链表,其结点值均为整数,且按绝对值从小到大链接。编写一个c 函数, 将此链表中的结点按值从小到大链接。10. 设有一个链表, 其结点值均为正整数。编写一个c 函数, 反复找出链表中结点值最小的结点。并输出该值,然后将该结点从链表中删除,直到链表空为止。11. 给定学生成绩登记表如表11.4 所示。编写一个c 程序,用冒泡排序对该学生成绩表按成绩( grade)从低到高进行排序。学号 (num)表 11.4学生成绩登记表姓名 (name)成绩 (grade)02lin9203zhang8704zhao7205ma9109zhen8511wang10012li8613xu8316mao7817hao9520lu8221song7622wu88具体要求:(1) 定义一个结构体数组表示学生成绩登记表,其中的每个元素依次存放表11.4 中各学生的情况。结构体类型为struct student int num;char name10; int grade;(2) 在程序中另外定义一个结构体指针数组,在排序前,其中每一个数组元素依次指向学生成绩登记表(为结构体类型数组)中的各学生情况。(3) 在程序中, 首先输出排序前的学生情况,然后输出排序后的结果。输出形式如表11.4所示,但不要表中的框线。(4) 将冒泡排序的功能独立编写成一个函数。方法说明:在实际排序的过程中,并不需要交换学生成绩登记表中的各学生情况,而只需要交换另一指针数组中的各指针。因此, 排序的最后结果,学生成绩登记表中各学生情况之间的存储 顺序并没有改变,而只是按指针数组中各指针元素顺序指向的各学生情况是按成绩有序的。12. 链表基本操作。具体要求:(1) 定义一个结构体数组表示学生成绩登记表,其中的每个元素依次存放表11.4 中各学生的情况。结构体类型为struct student int num;char name10; int grade;(2) 对于表11.4 所示的学生成绩登记表,依次将每个学生的情况作为一个结点插入到链表的链头(即当前插入的结点将成为链表中的第一个结点)。初始时链表为空,即该链表的头指针为空。每个学生情况结点结构的结构体类型为struct stunode int num;char name10; int grade;struct stunode *next;(3) 当所有学生情况都插入到链表后,从链头开始,依次输出链表中的各结点值(即每个学生的情况) 。输出格式如同表11.4 所示,但不要表中的框线。方法说明:为了给每个学生情况的结点p 动态分配存储空间,可以用如下语句:p=(struct stunode *)malloc(sizeof(struct stunode);其中 p 为结构体类型struct stunode 的指针。另外,为了使用函数malloc() ,应该包含头文件stdlib.h 。13. 将表 11.4 所示的学生成绩登记表划分成三个子表,其中子表1 登记的是成绩在90 100 之间的学生情况,子表2 登记的是成绩在80 89 之间的学生情况,子表3 登记的是成绩在 70 79 之间的学生情况。具体要求:(1) 定义一个结构体数组表示学生成绩登记表,其中的每个元素依次存放表11.4 中各学生的情况。结构体类型为struct student int num;char name10; int grade;(2) 划分成的三个子表均采用链表结构,链表中各结点的数据域存放学生情况在原登记 表中的序号(即结构体数组元素的下标),而不是直接存放学生的成绩情况。即各链表结点的结构体类型为struct stunode struct student*data; struct stunode *next;(3) 最后输出原学生成绩登记表以及划分成的三个子表。输出格式如表11.4 所示, 但不要表中的框线。方法说明:划分子表的方法如下:对于表 11.4 中的各学生成绩grade,计算k=10-int(grade/10)其中 int() 表示取整。根据k 值将学生情况插入到相应的子表中:若 k=0 或 1,则插入到子表1 中; 若 k=2 ,则插入到子表2 中;若 k=3 ,则插入到子表3 中。初始时各子表均为空。当需要将一个学生情况插入到某子表时,首先动态申请一个结点(struct stunode 类型),将该学生情况在原表中的序号(元素下标)存放到结点的数据域中; 然后将该结点链接到相应链表的链头。12.4习题1. 编写一个c 程序,首先从键盘输入20 个双精度实数,并写入文本文件fd.dat 中 。然后将写入文件fdata.dat 中的 10 个双精度实数显示输出。2. 编写一个c 程序,从键盘输入一个字符串(输入的字符串以“#”作为结束),将其中的小写字母全部转换成大写字母,并写入到文件upper.txt 中。然后再从该文件中的内容读出并显示输出。3. 编写一个c 程序, 主函数从命令行得到一个文件名,然后调用函数fgets( ) 从文件中读入一字符串存放到字符数组str 中(字符个数最多为80 个)。在主函数中输出字符串与该字符串的长度。fgets 函数的格式为:char *fgets( char *string, int n, file *stream );4. 编写一个c 程序, 将源文件拷贝到目的文件中。两个文件均为文本文件,文件名均由命令行给出,并且源文件名在前,目的文件名在后。5. 设二进制文件student.dat 中存放着学生信息,这些信息由以下结构体描述:struct student long int num; char name10; int age;char sex;char sreciality20; char addr40;请编写一个c 程序,显示输出学号在970101 970135 之间的学生学号num、姓名name、年龄 age 与性别 sex。6. 设有一学生情况登记表如表12.1 所示。表 12.1学生情况登记表学号 (num)姓名 (name)性别 (sex)年龄 (age)成绩 (grade)101zhangm1995.6102wangf1892.4103zhaom1985.7104lim2096.3105gaom1990.2106linm1891.5107maf1798.7108zhenm2190.1109xum1989.5110maof1894.5;.编写一个c 程序,依次实现以下操作:(1) 定义一个结构体类型structstudent charnum7; charname8; charsex3; charage5; chargrade9;(2) 为表 12.1 定义一个结构体类型(struct student) 数组,并进行初始化。(3) 打开一个可读写的新文件stu.dat。(4) 用函数fwrite() 将结构体数组内容写入文件stu.dat 中。(5) 关闭文件stu.dat。(6) 打开可读写文件stu.dat。(7) 从文件stu.dat 中读出各学生情况并输出。输出格式如表12.1 所示,但不要表格框线。(8) 关闭文件stu.dat。7. 将表 12.1 的内容按结构体类型写入文本文件st.dat 中;然后对该文件按成绩从低到高进行冒泡排序,并输出排序结果;最后, 在排序后的文件中用对分查找法查找并输出成绩在 95.0 到 100 分之间的学生情况。具体要求:(1) 在定义的结构体类型中,各成员均为字符数组。即结构体类型的定义如下:structstudent charnum8; charname8; charsex5; charage5; chargrade10;(2) 编写一个对文本文件(其中每一个记录的结构如(1)中定义)按成绩(grade)进行冒泡排序的函数mudisk(fp , n)。其中:fp 为文件类型指针,指向待排序的文件;n 为长整型变量,存放待排序文件中的记录个数(即学生的个数)。(3) 编写一个对按成绩(grade)有序的文件(其中每一个记录的结构如(1) 中定义)进行对分查找的函数nibsrch(fp ,n, a, b, m) 。其中:fp 为文件类型指针,指向给定的有序文件;n 为长整型变量,存放按成绩有序文件中的记录个数(即学生的个数);a 与 b 均为字符串指针,分别指向成绩(gr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论