程序功能:

  1. 提供管理员和客户登录,管理员可创建管理员和客户账号
  2. 管理员可录入图书(影碟),删除图书(影碟),查询客户电话
  3. 客户可借阅和归还图书(影碟),查询展示所有图书(影碟)信息,查询最近借阅的图书(影碟),查询最高借阅图书(影碟)TOP10榜单
  4. 所有上述操作产生的信息都将在退出时格式化存储在文件中,并在运行程序时重新加载,故不会丢失信息。

程序实现:

  1. 采用面向对象思想,对图书(影碟)和员工顾客都进行了抽象
  2. 封装了MemberCollection类,从而实现员工和顾客的一些操作
  3. 封装了图书(影碟)类,从而实现了对图书(影碟)的一些操作。
  4. 有关图书影碟信息的存储修改查询增加都使用了二叉查找树的数据结构,并使用了二叉查找树的增删改查。
  5. 经过反复调试测试优化使用逻辑和界面,几乎无bug。
    注意:程序运行根目录需要两个文件分别为DVDsinfo.txt,staffInfo.txt,并请在staffInfo.txt里写入如下格式内容作为管理员初始账号(注意有个换行):
li 1234

程序运行部分截图:



程序源码:

using Microsoft.SqlServer.Server;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Runtime.Remoting.Messaging;
using System.Security.AccessControl;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;namespace community_library_chsarp
{class showmenu{public static void showmainmenu(){string str = @"
welcome to the Community Library================================
1.Staff Login
2.Member Login
0.Exit
================================Please make a selection (1-2,or 0 to exit);";Console.Write(str);}public static void showsubmenu1(){string str = @"
===============Staff Menu============
1.Add a new movie DVD
2.Remove a movie DVD
3.Register a new Member
4.Find a registered member's phone number
0.Return to main menu
======================================Please make a selection (1-4,or 0 to return to main menu);";Console.Write(str);}public static void showsubmenu2(){string str = @"
==============Member Menu==============
1.Display all movies
2.Borrow a movie DVD
3.Return a movie DVD
4.List current borrowed movie DVDS
5.Display top 10 most popular movies
0.Return to main menu
=======================================Please make a selection (1-5,or 0 to return to main menu);";Console.Write(str);}public static void showaddstaff(){string str = @"
==============ADD Staff Or Customer==============
1.ADD a staff
2.ADD a customer
0.Return to main menu
=======================================Please make a selection (1-2,or 0 to return to main menu);";Console.Write(str);}public static void showregistmenu(){string str = @"
==============Register Menu==============
1.Register for a Satff
2.Register for a Customer
0.Return to last menu
=======================================Please make a selection (1-2,or 0 to return to last menu);";Console.Write(str);}}public class DVD{public bool isborrowed{get;set;}public DateTime borrowdate{get;set;}public DateTime returndate{get;set;}public Dictionary<DateTime, DateTime> borrowrecord;public int borrowcount{get;set;}public string name{get;set;}public int id{get;set;}public DVD(string n, int i){name = n;id = i;isborrowed = false;borrowdate = new DateTime();borrowrecord = new Dictionary<DateTime, DateTime>();}public DVD(string n, int i, string borrowinfo){name = n;id = i;try{int mill = 0;string[] info = borrowinfo.Split(';');borrowrecord = new Dictionary<DateTime, DateTime>();for (int j = 0; j < info.Length - 1; j++){int byear = int.Parse(info[j].Split('-')[0].Split(':')[0]);int bmonth = int.Parse(info[j].Split('-')[0].Split(':')[1]);int bday = int.Parse(info[j].Split('-')[0].Split(':')[2]);int ryear = int.Parse(info[j].Split('-')[1].Split(':')[0]);int rmonth = int.Parse(info[j].Split('-')[1].Split(':')[1]);int rday = int.Parse(info[j].Split('-')[1].Split(':')[2]);if (ryear==1975&& rmonth==12&& rday==1){isborrowed = true;}borrowrecord.Add(new DateTime(byear, bmonth, bday,1,1,1,mill++), new DateTime(ryear, rmonth, rday, 1, 1, 1, mill));}}catch (Exception){throw new Exception();}}}public class BTnode{//节点本身的数据public DVD data;//左孩子public BTnode left;//右孩子public BTnode right;public BTnode(DVD d){data = d;left = right = null;}}public class BinaryTreeDVD{public static void Insert(BTnode newBTnode,  ref BTnode rootDVD){//如果为空树,则插入根节点if (rootDVD == null){rootDVD = newBTnode;}//否则找到合适叶子节点位置插入else{BTnode Current = rootDVD;while (true){BTnode Parent = Current;if (newBTnode.data.id < Current.data.id){Current = Current.left;if (Current == null){Parent.left = newBTnode;//插入叶子后跳出循环break;}}else{Current = Current.right;if (Current == null){Parent.right = newBTnode;//插入叶子后跳出循环break;}}}}}public static int borrowsum(DVD d){if (d.borrowrecord != null){return d.borrowrecord.Count;}return -1;}public static void Findtop10(BTnode theRoot,ref List<DVD> l){if (theRoot != null){if (l.Count == 0)l.Add(theRoot.data);else{if (borrowsum(theRoot.data) > borrowsum(l[l.Count - 1]))l.Add(theRoot.data);else{int i;for ( i = 0; i < l.Count; i++){if (borrowsum(theRoot.data) <= borrowsum(l[i]))break;}l.Insert(i, theRoot.data);}}}elsereturn ;Findtop10(theRoot.left,ref l);Findtop10(theRoot.right, ref l);          }static string str = "";public static string PreOrder(BTnode theRoot, bool flag){            Dictionary<DateTime, DateTime> dc;if (theRoot != null){if (flag){Console.WriteLine("Nmae:" + theRoot.data.name + " id:" + theRoot.data.id + " " + (theRoot.data.isborrowed == true ? "borrowed" : "unborrowed"));}else{str += theRoot.data.name + " " + theRoot.data.id +" ";dc = theRoot.data.borrowrecord;                    foreach (KeyValuePair<DateTime, DateTime> keyval in dc){str +=keyval.Key.Year + ":" + keyval.Key.Month + ":" + keyval.Key.Day + "-";str +=keyval.Value.Year + ":" + keyval.Value.Month + ":" + keyval.Value.Day + ";";}                   str += "\r\n";}PreOrder(theRoot.left, flag);PreOrder(theRoot.right, flag);}return str;}//找到最大节点public static BTnode FindMax(BTnode rootDVD){BTnode current = rootDVD;//找到最右边的节点即可while (current.right != null){current = current.right;}return current;}//找到最小节点public static BTnode FindMin(BTnode rootDVD){BTnode current = rootDVD;//找到最左边的节点即可while (current.left != null){current = current.left;}return current;}public static BTnode Search(int id, BTnode rootDVD){BTnode current = rootDVD;while (true){if (id < current.data.id){if (current.left == null)break;current = current.left;}else if (id > current.data.id){if (current == null)break;current = current.right;}else{return current;}}if (current.data.id != id){return null;}return current;}public static bool delete(BTnode root, int key){Stack<BTnode> stack = new Stack<BTnode>();BTnode p = root, q;while (p != null){// System.out.println(p.val);stack.Push(p);if (p.data.id == key){//删除节点的左右子树都为空 直接将父节点的该左子树或者右子树置空if (p.left == null && p.right == null){//System.out.println(" p.left==null&&p.right==null" + p.val);if (stack.Count!=0){stack.Pop();q = stack.Peek();if (q.left == p){q.left = null;return true;}else{q.right = null;return true;}}else{return false;}//左子树为空 将右子树直接放到父节点的删除节点位置上}else if (p.left == null && p.right != null){// System.out.println(" p.left==null&&p.right!=null" + p.val);if (stack.Count!=0){stack.Pop();q = stack.Peek();if (q.left == p){q.left = p.right;}else{q.right = p.right;}}else{return false;}//右子树为空 左子树放到该节点位置上}else if (p.left != null && p.right == null){//System.out.println(" p.left!=null&&p.right==null" + p.val);if (stack.Count!=0 ){stack.Pop();q = stack.Peek();if (q.left == p){q.left = p.left;}else{q.right = p.left;}return true;}else{return false;}}else{//左右子树都不为空 将左子树节点放到右子树的最左边// System.out.println(" p.left!=null&&p.right!=null" + p.val);BTnode n = p.right;while (n.left != null){n = n.left;}if (!(stack.Count==0)){stack.Pop();q = stack.Peek();if (q.left == p){q.left = p.right;n.left = p.left;}else{q.right = p.right;n.left = p.left;}return true;}else{return false;}}}else{if (p.data.id > key){p = p.left;}else{p = p.right;}}}return false;}//删除二叉查找树中的节点,最麻烦的操作public static BTnode Delete(int key, BTnode rootDVD){if(rootDVD==null){return null;}BTnode parent = rootDVD;BTnode current = rootDVD;//首先找到需要被删除的节点&其父节点while (true){if (key < current.data.id){if (current.left == null)break;parent = current;current = current.left;}else if (key > current.data.id){if (current == null)break;parent = current;current = current.right;}//找到被删除节点,跳出循环else{break;}}//找到被删除节点后,分四种情况进行处理//情况一,所删节点是叶子节点时,直接删除即可if (current.left == null && current.right == null){//如果被删节点是根节点,且没有左右孩子if (current == rootDVD && rootDVD.left == null && rootDVD.right == null){rootDVD = null;}else if (current.data.id < parent.data.id)parent.left = null;elseparent.right = null;}//情况二,所删节点只有左孩子节点时else if (current.left != null && current.right == null){if (current.data.id < parent.data.id)parent.left = current.left;elseparent.right = current.left;}//情况三,所删节点只有右孩子节点时else if (current.left == null && current.right != null){if (current.data.id < parent.data.id)parent.left = current.right;elseparent.right = current.right;}//情况四,所删节点有左右两个孩子else{//current是被删的节点,temp是被删左子树最右边的节点BTnode temp;//先判断是父节点的左孩子还是右孩子if (current.data.id < parent.data.id){parent.left = current.left;temp = current.left;//寻找被删除节点最深的右孩子while (temp.right != null){temp = temp.right;}temp.right = current.right;}//右孩子else if (current.data.id > parent.data.id){parent.right = current.left;temp = current.left;//寻找被删除节点最深的左孩子while (temp.left != null){temp = temp.left;}temp.right = current.right;}//当被删节点是根节点,并且有两个孩子时else{temp = current.left;while (temp.right != null){temp = temp.right;}temp.right = rootDVD.right;rootDVD = current.left;}}return current;}}public class MovieCollection{static BTnode DVDROOT = null;public static BTnode initReadFromTXT(){StreamReader sr = new StreamReader("DVDsinfo.txt", Encoding.ASCII);string[] info = sr.ReadToEnd().Split('\r');DVD d;for (int i = 0; i < info.Length-1; i++)try{string[] infos = info[i].Trim('\n').Split(' ');if (infos.Length == 2){d = new DVD(infos[0].Trim('\n'), int.Parse(infos[1].Trim('\n')));BinaryTreeDVD.Insert(new BTnode(d),ref DVDROOT);}else if (infos.Length == 3){d = new DVD(infos[0].Trim('\n'), int.Parse(infos[1].Trim('\n')), infos[2].Trim('\n'));BinaryTreeDVD.Insert(new BTnode(d),  ref DVDROOT);}else{throw new Exception();}                    }catch (Exception){Console.WriteLine("READ FILE FAILED!");Console.ReadKey();return null;}sr.Close();return DVDROOT;}public static bool WriteToTXT( BTnode btroot){try{StreamWriter sw = new StreamWriter("DVDsinfo.txt", false, Encoding.ASCII);sw.Write(BinaryTreeDVD.PreOrder(btroot, false));                sw.Close();}catch ( Exception){Console.WriteLine("WRITE FILE ERROR!SAVE FAILED! ");Console.ReadKey();return false;}return true;}}class staff{public string name{get;set;}public string pwd{get;set;}public staff(string n, string p){name = n;pwd = p;}}class custom : staff{public string phone;public custom(string n, string p, string ph) : base(n, p){phone = ph;}public custom(string n, string p):base(n,p){phone = "";}public List<DVD> borrowed=new  List<DVD> ();}class MemberCollection{public static List<custom> mc=new  List<custom> ();public static bool addmem(string n, string p){try{mc.Add(new custom(n, p));}catch (Exception){Console.WriteLine("ADD staff FAILED!");Console.ReadKey();return false;}return true;}public static bool addmem(string n, string p, string ph){try{mc.Add(new custom(n, p, ph));}catch (Exception){Console.WriteLine("ADD custom FAILED!");Console.ReadKey();return false;}return true;}public static bool findphone(string name){bool flag = false;foreach (custom c in mc){if (c.name == name){flag = true;Console.WriteLine("phone number is:" + c.phone);Console.ReadKey();}}if (flag)return true;elsereturn false;}public static void findborrowed(custom c){foreach (DVD d in c.borrowed){Console.WriteLine(d.name + " " + d.id);}}public static custom judgestaff(string n, string p){            foreach (custom c in mc){if (c.name == n && c.pwd.TrimEnd('\r') == p){return c;}}return null;}public static bool initstafffromTXT(BTnode btroot){StreamReader sr;try{sr = new StreamReader("staffInfo.txt", Encoding.ASCII);string [] info = sr.ReadToEnd().Split('\r');for(int i=0;i<info.Length-1;i++){if(info[i].Split(' ').Length==3){custom c = new custom(info[i].Trim('\n').Split(' ')[0], info[i].Trim('\n').Split(' ')[1]);string[] borr = info[i].Trim('\n').Split(' ')[2].Split('-');for (int j = 0; j<borr.Length - 1; j++){c.borrowed.Add(BinaryTreeDVD.Search(int.Parse(borr[j]), btroot).data);}mc.Add(c);}else if(info[i].Split(' ').Length == 4){custom c = new custom(info[i].Trim('\n').Split(' ')[0], info[i].Trim('\n').Split(' ')[1], info[i].Trim('\n').Split(' ')[2]);string[] borr = info[i].Trim('\n').Split(' ')[3].Split('-');for (int j = 0; j < borr.Length - 1; j++){c.borrowed.Add(BinaryTreeDVD.Search(int.Parse(borr[j]), btroot).data);}mc.Add(c);}else{return false;}}sr.Close();return true;}catch (Exception){return false; ;}}public static bool savestafffromTXT(){try{StreamWriter sw = new StreamWriter("staffInfo.txt", false, Encoding.ASCII);foreach (custom c in mc){if (c.phone == ""){sw.Write(c.name + " " + c.pwd+" ");                       }else{sw.Write(c.name + " " + c.pwd + " " + c.phone+" ");}foreach (DVD d in c.borrowed){sw.Write(+d.id+"-");}sw.Write("\r\n");}                sw.Close();return true;}catch (Exception){return false;}}class Program{static void Main(string[] args){bool FLAG = false;                              BTnode btroot = MovieCollection.initReadFromTXT();if (!MemberCollection.initstafffromTXT(btroot)){Console.WriteLine(" init failed,press any key to exit");Console.ReadKey();return;}while (true){Console.Clear();showmenu.showmainmenu();int s;try{s = int.Parse(Console.ReadLine());}catch (Exception){Console.WriteLine("input invalidly,input again!");continue;}switch (s){case 1:{string name, pwd;Console.WriteLine("please input username or input # to return:");name = Console.ReadLine();if (name == "#"){break;}Console.WriteLine("please input userpassword:");pwd = Console.ReadLine();custom c = MemberCollection.judgestaff(name, pwd);if (c != null){while (true){Console.Clear();showmenu.showsubmenu1();int s1;try{s1 = int.Parse(Console.ReadLine());}catch (Exception){Console.WriteLine("Input invalidly,please input again!");break;}bool flag = false; ;switch (s1){case 1:{Console.WriteLine("please inupt name and id of movie,use space to split!inpu # to return");try{string str = Console.ReadLine();if (str == "#")break;string[] input = str.Split(' ');BinaryTreeDVD.Insert(new BTnode(new DVD(input[0], int.Parse(input[1]))), ref btroot);Console.WriteLine("ADD SUCCESS!");Console.ReadKey();}catch (Exception){Console.WriteLine("ADD FAILED!");Console.ReadKey();Console.ReadKey();}}break;case 2:{Console.WriteLine("please inupt the DVD's id!");string str = Console.ReadLine();if (str == "#")break;try{if (BinaryTreeDVD.delete( btroot,int.Parse(str))){Console.WriteLine("REMOVE SUCCESS!");}else{Console.WriteLine("REMOVE FAILED!");}    Console.ReadKey();}catch (Exception){Console.WriteLine("REMOVE FAILED!");Console.ReadKey();}}break;case 3:{while (true){string s11;int pwd1,se=-1;Console.Clear();bool flag1 = false;showmenu.showregistmenu();try{se = int.Parse(Console.ReadLine());}catch{Console.WriteLine("input invalidly");Console.ReadKey();break;}switch (se){case 1:{Console.WriteLine("please input name and password,use space to split!");try{s11 = Console.ReadLine();pwd1 = int.Parse(s11.Split(' ')[1]);if (pwd1 > 999 && pwd1 < 10000){MemberCollection.addmem(s11.Split(' ')[0], s11.Split(' ')[1]);}else{throw new Exception();}}catch (Exception){Console.WriteLine("ADD FALIED!");                                                                        Console.ReadKey();}}break;case 2:{Console.WriteLine("please input name ,password and phonenumber,use space to split!");try{s11 = Console.ReadLine();pwd1 = int.Parse(s11.Split(' ')[1]);if (pwd1 > 999 && pwd1 < 10000){MemberCollection.addmem(s11.Split(' ')[0], s11.Split(' ')[1], s11.Split(' ')[2]);}else{throw new Exception();}}catch (Exception){Console.WriteLine("ADD FALIED!");Console.ReadKey();}}break;case 0:{flag1 = true;}break;}if (flag1){break;}}}break;case 4:{Console.WriteLine("please input name");if (!MemberCollection.findphone(Console.ReadLine())){Console.WriteLine("NOT FOUND");Console.ReadKey();}}break;case 0:{flag = true;}break;}if (flag)break;}}else{Console.WriteLine("username or password is uncorrect!");Console.ReadKey();}}break;case 2:{Console.WriteLine("please input user name and password,use space to split!");string input = Console.ReadLine();custom c = null;try{c = MemberCollection.judgestaff(input.Split(' ')[0], input.Split(' ')[1]);}catch(Exception ){Console.WriteLine("input invalidly");Console.ReadKey();break;}if (c != null){while (true){Console.Clear();showmenu.showsubmenu2();bool flag2 = false;switch (int.Parse(Console.ReadLine())){case 1:{BinaryTreeDVD.PreOrder(btroot, true);Console.ReadKey();}break;case 2:{Console.WriteLine("input the id of movie");try{int id = int.Parse(Console.ReadLine());BTnode bt = BinaryTreeDVD.Search(id, btroot);if (bt != null){if (bt.data.isborrowed){Console.WriteLine("borrowed!");Console.ReadKey();}else{bt.data.borrowrecord.Add(new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day,DateTime.Now.Hour,DateTime.Now.Minute,DateTime.Now.Second), new DateTime(1975, 12, 1));bt.data.isborrowed = true;c.borrowed.Add(new DVD(bt.data.name, bt.data.id));Console.WriteLine("BORROW SUCEES!");Console.ReadKey();}}else{Console.WriteLine("NOT FOUND!");Console.ReadKey();}}catch(System.ArgumentException){                                                       Console.ReadKey();}catch (Exception){Console.WriteLine("NOT FOUND!");Console.ReadKey();}}break;case 3:{Console.WriteLine("input the id of movie");try{BTnode bt = BinaryTreeDVD.Search(int.Parse(Console.ReadLine()), btroot);if (bt != null){Dictionary<DateTime, DateTime> tmp =new Dictionary<DateTime, DateTime>( bt.data.borrowrecord);bt.data.borrowrecord.Clear();foreach(KeyValuePair<DateTime,DateTime> kvp in tmp){if (kvp.Value.Year == 1975){bt.data.borrowrecord.Add(kvp.Key, new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute,DateTime.Now.Second, DateTime.Now.Millisecond));bt.data.isborrowed = false;}else{bt.data.borrowrecord.Add(kvp.Key,kvp.Value);}}                                                                                                                   for (int i=0;i<c.borrowed.Count;i++){if(c.borrowed[i].id==bt.data.id)c.borrowed.RemoveAt(i);}Console.WriteLine("RETURN SUCCESS!");Console.ReadKey();}else{Console.WriteLine("NOT FOUND!");Console.ReadKey();}}catch (Exception){Console.WriteLine("NOT FOUND!");Console.ReadKey();}}break;case 4:{foreach (DVD d in c.borrowed)Console.WriteLine("Nmae:" + d.name + " Id:" + d.id);Console.ReadKey();}break;case 5:{List<DVD> l = new List<DVD>();BinaryTreeDVD.Findtop10(btroot,ref l);l.Reverse();for (int i = 0; i < 10 && i < l.Count; i++){Console.WriteLine("name:" + l[i].name + " id:" + l[i].id + " times:" + BinaryTreeDVD.borrowsum(l[i]));}Console.ReadKey();}break;case 0:{flag2 = true;}break;}if (flag2){break;}}}else{Console.WriteLine("username or password is uncorrect!");Console.ReadKey();}};break;case 0:{FLAG = true;};break;}if (FLAG){MemberCollection.savestafffromTXT();MovieCollection.WriteToTXT(btroot);return;}}}}}
}

基于二叉查找树的图书影碟租赁管理系统c#实现(控制台)相关推荐

  1. 基于java的滑雪场学具租赁管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署

    基于java的滑雪场学具租赁管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 基于java的滑雪场学具租赁管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署 ...

  2. 基于javaee的电影碟片租赁管理系统的设计与实现

    随着信息技术在管理中的广泛应用,管理信息系统(MIS)的实施在技术上逐渐成熟.为了适应时代的发展,降低管理成本,提高工作效率,企业需要加强对内部资源(人.钱.物)的有效管理,建立适合自身特点的管理信息 ...

  3. 基于javaee的电影碟片租赁管理系统的设计

    技术:Java.JSP.框架等 摘要: 随着信息技术在管理中的广泛应用,管理信息系统(MIS)的实施在技术上逐渐成熟.为了适应时代的发展,降低管理成本,提高工作效率,企业需要加强对内部资源(人.钱.物 ...

  4. 基于Java实现的汽车租赁管理系统、SSM/SpringBoot两个版本都有+mysql汽车出租系统实现

    基于Java实现的汽车租赁管理系统.SSM/SpringBoot两个版本都有+mysql汽车出租系统实现 感兴趣的朋友可以家 3060912346 主要技术 SpringBoot\SSM(两个版本都有 ...

  5. 基于javaspringboot+vue的汽车租赁管理系统含文档

    项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等.这里根据疫情当下,你 ...

  6. 基于C++的图书推荐与管理系统

    资源下载地址:https://download.csdn.net/download/sheziqiong/85723413 资源下载地址:https://download.csdn.net/downl ...

  7. 基于QT+MySQL的相机租赁管理系统

    资源下载地址:https://download.csdn.net/download/sheziqiong/85760437 资源下载地址:https://download.csdn.net/downl ...

  8. 基于javaEE的在线汽车租赁管理系统ssm

    本迅鹰在线车辆租赁平台主要是针对在线租车用户使用的,系统分为租车用户管理员2部分,本系统实现了用户注册登录,查看新闻信息,查看车辆信息,车辆租借,租借记录管理,归还管理,个人信管理,车辆信息管理,留言 ...

  9. 汽车租赁|基于SSM实现汽车租赁管理系统

    作者主页:编程指南针 作者简介:Java领域优质创作者.CSDN博客专家 .掘金特邀作者.多年架构师设计经验.腾讯课堂常驻讲师 主要内容:Java项目.毕业设计.简历模板.学习资料.面试题库.技术互助 ...

最新文章

  1. libgdx和android界面结合,Android游戏引擎libgdx使用教程5:常用UI类与舞台
  2. codeforces 712 Memory and De-Evolution
  3. django的admin中显示为xxxx object以及元类Meta和__str__的使用
  4. 扫雷程序设计 python_端口扫描
  5. windows访问mysql57_windows下 Mysql5.5升级5.7(其实就是安装了两个版本的mysql)
  6. golang goroutine实现_golang中的Mutex设计原理详解(一)
  7. jsp ---- JSTL
  8. mysql 子查询 根据查询结果更新表
  9. SpringBoot与JdbcTemplate的完美结合
  10. 自动化测试selenium基础面试技巧?
  11. 将PDF论文的公式截图后转成Word可编辑公式
  12. [SUCTF 2018]GetShell 中文字符取反绕过
  13. python爬去新浪微博_使用python抓取新浪微博数据
  14. AutoCAD Civil 3D 2015-2020
  15. 动手学Pytorch深度学习建模与应用
  16. Nacos一致性协议 CP/AP/JRaft/Distro协议
  17. F轮融资3.6亿美元,Keep能撑起20亿美元的估值吗?
  18. ksu7对讲机调频软件_万能对讲机写频软件
  19. python 传奇服务端_Python官方最后通牒:Python 2传奇20年将落幕,Python 3接力!
  20. linux下IIC驱动开发分析

热门文章

  1. @loj - 2288@「THUWC 2017」大葱的神力
  2. 关于输入银行卡号自动识别所属银行的一个API
  3. simulink-2-建模与仿真流程(简单)
  4. in与exist的区别
  5. 互联网医院系统源码智慧医院系统源码在线问诊系统java源码
  6. MySQL与Oracle的应用区别
  7. 什么高大填空四个字动人_什么的香气填空四个字
  8. ubuntu设置固定ip地址的方法
  9. mysql 8.x改密码的姿势
  10. android仿支付宝我的应用编辑界面,Android使用view仿支付宝月账单