四则运算3程序

一、设计思路

  第三版程序在第二版上增加了用户填写答案和自动批改答案功能,并且还能显示一共答对了多少题。

  在这里我引入的是datagridview控件来控制用户答题的变量,以及提取运算数和运算符号。在C#中这是一款功能很强大的控件,使用起来也相当方便。

二、程序源代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace suanshu
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            shuliang.Text = "10";
            chengchu.Text = "";
            amout1.Text = "0";
            amout2.Text = "100";
            fushu.Text = "";
            yushu.Text = "";
            hangju.Text = "0";
            dataGridView1.CellBorderStyle = DataGridViewCellBorderStyle.None;
            dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
        }
        Random ra = new Random(System.DateTime.Now.Millisecond);//时间毫秒数,取得随机数
        int rand(int num1, int num2)
        {
            int x;
           // Random ra = new Random(System.DateTime.Now.Millisecond);//时间毫秒数,取得随机数
            x = ra.Next(num1,num2);
            return x;
        }
        bool chongfu(int [] zu,int i,int num)
        {
            if(i==0)
            {
                return true;
            }
            else
            {
                int x=0,biaoji=1;
                while(x<i)
                {
                    if (zu[x] == num)
                    {
                        biaoji = 0;
                        break;
                    }
                    x++;
                }
                if (biaoji == 0)
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
            
        }
        bool cefushu(int num1, int num2,int ifushu)
        {
            if (ifushu ==0)
            {
                if (num1 >= num2)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return true;
            }
        }
        bool ceyushu(int num1, int num2, int iyushu)
        {
            if (iyushu == 0)
            {
                if (num1%num2==0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return true;
            }
        }
        bool sushu(int num,int iyushu)  //检测是否是素数
        {
            if (iyushu == 1)
            {
                return false;
            }
            else
            {
                int i = 2, j = num / 2,biaoji=0;
                while (i <= j)
                {
                    if (num % i == 0)
                    {
                        biaoji = 1;
                        break;
                    }
                    i++;
                }
                if (biaoji == 1)
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            int ishuliang = Convert.ToInt16( shuliang.Text.Trim());
            int ichengchu,iamout1,iamout2,ifushu,iyushu,ihangju;//获取变量参数
            iamout1 = Convert.ToInt16(amout1.Text.Trim());
            iamout2 = Convert.ToInt16(amout2.Text.Trim());
            ihangju = Convert.ToInt16(hangju.Text.Trim());
            if (iamout1 > iamout2)
            {
                MessageBox.Show("您输入的范围错误,第一个数应该小于等于第二个数,现默认范围为1~100");
                iamout1 = 1;
                iamout2 = 100;
                amout1.Text="1";
                amout2.Text ="100";

            }
            if (chengchu.Text.Trim() == "")
            {
                ichengchu = 1;
            }
            else
            {
                ichengchu = 0;
            }
            if (fushu.Text.Trim() == "")
            {
                ifushu = 1;
            }
            else
            {
                ifushu = 0;
            }
            if (yushu.Text.Trim() == "")
            {
                iyushu = 1;
            }
            else
            {
                iyushu = 0;
            }
            //生成一个表
            DataTable dt = new DataTable();
            dt.Columns.Add("num1", Type.GetType("System.Int16"));
            dt.Columns.Add("sign", Type.GetType("System.String"));
            dt.Columns.Add("num2", Type.GetType("System.Int16"));
            dt.Columns.Add("=", Type.GetType("System.String"));
            dt.Columns.Add("write", Type.GetType("System.Int16"));
            dt.Columns.Add("T/F", Type.GetType("System.String"));
            dt.Columns.Add("answer", Type.GetType("System.Int16"));
            //结束
            int i = 0,j=0;
            int num1, num2;
            int [] zu;
            string [] zufu={"+","-","*","/"};
            string[] zufu1 = { "+", "-" };
            zu=new int[ishuliang];
                while (i < ishuliang)
                {
                    j = 0;
                    num1 = rand(iamout1, iamout2);   //rand函数是生成一个随机数
                    while (true)
                    {
                        if (j >= ishuliang)
                        {
                            break;
                        }

                        if (chongfu(zu, i, num1))                //chongfu函数是检测产生的数与前面有木有重复
                        {
                            zu[i] = num1;
                            break;
                        }
                        num1 = rand(iamout1, iamout2);   //rand函数是生成一个随机数
                        j++;
                    }
                    string sign;
                    if (ichengchu == 1)
                    {
                        sign = zufu[rand(0, 4)];
                    }
                    else
                    {
                        sign = zufu1[rand(0, 2)];
                    }
                    if (sign == "/")
                    {
                        if (sushu(num1, iyushu))  //排除素数因素,否则会导致死循环
                        {
                            num2 = 1;
                        }
                        else
                        {
                            j = 0;
                            while (true)
                            {
                                num2 = rand(iamout1, iamout2);
                                if (j >= ishuliang*5)  //为了防止有些数找不到能被整除的数而陷入死循环
                                {
                                    break;
                                }
                                if (num2 == num1) //为了排除出现同一个数相除这种简单的题目
                                {
                                    continue;
                                }
                                if (num2 != 0 && cefushu(num1, num2, ifushu) && ceyushu(num1, num2, iyushu))//num2!=0要放在最前面,防止ceyushu函数中除数为0
                                {
                                    break;
                                }
                                j++;
                            }
                        }
                    }
                    else if (sign == "-")
                    {
                        while (true)
                        {
                            num2 = rand(iamout1, iamout2);
                            if (cefushu(num1, num2, ifushu))
                            {
                                break;
                            }
                        }
                    }
                    else
                    {
                        num2 = rand(iamout1, iamout2);
                    }
                    DataRow dr = dt.NewRow();
                    dr["num1"] = num1;
                    dr["sign"] = sign;
                    dr["num2"] = num2;
                    dr["="] = "=";
                   // dr["write"] = "0";
                    dr["T/F"] = "(在前面填写答案)";
                  //  dr["answer"] = 0;
                    dt.Rows.Add(dr);                  
                    i++;
                }
                dataGridView1.DataSource = dt;
            }
        private void button2_Click(object sender, EventArgs e) //清空
        {
            dataGridView1.DataSource = null;
          /*  DataTable dt = (DataTable)dataGridView1.DataSource;
            dt.Rows.Clear();
            dataGridView1.DataSource = dt;*/
            textBox1.Text = " ";
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (dataGridView1.DataSource != null)
            {     
                int ishuliang = Convert.ToInt16(shuliang.Text.Trim());
                int i, num1, num2, num3, write, biaoji = 0;
                String sgin;
                if (true)
                {
                    for (i = 0; i < ishuliang; i++)
                    {
                        num1 = Convert.ToInt16(dataGridView1.Rows[i].Cells[0].Value);
                        sgin = Convert.ToString(dataGridView1.Rows[i].Cells[1].Value);
                        num2 = Convert.ToInt16(dataGridView1.Rows[i].Cells[2].Value);
                       //write = Convert.ToInt16(dataGridView1.Rows[i].Cells[4].Value);
                        write = 0;
                        if (dataGridView1.Rows[i].Cells[4].Value == DBNull.Value)
                        {
                            write = -156887;
                        }
                        else
                        {
                            write = Convert.ToInt16(dataGridView1.Rows[i].Cells[4].Value); 
                        }
                        if (sgin == "+")
                        {
                            num3 = num1 + num2;
                        }
                        else if (sgin == "-")
                        {
                            num3 = num1 - num2;
                        }
                        else if (sgin == "/")
                        {
                            num3 = num1 / num2;
                        }
                        else
                        {
                            num3 = num1 * num2;
                        }
                        dataGridView1.Rows[i].Cells[6].Value = num3;
                        if (num3 == write)
                        {
                            dataGridView1.Rows[i].Cells[5].Value = "正确";
                        }
                        else
                        {
                            dataGridView1.Rows[i].Cells[5].Value = "错误";
                            biaoji++;
                        }
                        textBox1.Text = "本次作业一共" + ishuliang + "道\r\n" + "正确" + (ishuliang - biaoji) + "道\r\n" + "错误" + biaoji + "";
                    }
                }
                else
                {
                    MessageBox.Show("错误,请先填写答案再批改");
                }
            }
            else
            {
                MessageBox.Show("错误,没有数据,请先生成题目再批改");
            }
        }

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

        }
} }

