文本编辑器c++实验报告附源代码

合集下载

(c语言课程设计)C语言文本编辑器

(c语言课程设计)C语言文本编辑器
文本编辑器
文本编辑器是最常用的文档创建和编辑工具。随着计算机科学与技术的发展,用来处 理文本 的编辑器 随处可见 ,并且形 式多样。 比如, Windows 下的记 事本,写 字板, EditPlus,UltraEdit 等都是十分优秀的文本编辑器和处理工具。在本章中,我们将向读者讲解 如何利用 C 语言来发展开发一个简易的文本编辑器。
注意:Turbo C2.默认定义的文本窗口为整个屏幕,共有 80 列(或 40 列) ,25 行的文本单元, 每
个单元包括一个字符和一个属性,字符即 ASCII 码字符,属性规定该字符的颜色和强度。同时,他还规定 整个屏幕的左上角坐标为(1 ,1 ) ,右下角坐标为(80 ,25 ) 。并规定沿水平方向为 X 轴,方向朝右;眼循环移动。当光带移动到某个字菜单项上时,用户此时可使用 Enter 键来选取相关菜单选项。 (5)帮助及其他模块。在帮助及其他模块中,主要完成系统功能及按键的简要介绍。 其他模块包括文本的快速预览和窗口的显示。用户可按 F10 功能键来打开快速预览窗口, 在快速预览窗口中没有功能菜单条。 主窗口要有菜单栏, 文本编辑区和状态栏三大部分构成, 菜单栏用来显示菜单项,文本编辑区主要用来文本字符的输入,删除等操作,状态栏主要用 来显示当前光标在文本窗口中的坐标值。
若在第 m 行,第 n 列的位置插入一个字符,其 insert() 过程描述如下: (1) 定位至行单链表中的第 m 个节点,得到这个节点的数据域的值,其值为对应列单链 表中第一个节点的地址。 (2) 定位至列单链表中的第 n-1 个节点。 (3) 创建一个新的列单链表节点,用其数据域保存输入的字符。 (4) 若字符插入在第 m 行第 1 列, 则直接将行单链表中第 m 个节点的数据域的值改变为 新的列单链表节点的地址,新的列单链表节点的指针域指向列单链表中原来的第 1 个节点。 若字符不是插入在第 m 行第 1 列, 则执行简单的单链表中插入节点的操作。 (5) 插入此字符后,调用 test() 函数,从第 m 行开始检查各行是否满足每行只允许有 76 个字符的条件,若不满足此条件,则必须进行处理。 其 test()检查处理过程描述如下: (1) 用指针 tail 指向已经插入了新节点的列单链表中的最后一个节点。 (2) 若此单链表中节点数超过 76 个,则指针 p1 会指向此列单链表中的第 76 个节点, 指 针 p2 指向第 77 个节点,并将 p1 所指节点的指针域设置为 NULL。 (3) 若 tail 所指节点的数据域为 Enter 键(ASCII 为 13)且在行单链表中只有 m 个节点, 则在此行单链表中添加一个新的节点,新节点的数据域为 p2 的值,指针域为空, 并 将 m 节点的指针域指向它 ; 若 tail 所指节点反而数据域为 Enter 键(ASCII 为 13) 且在 行单链表中有多于 m 个节点,与上面不同的是,它执行的是在行单链表插入一个新 的节点的操作。 (4) 若 tail 所指节点的数据域不是回车符, p1 的数据域为回车符并且行单链表中只有 m 个节点,则在行单链表中添加一个新的节点,新节点的数据域为 p2 的值,指针域为 空,并将第 m 节点的指针域指向它;若 tail 所指节点的数据域不为回车符并且行单 链表中有多于 m 节点, 则将 tail 的指针域指向行单链表中第 m+1 个节点所指的列单 链表的首节点,并将行单链表中第 m+1 个节点的数据域修改成指针 p2 的值,并对 行单链表中第 m+1 个节点所指的列单链表进行 test() 检查,相似的处理过程至行单 链表中的最后一个节点结束。 3) 删除字符 当用户按下 Del 键时,系统会调用 del() 函数在单链表中删除当前光标所在处的字符;当用 户按下 BackSpace 键时, 系统也会调用这个函数在单链表中删除当前光标所在处前一个位置 的字符。 若在第 m 行、第 n 列的位置删除一个字符,其在列单链表中删除一个节点的操作域插入工 作十分相似,所以这里重点介绍删除该字符后,单链表中数据的前移工作过程。 (1) 在相应的列单链表中删除第 n 个节点。 (2) 判断第 m 行是否存在并且判断在此行中是否有字符, 若第 m 行不存在,或此行中没 有字符,则结束字符删除过程,否则执行步骤(3) 。 (3) 用 tail 保存第 m 行相应列单链表中最后一个节点的地址,并将最后一个节点的指针 域保存为第 m+1 行中相应列单链表的第一个元素的地址。 (4) 计算出第 m 行中没有字符的位置的个数 num ,然后在第 m+1 行的相应列单链表中 截取 num 个节点, 并将行单链表中的第 m+1 节点的数据域改为相应列单链表中的第 num 个节点后的节点的地址。 (5) 调用 m++语句,是变量 m 增 1,跳至步骤(3) ,开始对下一行进行处理。 4) 移动光标 移动光标的操作主要利用 gotoxy() 函数来实现,过程非常简单,只需对当前的光标位置和移 动方向进行判断后,即可执行 gotoxy() 过程。例如,如果当前光标在第 m 行第 1 列,且按下

