2016-12-01 56 views
0

我的任务如下。C#程序不能正确显示输出

某ITEC考试有20个选择题。下面是正确的答案:

1. B 11. B 
2. D 12. C 
3. A 13. D 
4. A 14. A 
5. C 15. D 
6. A 16. C 
7. B 17. C 
8. B 18. B 
9. C 19. D 
10. D 20. A 

创建的程序:

  1. 创建存储了正确的答案(5分)的阵列。
  2. 创建一个名为Response.txt的文本文件,它是模拟回答问题的学生 只写出字母答案,每行只写一个字母。记住你的文件必须 有20行从A,B,C或D.答案见下例 一个 ç 乙 d Ç
  3. 你的程序应该在一个数组
  4. 阅读文本文件和存储的答案
  5. 学生的答案从文件中读取并存储在数组中后,程序应该 将数组与正确的答案进行比较,数组与答案的答案和 确定有多少答案是正确的,有多少错误。
  6. 程序应显示一条消息,指出学生是否通过了 考试。通过分数是14正确的答案。
  7. 程序应显示正确答案的总数,错误答案的总数以及显示错误回答问题的问题编号的列表。

    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 < 20; i++) 
          { 
           if (correctAnswers.Count() > i && answers.Count() > i) 
           { 
            if (String.Compare(correctAnswers[i], answers[i]) == 0) 
             cnt++; 
            else 
             incorrect.Add(i + 1); 
           } 
          } 
    
          //Print Result 
          if (cnt >= 15) 
           MessageBox.Show("\n\n Result: PASS"); 
          else 
           MessageBox.Show("\n\n Result: FAIL"); 
    
          //Printing score 
          MessageBox.Show("\n Total number of Correct Answers: " + cnt); 
          MessageBox.Show("\n Total number of Incorrect Answers: " + (20 - cnt)); 
    
          MessageBox.Show("\n Question numbers of incorrect answers: "); 
          //Printing incorrectly answered question numbers 
          foreach (int qno in incorrect) 
           MessageBox.Show(" " + qno + " "); 
    
          //Closing Files 
          correctFile.Close(); 
          answerFile.Close(); 
    
    
         } 
        } 
    } 
    

我遇到的问题是,我似乎无法得到它的输出,显示的不正确回答问题,问题编号列表。

编辑:我遇到的问题是,我已确保答案的关键和响应文件都有相同的信息,所以程序应该导致与通过,并没有不正确的答案。

发生了什么事情是该程序说只有1个正确的答案,那么它也没有列出它的sttd不正确的答案。

+0

你重新广告只有一行文件。你的文件如何看起来像?所有的信息都写在一行吗?这种情况背后的原因是:if(correctAnswers.Count()> i && answers.Count()> i)'。你有没有试过一步一步通过调试器? –

+0

乙 d 甲 甲 Ç 甲 乙 乙 Ç d 乙 Ç d 甲 d Ç Ç 乙 d 甲 – Austin

+0

HMM在记事本中它是垂直的,但是当我复制并粘贴它的输出,如 – Austin

回答

0

你可以使用一个StringBuilder(或只是连接字符串)是这样的:

  //Printing score 
      MessageBox.Show("\n Total number of Correct Answers: " + cnt); 
      MessageBox.Show("\n Total number of Incorrect Answers: " + (20 - cnt)); 

      var sb = new StringBuilder(); 
      foreach (int qno in incorrect) 
       sb.Append(" " + qno + " "); 

      MessageBox.Show("\n Question numbers of incorrect answers: " + sb.ToString()); 
      //Printing incorrectly answered question numbers 
+0

主要问题是由于某种原因,它会说只有1是正确的(我已确保答案文件和响应文件匹配),它确实不列出任何它的sttd不正确的答案 – Austin

0

不幸遇到读只有一个从文件一行。 只有在文件中有1行时,您的代码才能正常工作。

如果您的文件中有数据列/垂直对齐,我会建议使用File.ReadAllLines()。它将返回所有行的string[]

string[] correctAnswers = File.ReadAllLines("filepath"); 
string[] answers = File.ReadAllLines("filepath"); 

的另一件事是你的条件if (correctAnswers.Count() > i && answers.Count() > i)

你不需要它,如果在这两个文件的顺序是一样的。你可以简单地比较一下。

for循环应运行,直到您试图索引的数组的末尾。如果在下一次考试中您将有24个问题,这个循环将跳出界限。因此,一个更安全的替代方法是使用Length属性或数组:

//Compare answers and compute the score 
for (int i = 0; i < answers .Lengt; i++) 
{ 

编辑:

如果你有文件之间的不匹配,则比较可能是危险的,所以你可以检查是否两个阵列具有相同的长度:

if(answers.Lenngth == correctAnswers.Length) 

,然后才执行循环和比较

+0

谢谢!我把if(correctAnswers.Count()> i && answers.Count()> i)出来,我添加它的原因似乎是由于我的txt文件不匹配造成的 – Austin

+0

如果你有一个不匹配的比较可能是危险的。检查我的编辑 –