中学理事会模拟选举程序中选民编号重复校验功能的代码问题求助
修复VB.NET中学模拟选举程序的选民编号重复检查问题
嘿,我完全理解你现在的焦虑——GCSE的评估项目卡壳,求助无门的感觉真的不好受。咱们来把这个选民编号重复检查的问题彻底解决掉,你的代码逻辑方向是对的,只是几个小细节没处理好,调整一下就能正常运行了。
先说说你当前代码的问题点:
- 你初始化的
voternum()是空数组,直接用voternum(i)赋值会立刻抛出索引越界错误,因为数组没有分配足够的存储空间 - 检查重复的逻辑错了:
voternum(i).Contains(voternumentry)是在检查当前刚赋值的元素里是否包含输入的编号(这永远是true),而不是检查整个数组里是否已经存在这个编号 - 写数组时用了固定索引
35,这会远超过大部分 tutor group的学生数量,同样会导致索引越界
修复后的数组版本代码
这是最贴合你现有代码结构的修复方案,用数组实现重复检查:
' 先根据学生数量初始化选民编号数组,确保有足够空间存储所有编号 Dim voternum(number - 1) As String Dim i As Integer Dim voternumentry As String For i = 0 To number - 1 Console.WriteLine("Enter your voter number:") voternumentry = Console.ReadLine() ' 检查编号是否重复,或者输入为空 While Array.IndexOf(voternum, voternumentry) <> -1 Or String.IsNullOrEmpty(voternumentry) Console.WriteLine("That number has already been used, or you entered an empty value. Please enter a different voter number:") voternumentry = Console.ReadLine() End While ' 把合法的编号存入数组 voternum(i) = voternumentry ' 下面是你的投票逻辑,保持不变即可 Console.WriteLine("Enter the number of the student you're voting for (type 0 to abstain):") entry = Console.ReadLine() ' ... 后续的投票计数代码 Next
关键修改说明:
- 数组初始化:用
Dim voternum(number - 1) As String根据学生数量创建对应长度的数组,避免索引越界 - 重复检查逻辑:用
Array.IndexOf(voternum, voternumentry) <> -1来判断编号是否已存在——这个方法会遍历整个数组,找到元素返回索引,找不到返回-1,完美解决重复检查问题 - 空值防护:添加
String.IsNullOrEmpty(voternumentry)防止学生输入空的编号 - 顺序调整:先检查编号合法性,再存入数组,确保数组里的都是有效、不重复的编号
更灵活的优化方案:使用List(Of String)
如果你想让代码更简洁、容错性更高,可以用List(Of String)代替数组,它支持动态添加元素,而且自带Contains方法直接检查重复:
' 使用List存储选民编号,无需提前指定长度 Dim voternum As New List(Of String) Dim i As Integer Dim voternumentry As String For i = 0 To number - 1 Console.WriteLine("Enter your voter number:") voternumentry = Console.ReadLine() ' 检查重复或空输入 While voternum.Contains(voternumentry) Or String.IsNullOrEmpty(voternumentry) Console.WriteLine("That number has already been used, or you entered an empty value. Please enter a different voter number:") voternumentry = Console.ReadLine() End While ' 将合法编号添加到List中 voternum.Add(voternumentry) ' 投票逻辑... Next
额外的小修复建议(避免程序崩溃)
你的代码里还有几个容易导致崩溃的小细节,顺便一起调整了会更稳妥:
- 输入转整数的安全处理:直接把
Console.ReadLine()赋值给Integer变量会在用户输入非数字时崩溃,用Integer.TryParse更安全:
Console.WriteLine("Enter the amount of students in " & tutor) ' 同时加入范围检查(28-35) While Not Integer.TryParse(Console.ReadLine(), number) Or number < 28 Or number > 35 Console.WriteLine("Please enter a valid number between 28 and 35 for the amount of students in " & tutor) End While
对候选人数量的输入也做同样的处理,避免非数字输入导致崩溃。
- 百分比计算的精度问题:整数除法会导致百分比计算错误(比如5/20会得到0而不是0.25),转换成浮点数计算再转回整数:
votepercentage1 = CInt((CDbl(votes1) / totalvotes) * 100) votepercentage2 = CInt((CDbl(votes2) / totalvotes) * 100) votepercentage3 = CInt((CDbl(votes3) / totalvotes) * 100) votepercentage4 = CInt((CDbl(votes4) / totalvotes) * 100)
这些调整应该能让你的程序正常运行,顺利完成GCSE的评估项目。祝你好运!
内容的提问来源于stack exchange,提问作者Eamon McKiernan
相关产品推荐
相关产品推荐

