综合实训(3)

2019-02-21 00:34

a从低到高的顺序将其恢复成一个数k(如n=13,则a=169且k=961),若a等于k则可判定n为回文数。

2. 打鱼还是晒网

中国有句俗语叫“三天打鱼两天晒网”。某人从1990年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。指定日期由键盘输入,请使用循环方法实现。

【编程提示】

(1)计算从1990年1月1日开始至指定日期共有多少天,要判断经历年份中是否有闰年,二月为29天,平年为28天。

(2)由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除。 (3)根据余数判断他是在“打鱼”还是在“晒网”;若余数为1,2,3,则他是在“打鱼”否则是在“晒网”。

3. 参会人员管理

使用单链表建立一个简易参会人员管理表。每个记录包括:姓名、单位、房间号。要求:

(1)建立n个结点(结点数据域的值由键盘输入)构成的单链表。 (2)统计某指定单位的参会人员人数。

(3)删除某指定房间号的参会人员的信息记录(每个房间仅住一人)。 【编程提示】

定义链表中记录结点的结构为:

struct node

{ char name[40];/*姓名*/

char unit[60];/*单位*/

char no[6];/*房间号*/

struct node *link;/*指向下一结点的指针*/

}

编写查询函数,从第一条记录开始,将记录中的单位字段和待比较的字符串进行比较,若相等,则统计后继续循环,直至循环结束;若不相等,继续循环直至结束。删除指定记录时,先根据输入的房间号进行查找。如果没找到指定结点,输出没找到信息。如果找到指定结点,则分三种情况讨论:该结点为头结点时,修改原头结点所指向的结点为新的头结点;该结点为中间结点时,修改该结点的前一结点的指针使其指向该结点的后一结点;该结点为尾结点时,修改原尾结点的前一结点为新的尾结点;最后释放该结点。

第十组

1. 1~9分成1:2:3的三个3位数

将1到9 这九个数字分成三个3位数,要求第一个3位数,正好是第二个3位数的二倍,是第三个3位数的三倍。问应当怎样分法。使用数组方法实现。

【编程提示】

问题中的三个数之间存在数学关系,只要确定第一个三位数就可以解决问题。试探第一个三位数之后,计算出另外两个数,将其分别分解成三位数字,进行判断后确定所试探的数是否就是答案。注意:试探的初值可以是123,最大值是333。 2. 捕鱼和分鱼

A、B、C、D、E五个人在某天夜里合伙去捕鱼,到第二天凌晨时都疲惫不堪,于是各自找地方睡觉。日上三杆,A第一个醒来,他将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。B第二个醒来,也将鱼分为五份,把多余的一条鱼扔掉,拿走自己的一份。C、

D、E依次醒来,也按同样的方法拿走鱼。问他们合伙至少捕了多少条鱼?使用循环方法求解。

【编程提示】

根据题意,总计将所有的鱼进行了五次平均分配,每次分配时的策略是相同的,即扔掉一条鱼后剩下的鱼正好分成五份,然后拿走自己的一份,余下其它的四份。

假定鱼的总数为X,则X可以按照题目的要求进行五次分配:X-1后可被5整除,余下的鱼为4*(X-1)/5。若X满足上述要求,则X就是题目的解。

3. 图书借阅管理

使用单链表建立一个简易图书借阅表。每个记录包括:图书编号、名称、借阅次数。要求:

(1)建立n个结点(结点数据域的值由键盘输入)构成的单链表。 (2)查找借阅次数最多和最少的图书记录,显示其编号、名称。 (3)在指定图书结点之前插入一新的结点,并返回成功与否的标志。 【编程提示】

定义链表中记录结点的结构为:

struct node

{ char no[40];/*编号*/

char name[60];/*名称*/

int num;/*次数*/

struct node *link;/*指向下一结点的指针*/

}

编写查询函数,从第一条记录开始,将借阅次数赋值给最大值和最小值变量,然后用最大值和最小值变量和后面的结点顺序比较,如果结点值大于最大值变量(或小于最小值变量),则将该结点值赋给最大值变量(或最小值变量),直至循环结束。插入新结点时,如果没有指定结点,则返回插入失败。如果表中有指定结点,则分两种情况讨论:该指定结点为头结点时,则修改新的结点的指针使其指向头结点;该结点为其他结点时,则修改新结点的指针使其指向指定结点,修改指定结点的前一结点的指针使其指向新结点。

第十一组

1. 歌德巴赫猜想

验证:2000以内的正偶数都能够分解为两个素数之和(即验证歌德巴赫猜想对2000以内的正偶数成立)。用函数方法实现。

