2016-10-19 3 views
2

저는 현재 3 가지 테스트 점수를 추가하고 평균에 따라 글자 등급을주는 성적 계산기를 코딩하고 있습니다. 지금까지 한 가지를 제외하고는 모든 문제없이 모든 것을 코딩 할 수있었습니다. 이 계산기에서 체크 된 경우 가장 낮은 점수를 내고 가장 높은 점수를내는 체크 상자를 추가했습니다. 몇 주 전에 프로그래밍을 시작했고 코딩을 시작하는 방법을 모릅니다. if 문이나 루프를 사용해야합니까? 불필요한 코드 또는 기타 사항을 제거하는 데 도움이되는 조언이 있으면 언제든지 알려주십시오.C# 그레이드 계산기

public frmGradeCalculator() 
    { 
     InitializeComponent(); 
    } 




    private void chkDropLowest_CheckedChanged(object sender, EventArgs e) 
    { 


    } 
    private void btnClear_Click(object sender, EventArgs e) 
    { 
     // Clear Text 

     txtTest1.Clear(); 
     txtTest2.Clear(); 
     txtTest3.Clear(); 
     txtAverage.Clear(); 
     txtLetterGrade.Clear(); 

     // Set Focus 

     txtTest1.Focus(); 
    } 

    private void btnCalculate_Click(object sender, EventArgs e) 
    { 
     // Declare variables 

     byte bytTest1; 
     byte bytTest2; 
     byte bytTest3; 
     float fltAverage; 
     string strLetterGrade = "F"; 

     // Convert to text 

     if (byte.TryParse(txtTest1.Text, out bytTest1)) 
     { 
     } 
     else 
     { 
      MessageBox.Show("Invalid Number!", 
       "Yancarlos Grade Calculator", 
       MessageBoxButtons.OK, 
       MessageBoxIcon.Exclamation); 
      txtTest1.Focus(); 
      return; 
     } 

     if (byte.TryParse(txtTest2.Text, out bytTest2)) 
     { 
     } 
     else 
     { 
      MessageBox.Show("Invalid Number!", 
       "Yancarlos Grade Calculator", 
       MessageBoxButtons.OK, 
       MessageBoxIcon.Exclamation); 
      txtTest2.Focus(); 
      return; 
     } 
     if (byte.TryParse(txtTest3.Text, out bytTest3)) 
     { 
     } 
     else 
     { 
      MessageBox.Show("Invalid Number!", 
       "Yancarlos Grade Calculator", 
       MessageBoxButtons.OK, 
       MessageBoxIcon.Exclamation); 
      txtTest3.Focus(); 
      return; 
     } 

     // Formula 

     fltAverage = (bytTest1 + bytTest2 + bytTest3)/3; 

     if (fltAverage <= 59.9) 
     { 
      strLetterGrade = "F"; 
     } 
     else if (fltAverage <= 63.9) 
     { 
      strLetterGrade = "D-"; 
     } 
     else if (fltAverage <= 66.9) 
     { 
      strLetterGrade = "D"; 
     } 
     else if (fltAverage <= 69.9) 
     { 
      strLetterGrade = "D+"; 
     } 
     else if (fltAverage <= 73.9) 
     { 
      strLetterGrade = "C-"; 
     } 
     else if (fltAverage <= 76.9) 
     { 
      strLetterGrade = "C"; 
     } 
     else if (fltAverage <= 79.9) 
     { 
      strLetterGrade = "C+"; 
     } 
     else if (fltAverage <= 83.9) 
     { 
      strLetterGrade = "B-"; 
     } 
     else if (fltAverage <= 86.9) 
     { 
      strLetterGrade = "B"; 
     } 
     else if (fltAverage <= 89.9) 
     { 
      strLetterGrade = "B+"; 
     } 
     else if (fltAverage <= 93.9) 
     { 
      strLetterGrade = "A-"; 
     } 
     else if (fltAverage <= 96.9) 
     { 
      strLetterGrade = "A"; 
     } 
     else 
     { 
      strLetterGrade = "A+"; 
     } 



     // convert back to user 

     txtAverage.Text = fltAverage.ToString("f1"); 
     txtLetterGrade.Text = strLetterGrade.ToString(); 

    } 

    private void btnExit_Click(object sender, EventArgs e) 
    { 
     // Exit application 

     Application.Exit(); 
    } 

    private void frmGradeCalculator_Load(object sender, EventArgs e) 
    { 

    } 
} 

}는 평균 계산에 갈 때

답변

1

