2017-05-27 2 views
0

Ich versuche, eine Konsolen-App in C# zu erstellen, die Benutzer zuerst zur Anmeldung auffordert und dann nur die angegebenen Fragen für jeden Benutzer beantwortet. Was ist der beste Weg, dies zu tun? Ich habe vier Fragen und möchte nur die ersten zwei Fragen an den ersten Benutzer und die anderen beiden an den zweiten.Konsolen-App, die jedem Benutzer bestimmte Fragen stellt

Hier ist mein Code unten:

static void Main(string[] args) 
{ 
    String username; 
    String password; 
    int row; 
    string[,] accnts = { { "jack", "111", "1" }, { "ibo", "121", "2" } }; 

    Console.Write("enter username >> "); 
    username = Console.ReadLine(); 
    Console.Write("enter password >> "); 
    password = Console.ReadLine(); 

    for (row = 0; row < 3; row++) 
    { 
     if (username.Equals(accnts[row, 0]) && password.Equals(accnts[row, 1])) 
     { 
      Console.WriteLine("welcome " + accnts[row, 0]); 
     } 

     else if (username.Equals(accnts[row + 1, 0]) && password.Equals(accnts[row + 1, 1])) 
     { 
      Console.WriteLine("welcome " + accnts[row + 1, 0]); 
     } 

     else 
     { 
      Console.WriteLine("invalid access"); 
      break; 
     } 

     string[,] question_id = { { "1", "1" }, { "1", "2" }, { "2", "3" }, { "2", "4" } }; 
     string[,] questions = { { "Türkiyenin baskenti neresidir?", "1" }, { "Baskomutan kim?", "2" }, { "2 kere 2?", "3" }, { "when did the world war 1 start?", "4" } }; 
     string[,] Answers = { { "a)ankara b)istanbul c)izmir", "1" }, { "a)ismet b)Atatürk c)Ali ", "2" }, { " a)1 b)2 c)4 ", "3" }, { " a)1912 b)1914 c)1915", "4" } }; 
     string[,] trueAnswers = { { "a", "1" }, { "b", "2" }, { "c", "3" }, { "c", "4" } }; 

     int result = 0; 
     string answers = ""; 
     for (int i = 0; i < questions.GetLength(0); i++) 
     { 
      Console.WriteLine(questions[i, 0]); 
      Console.WriteLine("--------------------------"); 

      for (int y = 0; y < Answers.GetLength(0); y++) 
      { 
       if (Answers[y, 1] == questions[i, 1]) 
       { 
        Console.WriteLine(Answers[y, 0]); 
        answers = Console.ReadLine(); 

        for (int z = 0; z < trueAnswers.GetLength(0); z++) 
        { 
         if (trueAnswers[z, 1] == questions[i, 1]) 
         { 
          if (trueAnswers[z, 0] == answers) 
           result = result + 10; 
          Console.WriteLine("total is " + result); 
         } 
        } 
       } 
      } 
     } 

     if (result < 20) 
     { 
      Console.WriteLine("failed"); 
     } 
     else 
     { 
      Console.WriteLine("congrats"); 
     } 

     return; 
    } 
} 
+0

Wenn Sie * mehr * Benutzer hat, schlage ich sie so gut wie qustions setzen und Antworten in eine * Datenbank * –

+0

Ja, Sie haben Recht, aber da ich 2D-Arrays erkunde, habe ich nur 2 verschiedene Benutzer definiert und wollte es mit Arrays tun – vinjakci

+0

Haben Sie irgendwas versucht? Deine Frage ist zu weit gefasst. Die offensichtliche Antwort lautet: "Finde heraus, mit welchem ​​Benutzer du es zu tun hast, und frag ihnen dann nur die Fragen, die du ihnen stellen willst". Aber es gibt viele verschiedene Möglichkeiten, dies zu tun. Wenn Ihr Code einen Versuch zeigt, der nicht funktioniert, müssen Sie genau erklären, woran Sie Probleme haben. Was macht der Code, was willst du stattdessen und was _speziell_ kannst du nicht zur Arbeit bringen? Wenn Ihr Code die "Vorher" -Version ist und nicht versucht, das Problem zu lösen, sind Sie noch nicht bereit, eine Frage zu stellen. –

