2017-05-05 4 views
0

Une autre question de groupe dentelée:Jagged arrays et exceptions

Actuellement avec des tableaux dentelés de travail dans une classe plutôt que dans Main(). Avec ce tableau en dents de scie, je veux tester mes entrées utilisateur contre une exception personnalisée. Actuellement, lorsque je lance le programme, il crée le tableau jusqu'au dernier point où je veux remplir le tableau et tester ces données par rapport à mon exception. L'exception est en cours d'exécution malgré la bonne entrée de l'utilisateur. Je ne suis pas sûr si l'erreur est dans mon exception ou si l'erreur est mon tableau. NOTE: Je sais que cela peut sembler compliqué, mais pour ce que je fais, il faut que ça reste comme ça. Désolé :(

Classe

class StudentGrades 
{ 
    private char[][] grades; 
    private double totalGpa; 
    private int totalClasses; 
    private int semesters; 

    public StudentGrades() 
    { 
     totalClasses = 0; 
     SetSemesters(4); 
     grades = new char [semesters][]; 
    } 


    public void InputSemesters() 
    { 
     int x; 
     int semestNum; 
     bool check; 
     do 
     { 
      check = false; 
      try 
      { 
       for (int r = 0; r < grades.Length; r++) 
       { 
        if (r == 0) 
        { 
         semestNum = 1; 

        } 
        else if (r == 1) 
        { 
         semestNum = 2; 
        } 
        else if (r == 2) 
        { 
         semestNum = 3; 
        } 
        else 
        { 
         semestNum = 4; 
        } 
        Console.Write("How many courses were taken semster {0}? ", semestNum); 
        x = int.Parse(Console.ReadLine()); 
        CreateSemesters(r, x); 
       } 
      } 
      catch (System.FormatException e) 
      { 
       Console.WriteLine("Problem with input.\n{0}\nTry again.", e.Message); 
       check = true; 
      } 
     } while (check); 

    } 

    public void CreateSemesters(int sem, int numClasses) 
    { 
     grades[sem] = new char[numClasses]; 
     totalClasses += numClasses; 
    } 

    public void EnterGrades() 
    { 
     int semestNum; 
     char letter; 
     bool check; 
     do 
     { 
      check = false; 
      try 
      { 
       for (int r = 0; r < grades.Length; r++) 
       { 
        if (r == 0) 
        { 
         semestNum = 1; 

        } 
        else if (r == 1) 
        { 
         semestNum = 2; 
        } 
        else if (r == 2) 
        { 
         semestNum = 3; 
        } 
        else 
        { 
         semestNum = 4; 
        } 
        for (int c = 0; c < grades[r].Length; c++) 
        { 

         Console.Write("Enter the letter grade for class {0} of semester {1}: ", c + 1, semestNum); //the array creation works up to this part. So I know the array is creating but not storing data. 
         letter = char.Parse(Console.ReadLine()); 
         letter = grades[r][c]; 
         CheckLetterGrade(letter); 
        } 
       } 
      } 
      catch (IncorrectLetterGradeException excepObj) 
      { 
       Console.Write("That is not an acceptable letter grade. Try Again. \n{0}", excepObj.Message); 
       Console.WriteLine(); 
       check = true; 
      } 
     } while (check); 
    } 

    public void CheckLetterGrade(char G) 
    { 
     if (G != 'A' || G != 'B' || G != 'C' || G != 'D' || G != 'F') 
     { 
      IncorrectLetterGradeException excepObj = new IncorrectLetterGradeException("Not an acceptalbe letter grade of A-D or F"); 
      throw excepObj; 
     } 
    } 

Main()

class UseStudentGrades 
    { 
     static void Main(string[] args) 
     { 
      StudentGrades student = new StudentGrades(); 
      // testing array functionality below 
      student.InputSemesters(); 
      student.EnterGrades(); 
     } 
    } 

Exception

class IncorrectLetterGradeException : 
       System.ApplicationException 
    { 
     public IncorrectLetterGradeException(string exceptionType) 
      : base (exceptionType) 
     { 
      //empty body 
     } 
    } 

MISE À JOUR 1: en train d'essayer ce changement pour voir si l'exception invite disparaît:

public void CheckLetterGrade(char G) 
{ 
    bool gradeMatch = (G == 'A' || G == 'B' || G == 'C' || G == 'D' || G == 'F');   
    if (!gradeMatch) 
    { 
     IncorrectLetterGradeException excepObj = new IncorrectLetterGradeException("Not an acceptalbe letter grade of A-D or F"); 
     throw excepObj; 
    } 
} 

Et que je reçois cette question:

Exception being thrown with correct user input

+1

Je suis assez sûr qu'il est possible de réduire votre code au strict minimum pour votre question. Qui devrait lire tout cela? –

+0

@ maf-soft Ceci a été modifié pour supprimer les éléments qui ne correspondent pas à ma question. – ZLackLuster

Répondre

0

Votre état

if (G != 'A' || G != 'B' || G != 'C' || G != 'D' || G != 'F') 

sera toujours vrai. Peu importe ce que le personnage est dans G, il ne sera pas toujours égal à certaines de ces lettres. Vous devez utiliser &&, l'opérateur logique AND au lieu de || l'opérateur OR logique.

if (G != 'A' && G != 'B' && G != 'C' && G != 'D' && G != 'F') 

De cette façon, pour votre exception à être jeté, le personnage G devra ne correspond à aucune de vos lettres de test.

Notez également que vos comparaisons sont sensibles à la casse. Avant de vous comparer peut vouloir convertir en majuscules:

char c = Char.ToUpper(G); 
if (c != 'A' && c != 'B' && c != 'C' && c != 'D' && c != 'F') 

Il y a un deuxième problème dans votre code, dans cette section:

letter = char.Parse(Console.ReadLine()); 
    letter = grades[r][c]; 
    CheckLetterGrade(letter); 

Ici vous assignez lettre du personnage que vous analysez de l'utilisateur contribution. Ensuite, vous remplacez cette valeur par une valeur que vous obtenez du tableau grades, perdant ainsi complètement la valeur entrée par l'utilisateur. Ensuite, vous vérifiez la valeur que vous avez obtenue à partir des notes (pas la valeur que vous avez obtenue de l'utilisateur). Je ne sais pas ce que vous essayez de faire avec cette ligne médiane, donc je ne suis pas sûr du bon code à suggérer, mais c'est pourquoi l'entrée de l'utilisateur n'est pas vraiment vérifiée. J'ai le sentiment que vous voulez vraiment ceci:

letter = char.Parse(Console.ReadLine()); 
    grades[r][c] = letter; 
    CheckLetterGrade(letter); 
+0

Si vous aviez un 'List ' de notes valides le test pourrait être rendu encore plus lisible: 'if (! ValidGrades.Contains (G))' –

+0

@BerinLoritsch - ou même juste une simple chaîne '' ABCDF ''. Je suis d'accord, il y a des choses qui pourraient être améliorées. – hatchet

+0

Toujours obtenir l'exception à l'invite lorsque j'entre la note de A? Peut-être que j'ai la condition libellée incorrectement? Une exception ne devrait être qu'une invite pour les lettres qui ne sont pas A-D ou F. – ZLackLuster

0

Comme cela a déjà été souligné, le problème est complexe OU déclaration. Il existe plusieurs façons d'améliorer le code afin qu'il soit plus lisible.

Les tests suivants pour savoir si Gest sont valides, puis ils testent la négation de cette valeur.

public void CheckLetterGrade(char G) 
{ 
    bool isValidGrade = (G == 'A' || G == 'B' || G == 'C' || G == 'D' || G == 'F'); 
    if (!isValidGrade) 
    { 
     IncorrectLetterGradeException excepObj = new IncorrectLetterGradeException("Not an acceptalbe letter grade of A-D or F"); 
     throw excepObj; 
    } 
} 

Ensuite, si nous voulons que le test de la qualité valide pour être plus concis que nous pouvons faire quelque chose comme ceci:

bool isValidGrade = "ABCDF".Contains(G); 

En C#, une chaîne est une collection de caractères afin que les œuvres de test bien, et est probablement plus facile de repérer le problème.

+0

L'exception est toujours levée avec ceci. Je pense que l'erreur existe dans ma population du tableau, mais je ne suis pas sûr. – ZLackLuster