教师信息管理系统

程序设计训练

                                       源文件:教师信息管理系统 报告-CSDN博客

                                                                 

信息与控制工程学院

2024年1月

报  告

  • 基础部分
  1. 题目描述

问题分析:问题的本质:三种传参方式的区别,传值型参数是将参数的值复制一份传递给函数或方法。在函数或方法内部对参数进行修改不会影响原始值。引用型参数是将参数的引用(内存地址)传递给函数或方法。在函数或方法内部对参数进行修改会影响原始值。指针型参数是传递参数的内存地址。通过指针可以直接访问和修改内存中的数据。实现思路:做一个函数,将要判别的年份分别用三种传参的方式输入该函数,将判断的结果输出。时间复杂度:O(1)。

代码:

#include <iostream>

using namespace std;

void inspect(int a) {

       if (a / 4 == 0 && a / 100 != 0 || a / 400 == 0)

              cout << "是闰年" << endl;

       else cout << "不是闰年" << endl;

}

void inspect1(int* a) {

       if (*a / 4 == 0 && *a / 100 != 0 || *a / 400 == 0)

              cout << "闰年" << endl;

       else cout << "不是闰年" << endl;

}

void inspect2(int &a) {

       if (a / 4 == 0 && a / 100 != 0 || a / 400 == 0)

              cout << "闰年" << endl;

       else cout << "不是闰年" << endl;

}

int main()

{

       int a;

       cin >> a;

       inspect(a);

       inspect1(&a);

       inspect2(a);

       return 0;

}

运行截图:

总结;问题:不清楚引用传参和指针传参的区别和方式。解决方法:csdn搜索传参方式。区别:传值是通过将实际的数值复制一份传递给函数或方法。函数内对参数的修改不会影响原始值。传引用是传递对象的引用或地址,而不是实际的数值。在函数内对参数的修改会影响原始值。传地址类似于传引用,但传递的是对象的内存地址,通常通过指针来实现。在函数内对参数的修改会影响原始值。效率:传值由于需要复制数据,可能会消耗较多的内存和时间,特别是传递大型对象或数据结构时。传引用不需要复制整个对象,因此在内存和时间上比传值更有效率。但仍然有一些开销,因为需要处理引用。传地址与传引用相似,效率较高。但需要小心空指针和指针悬挂等问题。

  1. 题目描述

问题分析:问题本质:线性表和来链表的创建和使用。实现思路:创建一个动态数组,找到要删除的数,删除该数,继续循环,直到剩下一个数;创建一个循环链表,循环删除要删除的数。时间复杂度:O(n)

代码:

#include <iostream>

#include<vector>

using namespace std;

int main()

{

       int n = 0, m;

       cin >> n >> m;

       vector<int>num(n);

       for (int i = 0;i < n;i++)

              num[i] = i;

       vector<int>::iterator i;

       int d = 0,q=0;

       while (num.size()!=1) {

              i = num.begin();

              for (int j = 1;;j++) {

                     if (num.size() == 1)break;

                     int s = j * m - 1 + q;int k = 1;

                     if (s - d > num.size()) {

                            for (k;;k++)if (k * num.size() > s - d)break;

                     int w = s - (k-1)*num.size() - d;

                            num.erase(i+w);

                            q = s - num.size() - d;

                            d = 1;

                            break;

                     }

                     else if(s - d == num.size()){

                            int w = s - num.size() - d;

                            num.erase(i + w);

                            q = 0;

                            d = 0;

                            break;

                     }

                     else {

                            num.erase(i + s - d);

                            d++;

              }

              }

       }

       cout << num[0]+1;

}

#include <stdio.h>

#include <stdlib.h>

typedef struct LNode {

    int data;

    struct LNode* next;

} LNode, * LinkList;

bool InitList(LinkList& L) {

    L = (LNode*)malloc(sizeof(LNode));  // 分配一个头结点

    if (L == NULL)  // 内存不足分配失败

        return false;

    L->next = L;

    return true;

}