用C编写文本编辑器实验报告

用C编写文本编辑器实验报告

用C#编写“文本编辑器”实验报告实验3 项目名称:文本编辑器1、实验目的和要求通过本实验,使得学生理解操作系统目录与文件的概念,掌握文件流的读写操作。

要求编写一个满足以下条件的文本编辑器程序。

(1)程序界面与操作系统中的记事本界面类似。

(2)程序可以打开、保存和编辑txt文本文件。

(3)程序可以查找和替换文本内容中的指定字符串2、程序代码using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.IO;namespace 记事本{public partial class frmNotepad : Form{bool b = false;//布尔变量b用于判断文件是新建的还是从磁盘打开。

true表示文件从磁盘打开的,false表示文件是新建的,默认值为falsebool s = true;//布尔变量s用于判断文件是否被保存。

false表示未被保存,默认值为truepublic frmNotepad(){InitializeComponent();}/*多格式文本框TextChange的事件代码*/private void rtxtNotepad_TextChanged(object sender, EventArgs e){//文本被修改后,设置s为false,表示文件未被保存s = false;}/*【新建】菜单代码*/private void tsmiNew_Click(object sender, EventArgs e){//判断当前文件是否从磁盘打开,或者新建时文档不为空,并且文件未被保存if (b == true || rtxtNotepad.Text.Trim() != ""){//若文件未被保存if (s == false){string result;result = MessageBox.Show("文件尚未保存,是否保存?", "保存文件", MessageBoxButtons.YesNoCancel).ToString();switch (result){case "Yes"://若文件是从磁盘打开的if (b == true){//按文件打开的路径保存文件rtxtNotepad.SaveFile(odlgNotepad.FileName);}//若文件不是从磁盘打开的else if (sdlgNotepad.ShowDialog() == DialogResult.OK){rtxtNotepad.SaveFile(sdlgNotepad.FileName);}s = true;rtxtNotepad.Text = "";break;case "No":b = false;rtxtNotepad.Text = "";break;}}}}/*【打开】菜单代码*/private void tsmiOpen_Click(object sender, EventArgs e){if (b == true || rtxtNotepad.Text.Trim() != ""){string result;result = MessageBox.Show("文件尚未保存,是否保存?", "保存文件", MessageBoxButtons.YesNoCancel).ToString();switch (result){case "Yes":if (b == true){rtxtNotepad.SaveFile(odlgNotepad.FileName);}else if (sdlgNotepad.ShowDialog() == DialogResult.OK){rtxtNotepad.SaveFile(sdlgNotepad.FileName);}s = true;rtxtNotepad.Text = "";break;case "No":b = false;rtxtNotepad.Text = "";break;}}odlgNotepad.RestoreDirectory = true;if ((odlgNotepad.ShowDialog() == DialogResult.OK) && odlgNotepad.FileName != ""){rtxtNotepad.LoadFile(odlgNotepad.FileName);b = true;}s = true;}/*【保存】菜单代码*/private void tsmiSave_Click(object sender, EventArgs e){//若文件从磁盘打开并且修改了其内容if (b == true && rtxtNotepad.Modified == true){rtxtNotepad.SaveFile(odlgNotepad.FileName);s = true;}else if (b == false && rtxtNotepad.Text.Trim() != "" && sdlgNotepad.ShowDialog() == DialogResult.OK){rtxtNotepad.SaveFile(sdlgNotepad.FileName);s = true;b = true;odlgNotepad.FileName = sdlgNotepad.FileName;}}/*【另存为】菜单代码*/private void tsmiSaveAs_Click(object sender, EventArgs e)if (sdlgNotepad.ShowDialog() == DialogResult.OK){rtxtNotepad.SaveFile(sdlgNotepad.FileName);s = true;}}/*【退出】菜单代码*/private void tsmiClose_Click(object sender, EventArgs e){Application.Exit();}//【撤销】菜单代码private void tsmiUndo_Click(object sender, EventArgs e){rtxtNotepad.Undo();}//【复制】菜单代码private void tsmiCopy_Click(object sender, EventArgs e){rtxtNotepad.Copy();}//【剪切】菜单代码private void tsmiCut_Click(object sender, EventArgs e){rtxtNotepad.Cut();}//【粘贴】菜单代码private void tsmiPaste_Click(object sender, EventArgs e){rtxtNotepad.Paste();}//【全选】菜单代码private void tsmiSelectAll_Click(object sender, EventArgs e) {rtxtNotepad.SelectAll();}//【日期】菜单代码private void tsmiDate_Click(object sender, EventArgs e){rtxtNotepad.AppendText(System.DateTime.Now.ToString()); }//【自行换行】菜单代码private void tsmiAuto_Click(object sender, EventArgs e)if (tsmiAuto.Checked == false){tsmiAuto.Checked = true;//选中该菜单项rtxtNotepad.WordWrap = true;//设置为自动换行}else{tsmiAuto.Checked = false;rtxtNotepad.WordWrap = false;}}//【字体】菜单代码private void tsmiFont_Click(object sender, EventArgs e){fdlgNotepad.ShowColor = true;if (fdlgNotepad.ShowDialog() == DialogResult.OK){rtxtNotepad.SelectionColor = fdlgNotepad.Color;rtxtNotepad.SelectionFont = fdlgNotepad.Font;}}//【工具栏】菜单代码private void tsmiToolStrip_Click(object sender, EventArgs e){Point point;if (tsmiToolStrip.Checked == true){point = new Point(0, 25);//隐藏工具栏时,把坐标设为(0,25),因为菜单的高度为24tsmiToolStrip.Checked = false;tlsNotepad.Visible = false;rtxtNotepad.Location = point;//设置多格式文本框左上角的位置rtxtNotepad.Height += tlsNotepad.Height;//隐藏工具栏后,增加文本框的高度}else{//显示工具栏时,多格式文本框左上角的位置为(0,50),因为工具栏的高度25加上菜单的高度25=50point = new Point(0, 50);tsmiToolStrip.Checked = true;tlsNotepad.Visible = true;rtxtNotepad.Location = point;rtxtNotepad.Height -= tlsNotepad.Height;}}//【状态栏】菜单代码private void tsmiStatusStrip_Click(object sender, EventArgs e){if (tsmiStatusStrip.Checked == true){tsmiStatusStrip.Checked = false;stsNotepad.Visible = false;rtxtNotepad.Height += stsNotepad.Height;}else{tsmiStatusStrip.Checked = true;stsNotepad.Visible = true;rtxtNotepad.Height -= stsNotepad.Height;}}//【关于记事本】菜单代码private void tsmiAbout_Click(object sender, EventArgs e){frmAbout ob_FrmAbout = new frmAbout();ob_FrmAbout.Show();}private void tlsNotepad_ItemClicked(object sender, ToolStripItemClickedEventArgs e) {int n;//变量n用来接收按下按钮的索引号n = tlsNotepad.Items.IndexOf(e.ClickedItem);switch (n){case 1:tsmiNew_Click(sender, e);break;case 2:tsmiOpen_Click(sender, e);break;case 3:tsmiSave_Click(sender, e);break;case 4:tsmiCut_Click(sender, e);break;case 5:tsmiCopy_Click(sender, e);break;case 6:tsmiPaste_Click(sender, e);break;case 7:tsmiAbout_Click(sender, e);break;}}//计时器控件代码private void tmrNotepad_Tick(object sender, EventArgs e){tssLbl2.Text = System.DateTime.Now.ToString();}//窗体的sizechanged事件代码(为使得改变窗体大小时,状态栏随之改变)private void frmNotepad_SizeChanged(object sender, EventArgs e){frmNotepad ob_frmNotepad = new frmNotepad();tssLbl1.Width = this.Width / 2 - 12;tssLbl2.Width = tssLbl1.Width;}}}3、实验结果及程序运行界面。

c#简易文本编辑器实训报告

c#简易文本编辑器实训报告
{
saveFileDialog1.InitialDirectory = "";
saveFileDialog1.Filter = "*.txt|*.txt|RTF文件(*.rtf)|*.rtf";
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
richTextBox1.SaveFile(saveFileDialog1.FileName,RichTextBoxStreamType.RichText);
ff.Show();
this.Hide();
}
else
MessageBox.Show("密码或用户不正确!");
}
private void button2_Click(object sender, EventArgs e)
{
this.Close();
}
}
}
实训总结、体会:
经过一学期的C#学习我的体会是:
{
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text == "abc" && textBox2.Text == "abc")
{
Form1 ff = new Form1();
实训任务及要求:掌握并熟练类、接口的创建和应用。并最终设计完成《密码验证登陆系统》,将各种算法综合运用于具体的设计任务中。
实训仪器、仪表与工具、器材:硬件设备为多媒体计算机、实验运行环境及软件为MicroSoft visual 2008及Windows XP操作系统、程序设计语言为C#语言。

C_实验-记事本(带源码)

C_实验-记事本(带源码)

记事本实验报告一、实验目的创建一个Windows窗体应用程序,实现记事本的基本功能,具体包括新建文件、打开文件、保存文件、查找等功能。

该实验的目的是掌握:(一)窗体程序的开发(二)常用控件的使用(三)常用事件的处理(四)对话框的设计和使用(五)文件访问的基本方法二、实验内容(一)主窗口Form1图1 主窗口主窗口界面如图1所示,功能包括基本编辑操作、主菜单和其它快捷键功能。

1、编辑功能用文本框实现。

2、窗口标题与文件名相一致。

未打开文件时为“无标题”,打开文件(另存为)后为文件名。

3、支持菜单的热键和快捷键。

二者的区别是前者是激活菜单且显示出该菜单项时有效,后者在任何时候有效。

4、实现新建、打开、保存和查找功能。

5、支持F3(查找下一个)。

表1 Form1控件列表using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.IO;namespace WindowsFormsApplication1{public partial class Form1 : Form{public Form2 fm2 = null;public string searchText = "";public Form1(){InitializeComponent();}private void saveFile(){if (textBox1.Text.Length > 0 && textBox1.Modified) {if (MessageBox.Show("想保存文件吗?", "记事本",MessageBoxButtons.YesNoCancel,MessageBoxIcon.Warning) == DialogResult.Yes){SaveFileDialog d = new SaveFileDialog();d.Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*";if (d.ShowDialog() == DialogResult.OK){FileStream fs = File.OpenWrite(d.FileName);StreamWriter sr = new StreamWriter(fs);sr.Write(textBox1.Text);sr.Flush();fs.Close();}}}}private void文件NToolStripMenuItem_Click(object sender, EventArgs e) {saveFile();textBox1.Text = "";Text = "无标题 - 记事本";}private void OpenFile(){OpenFileDialog d = new OpenFileDialog();d.Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*";if (d.ShowDialog() == DialogResult.OK){FileStream fs = File.OpenRead(d.FileName);StreamReader sr = new StreamReader(fs);string s;string s1 = "";while ((s = sr.ReadLine()) != null){s1 += s;}textBox1.Text = s1;string fname = d.FileName.Substring(stIndexOf("\\") + 1);Text = fname + " - 记事本";}}private void打开OToolStripMenuItem_Click(object sender, EventArgs e) {saveFile();OpenFile();}private void保存SToolStripMenuItem_Click(object sender, EventArgs e) {saveFile();}private void查找FToolStripMenuItem_Click(object sender, EventArgs e) {if (fm2 == null){fm2 = new Form2();fm2.fm1 = this;Form2.textBox2 = textBox1;fm2.Show();}elsefm2.Activate();}private void textBox1_KeyDown(object sender, KeyEventArgs e){if (e.KeyCode == Keys.A && e.Control && !e.Shift && !e.Alt){textBox1.SelectAll();e.Handled = true;}else if (e.KeyCode == Keys.F3 && !e.Control && !e.Shift && !e.Alt) {Form2.findNext();}}}}(二)查找对话框图2 查找对话框查找对话框的界面(图2)与记事本的相同。

文本编辑器实验报告

文本编辑器实验报告

综合性实验文本编辑器一.实验要求1.参考系统的写字板功能,编写一个小型的文字编辑工具;2.该文档编辑器,至少完成以下功能:A、文件操作:新建,打开,保存,退出;B、编辑操作:复制,剪切,黏贴,全选;C、查找与替换:查找,替换;D、格式操作:字体,颜色等。

3.界面设计应考虑美观,操作简便等问题,应有工具栏,右键菜单;二.设计思路1、首先,设计一个整体框架。

文本编辑器有一个主的窗体form1,文件的新建,打开,保存,退出;复制,剪切,黏贴,全选;字体,颜色等都是在这个窗体上进行的。

而这些操作的进行,都需要在richtextbox上进行,并且要允许用户打开多个窗口,所以我又增加了一个窗体newform(父窗体为form1),作为用户新建时调用的窗口。

其次,可以增加一个新的窗体searchform,作为查找、替换字符串的操作窗口。

所以,总的来说,有三个窗体,form1为主窗体,newform是用户在新建时调用的窗体,searchform为用户在操作查找、替换功能时需要调用的窗体。

2、接下来,就是对各个窗体的实现了。

Form1是主窗体,上面有菜单栏,工具栏,可以新建窗口,以及支持右键菜单。

3、Newform是用户新建时调用的。

它主要就是一个窗体中放了一个richtextbox,以及支持右键菜单。

4、Searchform是一个查询、替换窗体。

上面有2个label,2个textbox,3个button。

2个textbox的作用为获取要查找的字符串,已经要替换的字符串。

3个button的作用分别为“查询”、“单个替换”、“全部替换”。

5、此文本编辑器支持新建,打开,保存,退出,复制,剪切,黏贴,全选,查找,替换,字体,颜色以及支持右键菜单。

只要把鼠标放到主窗体上,就可支持右键新建、打开;把鼠标放到richtextbox上时,就可以支持右键复制、黏贴、剪切、关闭。

四则运算核心代码:private void打开ToolStripMenuItem1_Click(object sender, EventArgs e)//打开{//OpenFileDialog openfileDialog = new OpenFileDialog();openFileDialog1.Filter = "纯文本文件(*.txt)|*.txt|所有文件(*.*)|*.*";if (this.openFileDialog1.ShowDialog()== DialogResult.OK){s_FileName= openFileDialog1.FileName;NewForm nf = new NewForm();nf.MdiParent = thi s;nf.Text = s_FileName;using (StreamReader read = new StreamReader(s_FileName)){nf.richTextBox1.Text = read.ReadToEnd();}nf.Show();}}public void savefile()//保存文件{//SaveFileDialog saveFileDialog1 = new SaveFileDialog();saveFileDialog1.Filter = "纯文本文件(*.txt)|*.txt|所有文件(*.*)|*.*";saveFileDialog1.FilterIndex = 0;saveFileDialog1.RestoreDirectory = true;NewForm nf = (NewForm)this.ActiveMdiChild;if (nf == null){MessageBox.Show("没有文档可保存!");return;}if (s_FileName.Length != 0){if (File.Exists(@s_FileName)){StreamWriter sw = null;sw = new StreamWriter(s_FileName);sw.Write(nf.richTextBox1.Text);sw.Flush();sw.Close();return;}}if (saveFileDialog1.ShowDialog() == DialogResult.OK){if (s_FileName.Length != 0){nf.richTextBox1.SaveFile(s_FileName, RichTextBoxStreamType.PlainText);}else{s_FileName = saveFileDialog1.FileName;nf.richTextBox1.SaveFile(s_FileName, RichTextBoxStreamType.PlainText);}}}private void保存ToolStripMenuItem_Click(object sender, EventArgs e)//保存{savefile();}private void查找ToolStripMenuItem_Click(object sender, EventArgs e)//查找替换功能{if (searchform == null){searchform = new searchForm();searchform.SearchAction+=new searchForm.SearchEventHandle(OnSearch);}searchform.Show();}private void OnSearch(){NewForm nf=(NewForm)this.ActiveMdiChild;this.SearchString = searchform.SearchString;start = nf.richTextBox1.Find(SearchString,start,RichTextBoxFinds.MatchCase);if (searchform.two == 1){if (start >= 0){nf.richTextBox1.SelectedText = searchform.ReplaceStr;start += searchform.ReplaceStr.Length;}else{MessageBox.Show("已到文档末尾!");start = 0;}}else if (searchform.three == 1){string replaceall=nf.richTextBox1.Text.Replace(searchform.SearchString, searchform.ReplaceStr);nf.richTextBox1.Text = replaceall;start = 0;}else{if (start >= 0) start += thi s.SearchString.Length;else{MessageBox.Show("已到文档末尾!");start = 0;}}}private void全选ToolStripMenuItem_Click(object sender, EventArgs e)//后退{NewForm nf = (NewForm)this.ActiveMdiChild;nf.richTextBox1.Undo();}private void全选ToolStripMenuItem1_Click(object sender, EventArgs e)//全选{NewForm nf = (NewForm)this.ActiveMdiChild;nf.richTextBox1.SelectAll();}三.程序运行效果图1.开始运行的界面:2、新建文档:3、文本编辑:4、文档保存5、查找:6、替换:4实验总结教你如何用WORD文档(2012-06-27 192246)转载▼标签:杂谈1. 问:WORD 里边怎样设置每页不同的页眉?如何使不同的章节显示的页眉不同?答:分节,每节可以设置不同的页眉。

c语言课设实验报告-记事本程序(含源码)

c语言课设实验报告-记事本程序(含源码)

C语言课设实验报告[记事本程序]班级:学号:姓名:指导老师:C语言课设实验报告#define key_down 80#define key_up 72#define key_esc 1#define key_alt_f 33#define key_alt_x 45#define key_enter 28#define key_alt_e 18int get_key();void box(int startx,int stary,int high,int width);{int i,key,x,y,l;char *w=NULL,*d=NULL,*s=NULL;FILE *fp;char *menu[]={ "File ", "Edit ","Format","View","Help"};char *red[]={ "F", "E","F","V","H"};char *f[]={ "New ", "Open" , "Save", "Another","Quit alt_x"};char *e[]={"Search","Search next","Replace","Date"};char buf[16*10*2],buf1[16*2];textbackground(3);clrscr();window(1,1,80,1);textbackground(WHITE);textcolor(BLUE);clrscr();window(1,1,80,2);for(i=0, l=0; i <5;i++){x=wherex();y=wherey();textcolor(BLACK);cprintf( " %s ",menu[i]);l=strlen(menu[i]);gotoxy(x,y); x.y等的头文件*//*功能键的扫描码的定义*//* i为循环次数的序数,key为从键盘输入的功能键,x,y 为光标的坐标,l为菜单栏中菜单的字符长度*//*w是存放输入的内容(记录的事情)的指针,*s是存放输入的文件名的指针,*d是存放输入要定时的文件的文件名的指针*/ /*菜单栏中各个菜单的定义*//*菜单栏中菜单开头要标颜色的字母的定义*//* file 子菜单中项目的定义*//*edit子菜单的定义*/ /*缓冲区的定义*//*整个大窗口的背景颜色设置*//*创建菜单栏窗口*/ /*设置菜单栏窗口背景颜色为白色,字体颜色为蓝色*//*利用循环输出menu菜单栏,有多少个菜单循环多少次。

文本编辑器的程序设计及代码示例

文本编辑器的程序设计及代码示例

文本编辑器的程序设计及代码示例在计算机科学领域,文本编辑器是一种用于编辑文本文件的应用程序。

它允许用户创建、修改和保存文本文件,并提供了一系列功能来方便用户进行编辑操作。

本文将介绍文本编辑器的程序设计原理,以及示范几个常见的代码示例。

一、程序设计原理文本编辑器的程序设计需要考虑以下几个方面:1. 用户界面设计:一个好的文本编辑器应具备直观友好的用户界面,提供各种操作选项和快捷键,使用户能够轻松地进行文本编辑。

2. 文本处理功能:文本编辑器应具备基本的文本处理功能,如插入和删除文本、查找和替换、拷贝和粘贴等。

这些功能需要通过合适的数据结构和算法来实现。

3. 文本格式化:文本编辑器应支持对文本进行格式化操作,如自动对齐、缩进、换行等。

4. 多标签支持:多标签功能允许用户同时打开多个文本文件,并在它们之间切换。

这要求程序设计中能够有效地管理多个文本文件的打开、关闭和切换。

二、代码示例下面是几个简单的代码示例,用于展示文本编辑器的一些基本功能。

1. 创建文本文件```pythondef create_file(filename):# 创建一个新的文本文件file = open(filename, "w")file.close()```2. 打开文本文件```pythondef open_file(filename):# 打开文本文件并返回文件对象 file = open(filename, "r")return file```3. 插入文本```pythondef insert_text(file, position, text): # 在指定位置插入文本file.seek(position)content = file.read()file.seek(position)file.write(text + content)```4. 删除文本```pythondef delete_text(file, start, end):# 删除指定位置的文本file.seek(start)content = file.read()file.seek(start)file.write(content[:end - start])```5. 查找和替换文本```pythondef find_replace(file, old_text, new_text):# 在文本中查找指定内容并替换file.seek(0)content = file.read()new_content = content.replace(old_text, new_text)file.seek(0)file.write(new_content)```6. 关闭文本文件```pythondef close_file(file):# 关闭文本文件file.close()```三、总结通过以上代码示例,我们展示了文本编辑器的一些基本功能,包括创建文件、打开文件、插入和删除文本、查找和替换文本以及关闭文件。

(完整版)c实验报告

(完整版)c实验报告

(完整版)c实验报告实验名称: C语言实验报告实验内容:本次实验主要针对C语言编程进行实验。

通过实验的设计和完成,检验和加深对C语言的理解和应用能力。

实验步骤:1. 实验准备在开始实验之前,需要准备好以下必要的工具和材料:- 计算机- C语言编译器(比如GCC、Clang等)- 文本编辑器(比如Notepad++、Sublime Text等)2. 实验环境搭建在计算机上安装C语言编译器,并配置好相应的环境变量。

这样可以在终端或命令提示符中执行相关的C程序。

3. 编写实验代码根据实验要求,使用文本编辑器编写C语言代码。

根据实验的要求和功能需求,合理设计和组织代码结构,包括头文件的引用、变量的定义、函数的声明和定义等。

4. 编译和运行代码在命令行或终端中使用编译器对编写好的C语言代码进行编译,并生成可执行文件。

编译命令的具体格式根据不同的编译器而有所差异,但一般形式如下:```gcc -o output_file input_file.c```其中,"output_file"表示生成的可执行文件名,"input_file.c"表示待编译的C源代码文件名。

编译成功后,通过命令行或终端执行生成的可执行文件,检查程序的运行结果是否符合预期。

5. 实验结果分析根据实际运行结果,对实验数据进行分析和归纳。

可以通过输出结果、打印特定信息或观察程序的行为来判断程序是否正确地实现了预期的功能。

6. 实验总结在实验报告中对本次实验的过程、方法、结果进行总结,并提出实验中遇到的问题和解决方法。

同时,对所学习的C语言相关知识点进行总结和归纳,以加深对相关知识的理解和记忆。

实验结果:通过本次实验的设计和实现,我成功完成了对C语言编程的实验,达到了预期的目标。

通过编写实际的代码,我巩固了对C语言语法和基本概念的理解。

在实验过程中,我遇到了一些问题,通过查阅资料和与同学的讨论,我成功解决了这些问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

四川大学软件学院实验报告课程名称数据结构实验课时8 实验项目文本编辑器实验时间12到14周实验目的了解c++类的封装和KMP算法。

实验环境Windows平台 VC6.0++实验内容(算法、程序、步骤和方法)部分函数创建思想:创建过程如下:a、定义LinkList指针变量*temp: LinkList *temp;b、定义文本输入变量ch,记录文本行数变量j,记录每行字符数变量i;c、申请动态存储空间:head->next=(LinkList *)malloc(sizeof(LinkList));d、首行头指针的前驱指针为空:head->pre=NULL;首行指针:temp=head->next;首行指针的前驱指针也为空:temp->pre=NULL;定义没输入字符时文章长度为0:temp->length=0;初始化为字符串结束标志,防止出现乱码:for(i=0;i<80;i++)temp->data[i]='\0';e、利用循环进行文本输入for(j=0;j<LINK_INIT_SIZE;j++)// 控制一页{ for(i=0;i<80;i++) //控制一行{ ch=getchar(); //接收输入字符temp->data[i]=ch; //给temp指向的行赋值····temp->length++;//行中字符长度加1if(ch=='#'){NUM=j; break; //文章结束时,Num来记录整个文章的行数}}}在字符输入的过程中,如果在单行输入的字符超过了80个字符,则需要以下操作:输入字符数大于80,重新分配空间建立下一行temp->next=(LinkList *)malloc(sizeof(LinkList)) ;给temp的前驱指针赋值:temp->next->pre=temp;temp指向当前行:temp=temp->next;将下一行初始化为字符串结束标志,防止出现乱码:for(i=0;i<80;i++)temp->data[i]='\0';记录整个文章的行数:temp->row=NUM+1;返回指向最后一行指针:return temp;文本输入部分到此结束。

实验流程图:menuchangegetline BmeSearchdelete_ch add_charchar display Endmain程序清单Header file#include<iostream>#include<string>using namespace std;int* get_next(char* T, int* next);//声明get_next函数以获取next数组。

int KMP(char *S, char *T);//声明KMP函数调用next函数来进行查找。

int get_choice();//选择要执行的功能。

void serach(string S);//定义查找函数,用于进行字符串查找。

void add_char(string &S);//定义添加函数,用于进行字符串添加。

void change(string &S);//定义替换函数,将修改指定位置上的字符为新指定的字符。

void delete_char(string &S);//定义删除函数,将用于删除指定位置上的字符。

void display(string &S);//显示函数,用于显示当前的字符串。

C++soure file#include"textedit.h"using namespace std;int* get_next(const char* T, int* next){//根据T字符串将所得到的next数组值存在next指针指向的数组中int i = 0, j = -1;int length = strlen(T);int *temp = next;*next = -1;while(i< length){if(j==-1 || *(T+i)==*(T+j)){//如果字符串中第i个字符与从头起第j个相同,则i,j分别向后移一位i++;j++;if(*(T+i)!=*(T+j))//当遇到第一个不相等的字符时,当前的j值就是next数组第i个元素的值*(next+i)=j;else*(next+i)=*(next+j); //如果相等,则从字符串开始第j个元素的next值与当前位置的值相同}elsej=*(next+j); //如果遇到第i个元素和从头起第j个元素不相同,则从第j个元素的next值的位置开始比较,即回溯}return temp;}int KMP(string S, string T){int S_Length = S.length();int T_Length = T.length();if( S_Length < T_Length) //如果目标串比要查找的串要短,直接返回失败return 0;int i = 0, j = 0;int* next = new int[T_Length];get_next(T.c_str(), next);while(i < S_Length && j < T_Length){if(j == -1 || *(S.c_str()+i) == *(T.c_str()+j)){ //如果对应i,j号元素相同,则依次向后错一位,否则通过next函数,将j指针回溯一定距离。

i++;j++;}elsej=*(next+j);}if(j>=T_Length)//实际上当j==T_Length时,即意味着查找成功,返回开始字符所在的位置,否则返回失败return i-T_Length+1;return 0;}int get_choice() //获取用户输入的选项,以进行相应操作。

{int temp;cout<<"请输入你即将执行的操作:\n1--查找\t2--添加\t3--替换\n4--删除\t5--显示当前字符串\t6--退出\n你的选择:";while(true){cin>>temp;if(temp<7&&temp>0)//只有输入1、2、3、4、5、6时候才会返回输入的选项。

return temp;else{cout<<"你的输入有误,请重新输入\n你的选择:";}}}void serach(string S){int k;string T;cout<<"请输入要查找的串:";cin.sync();//清空缓存区,否则将自动读入输入选项时候按下的回车键。

getline(cin,T);if(k=KMP(S,T))//KMP的返回值不为0即查找成功时候,if条件判断认为是真。

cout<<"所要查找的字符串从第"<<k<<"个字符开始。

"<<endl;elsecout<<"查找失败"<<endl;}void add_char(string &S){int k;string m;cout<<"请输入你想插入的位置:";while(true){cin>>k;if(k>=0&&k<=S.length())//插入的位置不能在字符串外面。

break;elsecout<<"你输入的位置有误。

请重新输入你想插入的位置:";}cout<<"请输入你要插入的字符串:";cin.sync();//同前getline(cin,m);S=S.insert(k,m); //将字符串m插到S的第k个位置上。

}void change(string &S){//调用String类中将第k个字符到第m个字符替换为新字符串的函数。

int k,m;string temp;cout<<"请输入由第几个字符开始替换:";while(true){cin>>k;if(k<S.length()&&k>=0)//起始位置必须小于长度且不能等于{cout<<"替换至第几个字符:";while(true){cin>>m;if(m<=S.length()&&m>k)//结尾位置必须不能大于字符串长度,并且不能小于起始位置。

break;elsecout<<"输入有误,请重新输入结尾:";}break;}elsecout<<"输入有误,请重新输入开头:";}cout<<"请输入要替换成的字符串:";cin.sync();getline(cin,temp);S.replace(k,m,temp); //将目标串替换至指定位置。

}void delete_char(string &S){int k,m;cout<<"请输入从第几个字符开始删:";while(true){cin>>k;if(k<S.length()&&k>=0)//若k==S.length(),则下面无法删除0个。

{cout<<"删除的字符个数为:";while(true){cin>>m;if((k+m)<=S.length()&&m>0)//同前,删除的最后一个字符的位置不能超出字符串的长度。

break;elsecout<<"输入有误,请重新输入个数:";}break;}elsecout<<"输入有误,请重新输入开始位置:";}S=S.erase(k,m);}void display(string &S){cout<<"当前的字符串为:"<<endl;cout<<S.data()<<endl;}void main(){int choice;string S;cout<<"请输入一个字符串:"<<endl;getline(cin,S);while(true){choice = get_choice();switch(choice){case 1:serach(S);break;case 2:add_char(S);break;case 3:change(S);break;case 4:delete_char(S);break;case 5:display(S);break;default: exit(0);}}}实验内容(算法、程序、步骤和方法)数据记录和计算结论(结果)基本达到了实验的要求。

相关文档
最新文档