2014-06-16 4 views
0

4 개의 변수 유형을 보유하는 구조체가 있습니다.이 구조체의 데이터는 텍스트 파일에 보관됩니다. 구조체는 질문 번호, 질문 수준, 질문 및 질문 대답으로 구성됩니다. 콘솔 창에 질문 만 인쇄하려고하지만 atm 프로그램은 먼저 질문 번호를 쓰고 그 다음에 레벨을 작성한 다음 마침내 질문과 대답을 고집합니다. 나는 단지 질문을 콘솔 화면에 인쇄하고 싶다. 지금까지 내가 가지고있는 것 :streamreader가 텍스트 파일의 특정 줄을 읽은 다음 콘솔에 씁니다. C#

static void quiz(QuestionStruct[] _quiz) 
{ 
    bool asked = true; 
    int score = 0; 
    int AmountAsked = 0; 

    string level = "1"; 
      string ans; 
int pos = 0; 

var pathToFile = @"..\..\..\Files\questions.txt"; 
using (StreamReader sr = new StreamReader(pathToFile, true)) 
{  
    while (AmountAsked < 20 || score >= 50) 
    { 
     Console.Clear(); 
     //int pos = 0; 
     if (level == "1") 
     { 

      AmountAsked++; 
      questions[pos].Question = sr.ReadLine(); 
      Console.Write(questions[pos].Question); 
      ans = Console.ReadLine(); 
      if (ans == questions[pos].answer) 
      { 
       level = "2"; 
       score = score + 1; 
       while (questions[pos].Level != "2") 
       { 
        pos++; 
       } 
      } 
     } 
    } 
} 
+0

각각 4 개의 변수가 텍스트 파일에 한 줄로 저장되어 있습니까? –

+0

각 줄은 다음과 같습니다. 질문 번호, 질문 수준, 질문, 질문 응답 – COYG

답변

0

올바른 순서로 파일을 읽지 않은 것 같습니다. 파일의 첫 번째 줄은 질문 멤버에 저장하고 두 번째 줄은 응답 멤버에 저장합니다. 그러면 레벨의 질문 번호에 대한 행을 읽지 않습니다. 이것은 파일 레이아웃과 일치하지 않습니다.

너무 많은 일을하기 때문에 코드의 문제를보기가 어렵습니다. 파일을 읽는 것이 한 가지 방법이되도록 코드를 리팩터링해야하며, 그 다음에 퀴즈를 수행하는 것이 또 다른 방법입니다. 이 소프트웨어 설계 원칙은 분리 문제라고합니다 http://en.wikipedia.org/wiki/Separation_of_concerns.

다음은 리팩토링 된 코드입니다. 이 코드를 사용하여 행을 읽거나 건너 뛴 행을 읽지 않았다면 더 쉽게 발견 할 수있었습니다. 질문 번호, LEVE, 질의 응답에 대한 개별 라인이있는 경우

public void Quiz() 
{ 
    List<QuestionStruct> questions = GetQuestions(@"..\..\..\Files\questions.txt"); 

    RunQuiz(questions); 
} 


// My job is to parse the file 
public List<QuestionStruct> GetQuestions(string pathToFile) 
{ 
    List<QuestionStruct> questions = new List<QuestionStruct>(); 

    using (StreamReader sr = new StreamReader(pathToFile, true)) 
    { 
     while (!sr.EndOfStream) 
     { 
      QuestionStruct q = new QuestionStruct(); 
      q.Number = sr.ReadLine(); 
      q.Level = sr.ReadLine(); 
      q.Question = sr.ReadLine(); 
      q.Answer = sr.ReadLine(); 

      questions.Add(q); 
     } 
    } 

    return questions; 
} 


// My job is to run the quiz 
public void RunQuiz(List<QuestionStruct> questions) 
{ 

    bool asked = true; 
    int score = 0; 
    int AmountAsked = 0; 

    string level = "1"; 
    string ans; 
    int pos = 0; 

    foreach (QuestionStruct question in questions) 
    { 
     if (!(AmountAsked < 20 || score >= 50)) 
      break; 

     Console.Clear(); 
     //int pos = 0; 
     if (level == "1") 
     { 
      AmountAsked++; 

      Console.Write(question.Question); 
      ans = Console.ReadLine(); 

      if (ans == question.Answer) 
      { 
       level = "2"; 
       score = score + 1; 
       while (question.Level != "2") 
       { 
        pos++; 
       } 
      } 
     } 
    } 
} 
-1

는, 당신은 strcut의 멤버 각각의 정확한 라인을 할당하는 순서대로 4 sr.ReadLine()을 수행해야합니다.

static void quiz(QuestionStruct[] _quiz) 
{ 
    bool asked = true; 
    int score = 0; 
    int AmountAsked = 0; 

    string level = "1"; 
    string ans; 
    int pos = 0; 

    var pathToFile = @"..\..\..\Files\questions.txt"; 
    using (StreamReader sr = new StreamReader(pathToFile, true)) 
    { 


     while (AmountAsked < 20 || score >= 50) 
     { 
      Console.Clear(); 
      //int pos = 0; 
      while(!sr.EndOfStream) 
      { 
      if (level == "1") 
      { 

       AmountAsked++; 
       // Remember the order in which you are storing the values to each member of struch 
       questions[pos].number = sr.ReadLine(); 
       questions[pos].level = sr.ReadLine(); 
       questions[pos].Question = sr.ReadLine(); 
       questions[pos].answer = sr.ReadLine(); 

       Console.Write(questions[pos].Question); 
       ans = Console.ReadLine(); 
       if (ans == questions[pos].answer) 
       { 
        level = "2"; 
        score = score + 1; 
        while (questions[pos].Level != "2") 
        { 
         pos++; 
        } 
       } 
      } 
      } 
+0

이 예제는 코드 작동 방식을 변경합니다. (AmountAsked <20 || score> = 50)는 모든 질문 후에 평가되지 않으며 Console.Clear()도 아닙니다. –

관련 문제