数据结构与算法分析
实验四
1 字符编码转换练习
要求:创建一个窗体程序,在输入框1中输入以下字符,然后在选择框中选择一种编码,点编码转换按钮,在输入框2中显示转换后的编码。
输入字符文本:“鎴愰兘鐞嗗伐澶у鐨勬牎璁槸锛氱┓绌朵簬鐞嗭紝鎴愬氨浜庡伐锛”
实现步骤及过程:
- 获取输入框1中的文本,text1
(2)将text1转换成字节流bytes
(3)根据选择框中的选择,确定一个编码,然后采用此编码将字节流bytes转换成字符串。
(4)将text2显示到输入框2中
2 绘图程序实现及数据保存
要求:创建如下绘图程序,完成折线绘制、矩形绘制功能,并实现绘图的撤销与重做、图形的保存与读入等功能,实现线型的设置功能(线宽度和颜色设定)。
窗口界面如下
菜单设置如下
点线型设置菜单,弹出如下线型设置窗口。
在窗口输入线宽度,点击颜色框,弹出如下颜色选择框,
选择一个颜色,点确定后,返回线型设置对话框并刷新当前选择的颜色。
点确定按钮退出线型设置对话框,然后应用新的线宽和颜色绘制直线。(不影响已绘制直线)
实现步骤:
- 设计基本图形类Shape
基类定义
…
枚举类型定义如下
- 创建线类(从基类派生)
…
- 创建矩形类(从基类派生)
…
- 基类预留绘制函数Draw,Save函数,Read函数接口
- 定义线型结构LineStyle,并在基类中定义线性结构变量lineStyle,
线型结构体如下:
基类线型变量lineStyle定义
- 在派生类中实现绘制,保存,和载入
写入文件操作
读文件操作
- 修改派生类的Draw绘制方法,添加线型的应用,为绘制的图形添加线条颜色和宽度。
- 在窗口类定义Shape对象的撤销栈undoStack,重做栈redoStack
- 实现窗口图形绘制菜单,撤销重做按钮等功能
窗口图形对象的绘制方法
- 在窗口类中添加当前线型变量curLineStyle
- 创建一个新的线型设置窗口PenDlg,用于设定当前线型宽度和颜色。
步骤:添加一个新的Form如(PenDlg),在窗口类中添加当前线型变量lineStyle
在窗体中添加一个PictureBox控件作为当前颜色的绘制.
响应Paint消息,在控件上绘制颜色,绘制代码如下。
响应PictureBox鼠标点击事件,实现颜色选择操作。点击颜色控件,弹出颜色对话框并选择颜色。代码如下:
响应确定按钮,将当前的线宽度和颜色赋值给线型变量lineStyle
- 在绘图窗口中响应线型设置菜单点击事件,将当前线型赋给线型窗口对象,调用线型设置窗口程序完成线宽度和颜色修改,将修改后的线型保存到窗口变量curLineStyle
- 在鼠标响应中在添加线和矩形前,将当前线型lineStyle赋值给图形对象。
- 实现保存,载入功能
保存数据
写入文件
从文件读入
(1) 设计基本图形类Shape 基类定义 virtual public void Draw(Graphics g) { } public enum DrawType { Line = 0, Rectangle = 1 } public DrawType Type; public LineStyle LineStyle; public List<PointF> Points = new List<PointF>(); 枚举类型定义如下 enum DrawingMode { None = 0, Line = 1, Rectangle =2 }
(2) 创建线类(从基类派生)public class Line : Shape{ public Line() { Type = DrawType.Line; LineStyle = new LineStyle(); // 初始化线型 } public List<Point>Points = new List<Point>(); override public void Draw(Graphics g) { //g.DrawLines(Pens.Black, Points.ToArray()); Pen pen = new Pen(LineStyle.Color, LineStyle.Width); // 绘制直线 g.DrawLine(pen, Points[0], Points[1]); }(1) 创建矩形类(从基类派生) internal class MyRectangle: Shape { public Point p0; public int width = 0; public int height = 0; override public void Draw(Graphics g) { g.DrawRectangle(Pens.Black, p0.X, p0.Y,width, height); } }
(4) 基类预留绘制函数Draw,Save函数,Read函数接口public virtual void Draw(Graphics g){ public virtual void Write(BinaryWriter br){ public virtual void Read (BinaryReader br)
(5) 定义线型结构LineStyle,并在基类中定义线性结构变量lineStyle, 线型结构体如下 public struct LineStyle { public float Width; public Color Color;
public LineStyle(bool init = true) { Width = 1.0f; Color = Color.Black; } } 基类线型变量lineStyle定义public class Shape{ public LineStyle lineStyle; (6) 在派生类中实现绘制,保存,和载入 写入文件操作 public override void Write(BinaryWriter br){ br.Write((int)type);//写入当前图形对象的类型br.Write(lineStyle.width) ; (/写入当前对象的线宽度br.Write(lineStyle.color.R);//写入当前对象的颜色R分量br.Write(lineStyle.color.G);//写入当前对象的颜色G分量br. Write(lineStyle.color.B);//写入当前对象的颜色B分量br. Write(points.Count);//写入当前对象的点个数 double x,y; for (int i = 0; i < points.Count; i++){ x = points[i].X;y = points[i].Y;br.Write(x) ; br.Write(y) ; 读文件操作public override void Read (BinaryReader br){ double x,y; points.Clear(;//清除当前点数组 type = (DrawType) br.ReadInt32();//读入当前图形对象的类型lineStyle.width = br.ReadSingle() ;//读入当前线宽度 byte r = br.ReadByte();//读入当前对象的颜色R分量byte g = br.ReadByte() ;//读入当前对象的颜色G分量byte b = br.ReadByte();//读入当前对象的颜色B分量lineStyle.color = Color.FromArgb(r,g, b);//构建颜色int count = br.ReadInt32();//读入当前图形对象的坐标点数//依次读入坐标点并添加到数组中 for (int i = 0; i < count ; i++){ x = br.ReadDouble();y = br.ReadDouble() ; points.Add (new PointF((float)x,(float)y)) ; } (7) 修改派生类的Draw绘制方法,添加线型的应用,为绘制的图形添加线条颜色和宽度。
public override void Draw (Graphics g) Pen pen = new Pen(lineStyle.color,lineStyle.width) ;for (int i = 0; i < points.Count - l; i++) g. DrawLine (pen,p1,p2);(
8) 在窗口类定义Shape对象的撤销栈undoStack,重做栈redoStackpublic partial class Forml : Form{ Stack<Shape> undoStack = new Stack<Shape>() ;Stack<Shape> redoStack = new Stack<Shape>() ;
(9) 实现窗口图形绘制菜单,撤销重做按钮等功能 窗口图形对象的绘制方法 void Draw (Graphics g){ Shape[ objs = undoStack.ToArray () ;for (int i=0; i< objs.Length;i++){ objs[i].Draw(g) ;
(10) 在窗口类中添加当前线型变量curLineStyle (11) 创建一个新的线型设置窗口PenDlg,用于设定当前线型宽度和颜色。 步骤:添加一个新的Form如(PenDlg),在窗口类中添加当前线型变量lineStyle public partial class PenDlg : Form{ public LineStyle linesty1e;在窗体中添加一个PictureBox控件作为当前颜色的绘制. 响应Paint消息,在控件上绘制颜色,绘制代码如下。 private void PenDlg_Paint(object sender,PaintEventArgs e){ Graphics g = pictureBox1.CreateGraphics () ; Brush brush = new SolidBrush( lineStyle.color );//去lineStyle中的颜色int width = pictureBox1.Width; int height = pictureBox1.Height ; g.FillRectangle(brush,0,0, width,height);//用指定颜色的画刷填充控件响应PictureBox鼠标点击事件,实现颜色选择操作。点击颜色控件,弹出颜色对话框并选择颜色。代码如下ColorDialog cd = new ColorDialog(); cd.Color = lineStyle.color;//传入当前的颜色if( cd.ShowDialog() == DialogResult.OK){ lineStyle.color = cd.Color;//获取已选择的颜色响应确定按钮,将当前的线宽度和颜色赋值给线型变量lineStyleprivate void OK_Click(object sender,EventArgs e){ linestyle.Width = Convert.ToInt32(textBox1.Text);//获取线宽度DialogResult = DialogResult.OK;/对话框返回值设定为OK(12) 在绘图窗口中响应线型设置菜单点击事件,将当前线型赋给线型窗口对象,调用线型设置窗口程序完成线宽度和颜色修改,将修改后的线型保存到窗口变量curLineStylePenDlg pd = new PenDlg( ; pd.linestyle = curLineStyle; //先传入当前的线型参数 if ( pd.ShowDialog() == DialogResult.OK )//线型设置对话框点了确定按钮{ curLineStyle = pd.lineStyle;//获取最新的线型参数
(13) 在鼠标响应中在添加线和矩形前,将当前线型lineStyle赋值给图形对象。 (14) 实现保存,载入功能 保存数据 写入文件 private void saveloolStripMenultem_Click(object sender,EventArgs e{ SaveFileDialog sd = new SaveFileDialog( ; sd.Filter ="图形文件file(.dat)|.dat|all files(.)|.";if (sd.ShowDialog() == DialogResult.OK)//调用文件保存对话框{ string filename = sd.FileName;//获取保存数据文件名//将当前栈中图形对象写入文件 Shape[] objs = undoStack.ToArray () ; FileStream fs = new FileStream(filename,FileMode.Create);BinaryWriter br = new BinaryWriter(fs); br. Write(objs.Length);//写入图形对象的个数for (int i = 0; i < objs.Length; i++) { objs[i].Write(br); } br.Close( ;从文件读入 OpenFileDialog od = new OpenFileDialog() ; od.Filter = "图形文件 file(.dat)|.dat |all files(.)|.";if (od.ShowDialog() == DialogResult.OK)//调用文件打开对话框{ string filename = od.FileName ;//获取打开数据文件名//将当前文件中的图形对象读入到undo栈中 undoStack.Clear () ; redoStack.Clear( ; FileStream fs = new FileStream(filename,FileMode.Open) ;BinaryReader br = new BinaryReader(fs); int count = br.ReadInt32();//读入图形对象的个数for (int i = 0; i < count; i++) { Shape obj = new Shape) ;obj.Read(br); undoStack.Push(obj) ; } br.Close() ; }
附1 —— C#编码名称和代码对应表
代码页 | 名称 | 显示名称 | |
37 | IBM037 | IBM EBCDIC(美国 - 加拿大) | |
437 | IBM437 | OEM 美国 | |
500 | IBM500 | IBM EBCDIC(国际) | |
708 | ASMO-708 | 阿拉伯字符 (ASMO 708) | |
720 | DOS-720 | 阿拉伯字符 (DOS) | |
需要可私信获取