Antwort

1

Zuerst ich Ihnen den völlig falschen Ansatz lassen sagen. Dies ist die schmutzig, schnellste fix, dass ich tun kann:

static void Main(string[] args) 
    { 
     String username; 
     String password; 
     int row; 
     string[,] accnts = { { "jack", "111", "1" }, { "ibo", "121", "2" } }; 

     Console.Write("enter username >> "); 
     username = Console.ReadLine(); 
     Console.Write("enter password >> "); 
     password = Console.ReadLine(); 

     for (row = 0; row < 3; row++) 
     { 
      if (username.Equals(accnts[row, 0]) && password.Equals(accnts[row, 1])) 
      { 
       Console.WriteLine("welcome " + accnts[row, 0]); 

      } 
      else if (username.Equals(accnts[row, 0]) && password.Equals(accnts[row, 1])) 
      { 
       Console.WriteLine("welcome " + accnts[row + 1, 0]); 
      } 
      else 
      { 
       Console.WriteLine("invalid access"); 
       // changed break to continue, because it was crashing 
       continue; 
      } 


      string[,] question_id = { { "1", "1" }, { "1", "2" }, { "2", "3" }, { "2", "4" } }; 
      string[,] questions = { { "Türkiyenin baskenti neresidir?", "1" }, { "Baskomutan kim?", "2" }, { "2 kere 2?", "3" }, { "when did the world war 1 start?", "4" } }; 
      string[,] Answers = { { "a)ankara b)istanbul c)izmir", "1" }, { "a)ismet b)Atatürk c)Ali ", "2" }, { " a)1 b)2 c)4 ", "3" }, { " a)1912 b)1914 c)1915", "4" } }; 
      string[,] trueAnswers = { { "a", "1" }, { "b", "2" }, { "c", "3" }, { "c", "4" } }; 

      int result = 0; 
      string answers = ""; 
      // here I've added a start and end thingy to offset the loop acording to logged user. 
      int start = 0; 
      int endModifier = 2; 
      if (username == accnts[1,0]) 
      { 
       start = 2; 
       endModifier = 0; 
      } 
      for (int i = start; i < questions.GetLength(0) - endModifier; i++) 
      { 
       Console.WriteLine(questions[i, 0]); 
       Console.WriteLine("--------------------------"); 

       for (int y = 0; y < Answers.GetLength(0); y++) 
       { 
        if (Answers[y, 1] == questions[i, 1]) 
        { 

         Console.WriteLine(Answers[y, 0]); 

         answers = Console.ReadLine(); 
         for (int z = 0; z < trueAnswers.GetLength(0); z++) 

         { 
          if (trueAnswers[z, 1] == questions[i, 1]) 
          { 
           if (trueAnswers[z, 0] == answers) 
            result = result + 10; 
           Console.WriteLine("total is " + result); 
          } 

         } 
        } 

       } 
      } 

      if (result < 20) 
      { 
       Console.WriteLine("failed"); 
      } 
      else 
      { 
       Console.WriteLine("congrats"); 
      } 

      return; 
     } 
    } 

Natürlich kann man der beste Ansatz wollte es tun, werde ich OOP verwenden (objektorientierte Programmierung) Zuerst werde ich einige Hilfsklassen erstellen eine interne Klasse für Konto ...

class Account 
    { 
     public string UserName { get; set; } 
     public string Password { get; set; } 
     public int Group { get; set; } 
    } 

eine interne Klasse für Ihre Frage::

class Question 
    { 
     public string QuestionText { get; set; } 
     public List<Answer> AnswersList { get; set; } 
    } 

Und finnaly ein A die Daten in halten nswer Frage uns mit der Logik zu helfen, etwas:

class Answer 
    { 
     public string AnswerText { get; set; } 
     public bool IsCorrect { get; set; } 
     public string AcceptableLetter { get; set; } 
    } 

diese Klassen Füllung ist einfach, es ist fast das gleiche, als Ihr Beispiel, aber mit mehr poliert Namen. Liste ist dein Freund hier, alle Konten im Feld speichern kann, aber ohne die lästigen Indizes https://msdn.microsoft.com/cs-cz/library/6sh2ey19(v=vs.110).aspx#Anchor_8