bool ListInsert(LinkList& L, int n) {

    LinkList p, s;

    p = L;

    for (int i = 1; i <= n; i++) {

        s = (LNode*)malloc(sizeof(LNode));

        if (s == NULL)  // 内存不足分配失败

            return false;

        s->data = i;

        s->next = p->next;

        p->next = s;

        p = s;

    }

    return true;

}

void Josephus(LinkList L, int m, int n) {

    LinkList p = L->next, s = L->next;

    while (n != 1) {

        for (int i = 1; i < m; i++) {

            if (p->next == s)p = p->next->next;

            else

                p = p->next;

        }

        if (p->next->next == s->next)

            p = p->next->next;

        LinkList q = p->next;

        free(q);

        n--;// 将p指向下一个节点,继续循环

    }

    printf("%d", p->data);

    free(p);

}

int main() {

    LinkList L;

    int n, m;

    scanf_s("%d%d", &n, &m);

    InitList(L);

    ListInsert(L, n);

    Josephus(L, m, n);

     return 0;

    free(L);

  

}

运行截图:

总结;问题:线性表是没有太大的问题的,但是链表就有问题了,我先是想用链表代替线性表的,但是感觉不太行,链表学的不太好,就想用循环的链表,但是找到头的时候老是找不到,就又想把头给排除在外,花了不少时间,才算做完。解决方法:上csdn找链表的使用方法,自己想想理解。数组与链表的比较:数组具有O(1)的元素访问时间,但在插入/删除元素时为O(n);空间复杂度为O(n)。链表在插入/删除元素时具有O(1)的时间复杂度,但在访问元素时为O(n);空间复杂度也为O(n)。适用场景:数组适用于频繁访问元素、知道索引的情况。链表适用于频繁插入/删除元素的情况。

  1. 题目描述

问题分析:问题的本质:排序的流程问题。思路:快速排序,快速排序的算法思路太麻烦,我直接使用了algorithm中的sort函数,实现快速排序;冒泡排序就写了一个while循环,将比数大的数都放到右边。时间复杂度:快速排序,平均情况:O(n log n);冒泡排序,平均情况:O(n^2)。

代码:

#include <iostream>

#include <algorithm>

using namespace std;

constexpr auto N = 10000;;

int arr[N];

int main()

{

       int n;

       cin >> n;

       cout << "输入顺序:" << endl;

       for (int i = 0;i < n;i++) {

              arr[i] = rand() % 10000;

              cout << arr[i] << "\t";

       }

       cout << "\n";

       clock_t start_time = clock(); {

       sort(arr,arr+n);

       }

       clock_t end_time = clock();

       cout << "输出顺序:" << endl;

       for (int i = 0;i < n;i++) {

              cout << arr[i]<<"\t";

       }

       cout << "\n" << "运行时间:" << static_cast<double> (end_time - start_time) / CLOCKS_PER_SEC * 1000 << "ms" << endl;

}

#include <iostream>

#include <time.h>

using namespace std;

constexpr auto N =1000;;

int arr[N];

int main()

{

       int n,m;

       cin >> n;

       cout << "输入顺序:" << endl;

       for (int i = 0;i < n;i++) {

              arr[i] = rand() % 10000;

              cout << arr[i] << "\t";

       }

       m = n;

       clock_t start_time = clock(); {

              while (m != 1) {

                     for (int i = 0;i < m-1;i++) {

                            if (arr[i] > arr[i + 1])

                            {

                                   int temp;

                                   temp = arr[i];

                                   arr[i] = arr[i + 1];

                                   arr[i + 1] = temp;

                            }

                     }

                     m--;

              }

       }

       clock_t end_time = clock();

              cout << "\n"<<"输出顺序:" << endl;

              for (int i = 0;i < n;i++) {

              cout << arr[i] << "\t";

              }

              cout << "\n" << "运行时间:" << static_cast<double> (end_time - start_time) / CLOCKS_PER_SEC * 1000 << "ms" << endl;

}

运行截图:

