基于GUI的四则运算

基于GUI的四则运算

李志强 201421123028 连永刚 201421123014 林方言 201421123023

coding 地址 https://git.coding.net/lizhiqiang0x01/GUI-sizeyunsuan.git

一、简述题目要求:


  1、除了整数之外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24

  2、运算符为 +, −, ×, ÷

  3、并且要求能处理用户的输入,并判断错误,打分统计正确率

  4、要求能处理用户输入的真分数,如 1/2, 5/12 等

  5、程序基于GUI 界面

  6、记录用户的对错总数,程序退出再启动的时候,能把以前的对错数量保存并在此基础上增量计算

  7、有计时功能,能显示用户开始答题后的消耗时间

  8、界面支持中文简体/中文繁体/英文,用户选择一种


 二、实现步骤:


  a、需求分析

           写一段程序可以生成GUI界面,在GUI 界面上可以进行中文简体/中文繁体/英文切换,在做题过程中需要计时并显示用户答题时间,在用户输入答案时,需要对输入的参数进行过滤,当用户输入非法文字,例如:“#,@,我不知道”等会被检测到,并给予相应的错误提示,在用户结束答题后,需要显示用户答题后的各种参数并实现可以查看错题库功能。

  b、功能设计

      逻辑结构图

 

       基本功能  

          计时功能,切换语言功能,兼容获取分式和整数参数功能,生成真分式题目以及最简分式功能,运算功能,校验答案功能。

       扩展功能

          过滤非法字符功能,题目进度功能,生成用户错题库功能

       高级功能

          多级运算功能

  c、设计实现

          为满足功能需求,下面主要写了八个函数:

public void add();      //加法运算
public void sub();      //减法运算
public void mul();      //乘法运算
public void div();      //除法运算
public void ran();      //生成题目
public void check();    //校验答案
public string StringClear(string ai)   //过滤非法字符
public void thread()  //计时功能

  d、代码说明[source file]

  • 生成窗体功能
        private void InitializeComponent()
        {
            this.label1 = new System.Windows.Forms.Label();
            this.label3 = new System.Windows.Forms.Label();
            this.button1 = new System.Windows.Forms.Button();
            this.textBox2 = new System.Windows.Forms.TextBox();
            this.radioButton1 = new System.Windows.Forms.RadioButton();
            this.radioButton2 = new System.Windows.Forms.RadioButton();
            this.radioButton3 = new System.Windows.Forms.RadioButton();
            this.SuspendLayout();
            // 
            // label1
            // 
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(154, 81);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(143, 12);
            this.label1.TabIndex = 0;
            this.label1.Text = "请输入题目数(满分100)";
            // 
            // label3
            // 
            this.label3.AutoSize = true;
            this.label3.Location = new System.Drawing.Point(25, 201);
            this.label3.Name = "label3";
            this.label3.Size = new System.Drawing.Size(35, 12);
            this.label3.TabIndex = 2;
            this.label3.Text = "v1.00";
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(178, 166);
            this.button1.Name = "button1";
            this.button1.Size = new System.Drawing.Size(75, 23);
            this.button1.TabIndex = 3;
            this.button1.Text = "开始做题";
            this.button1.UseVisualStyleBackColor = true;
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // 
            // textBox2
            // 
            this.textBox2.Location = new System.Drawing.Point(165, 118);
            this.textBox2.Name = "textBox2";
            this.textBox2.Size = new System.Drawing.Size(100, 21);
            this.textBox2.TabIndex = 5;
            // 
            // radioButton1
            // 
            this.radioButton1.AutoSize = true;
            this.radioButton1.CheckAlign = System.Drawing.ContentAlignment.TopLeft;
            this.radioButton1.Checked = true;
            this.radioButton1.Location = new System.Drawing.Point(13, 13);
            this.radioButton1.Name = "radioButton1";
            this.radioButton1.Size = new System.Drawing.Size(47, 16);
            this.radioButton1.TabIndex = 6;
            this.radioButton1.TabStop = true;
            this.radioButton1.Text = "中文";
            this.radioButton1.UseVisualStyleBackColor = true;
            this.radioButton1.CheckedChanged += new System.EventHandler(this.radioButton1_CheckedChanged);
            // 
            // radioButton2
            // 
            this.radioButton2.AutoSize = true;
            this.radioButton2.Location = new System.Drawing.Point(13, 36);
            this.radioButton2.Name = "radioButton2";
            this.radioButton2.Size = new System.Drawing.Size(65, 16);
            this.radioButton2.TabIndex = 7;
            this.radioButton2.TabStop = true;
            this.radioButton2.Text = "English";
            this.radioButton2.UseVisualStyleBackColor = true;
            this.radioButton2.CheckedChanged += new System.EventHandler(this.radioButton2_CheckedChanged);
            // 
            // radioButton3
            // 
            this.radioButton3.AutoSize = true;
            this.radioButton3.Location = new System.Drawing.Point(13, 59);
            this.radioButton3.Name = "radioButton3";
            this.radioButton3.Size = new System.Drawing.Size(71, 16);
            this.radioButton3.TabIndex = 8;
            this.radioButton3.Text = "中文繁體";
            this.radioButton3.UseVisualStyleBackColor = true;
            this.radioButton3.CheckedChanged += new System.EventHandler(this.radioButton3_CheckedChanged);
            // 
            // Form1
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(443, 255);
            this.Controls.Add(this.radioButton3);
            this.Controls.Add(this.radioButton2);
            this.Controls.Add(this.radioButton1);
            this.Controls.Add(this.textBox2);
            this.Controls.Add(this.button1);
            this.Controls.Add(this.label3);
            this.Controls.Add(this.label1);
            this.Name = "Form1";
            this.Text = "中文";
            this.Load += new System.EventHandler(this.Form1_Load);
            this.ResumeLayout(false);
            this.PerformLayout();

        }