【编程提示】

将整数分解为两部分,然后判断出分解出的两个整数是否均为素数。若是,则满足题意;否则重新进行分解和判断。判断素数的部分可写成一个函数。 2. 魔术师的猜牌术

魔术师利用一副牌中的13张黑桃,预先将它们排好后迭在一起,牌面朝下。对观众说:我不看牌,只数数就可以猜到每张牌是什么,我大声数数,你们听,不信?你们就看。魔术师将最上面的那张牌数为1,把它翻过来正好是黑桃A,将黑桃A放在桌子上,然后按顺序从上到下数手上的余牌,第二次数1、2,将第一张牌放在这迭牌的下面,将第二张牌翻过来,正好是黑桃2,也将它放在桌子上,第三次数1、2、3,将前面两张依次放在这迭牌的下面,再翻第三张牌正好是黑桃3。这样依次进行将13张牌全翻出来,准确无误。问魔术师手中的牌原始顺序是怎样安排的?用数组方法实现。

【编程提示】

采用人工倒推的方法:在桌子上放13个空盒子排成一圈,从1开始顺序编号,将黑桃A放入1号盒子中,从下一个空盒子开始对空的盒子计数,当数到第二个空盒子时,将黑桃2放入空盒子中,然后再从下一个空盒子开始对空盒子计数,顺序放入3、4、5...,直到放入全部13张牌。注意在计数时要跳过非空的盒子,只对空盒子计数。最后牌在盒子中的顺序,就是魔术师手中原来牌的顺序。

3. 超长正整数的加法

请设计一个算法来完成两个超长正整数的加法。用链表方法实现。

【编程提示】

采用一个带有表头结点的环形链来表示一个非负的超大整数,如果从低位开始为每个数字编号,则第一位到第四位、第五位到第八位...的每四位组成的数字,依次放在链表的第一个、第二个、...结点中,不足4位的最高位存放在链表的最后一个结点中,表头结点的值规定为-1。定义链表结构为:

struct node{ int data; /*编号*/

struct node *next; /*指向下一结点的指针*/

};

按照此数据结构,可以从两个表头结点开始,顺序依次对应相加,求出所需要的进位后代入运算。

第十二组

1. 要发就发

“1898--要发就发”。请将不超过1993的所有素数从小到大排成第一行,第二行上的每个数都等于它右肩上的素数之差。编程求出:第二行数中是否存在这样的若干个连续的整数,它们的和恰好是1898?假设存在的话,又有几种这样的情况?

第一行:2 3 5 7 11 13 17......1979 1987 1993 第二行:1 2 2 4 2 4...... 8 6

用函数方法实现。 【编程提示】

假设第一行中的素数为n[1]、n[2]、n[3]....n[j]...第二行中的差值为m[1]、m[2]、m[3]...m[j]...。其中m[j]为:m[j]=n[j+1]-n[j]。则第二行连续j个数的和为:

SUM=m[1]+m[2]+m[3]+...+m[j]

=(n[2]-n[1])+(n[3]-n[2])+(n[4]-n[3])+...+(n[j+1]-n[j]) =n[j+1]-n[1]

由此题目就变成了:在不超过1993的所有素数中是否存在这样两个素数,它们的差恰好是1898。若存在,则第二行中必有所需整数序列,其和恰为1898。由分析可知,因为任意素数与2的差一定为奇数,所以不用考虑2。 2. 谁是窃贼

公安人员审问四名窃贼嫌疑犯。已知,这四人当中仅有一名是窃贼,还知道这四人中每人要么是诚实的,要么总是说谎的。在回答公安人员的问题中:

甲说:“乙没有偷,是丁偷的。” 乙说:“我没有偷,是丙偷的。” 丙说:“甲没有偷,是乙偷的。” 丁说:“我没有偷。”

请根据这四人的答话判断谁是盗窃者。用循环方法实现。

【编程提示】

假设A、B、C、D分别代表甲乙丙丁四个人,变量的值为1代表该人是窃贼。 由题目已知:四人中仅有一名是窃贼,且这四个人中的每个人要么说真话,要么说假话,

而由于甲、乙、丙三人都说了两句话:“X没偷,X偷了”,故不论该人是否说谎,他提到的两人中必有一人是小偷。故在列条件表达式时,可以不关心谁说谎,谁说实话。这样,可以列出下列条件表达式:

甲说:”乙没有偷,是丁偷的。” B+D=1 乙说:“我没有偷,是丙偷有。” B+C=1

丙说:“甲没有偷,是乙偷的。” A+B=1

