}
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 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 { FILE ?fp;char ch;