View Code
  • 计时功能
        public void thread()   //创建线程实现计时功能
        {
            int sec = 0;
            int min = 0;
            int hour = 0;
            
            while (true)
            {
                sec++;
                if (sec >=60)
                {
                    min++;
                    sec =0;
                    if (min >=60)
                    {
                        hour++;
                        min =0;
                    }
                }
                s.label10.Text = hour + ":" + min + ":" + sec;
                Thread.Sleep(1000);
                if (s.next == 1) {
                    break; 
                }
            }

        }

            ThreadStart th = new ThreadStart(thread);
            Console.WriteLine("In Main: Creating the Child thread");
            Thread the = new Thread(th);
            the.Start();
  • 切换语言功能
        private void radioButton2_CheckedChanged(object sender, EventArgs e)    //切换成英文
        {
            this.label1.Text = "Please enter the subject number";
            this.button1.Text = "start";
            s.label8.Text = "Time";
            s.label1.Text = "Schedule";
            s.button1.Text = "NEXT";
            this.Text = "English";
            s.Text = "English";
        }


        private void radioButton1_CheckedChanged(object sender, EventArgs e)  //切换成中文简体
        {
            this.label1.Text = "请输入题目数(满分100)";
            this.button1.Text = "开始做题";
            s.label8.Text = "时间";
            s.label1.Text = "题目进度";
            s.button1.Text = "下一题";
            this.Text = "中文";
            s.Text = "中文";
        }

        private void radioButton3_CheckedChanged(object sender, EventArgs e)  //切换成中文繁体
        {
            this.label1.Text = "請輸入題目數(滿分100)";
            this.button1.Text = "開始做題";
            s.label8.Text = "時間";
            s.label1.Text = "題目進度";
            s.button1.Text = "下壹題";
            this.Text = "中文繁體";
            s.Text = "中文繁體";
        }
  • 过滤非法字符功能
        public string StringClear(string ai)
        {
            bool temp = bolnum(ai);
            if (temp == true)
            {
                return ai;
            }
            else
            {
                cro = 1;
                if (this.Text == "中文")
                {
                    MessageBox.Show("输入错误,请正确输入字符!例如:12,1/2");
                }
                else if (this.Text == "English")
                {
                    MessageBox.Show("Input error, please correct input character! For example:12,1/2");
                }
                else
                {
                    MessageBox.Show("輸入錯誤,請正確輸入字符!例如:12,1/2");
                }
                this.textBox1.Text = "";
                return "";
            }
        }

        public bool bolnum(string temp)   //若为非法字符,返回false
        {
            for (int i = 0; i < temp.Length; i++)
            {
                byte tempByte = Convert.ToByte(temp[i]);
                if ((tempByte > 46) && (tempByte < 58))
                    return true;
            }
            return false;
        }
  • 生成用户错题库功能
      FileStream f = new FileStream("cuoti.txt", FileMode.Append, FileAccess.Write);
      StreamWriter fi = new StreamWriter(f);
      fs = "你的答案:" + this.label2.Text + this.label4.Text + this.label5.Text + this.label9.Text + ai + "    正确答案:" + au + "      " + "\r\n";
      fi.Write(fs);
      fi.Flush();
      fi.Close();
      f.Close();
  • 多级运算功能
        public void select()
        {
            int l1, l2;
            Random ra = new Random();
            int x = ra.Next(0, 4);
            switch (x)                          //产生一级运算
            {
                case 0: add(); break;
                case 1: sub(); break;
                case 2: mul(); break;
                case 3: div(); break;
            }
            int y = ra.Next(0, 5);
            switch (y)                         //产生二级运算
            {
                case 0:
                    if (q6 == 1) this.label12.Text = q5.ToString();
                    else this.label12.Text = q5 + "/" + q6;
                    this.label13.Text = "+";
                    this.label14.Text = "";
                    this.label15.Text = "";
                    l1 = r1;l2=r2;
                    r1 = l1 * q6 + l2 * q5;
                    r2 = l2 * q6;
                    break;
                case 1:
                    if (q6 == 1) this.label12.Text = q5.ToString();
                    else this.label12.Text = q5 + "/" + q6;
                    this.label13.Text = "-";
                    this.label14.Text = "(";
                    this.label15.Text = ")";
                    l1 = r1;l2=r2;
                    r1 = l1 * q5 - l2 * q6;
                    r2 = l2 * q6;
                    break;
                case 2:
                    if (q6 == 1) this.label12.Text = q5.ToString();
                    else this.label12.Text = q5 + "/" + q6;
                    this.label13.Text = "×";
                    this.label14.Text = "(";
                    this.label15.Text = ")";
                    l1 = r1;l2=r2;
                    r1 = l1 * q5;
                    r2 = l2 * q6;
                    break;
                case 3:
                    if (q6 == 1) this.label12.Text = q5.ToString();
                    else this.label12.Text = q5 + "/" + q6;
                    this.label13.Text = "÷";
                    this.label14.Text = "(";
                    this.label15.Text = ")";
                    l1 = r1;l2=r2;
                    this.r1 = this.q5 * l2;
                    this.r2 = this.q6 * l1;
                    break;
                case 4:
                    this.label12.Text = "";
                    this.label13.Text = "";
                    this.label14.Text = "";
                    this.label15.Text = "";
                    break;
            }
        }
  • 校验答案功能
        public void check()
        {
            int w = 1;
            for (int i = 2; i < 100; i++)
            {
                if (r1 % i == 0 && r2 % i == 0)
                {
                    w = i;
                }
            }
            r1 = r1 / w; r2 = r2 / w;
            ai = StringClear(this.textBox1.Text);
            if (cro != 1)
            {
                if (r2 == 1)
                    au = this.r1.ToString();
                if (r2 != 1)
                    au = r1 + "/" + r2;
                if (ai == au)
                {
                    n1++;
                }
                if (ai != au)
                {
                    FileStream f = new FileStream("cuoti.txt", FileMode.Append, FileAccess.Write);
                    StreamWriter fi = new StreamWriter(f);
                    fs = "你的答案:" + this.label2.Text + this.label4.Text + this.label5.Text + this.label9.Text + ai + "    正确答案:" + au + "      " + "\r\n";
                    fi.Write(fs);
                    fi.Flush();
                    fi.Close();
                    f.Close();
                    if (this.Text == "中文")
                    {
                        MessageBox.Show("回答错误!正确答案:" + au);
                    }
                    else if (this.Text == "English")
                    {
                        MessageBox.Show("Wrong answer!The correct answer:" + au);
                    }
                    else
                    {
                        MessageBox.Show("回答錯誤!正確答案:" + au);
                    }
                }
            }
        }

 

