8 svar
333 visningar
LlLinnea är nöjd med hjälpen
LlLinnea 51
Postad: 28 apr 2022 16:40 Redigerad: 28 apr 2022 16:44

Felhantering

Hej,
behöver hjälp att förstå hur jag kan åtgärda problemet med inkorrekt felhantering.
Arbetar i consoll application i visual studio.
Jag är absolut nybörjare (vilket ju min kod bevisar) och önskar en så enkel lösning som möjligt.
Nu förstår jag att jag försökt göra en while-loop som ska åtgärda problemet med fel inmatning, men nu går ju loopen helatiden och jag går aldrig vidare i programmet. Hur kan jag "stoppa", så att säga?
Eller måste jag göra felhanteringen på något annat sätt?
Jag önskar inte behöva skriva om hela koden då min tid att lösa uppgiften håller på rinna ut..
Tacksam för hjälp.

using System;

namespace GradeProgram
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string[] subject = { "mattematik", "svenska", "engelska", "histroia", "fysik" };
            int[] points = new int[5];
            char[] grade = new char[6];
            Console.WriteLine("Hej och välkommen till betygsprogrammet!");
            Console.ReadLine();

            ReadGrade(subject, points);
            GetGrade(subject, points, grade);
            PrintOutGrade(subject, points, grade);
            StatestikOut(subject, grade, points);




        }
        static void ReadGrade(string[] subject, int[] point)
        {


            int getPoints;
            bool correctValue = false;

            while (!correctValue)
            {
                try
                {

                    for (int i = 0; i < subject.Length; i++)
                    {
                        Console.WriteLine("Mata in ditt betyg i siffror i följande ämnen: " + subject[i]);
                        getPoints = Convert.ToInt32(Console.ReadLine());
                        point[i] = getPoints;
                    }
                }
                catch (Exception e)
                {


                    Console.WriteLine("Nu gjorde du en felaktig inmatning, " + e.Message);
                    Console.ReadLine();
                }
         

                  
                       
                
            }

        }
        static void GetGrade(string[] subject, int[] points, char[] grade)
        {



            for (int i = 0; i < subject.Length; i++)
            {
                if (points[i] > 90 && points[i] <= 100)
                    grade[i] = 'A';
                else if (points[i] >= 90)
                    grade[i] = 'B';
                else if (points[i] >= 80)
                    grade[i] = 'C';
                else if (points[i] >= 70)
                    grade[i] = 'D';
                else if (points[i] >= 60)
                    grade[i] = 'E';
                else if (points[i] <= 50)
                    grade[i] = 'F';

            }
        }
        static void PrintOutGrade(string[] subject, int[] points, char[] grade)
        {
            Console.WriteLine("Dina betyg: ");
            for (int i = 0; i < subject.Length; i++)
                Console.WriteLine(subject[i] + " betyget: " + grade[i]);
            Console.ReadLine();
            {

             
                Console.WriteLine("Tryck på valfri tangent för att se betygsstatestik");
                Console.ReadLine();
                      

            }
        }

        static void
            StatestikOut(string[] subject, char[] grade, int[] points)
        {
            int antalA = 0;
            int antalC = 0;
            int antalF = 0;
            int antalBDE = 0;
            int sum = 0;
     
            for (int i = 0; i < subject.Length; i++)
                sum = sum + points[i];
            for (int i = 0; i < grade.Length; i++)
                if (grade[i] == 'A')
                    antalA++;
                else if (grade[i] == 'C')
                    antalC++;
                else if (grade[i] == 'F')
                    antalF++;
                else if (grade[i] == 'B')
                    antalBDE++;
                else if (grade[i] == 'D')
                    antalBDE++;
                else if (grade[i] == 'E')
                    antalBDE++;



            Console.WriteLine("Dina totala antal poäng är:" + sum);
            Console.Write("Du har: " + antalA + " antal A." +
           " Du har: " + antalC + "antal C." +
           " Du har: " + antalF + " antal F." +
           " Dina övriga betyg (B & D) är: " + antalBDE + "st.");



            Console.ReadLine();

        }

    }

}



Laguna 28468
Postad: 28 apr 2022 16:50

Vad vill du ska hända om man gör en felaktig inmatning? Ska man mata in allt igen, eller bara det värdet?

LlLinnea 51
Postad: 28 apr 2022 16:56

Jag vill att den ska ge felmeddelandet och ge användaren en ny chans. Som den gör nu, problemet är att det inte fungerar då den bara fortsätter loopa ämnena, alltså när användaren skrivit in alla betyg korrekt så börjar loopen om från första ämnet igen och går inte vidare till nästa metod.

Laguna 28468
Postad: 28 apr 2022 17:01

Du får åtminstone sätta correctValue till true nån gång.

LlLinnea 51
Postad: 28 apr 2022 17:16 Redigerad: 28 apr 2022 17:41

Ok. NU fick jag det att fungera! 

Men...Får jag fråga om en annan sak.

Hur anropar jag den sista metoden "StatestikOut"? istället för att den bara skrivs ut när jag trycker på enter/valfri knapp.

Har testat tidigare att göra en meny med två val, en för statistik och ett för att avsluta. Sen en switchsats som skulle köra metoden "StatestikOut". Gick inte då metoden inte kunde anropas. .

Laguna 28468
Postad: 28 apr 2022 20:57

Du anropar StatestikOut, men funktionen innan (PrintOutGrade) gör Console.ReadLine, flera gånger t o m.

Är det inte du som har skrivit programmet?

LlLinnea 51
Postad: 28 apr 2022 21:20

Det är jag men jag vet väl inte riktigt vad jag gör kanske..:(

Jag försöker..

Det jag menar är att jag inte lyckas anropa.

Vad menas med att den gör det flera gånger? Jag ser inte..

Laguna 28468
Postad: 28 apr 2022 21:28

Högst upp, i Main, anropar du först PrintOutGrade och sedan StatestikOut. Så först görs allt som står i PrintOutGrade, och sedan allt som står i StatestikOut.

Sist i PrintOutGrade står Readline, sedan en utskrift och sedan en ReadLine till. Vid varje ReadLine väntar programmet på att du ska trycka på Enter.

Ta bort de ReadLine som du inte vill ha.

LlLinnea 51
Postad: 28 apr 2022 21:33

Ögonöppnare! Tack!

Svara Avbryt
Close