总结;(解题过程中出现的问题、解决方法和优化方法,并分析比较这两种方法的时间和空间复杂度以及适应场景;分析比较在9中不同数据上的运行效率)由于使用了sort函数解题时基本上没有问题。比较和分析:冒泡排序,我它在处理大规模数据或者逆序数据时效率较低。具体的优化方法:使用其他更适合大规模数据的排序算法,如快速排序或归并排序,也可以通过对数据进行预处理来提高冒泡排序的性能,对于大规模数据,可以考虑使用并行化的方法来加速排序过程。通过将数据分成多个部分并在多个处理器上同时进行排序,可以显著提高性能。

  1. 题目描述

问题分析: 问题的本质:字符串的检索。思路:定义要查找到字符串,读取输入的字符串,每一行进行比较,看是否有要查找的字符串。时间复杂度:O(n)

代码:

#include <vector>

#include <iostream>

#include <string>

using namespace std;

int main()

{

       vector<int>a;

       string s = {"chi1 huo3 guo1"};

       int n = 1,ans=0;

       while (1) {

              string str;

           getline(cin,str);

              if (str.size() == 1 && str[0] == '.')break;

                     for (int j = 0;j < str.size();j++) {

                            if (str[j] == s[0])

                            {

                                   int count = 0;

                                   for (int k = j;k < j + s.size();k++)

                                   {

                                          if (str[k] != s[k-j])break;

                                          else {

                                                 count++;

                                          }

                                          if (count == 14) {

                                                 a.push_back(n);

                                                 ans++;

                                          }

                                   }

                            }

                            else continue;

                     }

                     n++;

       }

       if (ans) {

              cout << "是" << endl;

              cout << a[0] << "\t" << ans << endl;

       }

       else  cout << " -_-#" << endl;

       return 0;

}

运行截图:

总结:问题:不知道getline函数的使用。解决方法:csdn查找getline函数的使用方法,要先string str;getline(cin,)它们要再一起才行,只能这样用。适用场景:查找文本中的需要的信息。

  1. 题目描述

问题分析:问题的本质:双向链表的指向查找问题。思路:创建链表,添加数据,将数之间有边的数据相互指到一起,查找符合条件的数据。存储结构:双向链表。原因:简单便捷,感觉用树的结构不好做。时间复杂度:O(n)。

代码:

#include <iostream>

#include <vector>

using namespace std;

typedef struct Node{

       int data;

       struct Node* p;

       struct Node* l;

}BiTreeNode, * BiTree;

BiTree initlist(int a) {

       BiTree T;

       T = new Node;

       T->data = a;

       T->l = NULL;

       T->p = NULL;

       return T;

}

void insert(BiTree& T,int b,int a) {

       for (int i = 0;i < b - 1;i++) {

              T = T->l;

       }

       BiTree p;

       p = new Node;

       p->data = a;

       p->l = T->l;

       T->l = p;

       p->p = T;

}

int main() {

       int n,m;

       vector<int>a;

       BiTree T;

      

       cin >> n;

       for (int i = 0;i < n;i++) {

              cin >> m;

              a.push_back(m);

       }

       T = initlist(a[0]);

       for (int i = 1;i < n;i++) {

              int j, k;

              cin >> j >> k;

              insert(T, a[j], a[k]);

       }

       BiTree p;

       p = T;

       for (int i = 1;i < n;i++) {

              p = p->l;

              if (p->p->data == p->data && p->data == p->l->data)

              {

                     cout << "否" << endl;

                     break;

              }

              if (i == n - 1)cout << "YES" << endl;

       }

       return 0;

}

运行截图:

总结;这个问题是我最后做的,数据结构学得不好,不太会写树的代码,当然也是因为这个题说是树,但我感觉它不是树的结构,刚开始的时候又想用树的结构来解题,耽误的不少时间,也没有思路,就放这了。解决方法,就是用双向链表来回指一下,最后一起查有没有符合要求的数据集。优化,解决单个树的独立问题,没有边,只有一个数。

  1. 题目描述

问题分析:(分析问题的本质,描述实现思路和采用的关键技术)

问题本质:类的创建和使用。思路:创建三个类,在类中加入计算面积的函数, 根据输入的信息选择计算面积达函数。关键技术:类的创建和使用。

