5.21 特殊小节:高级字符串操作练习
上述练习是本书的重点,用于测试读者对基本字符串操作概念的理解。本节介绍一组中高级字符串操作练习,这些题目的难度不一,有的要花一两个小时来编写和实现,有的要两三周来进行实验室讨论和实现,有些是较难的小组项目。
5.42 (文本分析)利用计算机的字符串操作功能可以用非常有趣的方法分析大作家的写作方法。许多人在分析莎士比亚是否真有其人,有些学者认为。许多重要证据表明,莎土比亚实际上是 Christopher Marlowe 或其他作家的化名。研究人员通过计算机寻找这些作家在写作中的相似性。本练习介绍三种用计算机分析文章的方法。
a)编写一个程序,从键盘读取几行文本,并打印一个表格,显示文中字母的出现次数。例如,下列短语:
To be,or not to be: that is the question:
包含一个a、二个b、不包含c等等。
b)编写一个程序,从键盘读取几行文本,并打印一个表格,显示文中单字符单词、双字符单词、三字符单词等的出现次数。例如,下列短语:
Whether 'tis nobler in the mind tO suffer
包含:
字长 | 出现次数 |
---|---|
1 | 0 |
2 | 2 |
3 | 2 |
4 | 2(包括'tis) |
5 | 0 |
6 | 2 |
7 | 1 |
c)编写一个程序,从键盘读取几行文本,并打印一个表格,显示文中每个单词的出现次数。程序的第一个版本应在表中按文中出现的顺序列出单词。例如,下列语句:
To be, or not to be:that is the question:
Whether 'tis nobler in the mind to suffer
包含三个“to”、两个“be”、一个“or”等等。然后按字母顺序列出更有趣(也更有用)的打印输出。
5.43 (字处理)字处理系统的一个重要功能是输入对齐,将单词与页面的左右边界对齐,从而产生漂亮的文档,就像是经过排版的,而不是直接输入的。计算机系统通过在行中的单词之间插入空格而让最右边的单词与右边界对齐。
编写一个程序,读取几行文本.并按对齐格式打印这些文本。假设文本在8.5英寸宽的纸上打印.左右页边留下1英寸的边距。假设计算机在水平方向每英寸打印10个字符。
因此,可以在6.5英寸的空间打印65个字符。
5.44 (按不同格式打印日期)可以按不同格式打印日期,两种常用格式如下所示:
07/21/55 July 2l。1955
编写一个程序,读取第一种日期格式,并打印第二种日期格式。
5.45 (支票保护)计算机经常用于工资与账号支付应用等支票写入系统。许多怪事常常出现,如每周工资支票上错误地多写1百万美元。由于人为和机器的错误,使支票写入系统写出不正常的数值。系统设计人员在系统中建立控制,防止发出这种错误支票。
另一个严重问题是有些人故意改变支票金额,想窃取钱财。要防止改变支票金额,大多数支票写入系统采用支票保护(check protection)技术。
99.87
---------
12345678
包含三个空格。如果打印支票时留下空格,则很容易篡改。要防止改变支票金额,许多支票写入系统插入如下星号:
***99.87
-----------
12345678
编写一个程序,输入支票上要打印的美元数,然后用支票保护格式打印金额,必要时加上星号,假设用九个空格打印金额。
5.46 (写出支票金额的大写)继续上面的例子,设计支票写入系统以防止改变支票金额非常重要,一个常用的安全方法是写出支票金额的大写。即使支票的数字好改,大写金额也很难篡改。
许多计算机支票写入系统不写出支票金额的大写,也许主要原因是商用应用程序使用的大多数高级语言没有足够的字符串操作特性,另一个原因则是编写大写金额的程序比较复杂。
编写一个 C++ 程序,输人数字金额,输出大写金额。例如,金额 112.43 写成:
ONE HUNDRED TWELVE and 43/100
5.47 (莫尔斯码)也许最著名的编码机制是莫尔斯码,是 1832 年由 Samuel Morse 创立的,用于电报系统使用。莫尔斯码对字母、数字和一些特殊符号(如圆点、逗号、分号)指定一系列点和线。在面向声音的系统中,点表示短音,线表示长音。点线表示还用于面向光的系统和面向信号标志系统。
单词之间用空格分开,没有点和线。在面向声音的系统中,空格表示为短时间不发声音。图 5.39 显示了莫尔斯码的国际化版本。
编写一个程序,读取一句英语短语,并将其编制成莫尔斯码,再用一个程序将莫尔斯码变成英语。莫尔斯码编码字母之间用一个空格,莫尔斯码编码单词之间用三个空格。
计算机打印的支票包含固定的可以打印金额的空格。假设支票中用八个空格写入每周工资,如果金额太大,则八个空格都会填满,例如:
1,230.60 (支票金额)
----------
12345678 (位置号)
另一方面,如果金额少于1000美元,则有些空格空着。例如:
字符 | 代码 | 字符 | 代码 |
---|---|---|---|
A | .- | T | - |
B | -… | U | ..- |
C | -.-. | V | …- |
D | -.. | W | .-- |
E | . | X | -..- |
F | ..-. | Y | -.-- |
G | --. | Z | --.. |
H | …. | ||
I | .. | 数字 | |
J | .--- | 1 | .---- |
K | -.- | 2 | ..--- |
L | .-.. | 3 | …-- |
M | -- | 4 | ….- |
N | -. | 5 | ….. |
O | --- | 6 | -…. |
P | .--. | 7 | --… |
Q | --.- | 8 | ---.. |
R | .-. | 9 | ----. |
S | … | 0 | ----- |
图 5.39 莫尔斯码的国际化版本
5.48 (公制换算程序)编写一个程序,帮助用户进行公制换算。程序让用户指定单位名字符串(如 centimeter、liter、gram 等表示公制,inche、quart、pound 等表示英制),并回答下列简单问题:
”How many inches are in 2 meters?”
”How many liters are in 1O quarts?”
程序应能认识无效转换。例如:
”How many feet in 5 kilograms?”
是无意义的,因为”feet”是长度单位,而”kilograms”是重量单位。