在java中创建一个行编辑器程序?
这是原始问题: 您的程序将是一个行编辑器。行编辑器是一个编辑器,所有操作都是通过在命令行输入命令来执行的。命令包括显示行,插入文本,编辑行,剪切和粘贴文本,加载和保存文件。例如,当用户输入三行文本,并将其保存为一个新文件的会话可能显示为:在java中创建一个行编辑器程序?
Menu: m Delete line: dl
Load file: l Delete range: dr
Show all: sa Copy range: cr
Show line: sl Paste lines: pl
Show range: sr Write to file: w
New line: nl Quit: q
Edit line: el Write and quit: wq
-> nl
type line? (y/n): y
1: this is the first line
type line? (y/n): y
2: and a second line
type line? (y/n): y
3: and this is the third line
type line? (y/n): n
-> w
write to file: test.txt
-> sa
1: this is the first line
2: and a second line
3: and this is the third line
-> q
创建的文件是:
this is the first line
and a second line
and this is the third line
编辑器会先显示一个菜单之后它会用“ - >”提示输入命令。可以在示例中出现的菜单中看到可以输入的命令。
这个网页是用这里描述的行编辑器编写的。 命令
如果您在没有命令行参数的情况下运行程序,它将以空白文档开始。如果您将现有文件的名称作为命令行参数提供,它将打开并加载该文件的内容。您可以使用quit,q或write和quit,wq命令退出程序。 显示菜单
程序启动时显示菜单。它可以用命令m显示。 读取和写入文件
加载文件命令l将询问用户文件名,打开文件进行读取,将文件内容读入编辑器并关闭文件。如果编辑器中已经有文本,则会被丢弃。写入文件命令w将编辑器的内容写入文件。如果以前使用读取文件命令打开了一个文件,该文件用于写入。否则,程序将提示用户输入文件名。对于读取或写入文件命令,如果所请求的文件无法打开,则会显示相应的错误消息。 显示文本
可以使用三个命令显示文本:show all(sa),show range(sr)和show line(sl)。所有这三个命令都以行号显示文本。全部显示显示整个文档。显示范围将询问用户一系列线(“从”和“到”),并将显示该范围内的线。如果“到”行号大于文档行中的行数,则直到文档末尾将显示。显示线路将询问用户一个线路号码并显示该线路。 输入新的文本行
新的文本行使用新行命令nl输入。在进入新行之前,程序会询问类型行吗? (Y/N)。如果用户选择“是”,那么在显示行号后将接受该行。如果文档为空,则新行将成为文档的第一行(第1行)。如果文件不是空白的,程序将提示用户输入新行后将被放置的行。如果行号超出范围,程序将不接受新行。可以通过要求在(不存在的)第0行之后添加一行来添加新的第一行。用户输入一行后,程序将继续询问新行,直到用户回答否。随着新行被输入,它们被顺序添加到文档中。当用户开始在新的线路命令中输入线路时,首先显示添加新线路的线路(除非用户在文档的开头输入线路)。实例:
-> sa
1: this is the first line
2: and a second line
3: and this is the third line
-> nl
insert after line number: 1
inserting after:
this is the first line
type line? (y/n): y
2: one and a half
type line? (y/n): y
3: one and three quarters
type line? (y/n): n
-> sa
1: this is the first line
2: one and a half
3: one and three quarters
4: and a second line
5: and this is the third line
->
缓冲器
有两个缓冲器,行缓冲器和字符串缓冲区,用于移动的文本块。行缓冲区保存整行的范围,字符串缓冲区保存各行的子字符串。无论何时将新的行范围复制到行缓冲区或将字符串复制到字符串缓冲区,该缓冲区的前一个内容都将被删除(但其他缓冲区不受影响)。 线的移动范围
线的块可以使用复制范围,cr和粘贴线,pl移动。复制范围将询问用户一系列行号(“from”和“to”),并将行复制到行缓冲区 - 行中的行保持不变。粘贴行会要求用户输入行的编号,之后将粘贴行缓冲区中的行。这些行然后被复制到文档中 - 行缓冲区保持不变。行的范围被删除范围删除,博士。再次,要求用户输入要删除的行号范围。行被删除(行缓冲区不变)。 编辑一行文本
编辑行命令el会要求编辑一行的编号,然后显示以一个标尺开头的行,它允许用户通过编号标识行中的位置(从0开始)。然后显示行菜单,程序提示输入。
-> el
line number: 3
0 5 10 15 20
|----+----|----+----|-
one and three quarters
Show line: s
Copy to string buffer: c
Cut: t
Paste from string buffer: p
Enter new substring: e
Delete substring: d
Quit line: q
->
该比例至少与显示的行一样长。然后,从行菜单中选择的操作将在此选择的行上运行,直至退出行q。
显示行将显示带有刻度的行(再次)。退出返回到主编辑器菜单。其余的命令编辑所选的行。
复制到字符串缓冲区和从字符串缓冲区粘贴工作就像复制范围和粘贴行,但他们使用字符串缓冲区而不是行缓冲区。此外,从字符串缓冲区粘贴将插入子字符串,以便它从指定的位置开始。 (因此它“插入之前”,其中糊线不“插入后”。)
-> c
0 5 10 15 20
|----+----|----+----|-
one and three quarters
from position: 4
to position: 7
copied:
0 5 10 15 20
|----+----|----+----|-
one and three quarters
^^^^
Show line: s
Copy to string buffer: c
Cut: t
Paste from string buffer: p
Enter new substring: e
Delete substring: d
Quit line: q
-> p
0 5 10 15 20
|----+----|----+----|-
one and three quarters
insert at position: 14
0 5 10 15 20 25
|----+----|----+----|----+
one and three and quarters
Show line: s
Copy to string buffer: c
Cut: t
Paste from string buffer: p
Enter new substring: e
Delete substring: d
Quit line: q
->
删除子,T,将提示字符的范围中删除,将显示字符串与所述子加下划线,询问用户范围是否正确,然后删除子字符串。
-> el
line number: 1
0 5 10 15 20
|----+----|----+----|-
this is the first line
Show line: s
Copy to string buffer: c
Cut: t
Paste from string buffer: p
Enter new substring: e
Delete substring: d
Quit line: q
-> d
0 5 10 15 20
|----+----|----+----|-
this is the first line
from position: 12
to position: 18
delete:
0 5 10 15 20
|----+----|----+----|-
this is the first line
^^^^^^^
y/n: y
0 5 10 15
|----+----|----+
this is the ine
Cut,t将复制到字符串缓冲区并删除子字符串。它将子字符串复制到字符串缓冲区并将其从行中删除。
输入新的子字符串e将允许用户在现有的行中输入新的文本。
line number: 1
0 5 10 15 20
|----+----|----+----|-
this is the first line
Show line: s
Copy to string buffer: c
Cut: t
Paste from string buffer: p
Enter new substring: e
Delete substring: d
Quit line: q
-> e
0 5 10 15 20
|----+----|----+----|-
this is the first line
insert at position: 12
text: very very
0 5 10 15 20 25 30
|----+----|----+----|----+----|-
this is the very very first line
内幕
您将定义(其中包括)两大类:一类线和文档类。 Line类将保存文档中一行字符串中的文本,并在一行上提供基本操作。其中一些操作是在指定位置的行中插入一个字符串,删除一个子字符串,复制一个子字符串等.Line类还将有一个字段,其中存储的行数为字符数。 Document类将保存整个文档(每行包含一个字符串),并提供基本操作,如插入行,删除,复制和粘贴行的范围。它也将具有一个字段,其中包含当前在文档中的行数。在程序的其他地方,您将提供操作代码(由用户从菜单中选择),然后调用Line和Document类的成员函数。
该文件将是与头节点行(串)的双向链表。也就是说,如果文档中有100行,链表中将有101个节点 - 100个文本和一个标题节点。这将通过消除特殊的边界条件使得插入和删除更容易。行号不会与行一起存储。相反,每次需要一个行号(例如,在显示范围内显示并显示所有行,找到新行的位置等)时,它将通过遍历列表和计数来找到。
所有字符串都将是Java字符串。文本的线可与串联和子的方法来处理:
String substring(int beginIndex) // Returns a new string that is a
// substring of this string.
String substring(int beginIndex, int endIndex) // Returns a new string
// that is a substring of
// this string.
接受用户输入的新生产线必须使用nextLine因为旁边停止接受输入的第一个空格和文本行读数可能含有白空间。您必须使用nextLine来处理所有键盘输入:nextLine不能与next,nextInt等混合良好,因此要读取整数输入,您首先要读取一个字符串,然后使用Integer.parseInt将其转换为整数。
你会做适当的输入验证。选择操作时(响应“ - >”提示),程序只接受菜单中所述的输入。当接受整数输入(行号,一行中的字符位置)时,程序将检查有效的数字和范围。
=========================== 我基本上想到的唯一的东西是比例和菜单...
当你有点迷路时,一个合理的方法是XP。下面是我建议的:
走好每一步,使之小,你可能可以。将其记录在待办事项列表中的单独卡片或订单项上。
一旦你把所有的步骤,挑选一个似乎不依赖于任何其他人去做。这可能与“显示菜单”一样简单。
我建议你也写一个测试,以确保它的工作原理 - 这需要一点时间在一开始,但是从长远来看,如果你有测试你会是一个更加快乐的人。首先写测试更好。严重的是,最小的步骤可能 -
最重要的是从你提供的到的东西,可以实现什么打破的步骤列表。您可能会从该问题描述中找出50-100个项目。
“入门”也很重要。你的程序应该始终运行。
另一种理论认为可能与测试的帮助是“你能够工作的最简单的事情”。这意味着先编写一个测试来测试一小部分功能,然后编写代码使其工作。例如,如果测试是“assert(5,add(3,2))”,那么可能工作的最简单的事情就是让“add”返回数字5并运行测试 - 嘿,它通过。然后,当您添加下一个测试时,您可能需要重新编写添加以便更灵活并且实际上可以工作。
(对不起,我的编辑,但希望尽量帮你尽可能的问题关闭之前,我希望它能帮助。)
** **请缩短您的问题。这是一个巨大的墙壁文字,只是尖叫“关闭这个问题!”此外,我们不在这里为你做功课。 – 2010-11-02 17:29:55
你的问题到底是什么?什么是你需要帮助的具体事情? – 2010-11-02 17:30:31
对不起,我知道你有点失落,但这不是一个真正的问题,你自己也没有做足够的工作 - 你真的需要与某人互动会话(老师最好)谁可以给你是一个想法从哪里开始的框架。我会尝试删除一个快速答案以帮助... – 2010-11-02 17:31:09