代码:

#include <math.h>

#include <iostream>

#include <string>

using namespace std;

class rectangle {

public:

       double n, m;

       double area(double n, double m) {

              return n * m;

       }

};

class roud {

public:

       double r;

       double area(double r) {

              double s;

              s = 314 * r * r/100;

              return s;

       }

};

class triangle {

public:

       double x, y, z;

       double area(double x, double y, double z) {

              double p = (x + y + z) / 2;

              double s = sqrt(p * (p - x) * (p - y) * (p - z));

              return s;

       }

};

int main()

{

       int n;char s;

       rectangle re;

       roud rr;

       triangle tr;

       cin >> n;

       for (int i = 0;i < n;i++) {

              cin >> s;

              if (s == 'R') {

                     double x, y;

                     cin >> x >> y;

                     cout << "面积:" << re.area(x, y)<<endl;

              }

              if (s == 'C') {

                     double r;

                     cin >> r;

                     cout << "面积:" << rr.area(r) << endl;

              }

              if (s == 'T') {

                     int x, y,z;

                     cin >> x >> y>>z;

                     cout << "面积:" << tr.area(x,y,z) << endl;

              }

       }

}

运行截图:

总结; c++学习的还是比较好的,但是类还是忘了不少的东西,继承就想不起来怎么用来,多态也是。继承的好处: 继承允许子类继承父类的属性和方法,从而实现代码的复用,减少了重复编码的工作。继承能够实现抽象,通过基类定义通用属性和方法,子类则提供具体实现。这也促使了封装,隐藏了实现细节,使得代码更加模块化和可维护。继承支持多层次的类结构,使得程序的层次结构更加清晰,更容易理解和扩展。修改基类的属性或方法会影响所有的子类,从而减少了修改的工作。同时,添加新的子类也是相对容易的,使系统更容易拓展。多态的好处: 多态允许使用基类类型的引用来引用派生类的对象,使得代码更加灵活。这样可以在运行时选择调用哪个实际的方法,而无需在编译时确定。多态能够简化代码,减少条件语句的使用。通过多态,可以通过基类类型的引用或指针来调用实际类型的方法,而不需要在代码中使用复杂的分支逻辑。多态提高了代码的可扩展性,因为可以通过添加新的派生类来扩展系统而无需修改已有的代码。

二、综合部分

题目描述

每个教师的信息为:教师号、姓名、性别、单位名称、家庭住址、联系电话、基本工资、津贴、生活补贴、应发工资、电话费、水电费、房租、所得税、卫生费、公积金、合计扣款、实发工资。注:应发工资=基本工资+津贴+生活补贴;合计扣款=电话费+水电费+房租+所得税+卫生费+公积金;实发工资=应发工资 - 合计扣款。

A、教师信息处理

(1) 输入教师信息

(2) 插入(修改)教师信息:

(3) 删除教师信息:

(4) 浏览教师信息:

B、教师数据处理:

(1) 按教师号录入教师基本工资、津贴、生活补贴、电话费、水电费、房租、所得税、卫生费、公积金等基本数据。

(2) 教师实发工资、应发工资、合计扣款计算。提示:计算规则如题目。

(3) 教师数据管理提示:输入教师号,读出并显示该教师信息,输入新数据,将改后信息写入文件

(4) 教师数据查询:提示:输入教师号,即读出所有数据信息,并显示出来。

(5) 教师综合信息输出提示:输出教师信息到屏幕。

1. 系统需求分析

(1)内容:

该教师信息管理系统的设计旨在简化学校或教育机构对教师信息和工资管理的任务。通过系统的建立,学校可以更方便地录入、修改、删除和浏览教师的详细信息,同时进行工资数据的计算和管理。系统的意义在于提高工作效率,减轻管理负担,确保教师信息和工资的准确性。

  1. 总体设计

用户界面模块:

Form1: 主界面,包含登录、注册、退出等按钮。

Formlogon: 注册界面,用户填写注册信息。

Formupdate: 查找界面,可以显示个人信息。