三、程序截图

四、活动记录表

一、项目计划总结:

 

                                        周活动总结表

姓名:柴珏辉                                       日期:2015.3.16

日期       任务

听课

编写程序

阅读课本

准备考试

 

 

日总计

周日

 

 

 

 

 

 

 

周一

 

 

 

 

 

 

 

周二

 2

 1

 

 

 

 

 3

周三

 

 1.5

 

 

 

 

 1.5

周四

 

 

 

 

 

 

 

周五

 2

 0.5

 

 

 

 

 2.5

周六

 

 

 

 

 

 

 

周总结

 4

 3

 

 

 

 

 7

 

 

                                           二、时间记录表:

学生        柴珏辉                                             日期         3.16             

教师        王建民                                             课程           PSP       

日期

开始时间

结束时间

中断时间

净时间

活动

备注

 3.17

 8:00

 10:00

 

 2

 上课

 软件工程课

 3.17

 6:00

 7:00

 

 1

 编程

 完成结队开发

 3.18

 19:30

 21:00

 

 1.5

 编程

编写四则运算3

 3.20

 8:00

 10:00

 

 2

 上课

 软件工程课

 3.20

 19:30

 20:00

 

 0.5

 编程

 四则运算3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                                            三、缺陷记录日志:

学生       柴珏辉    

日期      3.16   

教员       王建民   

程序号                

日期

编号

类型

引入阶段

排除阶段

修复时间

修复缺陷

 3.18

 1

 

 编译

 编译

 10min

 

 Datetable的行数据添加过程中数据类型引发的问题

 3.18

 2

 

 编译

编译 

20min 

 

Datagridview控件中空元素的判断出现错误

 3.20

 3

 

 设计

 编译

 1min

 

输入数据范围不规范引发的错误

五、实验体会总结

  这次的程序可以说在第二个的基础上稍加改动,不过一开始却并不顺利。我不知道如何在没有数据库的情况下使用datagridview,于是我就上网查询,并且用网上的方法进行了不断的尝试,在几经波折之后还是运行成功了,这次的程序虽然实现了题目的要求,但是一些对错误处理上还是显得很不完善。

  这次实验让我明白了在编程中不会做不要紧,只要知道正确的途径去寻找答案就好

posted on 2015-03-22 10:36  菠萝吃么  阅读(310)  评论(0编辑  收藏  举报

导航