精通C程序设计教程各章习题

更新时间:2023-03-08 05:14:35 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

精通C程序设计教程各章习题

第一章习题

1.1 简述冯·诺依曼体系计算机的硬件结构与“存储程序”的工作原理。 1.2 简述高级语言的编程过程。

1.3 编译程序与连接程序的主要功能是什么?

1.4 常见的程序错误有哪些类型?程序员该如何发现并修正这些错误? 1.5 为什么阅读和分析程序很重要?程序员该怎样阅读和分析程序?

1.6 程序员在编程过种中的主要工作是什么?编程工作对程序员有怎样的要求? 1.7 结构化程序设计的核心思想是什么? 1.8 什么是面向过程编程与面向对象编程?

1.9 按照软件工程的方法,软件“生命期”的全过程是怎样的? 1.10 什么是字符文件?字符文件的存储特点是怎样的? 1.11 C语言的主要特点是什么? 1.12 什么是高级语言的数据类型? 1.13 简述算法的主要特点与性能要求。 1.14 简述算法描述的几种常用方法。 1.15 试说明重视算法描述的意义。

1.16 用程序框图和N-S程序流图两种方法描述例1-15的算法。 1.17 名词解释。

(1)指令 (2)程序 (3)软件 (4)程序语言 (5)算法 (6)软件工程 (7)数据结构 (8)时间复杂度

1.18 采用二进制运算,把以下十进制数化为16位补码并写出内存中字节的存储顺序。 (1) ?1 (2) 27482 (3) ?9547 (4) ?32767 (5) ?27482 1.19 用十进制运算完成1.11题。

1.20 把下列十进制数化为IEEE单精度规格化浮点数,写出内存中字节的存储顺序。

(1) ?180.3 (2) 10000 (3) 0.0001 (4) ?247.75 (5) 0

第二章习题

2.1 什么是L-value?

2.2 C语言是怎样表示逻辑意义的?

2.3 C语言的字符常量与字符串常量有何区别?

2.4 什么是计算转换规则?C语言的计算转换规则是怎样的? 2.5 什么是表达式?

2.6 简述C语言数学表达式的书写方法。 2.7 简述C语言源程序的书写规范。

2.8 为什么说C语言程序是函数组成的程序? 2.9 什么是复合语句?为什么要使用复合语句?

2.8 以下符号序列作为用户标识符正确的是 。 (A)_75_ (B)TurboC (C)main (D)if (E)It (F)max_ (G)_000 (H)08H

2.9 以下符号序列中,合法的C常量有 。

(A)'\\X41' (B)099 (C)'\\x0' (D)0X9h (E)'\\\\n' (F)?.25 (G)1e2.0 (H)\(I)'\\8' (J)?1E?1 (K)'\\' (L)09E05

(M)0X0AaA (N)?15.2000e0 (O)abH (P)0110Lu (Q)1e1f (R)?0.1L (S)80h (T)?0xAUL 2.10 写出以下表达式的求值结果。设int a=3,b= ?2,c=4,d=0; (1) a++; (2) a+b1 (16)b?!a:~d

(17)035+0x10/a%b/b (18)10/3+9%3?(?1)/5 (19)10&6|5&&a (20)10&&6|!b| |c

2.11 若有定义double x=2.5, y=4.7; int a=7;

表达式x+a%3?(int)(x+y)%2/4的值是 。 2.12 若有定义int a=2, b=3; double x=3.5, y=2.5;

表达式(float)(a+b)/2+(int)x%(int)y的值是 。

2.13 若有定义int a=3,b=2,c=0;执行下列表达式,写出变量值和表达式值。

(1)c=a???b??; 则a= , b= , c= , 表达式= (2)c=++a?b; 则a= , b= , c= , 表达式= (3)b=??c?(??b); 则a= , b= , c= , 表达式= 2.14 若a=10, b=7,写出下列表达式的值和变量a的值。

(1)a/=a?a; (2)a?=a; (3)a/=2+3; (4)a%=n%=4; (1) a<<=n++/4 (6)a?=??a, a?=b??, a++; 2.15 写出下列数学表达式对应的C表达式。

??y?? (3)1??tan48?30? (1)?y(a?b) (2)sin?22?2?x?y?422(4)

a?a?yaxa?bba?bzpq(r?1)2?x3?eln(1?x) (5) (6)

(r?1)2?12.16 写出以下程序的输出(请上机验证)。 #include void main()

