程序设计基础习题 下载本文

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

k=&p; z=*p; p=p+1; z=z + **k; printf(\ }

输出结果为()。 (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(\ }

输出结果为()。

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进行初始化,并显示输出矩阵A、B与乘积矩阵C。

7. 编写一个C函数,将一个字符串连接到另一个字符串的后面。

8. 编写一个C函数,将两个有序字符串(其中字符按ASCII码从小到大排列)合并到另一个有序字符串中,要求合并后的字符串仍是有序的。

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

10. 编写一个C函数intstr_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的指数为

w=u+jv=ez=ex+jy

=ex(cos(y)+jsin(y)) 即u=excos(y),v=exsin(y)。 (2) 复数z的对数为

w=u+jv=ln(z)=ln(x+jy) =lnx2?y2+jArctg(y/x) 即u=lnx2?y2,v=Arctg(y/x)。

(3) 复数z的正弦为

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

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

=sin(x)(ey+e-y)/2+jcos(x)(ey-e-y)/2 即u=sin(x)(ey+e-y)/2,v=cos(x)(ey-e-y)/2。 (4) 复数z的余弦为

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

=cos(x)(ey+e-y)/2-jsin(x)(ey-e-y)/2 即u=cos(x)(ey+e-y)/2,v=-sin(x)(ey-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)从低到高进行排序。

表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