List<Account> accountsList = new List<Account>(); 
accountsList.Add(new Account { UserName = "jack", Password = "111", Order = 1 }); 
accountsList.Add(new Account { UserName = "ibo", Password = "121", Order = 2 }); 

Es ist auch eine gute Lang Code in kleine Methoden zu spalten, so dass diese Methode überprüft, ob die angegebenen Benutzernamen und Passwort richtig und gibt wahr oder falsch zurück.

private static bool CheckUserPassword(List<Account> accountsList, string username, string password) 
    { 
     foreach (Account account in accountsList) 
     { 
      if (account.UserName == username) 
      { 
       if (account.Password == password) 
       { 
        Console.WriteLine("welcome " + account.UserName); 
        return true; 
       } 
       else 
       { 
        Console.WriteLine("invalid access"); 
        return false; 
       } 
      } 
     } 
     return false; 
    } 

Mit Konten aus dem Weg habe, habe ich auch eine Methode, um alle Antworten im Quiz zu füllen, wo man deutlich sehen kann, wie weitere Frage hinzufügen, wenn nötig:

private static List<Question> FillQuestions() 
    { 
     List<Question> questionList = new List<Question>(); 
     List<Answer> answerList = new List<Answer>(); 

     answerList.Add(new Answer { AnswerText = "Ankara", IsCorrect = true, AcceptableLetter = "a" }); 
     answerList.Add(new Answer { AnswerText = "Istambul", IsCorrect = false, AcceptableLetter = "b" }); 
     answerList.Add(new Answer { AnswerText = "Izmir", IsCorrect = false, AcceptableLetter = "c" }); 
     questionList.Add(new Question { QuestionText = "Türkiyenin baskenti neresidir?", AnswersList = answerList }); 

     answerList = new List<Answer>(); 
     answerList.Add(new Answer { AnswerText = "ismet", IsCorrect = false, AcceptableLetter = "a" }); 
     answerList.Add(new Answer { AnswerText = "Atatürk", IsCorrect = true, AcceptableLetter = "b" }); 
     answerList.Add(new Answer { AnswerText = "Ali", IsCorrect = false, AcceptableLetter = "c" }); 
     questionList.Add(new Question { QuestionText = "Baskomutan kim?", AnswersList = answerList }); 

     answerList = new List<Answer>(); 
     answerList.Add(new Answer { AnswerText = "1", IsCorrect = false, AcceptableLetter = "a" }); 
     answerList.Add(new Answer { AnswerText = "2", IsCorrect = false, AcceptableLetter = "b" }); 
     answerList.Add(new Answer { AnswerText = "4", IsCorrect = true, AcceptableLetter = "c" }); 
     questionList.Add(new Question { QuestionText = "2 kere 2?", AnswersList = answerList }); 

     answerList = new List<Answer>(); 
     answerList.Add(new Answer { AnswerText = "1912", IsCorrect = false, AcceptableLetter = "a" }); 
     answerList.Add(new Answer { AnswerText = "1914", IsCorrect = true, AcceptableLetter = "b" }); 
     answerList.Add(new Answer { AnswerText = "1915", IsCorrect = false, AcceptableLetter = "c" }); 
     questionList.Add(new Question { QuestionText = "When did the world war 1 start?", AnswersList = answerList }); 

     return questionList; 
    } 

Und mit diesem Rahmen implementieren könnten Sie einfach die Fragen sind, die durch das Hinzufügen Eigenschaft Klasse Frage:

class Question 
    { 
     public string QuestionText { get; set; } 
     public List<Answer> AnswersList { get; set; } 
     // added property 
     public int DesiredGroup { get; set; } 
    } 

und Zuordnung, die Fragen für welche Gruppe in FillQuestions sind() -Methode: // code ... questionList.Add (neue Frage {QuestionText = "Wann hat der 1. Weltkrieg begonnen?", AnswersList = answerList, DesiredGroup = 2}); // Code ...

und dann Filtern jeder Frage in Frage Schleife:

if (questions[i].DesiredGroup == accountsList.Find(x => x.UserName == username).Group) 
{ 
    continue; 
} 

Der wenn vielleicht etwas kompliziert, aber die Alternative ist CheckUserPassword Methode Return-Konto haben, oder es Parameter haben aus .. Das sind ziemlich viele Informationen, also lasse ich es so wie es ist.

