华南理工大学计算机研究生复试机试复习
调研后发现近三年机试都是数据库+C#做一个小型管理系统。在这里边复习边做笔记。
拿15的作为练手材料。
首先是建立数据库
注意将数据库的文件跟日志的路径放到考试要求的文件夹下。
然后点击右上角的新建查询来建表。建议有约束的表格用SQL语言来建速度较快。
一、建立数据库,并建立以下各表 一个员工可以到多个不同公司上班。
员工关系表EMPLOYEE(员工号EmpNo,员工姓名EmpName,性别EmpSex,年龄EmpAge)
示例:E01, 张三,男, 20
工作关系表WORKS(EmpNo员工号,CmpNo公司号,Salary薪水)
示例:E01,C01,2000
公司关系表COMPANY(CmpNo公司号,CmpName公司名)
示例:C01,阳关科技
通过近三年的题目发现。一般都是建立3个表,中间的表有两个外键是来自于第1, 3两个表的,所以建表前看清楚,先建两个独立的表。
CREATE TABLE EMPLOYEE(
EmpNo varchar(10) primary key,
EmpName nvarchar(20) not null,
EmpSex nvarchar(10) check(EmpSex='男' or EmpSex='女'),
EmpAge int check(EmpAge>0));
注意
- 性别与年龄要加入检测。能检测的都检测
- nvarchar与varchar的区别:中文多点的用nvarchar。
- 建完表后左侧栏没有更新,需要右击“表”这一项进行刷新。
第三个表COMPANY
create table COMPANY(
CmpNo varchar(10) primary key,
CmpName nvarchar(20) not null);
第二个表WORKS
CREATE TABLE WORKS(
CmpNo varchar(10),
EmpNo varchar(10),
Salary int check(Salary>0),
PRIMARY KEY(EmpNo, CmpNo),
foreign key (EmpNo) references EMPLOYEE(EmpNo),
foreign key (CmpNo) references COMPANY(CmpNo));
关系的完整性
实体完整性:必须满足的完整性之一,若一个属性是主属性,则不能为空。
参照完整性:必须满足的完整性之二,比如WORKS中引用了EMPLOYEE的EmpNo,则EmpNo必须是存在于EMPLOYEE中的。
之后便是插入数据,一定要使用语言。可能会要求将insert语句也保存下来。
右键表格,选编辑前200行。
之后备份。右击我们的数据库SCUT,任务,备份。记得修改路径到非C盘。填写文件名加后缀“bak”.
二、基于上述数据库,请使用sql server2005+vs2008或vs2010完成员工信息管理系统,并生成相应的可运行文件(文件名为你的名字)。
具体要求如下:
- 要求程序与数据库能进行有效连接,并具有完善的人机交互界面, 要求有参数输入界面和执行按钮,在界面上有结果输出展现区, 要求不要把所有操作全部集中在一个菜单内。
2.完成对员工关系表的添加,删除,修改和浏览四项功能。老师的性别要求用单选按钮实现。(15分)
3.统计和查询:
(1)根据员工号或员工名查找员工所在的公司名和工资,员工号或员工名不能文本输入,要求使用下拉菜单实现,并与数据库中现有信息一致(10分)
(2)统计年龄至少为40岁员工的总工资,工资按从大到小顺序排列;与数据库中现有信息一致(10分)
(3)查询至少具有两份工作员工的姓名和其公司名。(10分)
4.具有数据完整性校验功能,当出现数据异常和操作异常时,程序应给出清楚完整的异常提示信息。(10分)
先解决SQL查询问题。
首先解决的思路就是将所需要的信息的表连接在一起。使用外键相连。比如将EMPLOYEE& COMPANY相连,select * from EMPLOYEE,COMPANY where EMPLOYEE.EmpNo=COMPANY.CmpNo;
解:(1)表中需要员工号EmpNo,员工名EmpName,员工所在公司名CmpName和工资Salary。所以需要连接三个表。
select EMPLOYEE.EmpNo as '员工号',EMPLOYEE.EmpName as '员工名',
COMPANY.CmpName as '公司名', Salary as '工资'
where EMPLOYEE.EmpNo=WORKS.EmpNo
and COMPANY.CmpNo=WORKS.CmpNo;
- 选出的列名另名为可以用as.
(2)
查询条件1:40岁以上员工
查询条件2:总工资
查询条件3:从大到小排列
- 查询条件1:EMPLOYEE.EmpAge>=40
- 查询条件2:使用GROUP BY聚类查询。group
by的意思是将表按条件分组,再按组内的来进行数学运算。比如WORKS里员工可能在多个公司有岗位工资,我们想查询每个员工的总工资,那么就GROUP
BY EmpNo,在select中select sum(salary)。需要注意的是select中的表的列需要在group
by中有出现。如果group
by中没有EMPLOYEE.EmpName,而select中有EMPLOYEE.EmpName,则会显示group
by中没有该元素,算术表达式则不需要,如下代码的sum(WORKS.Salary) as salary。having则是
用于group - 查询条件3:order by xxx desc.(升序则是asc)
select EMPLOYEE.EmpNo, EMPLOYEE.EmpName, EMPLOYEE.Empage, sum(WORKS.Salary) as salary
from EMPLOYEE, WORKS
where EMPLOYEE.EmpNo=WORKS.EmpNo
group by EMPLOYEE.EmpNo, EMPLOYEE.EmpName,EMPLOYEE.EmpAge
having EMPLOYEE.EmpAge>40
order by salary desc;
(3)至少有两份工作的员工及公司名
计算个数使用count。
select EMPLOYEE.EmpNo
from WORKS
group by EMPLOYEE.EmpNo
having count(EMPLOYEE.EmpNo)>=2;
我们需要这个表中的EmpNo来查找员工的名字,以及公司名。所以连接4个表。这里涉及到嵌套子查询。可以直接将上面代码作为一个独立的表格,比如查询这些有两份工作的员工名字
select EMPLOYEE.EmpName
from EMPLOYEE
where EMPLOYEE.EmpNo in (
select EMPLOYEE.EmpNo
from WORKS
group by EMPLOYEE.EmpNo
having count(EMPLOYEE.EmpNo)>=2);
所以连接四个表。则是
select EMPLOYEE.EmpName, COMPANY.CmpName
from EMPLOYEE, COMPANY, (
select EMPLOYEE.EmpNo
from WORKS
group by EMPLOYEE.EmpNo
having count(EMPLOYEE.EmpNo)>=2) as c1
where EMPLOYEE.EmpNo=c1.EmpNo
and EMPLOYEE.CmpNo=COMPANY.CmpNo;
之后是C#编程。
C#首先是拖控件,有点类似于Andriod。在vs中的视图中打开工具箱侧边栏。常用的控件用图中红框框出来了
先审题。题目要求不要把所有操作全部集中在一个菜单内。所以我们使用容器里的TabControl。将其拖到Form1的窗口中右键属性。在如图中的TabPage位置进入就可以添加,移除标签,并且修改标签中的字。根据题目有四个要求。1是一个显示当前数据库中的EMPLOYEE表格内容并且提供增删改功能,2,3,4分别是上面实现的查询。所以总有4个tab
之后每个标签下都使用ListView来显示查询结果。
C#之ListView
首先是属性:这里只需要改几处,
- FullRowSelect-true
- MultiSelect-false
- GridLines-true
View-details
代码:以上属性更改后点击一项同一行的都会被选中。
· 在修改时需要在两个窗口间传递数据,参考安卓的Intent,我们需要读取该行的数据放到Intent中。此时读取第一行的第一个数据的代码是(注意是数组从0开始)listView1.SelectedItems[0].SubItems[0].Text;
其中SelectedItems是一个数组,里面存放了你选择的ListView行。SubItems则是该行中的某一列。
· 在改与删时代码需要加入判断是否有选中的逻辑。所以此时代码是listView1.SelectedItems.Count>0
,否则会报错:未处理ArgumentOutOfRangeExceptionInvalidArgument=“0”的值对于“index”无效。
参数名: index
· 在显示查询到的数据时需要先加载表头才能够显示出来。代码是
//n是该行分成n等分,m是这个表头占m/n行的宽度
listView1.Columns.Add('表头名',listView1.Width/n-m',HorizontalAlignment.Left)
· 加载表头后要将数据一个个添加到行,行组成表。代码有通用性
//通过查表返回DataTable类型表格,数据由此表格得到,@表示禁止字符串强制转换。注意数据库语句最后要加‘;’
DataTable table=db.GetBySql(@"select * from EMPLOYEE;");
//与EndUpdate()配合有效提高加载速度,注意先建表头
listView1.BeginUpdate();
listView1.Columns.Add("员工编号", listView1.Width / 4 - 1, HorizontalAlignment.Left);
listView1.Columns.Add("员工姓名", listView1.Width / 4 - 1, HorizontalAlignment.Left);listView1.Columns.Add("员工性别", listView1.Width / 4 - 1, HorizontalAlignment.Left);
listView1.Columns.Add("员工年龄", listView1.Width / 4 - 1, HorizontalAlignment.Left);
for(int i=0;i<table.Rows.Count;i++){ListViewItem listViewItem =new ListViewItem();//新建一行for (int j = 0; j < table.Columns.Count; j++) { if (j <= 0){ listViewItem.Text = table.Rows[i][j] + ""; //第一列使用Text。后面才是SubItem} else { listViewItem.SubItems.Add(table.Rows[i][j] + ""); }listView1.Items.Add(listViewItem);//添加该行 }
}
listView1.EndUpdate();
在判断数据有效性时需要遍历整个ListView,使用foreach遍历listView中的ListViewItem。与上面的相同,SubItems[i]表示这一行的第i-1列的内容。
foreach(ListViewItem item in this.listView1.Items){if(Intent.dict['form2_textbox2_text"]+""==item.SubItems[0].Text){}
}
注意在添加行时,第一列是使用listViewItem.Text来设置的。之后则是使用listViewItem.SubItems.Add来添加。dataTable.Row[i][j]要加“”强制转换成字符串
删除选中行:listView1.SelectedItems[0].Remove();
C#之ComboBox
combobox是下拉框。即题目要求的要求使用下拉菜单实现。属性只需要将DropDownStyle设置为DropDownList(不可编辑)。
将员工名/员工编号加载进comboBox
table=db.getBySql(@"select EmpNo from EMPLOYEE");
for(int i=0;i<table.Rows.Count;i++)
for(int j=0;j<table.Columns.Count;j++)
comboBox1.Items.Add(table.Rows[i][j]+"");
comboBox1.SelectedIndex=0;//设置显示为第1个
获取选中的comboBox:comboBox1.Text
在选中查询后,若想表格只显示当前的员工信息,则需要将listView清空,使用listView2.clear();
但使用后表头也会没有,所以需要注意每次clear后重新增加表头
C#之Button
与安卓类似。直接在设计界面选中按钮,然后在属性框中的闪电标志下的Click中填入Click事件函数的函数名,回车,就会自动生成函数
C#之窗口
在Program.cs中可以设定应用程序入口点,默认新建项目时的窗口文件Form1.cs。
Form的属性设置FormBorderStyle为FixedSingle,MaximizeBox,MinimizeBox为false,即无法最大最小化。StartPosition为CenterScreen。事件中Load即弹出窗口时运行的函数。这个项目中有多个子菜单。几个查询都是点击标签即显示,所以在弹出窗口时就要查询好查好,放在Form1_Load()中。鼠标点击事件则按上面说的自动生成,在load函数外。
添加修改员工时需要弹出第二个窗口来填写信息,这时候直接新建一个对象Form2就好。Form2是个新的窗口Form2 form2=new Fomr2();
若要制造登陆窗口切换到另外一个窗口的效果,则使用
this.Hide();
form2.Show();
如果是非初始窗口则可以使用close。
窗口间信息交换
与安卓一样使用Intent的概念。新建一个Intent静态类,这个类是个字典。这样就可以通过键值来存储信息,通过静态的来共享。
using System;
using System.Collections.Generic;
using System.Text;
namespace SCUT
{class Intent{public static Dictionary<string, Object> dict=new Dictiionary<string, object>();}
}
例子:
//存:
Intent.dict["form2_textbox1_text"]=textBox1.Text;
Intent.dict["form2_raidobutton"]="男";
//取:
listViewItem.SubItems.Add(Intent.dict["form2_textbox1_text"]+"");
db.getBySql(@"select EmpName From EMPLOYEE where EmpNo='"+Intent.dict["form2_textbox2_text"]+"';"
连接数据库语句时要特别该变量是字符串还是数字,如果是varchar则要加’ ‘,数字则不用。
使用DialogResult来判断是否正确返回
//form1.cs
if(form2.showDialog()==DialogResult.OK){}//form2.cs
this.DialogResult=DialogReslut.OK;
this.close();
C#之其他控件
- RadioButton:多选一用的RadioButton要放在同一个panel里保证互斥,要取被选中的radioBUtton需要一个个检测if(radioButton.Checked),获取值是radioButton.Text;
- Label: 增加文本说明。
SqlServer
在最开始,先建立两个工具类,一个是数据库的操作,一个是Intent。这里说数据库:
首先是建立连接。写在构造函数中:
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;//DataTable用到
using System.Data.SqlClient;//一系列的数据库操作类用到 private SqlConnection sqlConnection;
public DB(){sqlConnection=new SqlConnection(@"server=.\SQLEXPRESS;database=SCUT;Trusted_Connection=SSPI;");//server名字看数据库的sqlConnection.Open();//要Open,否则无法增删
}
数据库的操作分为增删改和查两大类。因为前一类不会返回表,只执行操作,而查询需要返回的表。
所以分成两个函数;
public Datatable getSql(string sql){SqlDataAdapter sqlDataAdapter=new SqlDataAdapter(new SqlCommand(sql, sqlConnection));DataTable dataTable=new DataTable();sqlDataAdapter.Fill(dataTable);return dataTable;
}public void setSql(string sql){new SqlCommand(sql, sqlConnection).ExecuteNonQuery();
}
最后需要析构函数关闭数据库
public void Dispose(){sqlConnection.Close();
}
最后效果如图:
华南理工大学计算机研究生复试机试复习相关推荐
- 计算机复试机试题目与答案,二零一四年华中科技大学计算机研究生复试机试题目...
2014年华中科技大学计算机研究生复试机试题目 2014年研究生复试终于结束了,因为自己寻找往年机试题目的经历很艰难,故我希望为之后的学弟,学妹们提供一些资料,以供参考. 今年机试题目总共有3道,编译 ...
- 暨南大学计算机研究生复试机试历年真题
师弟师妹: 你好,2022年暨南大学硕士研究计算机专业考研初试已经结束.还能来这个网站的同学,应该是考的比较理想的.在这里,分享下暨大计算机复试的相关经验. 今年较去年比较,最大的区别是没有疫情了.从 ...
- 2013年中南大学计算机研究生复试机试题解
高温假闲着无聊,在voj上把CSU的机试题 刷了一道,可能是因为题目年代比较久远,题目的难度并不是很大.稍稍整理一下,希望以后用得着. 1264: 惠民工程 所有题目中唯一的数据结构题 一道最小生成树 ...
- 华师大计算机在线作业,华东师范大学计算机考研复试机试习题
华东师范大学计算机考研复试机试习题 华东师范大学计算机考研:计算机系.数据学院复试机试历年真题以及AC代码.历年学长总结得到.适用学院:计算机学院.数据学院.软件学院也可参考.sum/=10;prin ...
- 1004: 惠民工程 (2013年中南大学研究生复试机试 )
1004: 惠民工程 时间限制: 1 Sec 内存限制: 128 MB 提交: 404 解决: 81 [提交] [状态] [讨论版] [命题人:外部导入] 题目描述 市政府"惠民工程&q ...
- 2022年华南理工大学计算机考研复试时间
2022年华南理工大学计算机考研复试在几月份呢?2022年华南理工大学计算机考研初试已于2021年12月结束,现已进入2022年,迎接计算机考研党的是考研初试成绩.复试分数线以及复试时间,接下来就由小 ...
- 华南理工大学计算机/软件 复试 经验贴整理
文章目录 最新更新2023/02/24 : 我能提供?(21,22届复试全流程,如何找复试资料,一些学习技巧,前人经验,闲聊,会就答...) 2020年 2019年 其它 资料来源 最新更新2023/ ...
- 上海交大计算机考研复试,上海交大计算机考研复试机试
上海交大 计算机考研 SJTU-CS 复试机试 (2005-2010) 题目 我自己在准备考研时曾做了下06,07,08,09年的题目,并且在博客中提供了一个参考的题解,10年的题目以及11年保研的题 ...
- 南京大学java机试,2019年南京大学计算机考研复试机试真题
目录 第一题 Stepping Numbers 题意 思路 代码 反思 第二题 Nodes from the Root 题意 思路 代码 大佬的标准题解代码: 菜鸡我的又费空间,又费时间,又臭又长,思 ...
最新文章
- Android Layer List 使用实现实例
- 编译Hi3516a osdrv目录
- RCP:解决Navigator快捷键不生效的问题
- webSocket使用心跳包实现断线重连
- Matlab中的文件读取函数
- [导入]关于阶乘的两个常见算法及一个相关面试题
- linux显示mem进行排序,Linux查看系统负载(CPU和MEM考虑)
- SpringBoot引入Redis
- Python办公自动化——8行代码实现文件去重
- 诺基亚3090微信java,适合Asha系列,微信登陆诺基亚S40平台
- spring集成flyway
- 实验一 利用Excel表格进行掷硬币模拟实验
- 范里安《微观经济学:现代观点》(第9版)章节习题精编详解
- [Validation set: 'activiti-executable-process' | Problem: 'activiti-exclusive-gateway-condition-not-
- Chronometer实现计时器 开始、暂停、停止功能
- ios与android指纹识别,iOS开发实现TouchID指纹解锁
- 索尼xz Android 内存,首发Android 9.0索尼新旗舰XZ2P曝光:搭载骁龙845处理器和6GB内存...
- 适合短期内想快速上手数字孪生系统的人使用的数字孪生软件推荐
- RSA算法和RSA数字签名算法
- 电子招投标采购系统源码-适合于招标代理、政府采购、企业采购、工程交易等业务的企业