键盘输入)构成的单链表。
(2)查找指定职工工号的结点,若找到,打印其姓名和应发工资。 (3)统计链表中应发工资>y的结点的个数,并对该单链表进行复制。 【编程提示】
定义链表中记录结点的结构为:
struct node
{ char no[12];/*职工工号*/ char name[40];/*姓名*/
float yfgz;/*应发工资*/
struct node *link;/*指向下一结点的指针*/
}
按照工号查找结点,可从头结点开始循序查找,比较结点可用字符串比较函数strcmp()来实现。单独编写查找函数,进行结点统计时可进行调用。复制单链表时从链表头开始循环复制,直至链表尾。
第四组
1. 满足特异条件的数列
输入m和n(20>=m>=n>0)求出满足以下方程的正整数数列 i1,i2,...,in,使得:i1+i2+...+in=m,且i1>=i2...>=in。例如:当n=4, m=8时,将得到如下5 个数列:
5 1 1 1 4 2 1 1 3 3 1 1 3 2 2 1 2 2 2 2 使用数组方法编程。
【编程提示】
将原题抽象为:将m分解为n个整数,且n个整数的和为m,i1>=i2>=...>=in。题目中有i1>=i2>=.....>=in,可先确定最右边in元素的值为1,然后按照条件使前一个元素的值一定大于等于当前元素的值,不断地向前推来解决问题。
2. 分数四则运算
用函数方法对输入的两个分数进行+、-、*、/四则运算,输出分数结果。要求:
(1)用函数对输入的数据进行计算,得到y/x (2)用函数对y/x进行化简,并输出结果 【编程提示】
对分数b/a与d/c,不管哪一种运算,其运算结果均为y/x形式。对结果y/x进行化简,约去分子分母的公因数:试用i(i=1,...,y)对y,x进行试商,若能同时整除y,x,则y,x同时约去公因数i,最后打印约简的分数。 3. 约瑟夫问题
这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。问怎样排法,才能使每次投入大海的都是非教徒。
【编程提示】 题目中30个人围成一圈,用一个循环的链来表示。可以使用结构数组来构成一个循环链。定义链表中记录结点的结构为:
struct node
{ struct node *nextp; /*指向下一个人的指针(下一个人的数组下标)*/ int no_out; /*是否被扔下海的标记。1:没有被扔下海。0:已被扔下海*/
}
结构中有两个成员,其一为指向下一个人的指针,以构成环形的链;其二为该人是否被扔下海的标记,为1表示还在船上。从第一个人开始对还未扔下海的人进行计数,每数到9时,将结构中的标记改为0,表示该人已被扔下海了。这样循环计数直到有15个人被扔下海为止。
第五组
1. 数制转换
(1)将十进制整数转换为P进制数
(2)将十进制小数转换为P进制数 使用数组方法编写程序。 【编程提示】
十进制整数转换为P进制,反复除P取余,直到商为零时停止。输出结果时第一个余数最后打印输出,将每次的余数c赋值给s[m]。设置字符数组r[16],当s[k]>9时,输出相应的字符r[s[k]]。十进制小数转换为P进制方法与此类似。 2. 合数世纪
一个世纪的100个年号全为合数(即不存在一个素数),该世纪称为合数世纪。使用循环方法编程求出最早的合数世纪。
【编程提示】 可先约定一个世纪区间,如[21,20000]。设置a为区间变量,b为a世纪的50个奇数年号(偶数均为合数)。用变量s统计50个奇数中合数个数,若为50,则打印a后退出循环。 3. 教师工作量
使用单链表建立一个简易教师工作量表,要求:
(1)每个结点包含职工工号、姓名、工作量等,建立n个结点(结点数据域的值由键盘输入)构成的单链表。
(2)查找工作量>x的结点,打印其职工工号、姓名和工作量。
(3)从链表的第i个结点开始连删len个结点,若不够len个结点,则从第i个结点开始删到表尾。
【编程提示】
定义链表中记录结点的结构为:
struct node
{ char no[12];/*职工工号*/ char name[40];/*姓名*/
float workload;/*工作量*/
struct node *link;/*指向下一结点的指针*/
}
编写查找函数,首先输入要查找记录的工作量,然后顺序查找直到尾结点,如果没找到,输出没找到信息;否则显示找到的记录。删除某个结点时,首先要找到第i个结点,然后查找后面是否有len个长度的结点,如果不够则直接将第i-1个结点变为尾结点,释放之后的所有结点;如果够则将第i-1个结点的指针指向其后len+1位置的结点,然后释放中间的结点。
第六组
1. 勾股数
(1)满足x+y=z的正整数x,y,z称为一组勾股数,又称为毕达哥拉斯三元数组。用循环方法编程求出指定区间[a,b]范围内的所有勾股数组。
(2)满足1/x2+1/y2=1/z2的正整数x,y,z称为一组倒立的勾股数组。用循环方法编程求出指定区间[a,b]范围内的所有倒立的勾股数组。
【编程提示】 (1)设勾股数x,y,z,约定x (2)倒立勾股数组中x,y不可能相等,为避免重复,设x>y>z。设置循环条件,z从a至b-2,y从z+1至b-1,x从y+1至b。将条件整理为(x*x+y*y)*z*z=x*x*y*y再编程求解。 2. 选美比赛 在选美大奖赛的半决赛现场,有一批选手参加比赛,比赛的规则是最后得分越高,名次越低。当半决赛结束时,要在现场按照选手的出场顺序宣布最后得分和最后名次,获得相同分数的选手具有相同的名次,名次连续编号,不用考虑同名次的选手人数。例如: 选手序号: 1,2,3,4,5,6,7 选手得分: 5,3,4,7,3,5,6 则输出名次为: 3,1,2,5,1,3,4 请采用数组方法编程帮助大奖赛组委会完成半决赛的评分和排名工作。 【编程提示】 题目换种说法为:将数组A中的整数从小到大进行连续编号,要求不改变数组中元素的顺序,且相同的整数要具有相同的编号。 普通的排序方法均要改变数组元素原来的顺序,显然不能满足要求。为此,引入一个专门存放名次的数组,再采用通常的算法:在尚未排出名次的元素中找出最小值,并对具有相同值的元素进行处理,重复这一过程,直到全部元素排好为止。 3. 商品库存管理 使用单链表建立一个简易商品库存表,要求: (1)每个结点包含商品编号、名称、库存量等,建立n个结点(结点数据域的值由键盘输入)构成的单链表。 (2)统计商品的库存总量。 (3)在指定商品名称的结点之后插入一个新的结点,若表中无指定名称的结点,则将新结点插入到表头。 【编程提示】 定义链表中记录结点的结构为: struct node { char no[12];/*商品编号*/ char name[40];/*名称*/ float workload;/*库存量*/ struct node *link;/*指向下一结点的指针*/ } 统计库存总量时,从头指针开始顺序统计,直至所有记录统计完毕。插入新结点时,如果没有找到指定结点,则将新结点的指针指向头结点。如果表中有指定结点,则将指定结点的指针赋给新结点的指针,然后修改指定结点的指针使其指向新结点。 222 第七组 1. 数字菱形 设计程序打印n(n<=17)行上下对称的数字空心菱形,第一行为1个1,第二行前后各为2个2,……其中n由键盘输入,样图如下图所示。使用循环方法编程。 1 22 22 333 333 4444 4444 333 333 22 22 1 【编程提示】 图形上下对称,应用绝对值函数e=fabs(k-d),其中k为循环变量,取1,2,…,n(n为奇数),d=(n+1)/2。每行打印x+2*e个空格和d-e个数字,除首尾两行,其余需打印中间的空格和后d-e个数字。 2. 自动发牌 一副扑克有52张牌,打桥牌时应将牌分给四个人。请使用数组方法设计一个程序完成自动发牌的工作。要求:黑桃用S(Spaces)表示;红桃用H(Hearts)表示;方块用D(Diamonds)表示;梅花用C(Clubs)表示。 【编程提示】 按照打桥牌的规定,每人应当有13张牌。在人工发牌时,先进行洗牌,然后将洗好的牌按一定的顺序发给每一个人。为便于计算机模拟,将人工方式的发牌过程修改为:先确定好发牌顺序:1、2、3、4;将52张牌顺序编号:黑桃2对应数字0,红桃2对应数字1,方块2对应数字2,梅花2对应数字3,黑桃3对应数字4,红桃3对应数字5,...然后从52 张牌中随机的为每个人抽牌。采用C语言库函数的随机函数,生成0到51之间的共52个随机数,以产生洗牌后发牌的效果。 3. 学生籍贯管理 使用单链表建立一个学生籍贯信息表,每个学生信息包括:学号、姓名、籍贯。 要求: (1)先建立两个有序的单链表,再将其合并成一个有序的单链表。 (2)按籍贯查询输出该籍贯的所有学生。 (3)删除指定学号的学生记录,并返回成功与否的标志。 【编程提示】 定义链表中记录结点的结构为: struct node { char no[12];/*学号*/ char name[40];/*姓名*/ char jg[60];/*籍贯*/ struct node *link;/*指向下一结点的指针*/ } 合并链表时,将前一个链表最后一个结点的指针指向后一个链表的头指针。编写查找函数,首先输入要查找的籍贯,然后顺序查找结点,如果找到则显示找到的记录,之后继续向下查找直至链表结尾。删除某个结点时,可调用查找函数,如果没找到则输出没找到信息;如果找到则分三种情况讨论:该结点为头结点时,修改原头结点所指向的结点为新的头结点;该结点为中间结点时,修改该结点的前一结点的指针使其指向该结点的后一结点;该结点为尾结点时,修改原尾结点的前一结点为新的尾结点;最后释放该结点。 第八组 1. 埃及分数 分子为1的分数称为埃及分数,现输入一个真分数,请使用循环方法将该分数分解为埃及分数。如:8/11=1/2+1/5+1/55+1/110。 【编程提示】 若真分数的分子a能整除分母b,则真分数经过化简就可以得到埃及分数,若真分数的分子不能整除分母,则可以从原来的分数中分解出一个分母为b/a+1的埃及分数。用这种方法将剩余部分反复分解,最后可得到结果。 2. 10个小孩分糖果 十个小孩围成一圈分糖果,老师分给第一个小孩10块,第二个小孩2块,第三个小孩8块,第四个小孩22块,第五个小孩16块,第六个小孩4块,第七个小孩 10块,第八个小孩6块,第九个小孩14块,第十个小孩20块。然后所有的小孩同时将手中的糖分一半给右边的小孩;糖块数为奇数的人可向老师要一块。问经过这样几次后大家手中的糖的块数一样多?每人各有多少块糖?请使用数组方法实现。 【编程提示】 分糖过程是一个机械的重复过程,定义一个数组存放十个小孩手中的糖数,然后按照描述将分糖的过程写成循环语句,将判断手中的糖块数是否相等写成一个函数,通过调用这个函数来作为循环条件。 3. 销售管理 使用单链表建立一个简易销售管理表。每个记录包括:销售员代号、销售员姓名、当月销售额。要求: (1)建立n个结点(结点数据域的值由键盘输入)构成的单链表。 (2)查找当月销售额最高和最低的结点,显示其销售员代号、姓名和销售额。 (3)统计所有销售员的总销售额并输出。 【编程提示】 定义链表中记录结点的结构为: struct node { char no[12];/*代号*/ char name[40];/*姓名*/ float sales;/*销售额*/ struct node *link;/*指向下一结点的指针*/ } 编写查询函数,从第一条记录开始,将销售额赋值给最大值和最小值变量,然后用最大值和最小值变量和后面的结点顺序比较,如果结点值大于最大值变量(或小于最小值变量),则将该结点值赋给最大值变量(或最小值变量),直至循环结束。查找最大值或最小值结点过程中,可进行销售额的累加运算。 第九组 1. 回文数 打印所有不超过n(取n<256) 的其平方具有对称性质的数(也称回文数)。请使用数组方法实现。 【编程提示】 对于要判断的数n,计算出其平方后存于a,将a的每一位进行分解存到数组中,再按