nun der fertige Code sieht wie folgt aus:

static void Main(string[] args) 
    { 
     List<Account> accountsList = new List<Account>(); 
     accountsList.Add(new Account { UserName = "jack", Password = "111", Group = 1 }); 
     accountsList.Add(new Account { UserName = "ibo", Password = "121", Group = 2 }); 

     Console.Write("enter username >> "); 
     string username = Console.ReadLine(); 
     Console.Write("enter password >> "); 
     string password = Console.ReadLine(); 

     if (CheckUserPassword(accountsList, username, password)) 
     { 
      List<Question> questions = FillQuestions(); 

      int result = 0; 

      for (int i = 0; i < questions.Count; i++) 
      { 
       if (questions[i].DesiredGroup == accountsList.Find(x => x.UserName == username).Group) 
       { 
        continue; 
       } 
       Console.WriteLine(); 
       Console.WriteLine(questions[i].QuestionText); 
       Console.WriteLine("--------------------------"); 

       WriteAnswers(questions[i].AnswersList); 

       string answers = Console.ReadLine(); 
       for (int j = 0; j < questions[i].AnswersList.Count; j++) 
       { 
        if (questions[i].AnswersList[j].AcceptableLetter == answers) 
        { 
         if (questions[i].AnswersList[j].IsCorrect) 
         { 
          Console.WriteLine(questions[i].AnswersList[j].AcceptableLetter + " is correct"); 
          result += 10; 
         } 
         else 
         { 
          Console.WriteLine(questions[i].AnswersList[j].AcceptableLetter + " is incorrect"); 
         } 
        } 
       } 
      } 

      if (result < 15) 
      { 
       Console.WriteLine("failed"); 
      } 
      else 
      { 
       Console.WriteLine("congrats"); 
      } 
     } 

     Console.Read(); 

    } 

    private static void WriteAnswers(List<Answer> answersList) 
    { 
     char[] alphabetLetters = { 'a', 'b', 'c' }; 
     for (int i = 0; i < answersList.Count; i++) 
     { 
      Console.WriteLine(alphabetLetters[i] + ") " + answersList[i].AnswerText); 
     } 
    } 

    private static List<Question> FillQuestions() 
    { 
     List<Question> questionList = new List<Question>(); 
     List<Answer> answerList = new List<Answer>(); 

     answerList.Add(new Answer { AnswerText = "Ankara", IsCorrect = true, AcceptableLetter = "a" }); 
     answerList.Add(new Answer { AnswerText = "Istambul", IsCorrect = false, AcceptableLetter = "b" }); 
     answerList.Add(new Answer { AnswerText = "Izmir", IsCorrect = false, AcceptableLetter = "c" }); 
     questionList.Add(new Question { QuestionText = "Türkiyenin baskenti neresidir?", AnswersList = answerList, DesiredGroup = 1 }); 

     answerList = new List<Answer>(); 
     answerList.Add(new Answer { AnswerText = "ismet", IsCorrect = false, AcceptableLetter = "a" }); 
     answerList.Add(new Answer { AnswerText = "Atatürk", IsCorrect = true, AcceptableLetter = "b" }); 
     answerList.Add(new Answer { AnswerText = "Ali", IsCorrect = false, AcceptableLetter = "c" }); 
     questionList.Add(new Question { QuestionText = "Baskomutan kim?", AnswersList = answerList, DesiredGroup = 1 }); 

     answerList = new List<Answer>(); 
     answerList.Add(new Answer { AnswerText = "1", IsCorrect = false, AcceptableLetter = "a" }); 
     answerList.Add(new Answer { AnswerText = "2", IsCorrect = false, AcceptableLetter = "b" }); 
     answerList.Add(new Answer { AnswerText = "4", IsCorrect = true, AcceptableLetter = "c" }); 
     questionList.Add(new Question { QuestionText = "2 kere 2?", AnswersList = answerList, DesiredGroup = 2 }); 

     answerList = new List<Answer>(); 
     answerList.Add(new Answer { AnswerText = "1912", IsCorrect = false, AcceptableLetter = "a" }); 
     answerList.Add(new Answer { AnswerText = "1914", IsCorrect = true, AcceptableLetter = "b" }); 
     answerList.Add(new Answer { AnswerText = "1915", IsCorrect = false, AcceptableLetter = "c" }); 
     questionList.Add(new Question { QuestionText = "When did the world war 1 start?", AnswersList = answerList, DesiredGroup = 2 }); 

     return questionList; 
    } 

    private static bool CheckUserPassword(List<Account> accountsList, string username, string password) 
    { 
     foreach (Account account in accountsList) 
     { 
      if (account.UserName == username) 
      { 
       if (account.Password == password) 
       { 
        Console.WriteLine("welcome " + account.UserName); 
        return true; 
       } 
       else 
       { 
        Console.WriteLine("invalid access"); 
        return false; 
       } 
      } 
     } 
     return false; 
    } 

    class Account 
    { 
     public string UserName { get; set; } 
     public string Password { get; set; } 
     public int Group { get; set; } 
    } 

    class Question 
    { 
     public string QuestionText { get; set; } 
     public List<Answer> AnswersList { get; set; } 
     public int DesiredGroup { get; set; } 
    } 

    class Answer 
    { 
     public string AnswerText { get; set; } 
     public bool IsCorrect { get; set; } 
     public string AcceptableLetter { get; set; } 
    } 

