(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)从低到高进行排序。
表11.4 学生成绩登记表
学号(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) 定义一个结构体数组表示学生成绩登记表,其中的每个元素依次存放表11.4中各学生的情况。 结构体类型为 struct student { intnum;
char name[10]; int grade; };
(2) 在程序中另外定义一个结构体指针数组,在排序前,其中每一个数组元素依次指向学生成绩登记表(为结构体类型数组)中的各学生情况。 (3) 在程序中,首先输出排序前的学生情况,然后输出排序后的结果。输出形式如表11.4所示,但不要表中的框线。
(4) 将冒泡排序的功能独立编写成一个函数。 方法说明:
在实际排序的过程中,并不需要交换学生成绩登记表中的各学生情况,而只需要交换另一指针数组中的各指针。因此,排序的最后结果,学生成绩登记表中各学生情况之间的存储顺序并没有改变,而只是按指针数组中各指针元素顺序指向的各学生情况是按成绩有序的。 12. 链表基本操作。 具体要求:
(1) 定义一个结构体数组表示学生成绩登记表,其中的每个元素依次存放表11.4中各学生的情况。 结构体类型为 struct student { intnum;
char name[10]; int grade; };
(2) 对于表11.4所示的学生成绩登记表,依次将每个学生的情况作为一个结点插入到链表的链头(即当前插入的结点将成为链表中的第一个结点)。初始时链表为空,即该链表的头指针为空。
每个学生情况结点结构的结构体类型为 structstunode
{ intnum;
char name[10]; int grade;
structstunode *next; };
(3) 当所有学生情况都插入到链表后,从链头开始,依次输出链表中的各结点值(即每个学生的情况)。输出格式如同表11.4所示,但不要表中的框线。 方法说明:
为了给每个学生情况的结点p动态分配存储空间,可以用如下语句: p=(structstunode *)malloc(sizeof(structstunode)); 其中p为结构体类型structstunode的指针。
另外,为了使用函数malloc(),应该包含头文件stdlib.h。
13. 将表11.4所示的学生成绩登记表划分成三个子表,其中子表1登记的是成绩在90~100之间的学生情况,子表2登记的是成绩在80~89之间的学生情况,子表3登记的是成绩在70~79之间的学生情况。 具体要求:
(1) 定义一个结构体数组表示学生成绩登记表,其中的每个元素依次存放表11.4中各学生的情况。 结构体类型为 struct student { intnum;
char name[10]; int grade; };
(2) 划分成的三个子表均采用链表结构,链表中各结点的数据域存放学生情况在原登记表中的序号(即结构体数组元素的下标),而不是直接存放学生的成绩情况。即各链表结点的结构体类型为 structstunode
{ struct student *data; structstunode *next; };
(3) 最后输出原学生成绩登记表以及划分成的三个子表。输出格式如表11.4所示,但不要表中的框线。 方法说明:
划分子表的方法如下:
对于表11.4中的各学生成绩grade,计算 k=10-int(grade/10)
其中int()表示取整。根据k值将学生情况插入到相应的子表中: 若k=0或1,则插入到子表1中; 若k=2,则插入到子表2中; 若k=3,则插入到子表3中。
初始时各子表均为空。当需要将一个学生情况插入到某子表时,首先动态申请一个结点(structstunode类型),将该学生情况在原表中的序号(元素下标)存放到结点的数据域中;然后将该结点链接到相应链表的链头。
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 { longintnum; char name[10]; int age; char sex;
charsreciality[20]; charaddr[40]; };
请编写一个C程序,显示输出学号在970101~970135之间的学生学号num、姓名name、年龄age与性别sex。
6.设有一学生情况登记表如表12.1所示。
表12.1 学生情况登记表
学号(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 89.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) 打开一个可读写的新文件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) 在定义的结构体类型中,各成员均为字符数组。即结构体类型的定义如下: struct student { charnum[8]; char name[8]; char sex[5]; char age[5]; char grade[10]; };
(2) 编写一个对文本文件(其中每一个记录的结构如(1)中定义)按成绩(grade)进行冒泡排序的函数mudisk(fp,n)。其中:
fp为文件类型指针,指向待排序的文件;
n为长整型变量,存放待排序文件中的记录个数(即学生的个数)。
(3) 编写一个对按成绩(grade)有序的文件(其中每一个记录的结构如(1)中定义)进行对分查找的函数nibsrch(fp,n,a,b,m)。其中: fp为文件类型指针,指向给定的有序文件;
n为长整型变量,存放按成绩有序文件中的记录个数(即学生的个数);
a与b均为字符串指针,分别指向成绩(grade作为字符串)值的下限与上限(即查找成绩在a到b之间的学生); m为整型变量指针,该指针指向的变量返回成绩在a到b内的第一个记录号(即数组元素下标)。
(4) 在主函数外定义结构体类型,且主函数放在所有函数的前面。 (5) 在主函数中依次完成以下操作:
①为表12.1定义一个结构体类型(struct student)数组,并进行初始化。 ②打开可读写的新文本文件st.dat。
③使用函数fwrite()将结构体数组内容写入文件st.dat中。