Formadmin: 个人信息界面,用于显示信息等管理功能。

数据访问与处理模块:

Dao类: 处理数据库连接、读取、写入等操作。

MySql.Data.MySqlClient: 用于 MySQL 数据库的操作。

图10 系统总体设计流程图

  1. 详细设计

数据库设计:数据库设计:

 (1) 数据库概念结构设计 (E-R 图):

- 实体:教师、教师号、工资、地址、工作地址等。

- 关系:教师和工资之间的关系、教师和地址之间的关系等。

- 属性:教师实体有教师号、姓名、性别等属性,工资实体有基本工资、所得税等属性。

图11 E-R图

图12各模块设计图

点击运行时,会跳到登陆界面,你可以选择登录,注册或者查找。登录之后你可以选择修改信息或者查询信息,它会自动跳转到相关的页面并进行下一步操作。

表1数据库逻辑结构设计1

表2数据库逻辑结构设计2

4.系统实现与调试
关键代码(带注释)及代码调试出现的主要问题,编译语法错误及修改,重点是运行逻辑问题修改和调整。

private void 注销账号ToolStripMenuItem_Click(object sender, EventArgs e)

{

    // 确认是否注销账号

    if (DialogResult.Yes == MessageBox.Show("确认注销", "消息", MessageBoxButtons.YesNo, MessageBoxIcon.Question))

    {

        // 获取当前登录教师的教师号

        string id = Form1.id;

       

        // 创建数据库连接

        Dao dao = new Dao();

        dao.connect();

        

        // 构造 SQL 语句,删除数据库中对应教师号的信息

        string sql = $"delete FROM book where idcard ='{id}'";

        

        // 执行 SQL 语句,返回影响的行数

        if(dao.Execute(sql) > 0)

        {

            MessageBox.Show("注销成功","消息",MessageBoxButtons.OK, MessageBoxIcon.Information);

            dao.DaoClose();

            this.Close();

        }

        else

        {

            MessageBox.Show("注销失败","消息",MessageBoxButtons.OK, MessageBoxIcon.Stop);

            dao.DaoClose();

        }

    }

}

namespace bookmanagesystem

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        // 存储当前登录教师的教师号

        public static string id;

        // 存储当前登录教师的姓名

        public static string name;

        // 登录方法

        private void login()

        {

            // 获取用户输入的教师号

            string id = txtidcard.Text;

            // 创建数据库连接对象

            Dao dao = new Dao();

            dao.connect();

            // 构造 SQL 查询语句,检查是否存在对应教师号的记录

            string sql = $"select * from book where idcard='{id}'";

            MySql.Data.MySqlClient.MySqlDataReader reader = dao.read(sql);

            // 如果找到对应记录

            if (reader.Read() == true)

            {

                // 存储当前登录的教师号

                Form1.id = id;

                // 获取当前登录教师的姓名

                sql = $"select uname from book where idcard='{id}'";

                reader = dao.read(sql);

                reader.Read();

                Form1.name = reader[0].ToString();

                // 清空输入框

                txtidcard.Text = "";

                reader.Close();

                dao.DaoClose();

                // 打开管理员窗口

                Formadmin form = new Formadmin();

                form.ShowDialog();

            }

            else

            {

                // 清空输入框

                txtidcard.Text = "";

                // 提示账号错误

                MessageBox.Show("账号错误", "消息", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);

            }

        }

        private void Form1_Load(object sender, EventArgs e)

        {

        }

        private void label1_Click(object sender, EventArgs e)

        {

        }

        private void radioButton1_CheckedChanged(object sender, EventArgs e)

        {

        }

        // 点击注册按钮事件

        private void btnlogon_Click(object sender, EventArgs e)

        {

            // 打开注册窗口

            Formlogon form = new Formlogon();

            form.ShowDialog();

        }

        // 点击退出按钮事件

        private void btnexit_Click(object sender, EventArgs e)

        {

            // 确认是否退出

            if (DialogResult.Yes == MessageBox.Show("确认退出", "消息", MessageBoxButtons.YesNo, MessageBoxIcon.Question))

            {

                //退出应用程序

                this.Close();

            }

        }

        // 点击登录按钮事件

        private void btnlogin_Click(object sender, EventArgs e)

        {

            // 检查输入框是否为空

            if (txtidcard.Text == "")

            {

                MessageBox.Show("有空项", "消息", MessageBoxButtons.YesNo, MessageBoxIcon.Information);

                return;

            }

            else

            {

                // 执行登录方法

                login();

            }

        }

        // 点击更新信息按钮事件

        private void button1_Click(object sender, EventArgs e)

        {

            // 打开更新信息窗口

            Formupdate form = new Formupdate();

            form.ShowDialog();

        }

    }

}