if 문 루프 또는 사용 여부에 대한 특정 질문에 대답하려면, 모든 체크 박스 컨트롤을 확인할 수있는 Checked 속성이 있습니다.

if(chkDropLowest.Checked) 
{ 
     //Calculate average without the lowest test 
} 

디자인에 관한 한, 특정 버튼에 많은 기능을 지정하지 않는 것이 좋습니다.

private string CalculateLetterGrade(byte test1, byte test2, byte test3) 
{ 
    string letterGrade; 

    if(chkDropLowest.Checked) 
    { 
      //Drop lowest test then calculate average 
    } 
    else 
    { 
      //Use all tests then calculate average 
    } 

    //Determine the string for the letter grade, then return it 

    return letterGrade; 
} 

당신은 평균을 갖고있는 것 같다 : (혹시 미래에 새 컨트롤을 사용하기로 결정한 경우 안전 그런 식으로) 내가 대신

예 그 버튼에서 호출 할 수있는 새로운 방법을 만들 것 논리가 풀려서 내가 너에게 맡길거야.

+0

버튼 하나에 많은 기능을 할당하지 말라고 조언 해 주셔서 감사합니다. – Yanka

1

이 주사를 :

double totalScore = bytTest1 + bytTest2 + bytTest3; 
double lowest = Math.Min(Math.Min(bytTest1, bytTest2), bytTest3); 
if (chkDropLowest.IsChecked == true) 
{ 
    // Drop the lowest test 
    fltAverage = (totalScore - lowest)/2; 
} 
else 
{ 
    // Include all three tests 
    fltAverage = (totalScore)/3; 
} 
+0

감사합니다. 완벽하게 작동했습니다. 도움에 감사드립니다. – Yanka

+0

내기를 걸었습니다. 다른 사람들이 언급했듯이,이 '기능'비트를 자신의 방식으로 분해하는 것을 고려하십시오. 즉, CalculateScore (점수 점수, bool dropLowest) 메소드입니다. – GEEF

0

관심을 끌기 위해 조금만 btnCalculate_Click을 리팩터링했습니다. 이 방법으로 문제를 해결할 수 있지만 더 많이 게시 했으므로 문제를 좀 더 간결하게 해결하고 볼 수있는 구문을 제공 할 수 있습니다.

private void btnCalculate_Click(object sender, EventArgs e) 
{ 
    Func<TextBox, double?> parseTextBox = tb => 
    { 
     double value; 
     if (!double.TryParse(tb.Text, out value)) 
     { 
      MessageBox.Show("Invalid Number!", 
       "Yancarlos Grade Calculator", 
       MessageBoxButtons.OK, 
       MessageBoxIcon.Exclamation); 
      tb.Focus(); 
      return null; 
     } 
     return value; 
    }; 

    double?[] tests = 
    (
     from tb in new[] { txtTest3, txtTest2, txtTest1, } 
     let result = parseTextBox(tb) 
     orderby result descending 
     select result 
    ).ToArray(); 

    if (tests.Any(t => t == null)) 
    { 
     return; 
    } 

    double average = 
     tests 
      .Take(3 - (checkBox1.Checked ? 1 : 0)) 
      .Average() 
      .Value; 

    var grades = new[] 
    { 
     new { Score = 59.9, Grade = "F" }, 
     new { Score = 63.9, Grade = "D-" }, 
     new { Score = 66.9, Grade = "D" }, 
     new { Score = 69.9, Grade = "D+" }, 
     new { Score = 73.9, Grade = "C-" }, 
     new { Score = 76.9, Grade = "C" }, 
     new { Score = 79.9, Grade = "C+" }, 
     new { Score = 83.9, Grade = "B-" }, 
     new { Score = 86.9, Grade = "B" }, 
     new { Score = 89.9, Grade = "B+" }, 
     new { Score = 93.9, Grade = "A-" }, 
     new { Score = 96.9, Grade = "A" }, 
     new { Score = 100.0, Grade = "A+" }, 
    }; 

    string grade = 
     grades 
      .Where(g => g.Score >= average) 
      .Select(g => g.Grade) 
      .First(); 

    txtAverage.Text = average.ToString("f1"); 
    txtLetterGrade.Text = grade; 
} 
+0

이 코드는 좋아 보인다! 나는 아직도 배울 것이 많은 도움을 주셔서 감사합니다. 그래서 익숙하지 않은 코드가 있습니다. 나는 이것을 조금 더 배우고 aha를 할 때 그것을 지키고 되돌아 볼 것이다! 다시 한 번 감사드립니다! – Yanka