Es gibt immer bessere Ansätze, aber für jetzt genügt :) Glückliche

Codierung
0

Hier ist nur ein kleines Stück. Die längere Antwort von @OrilesElkar, die dir sagt, wie du das in kleinere Klassen aufteilen kannst, ist was du brauchst.

Hier ist noch:

public class QuestionsByAccountProvider 
{ 
    Question[] GetQuestionsForAccount(Account account) 
    { 
     // Put your code for providing questions here. 
    } 
} 

Dann aus einer anderen Klasse, die Sie

var questionProvider = new QuestionsByAccountProvider(); 
var questions = questionProvider.GetQuestions(account); 

Dies hilft separate verschiedene Bereiche des Codes zu halten nennen könnten, so dass, wenn Sie in Ihrem Programm suchen Sie don Ich sehe die ganze Sache nicht sofort. Das kann verwirrend sein, selbst wenn es sich um einen eigenen Code handelt. Zu jedem Zeitpunkt siehst du nur den Teil der Logik an, der dir wichtig ist.

Auch, wie gesagt wurde, vielleicht später möchten Sie Ihre Fragen in eine Datenbank stellen. Wenn Ihre Fragen von einer separaten Klasse gestellt werden, können Sie Ihre Änderungen dort vornehmen und es ist viel einfacher. Wenn es alles in einer gigantischen Methode ist, wird es viel schwieriger, einen Teil zu ändern, ohne andere Dinge zu brechen. Auf diese Weise weiß Ihre Hauptmethode, dass sie etwas darum bittet, Fragen zu stellen, und es ist ihr egal, wie das geschieht.

Oder vielleicht, wenn Sie das funktioniert haben, werden Sie entscheiden, dass Sie es in eine Windows Forms-Anwendung oder eine Webanwendung einfügen möchten. Wenn sich Ihr Code in separaten Klassen befindet, können Sie sie einem anderen Apptyp hinzufügen, und sie funktionieren genauso. Aber wenn alle Ihre Arbeit in Main in Ihrer Konsole App ist, dann wird es wirklich schwer sein, einige Stücke zu extrahieren und sie wiederzuverwenden.

Es ist hilfreich, wenn eine Klasse einem anderen mitteilen kann, was zu tun ist, oder Informationen darüber erhalten, ohne etwas darüber zu wissen, wie diese andere Klasse ihre Arbeit macht. Auf diese Weise können Sie Änderungen an einer Klasse vornehmen, ohne die andere zu beeinflussen. Sie werden feststellen, dass Sie mehr Zeit mit dem "Spaß" -Teil des Schreibens von Code verbringen - herauszufinden, wie Sie Dinge umsetzen können - und weniger Zeit damit verbringen, es zu lesen oder zu debuggen.

(Ein nächster Schritt ist unit testing, die wirklich genial ist. Ich es empfehlen, das Lernen früh. Ich wünschte, ich hätte.)

Verwandte Themen