namespace bookmanagesystem

{

    public partial class Formupdate : Form

    {

        // 数据加载方法

        private void load()

        {

            // 清空数据表

            upt.Rows.Clear();

            // 创建数据库连接对象

            Dao dao = new Dao();

            dao.connect();

            // 构造 SQL 查询语句,查询所有记录

            string sql = $"select * from book";

            MySql.Data.MySqlClient.MySqlDataReader reader = dao.read(sql);

            // 将查询结果添加到数据表中

            while (reader.Read())

            {

                upt.Rows.Add(reader[0].ToString(), reader[1].ToString(), reader[2].ToString(), reader[3].ToString(),

                    reader[4].ToString(), reader[5].ToString(), reader[6].ToString());

            }

            // 关闭数据库连接

            reader.Close();

            dao.DaoClose();

        }

        public Formupdate()

        {

            InitializeComponent();

        }

        // 点击关闭按钮事件

        private void button1_Click(object sender, EventArgs e)

        {

            // 关闭窗口

            this.Close();

        }

        // 点击查询按钮事件

        private void btn_Click(object sender, EventArgs e)

        {

            // 获取查询关键字

            string key = txtkey.Text;

            // 创建数据库连接对象

            Dao dao = new Dao();

            dao.connect();

            // 构造 SQL 查询语句,根据关键字查询记录

            string sql = $"select * from book where uname like '{key}' or idcard like '{key}' or tel like '{key}'";

            MySql.Data.MySqlClient.MySqlDataReader reader = dao.read(sql);

            // 清空数据表

            upt.Rows.Clear();

            // 将查询结果添加到数据表中

            while (reader.Read())

            {

                upt.Rows.Add(reader[0].ToString(), reader[1].ToString(), reader[2].ToString(), reader[3].ToString(),

                    reader[4].ToString(), reader[5].ToString(), reader[6].ToString());

            }

            // 关闭数据库连接

            reader.Close();

            dao.DaoClose();

        }

        // 窗体加载事件

        private void Formupdate_Load(object sender, EventArgs e)

        {

            // 调用数据加载方法

            load();

        }

    }

}

namespace bookmanagesystem

{

    public partial class Formchange : Form

    {

        public Formchange()

        {

            InitializeComponent();

        }

        // 加载用户信息显示在表格中

        private void load()

        {

            dgv.Rows.Clear(); // 清空表格

            Dao dao = new Dao();

            dao.connect();

            // 查询数据库中指定用户的信息

            string sql = $"select * from xinxi where uid='{Form1.id}'";

            MySql.Data.MySqlClient.MySqlDataReader reader = dao.read(sql);

            reader.Read();

            // 将查询结果添加到表格中

            dgv.Rows.Add(reader[0].ToString(), reader[1].ToString(), reader[2].ToString(), reader[3].ToString(),

                reader[4].ToString(), reader[5].ToString(), reader[6].ToString(), reader[7].ToString(),

                reader[8].ToString(), reader[9].ToString(), reader[10].ToString(), reader[11].ToString(), reader[12].ToString());

            reader.Close();

            dao.DaoClose();

        }

        private void Formchange_Load(object sender, EventArgs e)

        {

            // 窗体加载时显示用户信息

            load();

        }

        // 刷新按钮点击事件,重新加载用户信息

        private void button1_Click(object sender, EventArgs e)

        {

            load();

        }