丁说:“我没有偷。” A+B+C+D=1

其中丁只说了一句话,无法判定其真假,表达式反映了四人中仅有一名是窃贼的条件。 3. 大赛计分排行榜

使用单链表建立一个大赛计分排行榜。每个记录包括:挑战者的姓名、成绩、名次。要求:

(1)按名次顺序建立n个结点(结点数据域的值由键盘输入)构成的单链表。 (2)显示分数的排行榜,统计大赛的平均得分。

(3)按名次大小将某一挑战者的记录插入到链表中。 【编程提示】

定义链表中挑战者结点的结构为:

struct node

{char name[40];/*姓名*/ float sco;/*成绩*/

int no;/*名次*/

struct node *link;/*指向下一结点的指针*/

}

显示分数的排行榜需要从头结点开始循环显示,循环显示的同时可进行得分求和。插入结点时,首先要查找相应的位置,如果名次为第1名则插入到表头,直接修改该结点的指针使其指向原头结点;如果名次为最后一名则插入到表尾,修改原尾结点的指针使其指向当前结点;如果在两个结点之间,则修改前一结点的指针使其指向该结点,修改该结点的指针使其指向后一结点。

第十三组

1. 分数比较

比较两个分数的大小。用函数方法实现。 【编程提示】

将分数通分后比较分子的大小,比较分子的部分可写成函数进行调用。 2. 波松瓦的分酒趣题

法国著名数学家波瓦松在青年时代研究过一个有趣的数学问题:某人有12品脱的啤酒一瓶,想从中倒出6品脱,但他没有6品脱的容器,仅有一个8品脱和5品脱的容器,怎样倒才能将啤酒分为两个6品脱呢?用函数方法实现。

【编程提示】

将12品脱酒用8品脱和5品脱的空瓶平分,可以抽象为解不定方程:

8x-5y=6 其意义是:从12品脱的瓶中向8品脱的瓶中倒x次,并且将5品脱瓶中的酒向12品脱的瓶中倒y次,最后在12品脱的瓶中剩余6品脱的酒。

用a,b,c代表12品脱、8品脱和5品脱的瓶子,求出不定方程的整数解,按照不定方程的意义则倒法为:

?a a ?x?? b ?y?? c??倒酒的规则如下:

1) 按a -> b -> c ->a的顺序; 2) b倒空后才能从a中取 3) c装满后才能向a中倒 3. 计算机设备管理

使用单链表建立一个简易计算机设备管理表。每个记录包括:计算机设备编号、名称、单价、数量、金额。要求:

(1)建立n个结点(结点数据域的值由键盘输入)构成的单链表。 (2)查找设备编号为x的结点,若找到,打印其名称、单价和数量。

(3)计算金额=单价*数量后,将金额添加到结点相应的数据域中,并对该单链表进行复制。

【编程提示】

定义链表中记录结点的结构为:

struct node

{ char no[12];/*设备编号*/

char name[40];/*名称*/

float dj;/*单价*/ int num;/*数量*/ float jine;/*金额*/

struct node *link;/*指向下一结点的指针*/

}

按照编号查找结点,可从头结点开始循序查找,比较结点可用字符串比较函数strcmp()来实现。利用公式求出金额后,将结果循环赋值给结点中的数据项。复制单链表时从链表头开始循环复制,直至链表尾。

第十四组

1. 计算分数的精确值

使用数组方法精确计算M/N(0

【编程提示】

将商存放在一维数组中,数组的每个元素存放一位十进制数,即商的第一位存放在第一个元素中,商的第二位存放在第二个元素中....,依次类推。

进行除法运算时,每次求出商的第一位后,将余数乘以10,再计算商的下一位,重复以上过程,当某次计算后的余数为0 时,表示M/N为有限不循环小数。当某次计算后的余数与前面的某个余数相同时,则M/N为无限循环小数,从该余数第一次出现之后所求得的个位数就是小数的循环节。 2. 搬山游戏

设有n座山,计算机与人为比赛的双方,轮流搬山。规定每次搬山的数目不能超过k座,谁搬最后一座谁输。游戏开始时,计算机请人输入山的总数n和每次允许搬山的最大数k。然后请人开始,等人输入了需要搬走的山的数目后,计算机马上打印出它搬多少座山,并提示尚余多少座山。双方轮流搬山直到最后一座山搬完为止。计算机会显示谁是赢家,并问人是否要继续比赛。若人不想玩了,计算机便会统计出共玩了几局,双方胜负如何。使用


综合实训(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:第七章 原子发射光谱法

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: