Почему моей программе требуются две строки ввода и почему мой расчет GPA неверен c#? - PullRequest
0 голосов
/ 26 апреля 2020

Я делаю программу для расчета среднего балла. У меня это в основном работает, но я не могу понять, почему он запрашивает 2 входа и почему расчет GPA неверен. Мне также нужно сделать так, чтобы я мог вводить прописные или строчные буквы. Если вы можете предложить способ переписать, это будет с благодарностью.

Это программа:

using System;
using System.IO;
using System.Linq;
using System.Collections.Generic;

namespace gpa
{
    class Program
    {
        static void Main(string[] args)
        {
            //create a list for the grades to go into
            List<double> GradeList = new List<double>();


            Console.Write("\n********************************************\n");
            bool LastGrade = false;
            while (LastGrade == false)
            {



                //pass letter as parameter to get the GradePoint
                double Grade = Calculations.GetGradePoint();

                if (Console.ReadLine() == "")
                {
                    LastGrade = true;
                }
                else
                {
                    GradeList.Add(Grade);
                }
            }

            //add all the gradepoints and round to 2 decimal places
            double TotalGradePoints = Math.Round(GradeList.Sum(), 2);
            Console.WriteLine($"your total grade points are {TotalGradePoints}");

            Console.WriteLine("How many total credits did you take this semester?");
            double TotalCredits = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine($"total credits {TotalCredits}");

            double EndGPA = Calculations.GPA(TotalGradePoints, TotalCredits);
            Console.WriteLine($"Your GPA this semester will be {EndGPA}");



        }
    }
}

Это класс вычислений, который я добавил:

using System;
namespace gpa
{
    public class Calculations
    {

        public static double GPA(double points, double credits)
        {
            double average = points / credits;
            return average;

        }

        public static double GetGradePoint()
        {
            Console.WriteLine("Enter your letter grade for each class");
            double Grade = 0;
            string letter = Console.ReadLine();
            if (letter == "A")
            {
                return 4;
            }
            if (letter == "A-")
            {
                return 3.7;
            }
            if (letter == "B+")
            {
                return 3.3;
            }
            if (letter == "B")
            {
                return 3;
            }
            if (letter == "B-")
            {
                return 2.7;
            }
            if (letter == "C+")
            {
                return 2.3;
            }
            if (letter == "C")
            {
                return 2;
            }
            if (letter == "C-")
            {
                return 1.7;
            }
            if (letter == "D+")
            {
                return 1.3;
            }
            if (letter == "D")
            {
                return 1;
            }
            if (letter == "F")
            {
                return 0;
            }
            return Grade;
            //do not need to add looping mechanism in this fucntion - loop it in the main function

            // Write function that takes a letter grade as input
            // and returns the grade-point value of that letter grade

            // Replace your switch statement above with a call to this function

        }




    }
}

Это вывод: введите описание изображения здесь

1 Ответ

0 голосов
/ 26 апреля 2020

Ваш логин программы c имеет недостатки. Так. У вас есть al oop, который продолжает цикл и вызывает метод. В этом методе GetGradePoint вы запрашиваете ввод оценок и затем читаете ввод, используя Console.ReadLine().

Это нормально. Вопрос приходит после. Вы снова ждете ввода от пользователя, и если он вводит что-либо, кроме пустой строки, программа добавит первое значение оценки ввода, а затем l oop обратно, так как LastGrade все еще ложно.

Это означает, что программа запускается с начала l oop, что означает, что она затем снова вызовет метод GetGradePoint, поэтому она снова запрашивает ввод. Также, если вы затем введете пустую строку, оценка, введенная пользователем, не будет добавлена ​​в список GradeList.

Вам необходимо go через вашу программу, поскольку проблема, как я уже сказал, заключается в логах c вашей программы. Я подозреваю, что другая проблема, связанная с неправильным GPA, также исправится.

Подсказки по коду:

Вместо 1000 операторов if, поскольку вы принимаете только один символ, который можете использовать else if для остальных утверждений. Хотя это не имеет большого значения, так как вы возвращаете значение. IE:

if(condition)
{
}
else if(other condition)
{
}

Ваше время l oop принимает логическое значение в качестве условия, которое обеспечивает ==, но вместо этого вы можете использовать переменную LastGrade в качестве условия для l oop IE:

while(!LastPass)
{
}

Что касается получения ввода, я бы переписал его примерно как

//Remove the line in GetGradePoint if you're gonna put it here
Console.WriteLine("Enter your grades");
while(condition)
{
    string input = Console.ReadLine();
    if(input != "")
    {
        var grade = GetGradePoint(input);
        GradeList.Add(grade);
    }
    else LastGrade = true;
}
//Rest of code to calculate GPA

Это грубый псевдо-c# код. Что касается принятия как строчных, так и прописных букв: вы можете использовать .ToUpper() на входе, чтобы обеспечить ввод заглавной буквы, даже если пользователь вводит строчную букву.

...