我正在开发一个项目,该项目涉及创建两个数组并比较答案以确定通过或失败状态。
当我尝试运行我的代码时,我收到此错误:
ITEC exam.exe中发生未处理的“System.IndexOutOfRangeException”类型异常 附加信息:索引超出了数组的范围。
我的代码如下
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ITEC_exam
{
public partial class ITEC_exam : Form
{
public ITEC_exam()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string line;
int cnt = 0;
//List to hold question numbers of incorrect answers
List<int> incorrect = new List<int>();
//Array to store correct answers
string[] correctAnswers = { };
//Array to store answers
string[] answers = { };
//Read the files and store answers in arrays
System.IO.StreamReader correctFile = new System.IO.StreamReader("C:\\Users\\a_day\\Desktop\\Baker_Austin_c#_final\\ITECexam\\ITEC exam\\correctAnswers.txt");
System.IO.StreamReader answerFile = new System.IO.StreamReader("C:\\Users\\a_day\\Desktop\\Baker_Austin_c#_final\\ITECexam\\ITEC exam\\testResult.txt");
if ((line = correctFile.ReadLine()) != null)
correctAnswers = line.Split(' ');
if ((line = answerFile.ReadLine()) != null)
answers = line.Split(' ');
//Compare answers and compute the score
for (int i = 0; i < 21; i++)
{
if (String.Compare(correctAnswers[i], answers[i]) == 0)
cnt++;
else
incorrect.Add(i + 1);
}
//Print Result
if (cnt >= 15)
Console.WriteLine("\n\n Result: PASS");
else
Console.WriteLine("\n\n Result: FAIL");
//Printing score
Console.WriteLine("\n Total number of Correct Answers: " + cnt);
Console.WriteLine("\n Total number of Incorrect Answers: " + (20 - cnt));
Console.Write("\n Question numbers of incorrect answers: ");
//Printing incorrectly answered question numbers
foreach (int qno in incorrect)
Console.Write(" " + qno + " ");
//Closing Files
correctFile.Close();
answerFile.Close();
Console.WriteLine("\n\n Press any key to exit.");
Console.ReadKey();
}
}
}
答案 0 :(得分:2)
您的for循环假设两个列表中有20个或更多项目,如果您在任何列表correctAnswers[i], answers[i]
中没有20个项目将失败。在通过索引访问之前验证。
我在答案中假设您有一些像NA
这样的标志,这些标志不在未尝试的问题/未答复的问题的实际答案列表中
不要为未尝试的问题/未回答的问题留空或空格,然后在按空格分割后,它会在答案列表的结果数组中生成更多项目。
此外,如果你有多个单词的答案,那么这种方法将失败。 (因为你被空间分割)
if(correctAnswers.Length == answers.Length)
{
for (int i = 0; i < correctAnswers.Length; i++)
{
if (String.Compare(correctAnswers[i], answers[i]) == 0)
cnt++;
else
incorrect.Add(i + 1);
}
}
其他选项:您可以创建Answer类并添加一些属性,如问题ID,答案,标记等。然后您可以从此类创建答案列表并将整个列表保存到文件并从文件读回列表使用序列化和反序列化
答案 1 :(得分:0)
您正在迭代20号数组并访问20索引处的值。检查你的循环。它应该访问索引0到19,而不是0到20。
答案 2 :(得分:0)
不应使用“21”作为计数,
answers
可能为空或少于21。
所以使用如下。
//Compare answers and compute the score
for (int i = 0; i < answers.Length && i < correctAnswers.Length; i++)
{
if (String.Compare(correctAnswers[i], answers[i]) == 0)
cnt++;
else
incorrect.Add(i + 1);
}
答案 3 :(得分:-1)
你需要检查数组如下,以避免异常。
//Compare answers and compute the score
for (int i = 0; i < correctAnswers.Count(); i++)
{
if (answers.Count() > i && String.Compare(correctAnswers[i], answers[i]) == 0))
cnt++;
else
incorrect.Add(i + 1);
}
答案 4 :(得分:-1)
for (int i = 0; i < 21; i++)
{
if (i < correctAnswers.Length && i < answers.Length)
{
if (String.Compare(correctAnswers[i], answers[i]) == 0)
cnt++;
else
incorrect.Add(i + 1);
}
else
incorrect.Add(i + 1);
}
在for循环中首先检查两个数组的索引为i
,然后检查您的状况。