        // 关闭窗体按钮点击事件

        private void button2_Click(object sender, EventArgs e)

        {

            this.Close();

        }

    }

}

private void btnadd_Click(object sender, EventArgs e)

{

    // 检查文本框是否为空

    if (txtallowance.Text.Trim() == "" || txtfund.Text.Trim() == "" || txtlallow.Text.Trim() == "" || txtrent.Text.Trim() == "" ||

        txtsalary.Text.Trim() == "" || txttax.Text.Trim() == "" || txttel.Text.Trim() == "" || txtwefee.Text.Trim() == "")

    {

        MessageBox.Show("有空项", "消息", MessageBoxButtons.OK, MessageBoxIcon.Warning);

        return;

    }

    // 计算薪资相关信息

    int salaryp, totaldd, nsalary;

    salaryp = int.Parse(txtallowance.Text) + int.Parse(txtsalary.Text) + int.Parse(txtlallow.Text);

    totaldd = int.Parse(txttax.Text + txttel.Text) + int.Parse(txtwefee.Text) + int.Parse(txtrent.Text) + int.Parse(psfee.Text) + int.Parse(txtfund.Text);

    nsalary = salaryp - totaldd;

    // 连接数据库

    Dao dao = new Dao();

    dao.connect();

    // 构建插入用户信息的 SQL 语句

    string sql = $"INSERT INTO xinxi VALUES('{Form1.id}', '{txtsalary.Text}', '{txtallowance.Text}', '{txtlallow.Text}', " +

                 $"'{txttel.Text}', '{txtwefee.Text}', '{txtrent.Text}',  '{txttax.Text}',  '{psfee.Text}',  '{txtfund.Text}'," +

                 $" '{salaryp}', '{totaldd}', '{nsalary}')";

    // 执行 SQL 语句,判断是否插入成功

    if (dao.Execute(sql) > 0)

    {

        dao.DaoClose();

        MessageBox.Show("添加成功", "消息", MessageBoxButtons.OK, MessageBoxIcon.Information);

        this.Close();

    }

    else

    {

        dao.DaoClose();

        MessageBox.Show("添加失败", "消息", MessageBoxButtons.OK, MessageBoxIcon.Warning);

    }

}

1. 问题:

在解决问题时,我们应该仔细理解问题的本质,避免误解导致后续的实现中出现逻辑错误。当我们开始编写代码时,码代码过程中可能出现语法错误、逻辑错误,或者对题目要求的理解不准确等问题,这时需要进行仔细的调试和修正。另外,部分编译器可能不支持C++11及以上版本的语法,比如range-based for循环,需要注意选择兼容的语法。

2. 问题解决优化方法:

为了更好地解决问题,我们可以采用以下优化方法:良好的代码风格(包括恰当的缩进、注释、变量命名等),使代码更易读、易维护;进行错误处理,对于不合法的输入要进行处理,提高程序的健壮性;在算法实现中,考虑如何降低时间复杂度、减小空间占用,以提高程序的性能;将代码分成合理的模块或函数,提高代码的复用性和可读性。同时,在团队协作中,交流与讨论也是解决问题的重要手段。总之,通过仔细分析问题,采用合适的数据结构和算法,以及正确的编程方法,能够有效解决问题。及时发现和纠正错误,并对代码进行优化,能提高代码的质量和性能。

5.系统使用测试说明

程序开始运行,弹出如下图13对话框,如果没有账号则要进行注册,点击注册按钮,弹出如下图14所示对话框。输入个人信息,点击注册,弹出如图17所示对话框,输入账号可进行登录,登录后的界面如图16所示。可对账号进行信息管理,添加信息,如图15所示,可对个人的基本工资信息进行添加,查询可以看到自己的工资信息,如图18所示,修改,可以对自己的个人信息进行修改如图15。查找可对所有已注册账号进行信息查询,输入关键字,可对信息进行查找。注销可对已创建的账号进行删除,

图13   登录界面

图14  注册页面

图15 工资信息添加修改界面

图16  个人信息界面

图17  添加页面

图18  查找界面

6.总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值