{ int a=157; unsigned long b=0xa8d5b;char c='a'; double x=30.57; printf(\?08X,%o,%+10d\\n\ printf(\?10lx,%+5lu, lX\\n\ printf(\ printf(\ printf(\?.?f,%+0?d\\n\

}

2.17 如果希望a= ?15, b=38.7, c='A', x=1e?6,写出下面程序的正确输入格式(请上机验证)。 #include \void main()

{int a;float b;char c;double x;

scanf(\ printf(\

}

2.18 下列程序的输入输出语句虽然不存在任何语法问题,但无法正确输入/输出某些变量,请指出程序中的问题并改正。 #include \void main()

{ long a;int b;double x;float y; scanf(\

printf(\,y=%Lg\\n\ }

2.19 输入圆的半径r,编程计算并输出圆的周长和面积。

2.20 输入三角形的三边长a, b, c,编程计算并输出三角形的面积。(注意:输入a, b, c时,应保证三角形两边之和大于第三边)三角形面积计算公式如下:

1 p?(a?b?c),s?p(p?a)(p?b)(p?c)

22.21 购房按揭贷款:设贷款本金为a,贷款期数为n(以月为单位),贷款月利率为p,采用等额本息法还款,问每月还款额是多少?编程输入a,n,p,输出每月还款额。

比如,输入a=100000,n=120,p=0.004,表示本金10万元,贷款期限为10年(120个月,月利率为0.4%。(程序假设月利率在贷款期限内恒定不变)。

提示:首先从数学上分析每月固定还款额x与a,n,p的关系式,然后求解,分析方法提示如下:

设第i个月开始时,还有本金ai,则第i个月结束时,剩余本金即第i+1月开始时的本

金ai+1= ai(1+p)?x。i=1,2,3,…,n

显然,有a1=a,an+1=0。

第三章习题

3.1 C语言的三种循环语句是什么?它们各自有什么特点? 3.2 break、continue语句与goto语句有何区别?

3.3若a=3, b=2, c=1, 则执行下列if语句后,依次写出a、b、c的值。

if (a>b) a=b; if (b>c) b=c; else c=b; c=a;

3.4 执行下列程序后,x和y的值分别是多少。

int x,y;

for (y=1,x=1;y<=50;y++) { if (x>=10) break; if(x%2= =1)

{x+=5; continue;} x?=3; }

3.5 写出以下程序的输出结果。 #include main()

{ int c='A',a=0,k=1;

while((k+=2)<8)

{ putchar(++c);a+=k; }

printf(\return 1; }

3.6 下面程序的循环体共执行了多少次,输出的结果是什么? #include \void main() { int m,n;

m=10;n= ?1; do { m??; n+=5;

if(!(n%3)) printf(\ } while(m>n);

}

3.7 若输入为ABCD?,下面程序的输出是什么? #include void main() { char ch,n;

for(n=0;(ch=getchar())!=10;n++) putchar(ch+32); printf(\

}

3.8 若a, n, i, j, k都是int型变量,且n值大于0。执行下面的程序后,变量a的值是多少?(用n表达变量a的值) a=0;

for(i=1;i

fo(k=1;k<=j;k++) a++;

3.9 假设变量已有正确定义,以下程序能够正确计算p=n!的有 。

(A) for(p=1,k=0;k??<=n;p?=k); (B) p=1;k=n; while(p?=k,? ?k); (C) p=0;do { k=1;p?=k++; } while(k<=n); (D) p=k=1; do p?=k; while(++k>=n); (E) p=0;for(k=1;k<=n;k++) p?=k; (F) for(p=1,k=0;k

3.10 以下程序的功能是输入10个字符,如果输入的是数字字符0,则输出字符?;如果是数字字符1-9,则原样输出;如果输入的是其它字符则不输出,但要求用变量s累加计算它们的ASCII码平方和。全部字符输入结束后,输出s的值。有同学写了一个程序,编译完全正确,但无法得到所要求的结果,请帮助这位同学改正程序中的问题。 #include main()

{ char c,i,s;

for(i=1;i<10;i++); { c=getchar();

if('1'<=c<='9') putchar(c);

if(c='0') putchar('?'); else s=c?c;

printf(\ }

}

3.11 编写一个程序,使它能够将用户输入的四个整数按大小次序排列。 3.12 企业放发的奖金根据利润提成。设企业的利润为I,提成标准如下: I<10万元时,提成10%;

10万元<I≤20万元时,低于10万元部分仍按10%提成,高于10万元部分按7.5%提成; 20万元<I≤40万元时,低于20万元部分按前面方法提成,高于20万元部分按5%提成; 40万元<I≤60万元时,低于40万元部分按前面方法提成,高于40万元部分按3%提成; 60万元<I≤100万元时,低于60万部分按前面方法提成,高于60万部分按1.5%提成; 100万元<I时,低于100万元部分按前面方法提成,高于100万元部分按1%提成。 编程输入利润I,计算输出提成金额。

3.13 用switch语句和if语句两种方法描述以下计算要求:

2

t 0≤t<1

2

y = t?1 1≤t<2

t?2t+1 2≤t<3

3.14 编程输出一个周期的余弦函数cosx的值,要求每隔?/20输出一个函数值。 3.15 编程输出以下计算结果。

0.02 0.22 0.42 0.62 0.82 1.02 1.22 1.42 1.62 1.82 1.92 2.02 3.16 输入一个实数a和一个整数m,不使用系统库函数,计算并输出am。 比如:输入a值为3,m值为3,则输出27.0000; 输入a值为?2,m值为?3,则输出?0.1250。 3.17 编程求出一个长整数的十进制位数。 比如,输入35076,输出为5; 输入为?24,输出为2。

3.18 输入一个正长整数,按相反次序输出该整数的各位数字。 比如,输入为35076,输出是67053。

3.19编写一个决定学生成绩的程序。这个程序将读入一个学生的三次考试成绩(0-100),然后计算其平均值,并根据这个平均值决定学生的总成绩(用字母A, B, C, D, F来表示)。字母成绩按如下规定来确定:

A 平均成绩在90或90分以上 B 平均成绩在80到89分 C 平均成绩在70到79分 D 平均成绩在60到69分 F 平均成绩在60分以下

程序在显示了一个学生的字母成绩后,将继续对下一个学生的成绩进行处理,直到用户输入的学生成绩为负数时停止。

3.20 编程输入两个日期y1,m1,d1和y2,m2,d2,计算并输出这两个日期相距的天数。

4.1 输入若干整数,直到输入0时停止,统计并输出奇数的数目和偶数的数目。 4.2 输入10个实数,输出这10个数的平均值。 4.3 计算s=

2

?k!?0!?1!?2!?????(n?1)!?n!。要求n值由用户输入。

k?0n4.4 根据本章打印杨辉三角形例题中组合数的递推计算方法计算组合数Cm要求输入n、mn,值,输出组合数。程序中应对输入的n, m有效性进行检查。

x3x5x7??????,要求最后一项绝对值小于10?6时停止计4.5 输入x值,计算sin(x)?x?3!5!7!算。 4.6 用公式

?2?22442n2n计算时取1000个因子。 ?????????????计算?的近似值,

13352n?12n?1?2x2?2?4x42?4?6x51?????????的前n?1项和。要求x和n2222333?53?5?71?x(1?x)(1?x)??x4.7 计算

1?x2值由键盘输入。

x2x3x4??????。要求计算到最一项绝对值小于10?64.8 输入x值(|x|<1),计算s?x?234时停止。

4.9 一个小球从高度为h米处自由落下,每次落地后反弹回原高度的一半再落下。求小球第k次落地时,总共走过了多少米?第k次落地反弹后,可以反弹到多高?

4.10 输入自然数n,输出其和等于n的所有不增的正整数和式。如n=4,程序将输出: 4=4 4=3+1 4=2+2 4=2+1+1 4=1+1+1+1

要求程序完成一次输出后,继续提示用户输入n值,直到用户输入0或负数时才停止运行。

4.11 编写程序,输入一个自然数n,将n分解成质因子连乘形式。要求程序完成一次输出后,继续提示用户输入自然数,只有当输入的自然数是0或负数时,程序才停止运行。

4.12 “有物不知何数,三三数剩二,五五数剩三,七七数剩二”问物有多少?(引自《孙子算经》)编程输出1000以内所有的解。

4.13 韩信点兵:有兵一队,五伍剩一,六伍剩五,七伍剩四,十一伍剩十,问兵几何? 4.14 有30个男女小孩同在一家饭馆进餐,共花了50元,其中每男宾3元,女宾2元,小孩1元。问男、女、小孩各多少?

4.15 将一张面值100元的人民币兑换为5元、2元、1元和5角的零钞,要求零钞总数不超过40张且每种至少1张,求所有兑换方案。 4.16 有一个算式缺少了四个数字(如下所示),请编程找出这四个数字。 1?0566?(475??3?49)?1?6=416354

4.17 打印如下图形。要求把图形放到屏幕中央并且打印行数n(n=1, 2, … , 9)由用户输入。

1 1 2 1 1 2 3 2 1 1 2 3 4 3 2 1 1 2 3 4 5 4 3 2 1

4.18 打印如下图形。打印行数n由有户输入。要求把图形放在屏幕中央。

a a b a a b c b a a b c d c b a

a b c d e d c b a

4.19 打印如下图形。要求总行数n由键盘输入。注意:n必须是奇数。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

4.20 打印如下图形。要求输入最大的字母来控制打印行数。比如,下图应该输入字母D。 A B-B C―――C D―――――D C―――C

B-B A

4.21 打印如下图形。要求打印行数n由用户输入。 1 2 4 7 11 2 3 5 8 12 4 5 7 10 14 7 8 10 13 17 11 12 14 17 21

4.22 自拟格式,打印九九乘法表。

4.23 p和q都是素数,若q=p?2,那么p, q对被称为双素数。 例如,3, 5就是双素数。

编程求1000以内所有的双素数。

4.24 如果一个自然数的所有因子之和等于该数本身,称这个数为“完数”。编程输出1000以内的全部完数。要求输出格式如下: 28=1+2+4+7+14

4.25 输入若干个自然数,直到输入0时停止,求所有自然数的最大公约数与最小公倍数。 4.26 求2-10000中的守形数。所谓守形数,是指某数平方的低位就是该数本身。 比如,52=25, 5是25的低位,因此5就是守形数;

762=5776,76是5776的低位,因此76也是守形数。

要求输出格式形如:76:76?76=5776 4.27 两个自然数a, b(a?b),若a的因子和等于b,b的因子和等于a,称a, b为亲密数对,求1000以内

第五章习题

5.1 建立一个N元实型数组,输出最大值与最小值元素的下标。

5.2 编写程序,输入N个学生的成绩并用一维数组保存。计算并输出平均成绩、最高分以及最低分。

5.3 编程建立并输出一个N阶单位矩阵。

5.4 建立一个整型一维数组,然后重排数组元素,使得所有奇数排在偶数前面。

5.5 用一维数组存储素数,求1000以内的素数。为了提高算法效率,在判断整数m是否是素数时,只需要用已经找到并存入数组中的素数去试除m。

5.6 输入最多不超过15个正整数,求这些整数的最大公约数与最小公倍数。要求用数组求解。

5.7 写一个程序,输入一个N阶实数方阵,实现矩阵转置并输出。

5.8 在屏幕上打印出以下杨辉三角形,要求打印出的行数n由用户输入。

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1 ?

(用二维数组求解)

5.9 删除数组中小于0的所有元素,要求不另辟数组空间实现算法。

比如:数组原来为:?5 ?2 9 3 ?1 ?10 ?7 12 6 ?3 则删除小于0的元素后,数组变为9 3 12 6

5.10 输出一个二维数组中的鞍点(i0, j0)。鞍点满足两个条件,一是在i0行它是最大元,二是在j0列它是最小元。如果没有鞍点,输出提示信息。 5.11 编程判断一个N阶方阵是否为对称矩阵。

5.12 以下程序的功能是重新排列数组a[N]的元素,使相等元素放在一起,并且保持它们在数组中第一次出现的相对次序。例如:

重排前:4, 3, 4, 2, 4, 5, 2, 4, 3, 1, 5, 4 重排后:4, 4, 4, 4, 4, 3, 3, 2, 2, 5, 5, 1

程序采用的算法是先删去重复元素,并统计各不同元素出现的次数,再按照各元素重复次数写回到数组a中。 #include #define N 20 void main()

{ int a[N],b[N],c[N],i,j,k,t; for(j=0;j

{ b[j]=c[j]=1; scanf(\}

for(i=0;i

for(j=i+1;j

t=N?1;

for(i=k;i>=0;i??)

for(j=1;j ;j++) =a[i]; for(j=0;j

第六章习题

6.1 指针的三个属性是什么?

6.2 指出下面程序中的指针常量标识符,并说明含义。 #include #include void main()

{ double x,y;int a[]={0,1,2,3 };int ?p=NULL;

scanf(\x=fabs(y);p=&a[1]; printf(\ }

6.3 若有定义float a[7],?p=a+3;写出以下表达式代表的数组元素。

(1)?a; (2)?p; (3)?(a+2); (4)?(p?2); (5)?(p?2); (6)p[?1]; (7)p[1]; (8)p[?3];

6.4 若有定义long a[10],i,?p;以下程序能够正确输入数组元素的是 。 (A) i=0;while(i<10) scanf(\(B) for(i=0,p=a;i<10;scanf(\(C) for(p=a;p<=a+9;p++) scanf(\?p); (D) p=a;do scanf(\?a>=10);

6.5 以下程序能够安全正确地建立字符串的是 。

(A) main() { char s[41];scanf(\(B) main() { char s[41];scanf(\(C) main() { char ?s;scanf(\(D) main() { char s[41],?p=s;scanf(\?p);

6.6 定义三个变量用于存储读入的三个整数,另定义三个指向整型量的指针变量,并利用它们实现将读入的三个整数按值从小到大顺序输出。

6.7 利用指针编写一个程序,使它能够从键盘读入4个数,并找出它们的平均值、最大值和最小值,然后将结果显示到屏幕上。要求不能使用数组。

6.8 编写一个程序,要求当用户输入两个字符串后,程序将这两个字符串连接起来输出。 6.9 由用户输入一串字符,将其中大写字母变成小写字母,小写字母变成大写字母,并按倒序输出。要求用下标和指针两种方法求解。

6.10 编写一个程序,使它能够统计用户输入的字符串中的数字字符数目。 6.11 编写程序,实现N元数组元素循环左移m次。

比如:N=8,输入8个元素为1 2 3 4 5 6 7 8 则循环左移三次的输出结果是 4 5 6 7 8 1 2 3

(要求用下标和指针两种方法求解)

6.12 编写一个程序,使它能够模拟摩斯译码,即 将字母ABCDEFGHIJKLMNOPQRSTUVWXYZ 翻译成ZYXWVUTSRQPONMLKJIHGFEDCBA 例如,输入如下密码:

NZWZN,R ZN ZWZN 将译码为:

MADAM,I AM ADAM

该程序要求用户从键盘输入一个按照以上密码规定编写的字符串,然后对其进行译码并输出结果。

6.13 编写一个程序,输入一个字符串,删除字符串中所有的空格后,输出字符串。要求不另辟串存储空间且输出时不能使用循环语句。

6.14 输入学生人数n以及n个学生的成绩,将成绩存储于n元动态数组。输出其中的最高分、最低分以及平均成绩。

6.15 定义两个大小相同的矩阵a,b,输入矩阵a的所有元素,将矩阵a复制到矩阵b,然后输出矩阵b。

6.16 输入两个字符串s1和s2,以及一个正整数n,将字符串s2插入到s1的第n个字符之后,输出插入字符串s2之后字符串s1。

其中,当n=0时,表示将串s2插入到s1有效字符之前; 当n=串s1长度时,将s2插入到s1有效字符之后。 要求不另辟字符串存储空间,并且对能否插入应该作判断,即

}

9.4 下列程序的运行结果是 。

main()

{ char a[2][5]={ \

char ?p=a[0],?s=a[1]; while(?p) p++;

while(?s) ?p++=?s++; printf(\ }

9.5 若有定义int a[4][5],(?p)[5]=a;则以下正确而安全访问数组元素的表达式是 。 (A)??p; (B)?(?(p+4)+1) (C)??(a+1)+1 (D)?(?a+1) (E)?p[0]+2 (F)(?(p+3))[4] (G)a[4][3] (H)?(a[3]+1) 9.6 若有数组定义int a[3][4];以及函数原型void f(int (?a)[4]);

以下函数调用正确的是 。 (A) f(a); (B) f(a[0][0]); (C)f(a[0]); (D)f(a+2); (E)f(&a[1]); (F)f(&a[0][0]); (G)f(?a); (H)f(?a[0]); 9.7 输入行数和列数建立动态二维数组。

方法是定义二级指针变量T ??p;

若矩阵有m行n列,则先用动态内存分配函数建立m元指针数组T ?p[m]; 然后为每个指针p[0]~p[m]分配n元T型数组空间。

则对象p[i][j]就可以当作二维数组的i行j列元素来使用。

用上述方法建立一个int型二维数组并输入数据,然后调整二维数组各行,使得行的顺序按各行元素之和由大到小排列。输出调整后的矩阵。

提示:i1行和i2行交换时,只需交换行首指针p[i1]和p[i2]。 9.8 用字符指针数组对n个字符串由大到小排序并输出。

9.9 输入数据,建立4行6列实型矩阵。写一个函数,用向量指针作为形参,传入该二维数组,函数中求出矩阵中负数最多的行,并返回指向该行的向量指针。如果矩阵中没有任何一行有负数,函数返回空指针NULL。主程序中输出返回的矩阵行中的各元素。

9.10 定义一个3元函数指针数组,它的第一个元素指向求三个实数最大值函数,它的第二个元素指向求三个实数最小值函数,它的第三个元素指向求三个实数平均值函数。输入三个实数,对该函数指针数组进行循环,调用这三个函数,输出三个函数调用的返回值。

9.11 用带参数的main函数输入三个字符串参数,将三个字符串按由大到小顺序输出。当输入的字符串少于3个时,应该显示提示信息。

第十章习题

10.1 什么是结构?结构与数组有什么不同?试举例说明。

10.2 enum color{ red,green,yellow=5,white,black }定义了一个枚举类型编译程序为值表中各标识符分配的枚举值依次为多少?

10.3 试指出如下形式的typedef类型定义和#define宏定义的区别: typedef int INTEGER; #define INTEGER int

10.4 下面程序的运行结果是 。

#include

main()

{ struct equip { unsigned a:2; unsigned b:3; unsigned c:1; unsigned d:4; unsigned e:3; unsigned :3;

}; union

{ struct equip eq; unsigned i; } abc; abc.i=255;

printf(“%d\\n”,abc.eq.d+1); }

10.5 下面程序的运行结果是 。

main()

{ union zj { int a;

char ch[2]; } au; au.a=298;

printf(“%d\\n%d\\n”,au.ch[0],au.ch[1]); }

10.6 试定义一个结构类型,该结构表示一张扑克牌。结构包含两个成分:牌的面值和牌的花色。利用该结构类型定义表示一副(52张)扑克牌的变量;然后写出为该变量置值的C代码。

10.7 试编写输入、输出学生信息的函数。设学生信息包括学号、姓名和五门课的成绩。 10.8 在习题10.7的基础上,编写输入几个学生信息,并以学生成绩总分从高到低顺序输出学生信息。

10.9 设某图形处理程序只考虑点、直线、圆三种基本图形。对于点,给出点的坐标;对于直线,给出方程ax+by+c=0的三个系数a,b,c;对于圆,给出圆心坐标和半径。试定义图形几何形状类型。并编写求两点距离,两直线交点和求两圆交线的函数。

10.10 利用结构编写一个程序,使它能够计算任意两天之间的天数。例如,计算出1995年2月18日到1996年5月5日之间的天数。程序应该首先要求用户从键盘输入开始日期以及结束日期,然后显示其间的天数并继续运行,直到用户输入某个特殊键停止程序运行为止。程序中需要判断闰年。 10.11 编写一个函数,对一个32位的二进制数取出它的偶数位(即从左边起第2,4,6,??,32位)

10.12 设计一个函数用来实现左右循环移位。调用方法为: move(value, n)

其中value为要循环位移的数,n为位移的位数。如n<0表示为左移;n>0为右移。如n=4,表示右移4位;n=-3,表示左移3位。

10.13 编写一个程序,该程序要求用户输入职工编号和完成产品数量,允许同一职工有多次输入,由程序完成累计。程序按完成数量由多到少的名次排序,输出名次、同一名次的职工人数及他们的编号(编号由小到大顺序输出)。要求程序用有序链表存储数据信息。 10.14 输入两个整数m和n(m

10.15 设计一个模拟社会关系的数据结构。每个人的信息用结构表示,包含姓名、性别和指向父亲、母亲、配偶、子女的指针(设只限两个子女)。试编写以下函数:

(1) 增加一个新人的函数;

(2) 建立人与人之间关系的函数:父-子、母-子、配偶等;

(3) 检查某两人之间关系的函数:父-子、母-子、配偶、兄弟、兄妹、堂兄妹、

表兄妹等。

10.16 编写三个链表复制函数:第一个复制出与已知链表完全相同的链表;第二个复制出与已知链表的链接关系颠倒的链表;第三个复制出一个有序链表。 10.17 编写一个递归函数,实现输入正整数序列(小于0结束),生成一个按输入顺序链接的链表。

第十一章习题

11.1 什么是流文件?

11.2 什么是缓冲文件系统与非缓冲文件系统? 11.3 文本文件与二进制文件操作有哪些区别?

11.4 编写程序,打印如下图形到屏幕上和字符文件A1.TXT中。打印行数n由键盘输入。 * * * *

* * * * * * * * * * * *

11.5编写程序,打印杨辉三角形到屏幕上和字符文件A2.TXT中。要求打印行数n由键盘输入。

11.6 编写程序,打印九九乘法表到屏幕上和正文文件A3.TXT中。

11.7 编程输入一个字符文件名,统计文件中的英文字母个数,数字字符的个数以及其它字符的个数,最后显示统计结果。

11.8 输入一个文件名及一个字符串,在文件中查找是否包含该字符串内容,显示查找结果。 提示:使用子串查找函数strstr(s,t);

11.9 用字符文件B1.TXT建立6行?8列实型矩阵A,用字符文件B2.TXT建立8行?6列实型矩阵B。编写程序,实现矩阵乘法C=A?B,将结果矩阵C存入字符文件B3.TXT。

11.10 编写程序,求出10000以内所有素数并写入字符文件prime.txt。要求文件中每输出十个素数换一行。

11.11 显示一个菜单,包括以下功能: 1――删除字符文件中的第i行

(输入行号i和文件名然后实现操作) 2――在字符文件中插入一行字符

(输入行号i、一行字符以及文件名,将输入的字符行插入到文件第i行之后) 3――显示字符文件内容到屏幕上

(输入文件名,则显示字符文件内容)

4――退出

此题可分为三个独立的小题分别求解。

插入字符行的算法有两种:一种是复制临时文件的方法;另一种是采用r+方式,首先计算出插入字符行所需要增加的字节数,然后从文件结尾开始向后复制数据,为插入字符行留出空位。

11.12 编写程序输入一个字符文件名,将字符文件中的大写英文字母变成小写。要求不能复制临时文件。

11.13 用命令行参数向main函数提供两个文件名,比较两个文件是否完全一样,输出比较结论。

11.14 输入两个字符文件名,将第二个字符文件的内容拷贝到第一个字符文件结尾,即连接两个字符文件为一个文件。程序运行结束后,察看第一个字符文件的内容,以检验程序的正确性。

11.15 文件异或加密和解密。加密:输入被加密的源文件名和加密后的目的文件名,输入一个字符K作为密钥,依次读出源文件的每一个字节并与字符K作异或运算后写入目的文件,则目的文件称为密文。解密:用同样的密钥K去异或密文的每一个字节,就可以恢复原文件。编写程序实现文件的异或加密和解密。

11.16 建立学生结构体,包括学号、姓名、性别、生日、成绩信息。用字符文件向程序提供全班学生的数据。建立如下菜单功能:

1――输入学号显示学生姓名、性别、年龄、成绩和名次

2――将所有学生数据按成绩由高到低顺序存入另一个字符文件 3――退出

11.17 用字符文件提供数据建立一个整型矩阵,将该矩阵写入一个二进制文件。用另一个程序读出二进制文件中的矩阵,并把矩阵显示到屏幕上。

11.18 编写程序P1,输入实数的个数n和n个实数,建立由大到小排序的实数二进制文件。另外编写一个程序P2,输入一个实数二进制文件名和一个字符文件名,读出二进制文件中的所有实数并顺序写入一个字符文件。

11.19 用11.18题程序P1建立两个由大到小排序的实数文件A.DAT和B.DAT,编程将两个实数文件合并成一个新的实数文件C.DAT,要求C.DAT中实数保持由大到小的顺序。为了观察程序结果,用11.18题的P2程序将C.DAT的内容转存入一个字符文件。 11.20 一个管理通信录的程序设有以下功能:

·插入新的通信记录; ·查找某人的通信记录; ·删除某人的通信记录; ·浏览通信录; ·结束程序运行。

设每条通信记录包含以下内容:

·姓名 ·地址 ·邮政编码 ·电话号码

并设通信录全部以字符形式存于文本文件中,每四个数据项构成一行。

程序启动后,自动从指定的文件中读取通信录信息;程序运行结束后,又自动将内存中修改过的通信录信息保存到文件中。为了查找、插入、删除等操作的方便,程序内部以双向链表形式组织通信录信息。

设启动程序的命令行可带通信录文件参数。如启动时未给出文件名参数,则程序首先提示用户输入通信录文件名。

11.21 建立某航班的乘客定票链表。该链表的每个结点包括乘客名和定票张数,且链表结点按乘客名字的字典顺序排列。第一个结点是附加头结点,它的乘客名为空串,定票张数为该航班已定票张数(开始设置为0)。当每输入一个乘客名及定票张数时,系统应首先检查已定票张数加新定票张数是否超过该航班允许定票张数(例如200),若超出只能定较少的张数或不能定。如果是已定票的乘客,则追加定票。如果是新定票的乘客,则建立新结点并正确插入结点。如果输入定票张数为负数,表示退票。退票时,退票张数不允许超过已定票数,如果退票后该乘客已定票张数为0,则应该删除该结点。每天工作结束时通过输入一个特殊的名字,比如XXXX,使程序结束。程序结束时将链表所有数据保存到正文文件中。第二天上班时,启动程序,程序从头天保存数据的正文文件中读出数据并恢复链表,从而开始新的一天定票工作。

11.22 下面程序的功能是复制文件,两个文件名在命令行参数中给出,请填空。 #include #include

main( int argc, )

{ FILE ?f1,?f2;char ch; if ( argc< ) { printf(\

if ((f1=fopen(argv[1], \ { printf(\ ch=fgetc(f1);

while( ) { fputc( );ch=fgetc(f1); } fclose(f1); fclose(f2); }

11.23 以下程序的功能是统计字符文件a.txt中有多少个空格,请填空。 #include \#include \main()

{ FILE ?fp;char ch;int n= ; if(!(fp=fopen(\ ))) { printf(\while(1)

{ ch=fgetc(fp);if( ) break; if( ) n++; }

printf(\fclose(fp); }

11.24 分析以下程序的功能。 #include void main()

{ FILE ?fp;char ch;

fp=fopen(\

while((ch=getchar())!='\\n') fputc(ch,fp); fclose(fp); }

11.25 若向磁盘上已有的字符文件添加字符(在文件尾插入字符),可以选用的文件操作方式串是 。

(A)\ (B)\

第十二章习题

12.1 用动态链表求解约瑟夫问题。

31?x12.2 用辛普森方法求积分dx。

0.5ex?e?x??12.3 用辛普森方法求积分(1?sinx)dx。

0112.4 用二分法和截弦法求方程x2?4x?1=0的根。 12.5 用二分法求超越方程tanx?kx=0的5个正根。

12.6 用二分法、牛顿法和截弦法求方程x3?2x2+4x+1=0在x=0附近的一个实根。 12.7 用牛顿法求方程x3?2x?5=0在x=2附近的一个实根。 12.8 用高斯消元法和赛德尔迭代法求解下列方程组。

?0.7x1+0.2x2?0.1x3?0.2x4=0.2 0.2x1?0.8x2?0.3x3?0.1x4= ?0.9 0.1x1?0.2x2?0.9x3?0.2x4= ?2.2

0.3x1?0.2x2?0.2x3?0.8x4= ?2.7

赛德尔迭代法的初始解可设为全0。

12.9 不设堆栈,编写求解八皇后问题的非递归程序。

12.10 传教士与吃人生番:三个传教士要同三个吃人生番过河,却只有一条小船,每次至多乘两人。在穿梭运载过程中,无论在此岸还是彼岸,只要生番多于教士,后者就被吃掉,试为传教士设计一个安全的渡河方案。

12.11 跳马(骑士巡游)问题:在一个5?5格棋盘上,从某个格子出发,按日字跳马,要求不重复地跳经所有方格。求出符合要求的所有跳马方案。 12.12 打印m阶魔方矩阵。(m为奇数)

魔方矩阵是这样一个方阵,它用1,2,…,m2共m2个数填满每个位置,使行、列、对角线元素之和均相等。 比如:m=3时,有 8 1 6 3 5 7 4 9 2

各行、列、对角元素元素之和都等于15。

12.13 编写程序,产生10万个标准正态分布随机数并存于字符文件。用另外一个程序统计文件中的随机数概率。统计的方法是

P{X

小于x的随机数的个数

100000其中x可以从?3开始,每隔0.1、0.2或0.3递增,直到x=3时停止。 统计结果也用字符文件保存,并与概率表中的理论值比较。

12.14 编写程序,产生10万个泊松分布随机数并存于字符文件。用另外一个程序统计文件中的随机数概率。统计的方法是

等于k的随机数的个数

100000k可取0,1,2,3…,一直到3?附近。统计结果也用字符文件保存。对比理论值与统计值。 为了减少计算量,?不要取太大,一般取3~10。

12.15 假设有一个共100行的文本文件,其每行内容为一道试题。编写一个程序,使它能够随机产生有30道考题的试卷。将随机产生的试卷存为一个文本文件,并在文件开始处加入适当的试卷标题。

12.16 建立一个班级学生成绩管理系统,要求人数不低于25人,课程成绩不少于5门课。程序功能自拟。学生成绩可以用正态分布随机数产生。比如,课程A学生成绩近似符合均值为70,方差为25的正态分布。产生的在成绩如果低于0分则作为0分处理,如果高于100分,则作为100分处理。

P{N=k} =

本文来源:https://www.bwwdw.com/article/9rb.html

Top