2017-05-05 151 views
0

另一个参差不齐的阵列问题:锯齿阵列和异常

当前在类中工作锯齿状数组而不是在Main()中。有了这个锯齿状的数组,我想根据自定义异常来测试我的用户输入。目前,当我运行程序时,它会创建阵列,直到我想填充阵列并测试该数据与我的异常的最后一点。尽管用户输入正确,异常仍在运行。我不确定错误是在我的异常中,还是错误是我的数组。

注:我知道这可能看起来有些复杂,但为了我正在做的事情,它必须保持这种方式。对不起:(

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(); 
     } 
    } 

异常

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

更新1: 目前正在这一变化,看是否异常停止提示:

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; 
    } 
} 

而且我得到这个问题:

Exception being thrown with correct user input

+1

我敢肯定有可能缩减您的代码到最低限度为您的问题。谁应该读这一切? –

+0

@ maf-soft这已被编辑删除那些不属于我的问题的项目。 – ZLackLuster

回答

0

你的条件

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

永远是正确的。不管G中的字符是什么,它总是不等于其中的一些字母。您应该使用逻辑AND运算符&&,而不是||逻辑OR运算符。

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

这样一来,对于被抛出的异常,在G字符必须不等于任何测试信件。

还要注意您的比较区分大小写。在此之前比较,你可能要转换为大写:

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

。在你的代码中的第二个问题,在本节:

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

在这里,您从您从用户解析角色分配信输入。然后,用您从成绩数组中获得的值覆盖该值,从而完全损失用户输入的值。然后你检查你从成绩中得到的价值(而不是你从用户那里得到的价值)。我不知道你想用中间线做什么,所以我不确定要建议什么正确的代码,但这就是为什么用户输入没有真正被检查。我有一种感觉,虽然你真的想这样:

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

如果你有一个有效等级的“列表”,测试可以变得更易读:'if(!validGrades.Contains(G))' –

+0

@BerinLoritsch - 甚至只是一个简单的字符串'“ABCDF”'。我同意,有些事情可以改进。 – hatchet

+0

当我输入A的等级时,还会得到例外提示吗?也许我的条件措辞不正确?例外只应提示非A-D或F的信件。 – ZLackLuster

0

正如已经指出的,问题是复杂的OR语句。有几种方法可以提高代码的可读性。

以下测试G是否为有效,然后测试否定。

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; 
    } 
} 

接下来,如果我们要有效年级的测试,以更为简洁,我们可以做这样的事情:

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

在C#中,字符串是字符的集合,使测试工作好吧,可能更容易发现问题。

+0

这个异常仍在抛出。我认为这个错误存在于我的阵列中,但我不确定。 – ZLackLuster