e、测试运行

1.首页(中文)及过滤错误字符:

2.检查答案,得出成绩报告单:

3.查看错题及其他语言的部分截图:

4、多级运算高级功能

GIF过程浏览

 


 三、PSP


 

PSP2.1 Personal Software Process Stages Estimated time(h) actual time(h)
Planning 计划 1 1.5
· Estimate 估计这个任务需要多少时间 24 40
Development 开发 24 34
· Analysis 需求分析 (包括学习新技术) 1 1.2
· Design Spec 生成设计文档 7 10
· Design Review 设计复审 0.5 0.5
· Coding Standard 代码规范 0.5 0.8
· Design 具体设计 1.5 1.5
· Coding 具体编码 20 30
· Code Review 代码复审 10 15
· Test 测试(自我测试,修改代码,提交修改) 1 3
Reporting 报告 20 25
· 测试报告 1 1.5
· 计算工作量 0.5 1
· 并提出过程改进计划 2 4

 


四、总结


   

      先来一片面包:队友之前作业都是用c++写的,都对c#比较熟悉,代码以我的为基础进行GUI转换。

      再把肉放上:首先我们设计了一套流程图,根据流程图具体分析问题,发现问题,解决问题,问题的解决方法都在博客上做了总结,我们共同编写生成题目功能,实现动态计时功能,错题库功能,语言切换功能,字符过滤功能,对话框的弹出功能,在代码复审期间我们做了加减乘除运算优化升级和代码的重构,代码格式的规范,碰到难点,便和队友lianyg(连永刚)Dialect(林方言)探讨,共同解决,连永刚同学缺点是做事慢了一点,优点持之以恒,最终找到解决方法,林方言同学缺点是对代码语法不是太熟悉,不过他确实挺好问,理解能力好。

      然后再来一片面包:经过了两天的共同奋斗,从刚开始对GUI的一无所知,到将四个GUI窗体灵活调用,最终能实现所有功能,并让界面最大程度简洁化,提高界面整洁度。

     由于要用C#做成GUI界面,并且内容新加了其他功能,下面总结一下这次我们所遇到难点

         问题一:如何产生GUI界面

            解决该问提主要是借助于VS2013平台可自动生成窗体控件,然后阅读自动生成的源码,从中学习并加以利用。

         问题二:计时功能

            由于要计时功能,使时间在窗体上动态变化,这就意味这要使用线程,从而可以保证主线程可以继续监听消息。

         问题三:过滤功能

            在用户输入答案,如果输入非法字符就会被过滤并得到提示,在这里主要是将用户输入的值转化成 char ,然后将其与 ASCII 值进行对比,从而实现此功能。

   We are a team and we work as a team!

   

posted on 2017-03-12 16:14  lizhiqiang0x01  阅读(994)  评论(6编辑  收藏  举报