学生随机点名程序
2013-04-23 20:23
330 查看
代码托管地址(svn-checkout):
http://student-call.googlecode.com/svn/trunk/作者水平有限,欢迎高手们指点迷津。
功能描述:
1.导入班级名单(excel)2.随机生成两个学生(当前的和下一个的)
3.对当前的学生进行星级评价
4.评价过的学生加入右侧的历史记录栏
5.保存历史记录到本地
编程语言:C#
主要算法也就是随机算法:
1.先随机产生两个人2.从两个人中选择一个被点到次数较少的一个(增加一定公平性)
最终界面效果图:
代码清单:
模型类:
学生
using System; namespace stdCall.Models { /// <summary> /// 学生模型类:姓名,学号,被点名次数 /// </summary> class Student { private String name; private String number; private int unluckyCallNum; /* private String message;*/ public int UnluckyCallNum { get { return unluckyCallNum; } set { unluckyCallNum = value; } } public Student(String number, String name) { this.name = name; this.number = number; } public Student(String number, String name ,int unluckyCallNum) { this.name = name; this.number = number; this.unluckyCallNum = unluckyCallNum; } public String Number { get { return number; } set { number = value; } } public String Name { get { return name; } set { name = value; } } public String getMessage() { return (number + "," + name); } } }
点名模型
using System; namespace stdCall.Models { /// <summary> /// 点名模型类:id,学生号,星级,课程号 /// </summary> class UnluckyCall { private String id; private String studentid; private int star; private int courseID; public UnluckyCall() { id = ""; studentid = ""; star = 0; courseID = 0; } public UnluckyCall(String id, String studentid, int star, int courseNum) { this.id = id; this.studentid = studentid; this.star = star; this.courseID = courseNum; } public UnluckyCall( String studentid, int star, int courseNum) { this.studentid = studentid; this.star = star; this.courseID = courseNum; } internal String Studentid { get { return studentid; } set { studentid = value; } } public int Star { get { return star; } set { star = value; } } public int CourseID { get { return courseID; } set { courseID = value; } } public String Id { get { return id; } set { id = value; } } /// <summary> /// 获得模型类的信息 /// </summary> /// <returns></returns> public String getMessage() { return ("id:" + id + ",studentid:" + studentid + ",star:" + star.ToString() + ",courseID:" + courseID.ToString() + ""); } } }
模型管理类:
学生管理
using stdCall.MyUtils; using System; using System.Collections; namespace stdCall.Models { /// <summary> /// 学生管理类,学生表为静态Hash表 /// </summary> class StudentsManager { private static Hashtable students = new Hashtable(); public static Hashtable Students { get { return StudentsManager.students; } set { StudentsManager.students = value; } } /// <summary> /// 根据学号获取学生 /// </summary> /// <param name="studentNum"></param> /// <returns></returns> public Student getStudentByNum(String studentNum) { // Student student=null; return (Student)students[studentNum]; } /// <summary> /// 获取所有学生,返回排序后的ArrayList /// </summary> /// <returns></returns> public ArrayList getAllStudents() { ArrayList stds = new ArrayList(); foreach (DictionaryEntry de in students) { stds.Add((Student)(de.Value)); } stds.Sort(new StudentCompare()); return stds; } /// <summary> /// 添加一个学生 /// </summary> /// <param name="studentNum"></param> /// <param name="name"></param> public void addStudent(String studentNum , String name) { students.Add(studentNum, new Student(studentNum, name)); } /// <summary> /// 添加一个学生 /// </summary> /// <param name="studentNum"></param> /// <param name="name"></param> /// <param name="unluckyNum">被点名次数</param> public void addStudent(String studentNum, String name,int unluckyNum) { students.Add(studentNum, new Student(studentNum, name, unluckyNum)); } // // public Student getAPoorStdFairly() // { // Student student = null; // // return student; // } // public bool loadStudents() // { // bool flag = false; // return flag; // } } }
点名模型管理
using System; using System.Collections; namespace stdCall.Models { /// <summary> /// 点名模型管理器,点名表unluckyCalls为静态 /// </summary> class UnluckyCallsManager { private static Hashtable unluckyCalls = new Hashtable(); private static int callid = 0; public static Hashtable UnluckyCalls { get { return UnluckyCallsManager.unluckyCalls; } set { UnluckyCallsManager.unluckyCalls = value; } } /// <summary> /// 根据学生号获取点名次数 /// </summary> /// <param name="studentnum"></param> /// <returns>点名次数</returns> public int getCallNumByStdNum(String studentnum){ int num = 0; foreach (DictionaryEntry de in unluckyCalls) { UnluckyCall uc = (UnluckyCall)de.Value; if (uc.Studentid.Equals(studentnum)) { num++; } } return num; } /************************************************************************/ /* bug */ /************************************************************************/ public ArrayList getCallsByStdNum(String studentnum){ ArrayList unluckycalls = new ArrayList(); foreach (DictionaryEntry de in unluckyCalls) { UnluckyCall uc = (UnluckyCall)de.Value; if (uc.Studentid.Equals(studentnum)) { unluckycalls.Add(uc); } } return unluckycalls; } /// <summary> /// 根据课程号获取点名的学生列表 /// </summary> /// <param name="courseid"></param> /// <returns>学生列表</returns> public ArrayList getPoolStdsByCourseID(int courseid) { ArrayList students = new ArrayList(); foreach (DictionaryEntry de in unluckyCalls) { UnluckyCall uc = (UnluckyCall)de.Value; if (uc.CourseID==courseid) { students.Add(new StudentsManager().getStudentByNum(uc.Studentid)); } } return students; } /************************************************************************/ /* BUG */ /************************************************************************/ /// <summary> /// BUG,未实现 /// </summary> /// <param name="studentnum"></param> /// <param name="courseid"></param> /// <returns></returns> public int getStarBySNumCID(String studentnum,int courseid) { String id = getCallID(); return ((UnluckyCall)unluckyCalls[id]).Star; } /// <summary> /// 添加一个点名 /// </summary> /// <param name="studentNum"></param> /// <param name="star"></param> /// <param name="courseID"></param> public void addUnluckyCall(String studentNum ,int star, int courseID) { String id = getCallID(); unluckyCalls.Add(id, new UnluckyCall(id, studentNum, star, courseID)); } // // public bool loadUnluckyCalls() // { // bool flag = false; // return flag; // } /// <summary> /// 获取点名ID /// </summary> /// <returns></returns> public String getCallID() { callid++; return callid.ToString(); } } }
读取excel的类(可重用)
using System; using System.Collections.Generic; using Excel = Microsoft.Office.Interop.Excel; namespace stdCall.MyExcel { /// <summary> /// Excel读取类 /// </summary> class ExcelHelper { private Excel._Application excelApp; private string fileName = string.Empty; private Excel.WorkbookClass wbclass; public ExcelHelper(string _filename) { excelApp = new Excel.Application(); object objOpt = System.Reflection.Missing.Value; wbclass = (Excel.WorkbookClass)excelApp.Workbooks.Open(_filename, objOpt, false, objOpt, objOpt, objOpt, true, objOpt, objOpt, true, objOpt, objOpt, objOpt, objOpt, objOpt); } /// <summary> /// 所有sheet的名称列表 /// </summary> /// <returns></returns> public List<string> GetSheetNames() { List<string> list = new List<string>(); Excel.Sheets sheets = wbclass.Worksheets; string sheetNams = string.Empty; foreach (Excel.Worksheet sheet in sheets) { list.Add(sheet.Name); } return list; } /// <summary> /// 获取sheet表 /// </summary> /// <param name="name"></param> /// <returns></returns> public Excel.Worksheet GetWorksheetByName(string name) { Excel.Worksheet sheet = null; Excel.Sheets sheets = wbclass.Worksheets; foreach (Excel.Worksheet s in sheets) { if (s.Name == name) { sheet = s; break; } } return sheet; } /// <summary> /// 获取sheetName的所有内容 /// </summary> /// <param name="sheetName">sheet名称</param> /// <returns></returns> public Array GetContent(string sheetName) { Excel.Worksheet sheet = GetWorksheetByName(sheetName); //获取A1 到AM24范围的单元格 Excel.Range rang = sheet.get_Range("A1", "B200"); //读一个单元格内容 //sheet.get_Range("A1", Type.Missing); //不为空的区域,列,行数目 // int l = sheet.UsedRange.Columns.Count; // int w = sheet.UsedRange.Rows.Count; // object[,] dell = sheet.UsedRange.get_Value(Missing.Value) as object[,]; System.Array values = (Array)rang.Cells.Value2; // double d=(double)values.GetValue(1,1); return values; } /// <summary> /// 关闭文件 /// </summary> public void Close() { excelApp.Quit(); excelApp = null; } } }
读取excel并导入文本文件的类
using stdCall.File; using stdCall.MyExcel; using stdCall.Resource; using stdCall; using System; using System.Windows.Forms; namespace stdCall.MyExcel { /// <summary> /// 提供导入excel模块的服务 /// </summary> class ExcelService { ExcelHelper excelHelper ; /// <summary> /// 倒入excel主函数 /// </summary> /// <returns></returns> public bool loadExcel(){ bool flag = false; try { OpenFileDialog ofd = new OpenFileDialog(); //new一个方法 ofd.Filter = "excel文件(*.xls)|*.xls|所有文件(*.*)|*.*"; // ofd.InitialDirectory = Environment.GetFolderPath_r(Environment.SpecialFolder.MyDocuments); //定义打开的默认文件夹位置 ofd.ShowDialog(); if (ofd.FileName == null || ofd.FileName == "") return false; excelHelper = new ExcelHelper(ofd.FileName); FileHelper fileHelper = new FileHelper(); fileHelper.openWriteFile(ResourseLoader.FileSTDSPath, false); Array stds = excelHelper.GetContent("Sheet1"); excelHelper.Close(); int y = 1; do { String stdnum = (stds.GetValue(y, 1)).ToString(); fileHelper.writeSingleData(stdnum); String stdname = stds.GetValue(y, 2).ToString().Trim(); fileHelper.writeSingleData(stdname); y++; } while (stds.GetValue(y, 1) != null); fileHelper.closeFile(); flag = true; } catch (System.Exception ex) { flag = false; } return flag; } } }
读写文件类(可重用)
using System; using System.IO; using System.Windows.Forms; namespace stdCall.File { /// <summary> /// 文本文件读写类,File为静态类 /// </summary> class FileHelper { private static StreamReader readFile; private static StreamWriter writeFile; public static StreamReader ReadFile { get { return FileHelper.readFile; } set { FileHelper.readFile = value; } } public static StreamWriter WriteFile { get { return FileHelper.writeFile; } set { FileHelper.writeFile = value; } } /// <summary> /// 打开读文件,未确认是否关闭 /// </summary> /// <param name="filepath"></param> /// <returns></returns> public bool openReadFile(String filepath) { bool flag = false; try { readFile = new StreamReader(filepath); flag = true; } catch (System.Exception ex) { Console.Write(ex.Message); } return flag; } /// <summary> /// 打开写文件,未确认是否关闭,默认添加内容到尾部 /// </summary> /// <param name="filepath"></param> /// <returns></returns> public bool openWriteFile(String filepath) { bool flag = false; try { writeFile = new StreamWriter(filepath,true); flag = true; } catch (System.Exception ex) { Console.Write(ex.Message); } return flag; } /// <summary> /// 打开写文件,可选择是否覆盖 /// </summary> /// <param name="filepath"></param> /// <param name="apendFlag">false为覆盖</param> /// <returns></returns> public bool openWriteFile(String filepath,bool apendFlag) { bool flag = false; try { writeFile = new StreamWriter(filepath, apendFlag); flag = true; } catch (System.Exception ex) { Console.Write(ex.Message); } return flag; } /// <summary> /// 确认是否关闭,并关闭文件 /// </summary> /// <returns></returns> public bool closeFile() { bool flag = false; try { if (readFile != null) { readFile.Close(); } if (writeFile != null) { writeFile.Close(); } flag = true; } catch (System.Exception ex) { Console.Write(ex.Message); flag = false; } return flag; } /// <summary> /// 读取一行数据 /// </summary> /// <returns></returns> public String readSingleData() { String data = null; try { if (!ReadFile.EndOfStream) { data=readFile.ReadLine().Trim(); } } catch (System.Exception ex) { Console.Write(ex.Message); } return data; } /// <summary> /// 写入一行数据 /// </summary> /// <param name="data"></param> /// <returns></returns> public bool writeSingleData(String data) { bool flag = false; try { writeFile.WriteLine(data); flag = true; } catch (System.Exception ex) { Console.Write("writeSingleData:" + ex.Message); ThreadExceptionDialog warnDialog = new ThreadExceptionDialog(ex); warnDialog.ShowDialog(); flag = false; } return flag; } } }
读取文件并转换为模型的类
using stdCall.File; using stdCall.Models; using stdCall; using System; using System.Windows.Forms; namespace stdCall.Resource { /// <summary> /// 资源加载类,包含名单和点名的文本文件路径(静态) /// </summary> class ResourseLoader { private StudentsManager studentManager = new StudentsManager(); private UnluckyCallsManager unluckyCallsManager = new UnluckyCallsManager(); private static String fileSTDSPath = @".\students.txt"; private static String fileCourseIDPath = @".\course.txt"; /* public static Hashtable static_controls = new Hashtable();*/ public static String FileCourseIDPath { get { return ResourseLoader.fileCourseIDPath; } set { ResourseLoader.fileCourseIDPath = value; } } public static String FileSTDSPath { get { return ResourseLoader.fileSTDSPath; } } private static String fileUCSPath = @".\unluckycalls.txt"; public static String FileUCSPath { get { return ResourseLoader.fileUCSPath; } } private FileHelper fileHelper = new FileHelper(); public static int CourseID = 0; /// <summary> /// 加载所有系统资源(学生列表,点名历史,课程ID) /// </summary> public void loadSystemResourse() { loadUnluckyCalls(); loadStudents(); } /// <summary> /// 加载学生表 /// </summary> public void loadStudents() { fileHelper.openReadFile(fileSTDSPath); while (!FileHelper.ReadFile.EndOfStream) { String stdNum = fileHelper.readSingleData(); String stdName = fileHelper.readSingleData(); new StudentsManager().addStudent(stdNum,stdName,new UnluckyCallsManager().getCallNumByStdNum(stdNum)); } fileHelper.closeFile(); } /// <summary> /// 加载点名历史表 /// </summary> public void loadUnluckyCalls() { fileHelper.openReadFile(fileUCSPath); while (!FileHelper.ReadFile.EndOfStream) { String stdNum = fileHelper.readSingleData(); String star = fileHelper.readSingleData(); String courseID = fileHelper.readSingleData(); new UnluckyCallsManager().addUnluckyCall(stdNum, int.Parse(star), int.Parse(courseID)); } fileHelper.closeFile(); } /// <summary> /// 加载课程ID,未实现 /// </summary> public void loadCourseID() { /* CourseID = 2;*/ fileHelper.openReadFile(fileCourseIDPath); CourseID = int.Parse(fileHelper.readSingleData().Trim())+1; fileHelper.closeFile(); } /// <summary> /// 设置此堂课程编号 /// </summary> /// <param name="courseid"></param> public void setCourseID(int courseid) { CourseID = courseid; FileHelper fh = new FileHelper(); fh.closeFile(); fh.openWriteFile(ResourseLoader.FileCourseIDPath,false); try { fh.writeSingleData(courseid.ToString()); } catch (System.Exception ex) { ThreadExceptionDialog warnDialog = new ThreadExceptionDialog(ex); warnDialog.ShowDialog(); } fh.closeFile(); } } }
随机算法模块:
服务类
using stdCall.MyAnimate; using stdCall.Models; using stdCall; namespace stdCall.MyRandom { /// <summary> /// 提供核心随机服务 /// </summary> class RandomService { public static Student currentStudent; public static Student nextStudent; private StudentsManager studentManager = new StudentsManager(); /// <summary> /// 点击random按钮触发,随机主函数,包括动画 /// 先做当前学生Label的动画(做 AnimateService.animateNum次:获取随机学生,进行动画) /// 再做下一个学生Label的动画(做 AnimateService.animateNum次:Service.getAnimateService().animateNextResulted()) /// </summary> public void startRandom(){ AnimateService animateService = new AnimateService(); Student std = null; int num = AnimateService.animateNum; System.Collections.ArrayList stds = studentManager.getAllStudents(); for (int i = 0; i < num; i++) { std = Caculator.getAPoorStdNum(stds); animateService.animateCurrentStd(std, i); } RandomService.currentStudent = std; RandomService.nextStudent=animateService.animateNextAndReturnStd(); } } }
具体算法实现类
using stdCall.Models; using System; using System.Collections; namespace stdCall.MyRandom { /// <summary> /// 核心算法类 /// </summary> class Caculator { public static int RandomStdNum = 2; /// <summary> /// 按算法获取一个可怜的学生 /// </summary> /// <param name="calllist">包含点名次数的学生列表</param> /// <returns>学生</returns> public static Student getAPoorStdNum(ArrayList calllist) { int index= decideFinally(calllist, randomFirstly(calllist.Count)); Student std=(Student)calllist[index]; new StudentsManager().getStudentByNum(std.Number).UnluckyCallNum++; return std; } /// <summary> /// 初始随机产生RandomStdNum个学生索引 /// </summary> /// <param name="range">随机数范围</param> /// <returns>RandomStdNum个学生索引数组</returns> public static int[] randomFirstly(int range) { int[] s=new int[RandomStdNum]; for (int i = 0; i < RandomStdNum; i++) { s[i] = -1; } s = getRandomNum(RandomStdNum, 0, range); return s; } /// <summary> /// 按公平算法决定最终的倒霉鬼索引 /// </summary> /// <param name="calllist">包含点名次数的学生列表</param> /// <param name="students">初始随机产生的学生索引数组</param> /// <returns>最终倒霉鬼索引</returns> public static int decideFinally(ArrayList calllist,int []students) { int luckiestStudent = 0; int fairness = 1000; for (int i = 0; i < RandomStdNum; i++) { ArrayList ca = new ArrayList(); foreach (Student std in calllist) { ca.Add(new Student(std.Number,std.Name,std.UnluckyCallNum)); } int index = students[i]; ((Student)(ca[index])).UnluckyCallNum++; if (computeUnlucky(ca) < fairness) { luckiestStudent = students[i]; fairness = computeUnlucky(ca); } } return luckiestStudent; } /// <summary> /// 计算公平值,各个学生倒霉值的平方的和 /// </summary> /// <param name="calllist">包含点名次数的学生列表</param> /// <returns>公平值</returns> public static int computeUnlucky(ArrayList calllist) { int result = 0; foreach(Student std in calllist){ result += std.UnluckyCallNum * std.UnluckyCallNum; } return result; } /// <summary> /// 随机产生num个数 /// </summary> /// <param name="num"></param> /// <param name="minValue">范围最小值(包含)</param> /// <param name="maxValue">范围最大值(不包含)</param> /// <returns></returns> private static int[] getRandomNum(int num, int minValue, int maxValue) { Random ra = new Random(unchecked((int)DateTime.Now.Ticks)); int[] arrNum = new int[num]; int tmp = 0; for (int i = 0; i <= num - 1; i++) { tmp = ra.Next(minValue, maxValue); //随机取数 arrNum[i] = getNum(arrNum, tmp, minValue, maxValue, ra); //取出值赋到数组中 } return arrNum; } /// <summary> /// 递归,确保随机不重复 /// </summary> /// <param name="arrNum"></param> /// <param name="tmp"></param> /// <param name="minValue"></param> /// <param name="maxValue"></param> /// <param name="ra"></param> /// <returns></returns> private static int getNum(int[] arrNum, int tmp, int minValue, int maxValue, Random ra) { int n = 0; while (n <= arrNum.Length - 1) { if (arrNum == tmp) //利用循环判断是否有重复 { tmp = ra.Next(minValue, maxValue); //重新随机获取。 getNum(arrNum, tmp, minValue, maxValue, ra);//递归:如果取出来的数字和已取得的数字有重复就重新随机获取。 } n++; } return tmp; } } }
评价模块:
评价服务
using stdCall.MyRandom; using stdCall.Resource; using stdCall.TotalService; using stdCall; using System.Windows.Forms; using stdCall.MyUtils; namespace stdCall.MyEvaluation { /// <summary> /// 继承ResourceGet,提供评价模块的服务 /// </summary> class EvaluateService:ResourceGet { Evaluation evaluation = new Evaluation(); /// <summary> /// 评价主函数 /// 点击星星触发 /// 因为逻辑和第一次不同,判断是否已做了第一次随机,没有不继续 /// 添加当前学生到历史记录 /// 改变RandomService.currentStudent=RandomService.nextStudent; /// 延迟,让星星保留一段时间 /// </summary> /// <param name="sender">点击的星星</param> public void evaluateCurrentStd(object sender){ if (RandomService.nextStudent == null || RandomService.currentStudent == null) { return; } Panel panel_history = (Panel)resources["panel_history"]; evaluation.markStarAndAddHisLabel((PictureBox)sender, RandomService.currentStudent, panel_history.Controls); Utils.Delay(500); FormMain.clearStars(); Service.getAnimateService().animateCurrentStd(RandomService.nextStudent, 1); RandomService.currentStudent = RandomService.nextStudent; RandomService.nextStudent=Service.getAnimateService().animateNextAndReturnStd(); //Utils.Delay(100); } } }
评价具体实现的类
using stdCall.History; using stdCall.Models; using stdCall.Resource; using System; using System.Collections; using System.Windows.Forms; namespace stdCall.MyEvaluation { /// <summary> /// 评价类 /// </summary> class Evaluation { public static ArrayList picStars; public static int historyPosx = 0; public static int historyPosy = 0; public static Label latestHistoryLabel = new Label(); private static bool firstFlag = true; private const int blankInside = 5; private const int blankOutside = 10; private const int picStarHeight = 20; /// <summary> /// 待优化,评分,并生成星级图片到历史记录栏,直接添加至外部容器,并返回一个包含学生姓名的历史记录Label,在外部添加 /// </summary> /// <param name="picstar">星级评价(0-5)</param> /// <param name="currentStd"></param> /// <param name="collection">容器类</param> /// <returns>包含学生姓名的历史记录Label</returns> public void markStarAndAddHisLabel(PictureBox picstar, Student currentStd,Control.ControlCollection collection) { if (currentStd == null) return ; int stars = 0; foreach (PictureBox pb in picStars) { if (pb != picstar) { pb.Load("star_yellow.png"); stars++; } else { pb.Load("star_yellow.png"); stars++; break; } } new StudentsManager().getStudentByNum(currentStd.Number).UnluckyCallNum++; new CurrentHistory().addUnluckyCall(currentStd.Number,stars,ResourseLoader.CourseID); if (firstFlag) { latestHistoryLabel = generateHistoryLabelStars(collection, currentStd.Name, stars, historyPosx, historyPosy); firstFlag = false; } else { latestHistoryLabel = generateHistoryLabelStars(collection, currentStd.Name, stars, latestHistoryLabel); } collection.Add(latestHistoryLabel); } private Label generateHistoryLabelStars(Control.ControlCollection collection, String text, int stars, Label label) { generateHistoryStar(collection, stars, label.Location.X, label.Location.Y + label.Size.Height * 2 + picStarHeight + blankInside*2 + blankOutside); return generateLabel(text, label.Location.X, label.Location.Y + label.Size.Height + blankOutside + picStarHeight+blankInside); } /// <summary> /// 生成一个历史记录Label /// </summary> /// <param name="text">Label内容</param> /// <param name="posx">Label位置x</param> /// <param name="posy">Label位置y</param> /// <returns></returns> public Label generateHistoryLabel(String text, int posx, int posy) { historyPosy += 45; return generateLabel(text,posx,posy); } /// <summary> /// 生成星级图片到历史记录栏,直接添加至外部容器,并返回一个包含学生姓名的历史记录Label,在外部添加 /// </summary> /// <param name="collection">外部容器</param> /// <param name="text"></param> /// <param name="stars">星级(0-5)</param> /// <param name="posx"></param> /// <param name="posy"></param> /// <returns></returns> public Label generateHistoryLabelStars(Control.ControlCollection collection,String text, int stars,int posx, int posy) { /* historyPosy += 65;*/ Label lable=generateLabel(text, posx, posy); generateHistoryStar(collection, stars,posx, posy +lable.Size.Height+blankInside); return lable; } /// <summary> /// 生成并返回一个Label /// </summary> /// <param name="text"></param> /// <param name="posx"></param> /// <param name="posy"></param> /// <returns></returns> private Label generateLabel(String text, int posx, int posy) { Label mylabel = new Label(); mylabel.AutoSize = true; mylabel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; mylabel.Font = new System.Drawing.Font("Buxton Sketch", 21.75F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic))), System.Drawing.GraphicsUnit.Point, ((byte)(0))); mylabel.Location = new System.Drawing.Point(posx, posy); mylabel.Size = new System.Drawing.Size(164, 38); mylabel.TabIndex = 1; mylabel.Text = text; return mylabel; } /// <summary> /// 根据评分生成历史记录栏的星级,直接添加至外部容器 /// </summary> /// <param name="collection">外部容器</param> /// <param name="stars"></param> /// <param name="posx"></param> /// <param name="posy"></param> public void generateHistoryStar(Control.ControlCollection collection,int stars,int posx,int posy){ int starPosX = posx; int starPosY = posy; for (int i = 0; i < stars; i++) { System.Windows.Forms.PictureBox pictureBox_star; pictureBox_star = new System.Windows.Forms.PictureBox(); pictureBox_star.Location = new System.Drawing.Point(starPosX, starPosY); pictureBox_star.Name = "pictureBox_stars"; pictureBox_star.Size = new System.Drawing.Size(picStarHeight, picStarHeight); pictureBox_star.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; pictureBox_star.TabIndex = 3; pictureBox_star.TabStop = false; /* pictureBox_star.Click += new System.EventHandler(this.pictureBox_stars_Click);*/ pictureBox_star.Load("star_yellow.png"); collection.Add(pictureBox_star); // picStars.Add(pictureBox_star); starPosX += 25; } } } }
历史记录模块:
历史记录服务类
using stdCall; namespace stdCall.History { /// <summary> /// 提供保存当前历史的服务 /// </summary> class HistoryService { CurrentHistory currentHistory = new CurrentHistory(); /// <summary> /// 保存当前历史主函数 /// </summary> /// <returns></returns> public bool saveCurrentHistory() { bool flag = false; try { currentHistory.save(); flag = true; } catch (System.Exception ex) { flag = false; } return flag; } } }
历史记录模型类
using stdCall.Models; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace stdCall.History { class unluckSavingCall:UnluckyCall { private bool saveflag = false; public unluckSavingCall(string studentid, int star, int courseNum) { // TODO: Complete member initialization this.Studentid = studentid; this.Star = star; this.CourseID = courseNum; } /// <summary> /// 防止重复保存 /// </summary> public bool Saveflag { get { return saveflag; } set { saveflag = value; } } } }
历史记录具体实现类
using stdCall.File; using stdCall.Models; using stdCall.Resource; using System; using System.Collections; using System.Windows.Forms; namespace stdCall.History { /// <summary> /// 历史记录类 /// </summary> class CurrentHistory { public static ArrayList unluckSavingCalls = new ArrayList(); /// <summary> /// 保存历史记录到ResouseLoader.FileUCSPath /// </summary> /// <returns></returns> public bool save(){ new FileHelper().closeFile(); new FileHelper().openWriteFile(ResourseLoader.FileUCSPath); bool flag = true; foreach (unluckSavingCall uc in unluckSavingCalls) { if (!uc.Saveflag) { try { new FileHelper().writeSingleData(uc.Studentid); new FileHelper().writeSingleData(uc.Star.ToString()); new FileHelper().writeSingleData(uc.CourseID.ToString()); uc.Saveflag = true; } catch (System.Exception ex) { flag = false; ThreadExceptionDialog warnDialog = new ThreadExceptionDialog(ex); warnDialog.ShowDialog(); uc.Saveflag = false; } } } new FileHelper().closeFile(); return flag; } /// <summary> /// 添加一个点名 /// </summary> /// <param name="studentid"></param> /// <param name="star"></param> /// <param name="courseNum"></param> public void addUnluckyCall(String studentid, int star, int courseNum) { unluckSavingCalls.Add(new unluckSavingCall(studentid, star, courseNum)); } public void getHistoryCalls() { } /// <summary> /// 删除历史记录,未实现 /// </summary> /// <param name="studentnum"></param> public void delCallByStdNum(int studentnum) { } } }
所有服务获取类
using stdCall.MyAnimate; using stdCall.MyEvaluation; using stdCall.MyExcel; using stdCall.MyRandom; namespace stdCall.TotalService { /// <summary> /// 总服务类,即各模块服务获取类 /// </summary> class Service { public static stdCall.Resource.ResourseServer getResouseService() { return new stdCall.Resource.ResourseServer(); } public static RandomService getRandomService() { return new RandomService(); } public static EvaluateService getEvaluateService() { return new EvaluateService(); } public static ExcelService getExcelService() { return new ExcelService(); } public static AnimateService getAnimateService() { return new AnimateService(); } public static stdCall.History.HistoryService getHistoryService() { return new stdCall.History.HistoryService(); } } }
界面类实现
using stdCall; using stdCall.MyEvaluation; using stdCall.Models; using stdCall.TotalService; using System; using System.Collections; using System.Windows.Forms; namespace stdCall { /// <summary> /// 主页面 /// </summary> public partial class FormMain : Form { ArrayList historyStds = new ArrayList(); static ArrayList picStars = new ArrayList(); StudentsManager studentManager = new StudentsManager(); UnluckyCallsManager unluckyCallsManager = new UnluckyCallsManager(); /// <summary> /// /// </summary> public FormMain() { FormMain.CheckForIllegalCrossThreadCalls = false; InitializeComponent(); sendControlsToModles(); Service.getResouseService().loadSystemResourse(); new CourseDialog().ShowDialog(); generateStars(); Evaluation.picStars = picStars; } /// <summary> /// 让需要空间的模块获取控件 /// </summary> private void sendControlsToModles() { Service.getAnimateService().addResource("label_currentStd", this.label_currentStd); Service.getAnimateService().addResource("label_hideCurrentStd", this.label_hideCurrentStd); Service.getAnimateService().addResource("label_nextStd", this.label_nextStd); Service.getAnimateService().addResource("label_hideNextStd", this.label_hideNextStd); Service.getAnimateService().addResource("panel_current", this.panel_current); Service.getAnimateService().addResource("panel_nextstd", this.panel_nextstd); Service.getEvaluateService().addResource("panel_history", this.panel_history); } /// <summary> /// 生成星级(黑),并加入容器 /// </summary> private void generateStars() { int starSize = 52; int starPosX = this.label_currentStd.Width / 2 - starSize; int starPosY = 0; for (int i = 0; i < 5; i++) { System.Windows.Forms.PictureBox pictureBox_star; pictureBox_star = new System.Windows.Forms.PictureBox(); pictureBox_star.Cursor = System.Windows.Forms.Cursors.Hand; pictureBox_star.Location = new System.Drawing.Point(starPosX, starPosY); pictureBox_star.Name = "pictureBox_stars"; pictureBox_star.Size = new System.Drawing.Size(starSize, starSize); pictureBox_star.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; pictureBox_star.TabIndex = 3; pictureBox_star.TabStop = false; pictureBox_star.Click += new System.EventHandler(this.pictureBox_stars_Click); pictureBox_star.Load("star_black.png"); this.panel_star.Controls.Add(pictureBox_star); picStars.Add(pictureBox_star); starPosX += starSize+8; } } /// <summary> /// 星级初始化并随机产生倒霉鬼 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button_random_Click(object sender, EventArgs e) { clearStars(); Service.getRandomService().startRandom(); } /// <summary> /// 星星变黑,初始化 /// </summary> public static void clearStars() { foreach (PictureBox pb in picStars) { pb.Load("star_black.png"); } } /// <summary> /// 星级的评价,点击可评价,不可修改 /// </summary> /// <param name="sender">点击的图片</param> /// <param name="e"></param> private void pictureBox_stars_Click(object sender, EventArgs e) { Service.getEvaluateService().evaluateCurrentStd(sender); // clearStars(); } /// <summary> /// 保存当前历史记录 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button_save_Click(object sender, EventArgs e) { stdCall.View.DialogReply reply = new stdCall.View.DialogReply(); if (Service.getHistoryService().saveCurrentHistory()) { reply.setReply("当前历史保存成功!"); reply.ShowDialog(); } else { reply.setReply("当前历史保存失败,请检查!"); reply.ShowDialog(); } } /// <summary> /// 点击加载excel(班级名单) /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button_loadExcel_Click(object sender, EventArgs e) { stdCall.View.DialogReply reply = new stdCall.View.DialogReply(); if (Service.getExcelService().loadExcel()) { reply.setReply("班级名单导入成功!"); reply.ShowDialog(); //reply.Dispose(); } else { reply.setReply("班级名单导入失败,请检查!"); reply.ShowDialog(); } } } }
课程ID询问对话框
using stdCall; 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; using stdCall.TotalService; using stdCall.Resource; namespace stdCall { /// <summary> /// 课程设置对话框 /// </summary> public partial class CourseDialog : Form { /// <summary> /// /// </summary> public CourseDialog() { InitializeComponent(); ResourseLoader rl=new ResourseLoader(); rl.loadCourseID(); textBox_courseID.Text = ResourseLoader.CourseID.ToString(); } private void button_ok_Click(object sender, EventArgs e) { try { int courseid = int.Parse(textBox_courseID.Text); new ResourseLoader().setCourseID(int.Parse(textBox_courseID.Text)); this.Dispose(); } catch (System.Exception ex) { ThreadExceptionDialog td = new ThreadExceptionDialog(ex); td.ShowDialog(); } } } }
操作回复对话框
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 stdCall.View { /// <summary> /// 操作回复对话框 /// </summary> public partial class DialogReply : Form { public DialogReply() { InitializeComponent(); } public void setReply(String text){ this.label_reply.Text = text; } private void button_ok_Click(object sender, EventArgs e) { this.Dispose(); } } }
实用类(目前只有延迟函数)
using System; using System.Windows.Forms; namespace stdCall.MyUtils { /// <summary> /// 实用类 /// </summary> class Utils { /// <summary> /// 延迟函数,毫秒级 /// </summary> /// <param name="delayTime">延迟时间,毫秒级</param> /// <returns></returns> public static bool Delay(int delayTime) { DateTime now = DateTime.Now; int s; do { TimeSpan spand = DateTime.Now - now; s = spand.Milliseconds; Application.DoEvents(); } while (s < delayTime); return true; } } }
学生排序类
using stdCall.Models; namespace stdCall.MyUtils { /// <summary> /// 学生ArrayList的排序规则:学号升序 /// </summary> class StudentCompare : System.Collections.IComparer { public int Compare(object x, object y) { return int.Parse(((Student)x).Number) - int.Parse(((Student)y).Number); } } }
相关文章推荐
- 请使用rand函数,来写一个上午上课随机点名的小程序,要求执行该程序后会输出被提问学生的学号。(注意,咱班有45个人,学号为1~45)
- 第三周作业-实现随机点名的签到程序 第四需求,非头像版
- 第三周作业-实现随机点名的签到程序
- C语言随机点名程序
- 第三周作业-实现随机点名的签到程序
- 第三周作业-实现随机点名的签到程序
- 第三周作业-实现随机点名的签到程序 非头像版
- 第三周作业-实现随机点名的签到程序和计算闰年的简单程序
- 使用javascript做的一个随机点名程序
- 随机点名程序---Excel
- EXCEL VBA (课堂随机点名程序)
- 第三周作业-实现随机点名的签到程序 第五需求,头像版
- 随机点名程序方便好用
- php实现随机点名程序
- JAVA小程序—学生点名系统
- 使用javascript做的一个随机点名程序
- 网络121第3周实验——实现随机点名的签到程序
- [置顶] JAVA小程序—学生点名系统
- 第三周作业--实现随机点名的签到程序
- JavaScript做的一个随机点名程序