Премини към съдържанието
  • Добре дошли!

    Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

    Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

     

C# Задача - Не мога да си намеря очевидната грешка.


Препоръчан отговор


using System;

namespace SumStudentGrade
{
    class Program
    {
        static void Main(string[] args)
        {
            string firstName;
            string lastName;
            string school;
            int currentClass = 0;
            int enterGrade = 0;
            double sumGrade = 0.0;
            int gradeCounter;
            int schoolSubjects;
            double totalGrade;
            Console.Write("Please enter your first name: ");
            firstName = Console.ReadLine();
            Console.Write("Please enter your last name: ");
            lastName = Console.ReadLine();
            Console.Write("Please enter your school name: ");
            school = Console.ReadLine();
            Console.WriteLine("Please enter your class (1 - 12)");
            Console.Write("Class: ");
            currentClass = int.Parse(Console.ReadLine());

            while (currentClass < 1 || currentClass > 12)
            {
                Console.WriteLine("Error!");
                Console.WriteLine("Enter class from 1 to 12: ");
                Console.Write("Class: ");
                currentClass = int.Parse(Console.ReadLine());
                if (currentClass >= 1 || currentClass <= 12)
                {
                    break;
                }
            }

            Console.WriteLine("How many school subjects u have in school?");
            Console.Write("Answer: ");
            schoolSubjects = int.Parse(Console.ReadLine());

            for (gradeCounter = 0; gradeCounter < schoolSubjects; gradeCounter++)
            {
                Console.Write("Please enter grade from 2 to 6: ");
                enterGrade = int.Parse(Console.ReadLine());
                sumGrade += enterGrade;
                
                while (enterGrade < 2 || enterGrade > 6)
                {
                    Console.WriteLine("Error!");
                    Console.Write("Please enter grade from 2 to 6: ");
                    enterGrade = int.Parse(Console.ReadLine());
                    if (enterGrade >= 2 || enterGrade <= 6)
                    {
                        break;
                    }
                }
            }
            if (gradeCounter == schoolSubjects)
            {
                totalGrade = sumGrade / schoolSubjects;
                if (totalGrade < 3)
                {
                    Console.WriteLine
                        ($"The student: {firstName} {lastName} who is {currentClass} class in {school} school will be in the same class" +
                        $", because his grade is {totalGrade:f2} and it's lower than 3.00 ");
                }
                else if (totalGrade >= 3.00 && currentClass < 12)
                {
                    Console.WriteLine
                        ($"the student: {firstName} {lastName} who is {currentClass} class in {school} school has grade {totalGrade:f2}" +
                        $" and goes to {currentClass + 1} class");
                }
                else if (totalGrade >= 3 && currentClass == 12)
                {
                    Console.WriteLine
                        ($"the student: {firstName} {lastName} who is {currentClass} class in {school} school has grade {totalGrade:f2} " +
                        $"and succesfully finished school!");
                }

            }


        }
    }
}

Кодът може да е хаос, но работи безпроблемно. Поне така мислех докато не забелязах, че когато въведа оценка по-голяма от 6 или по-малка от 2 я смята и нея. Как да го оправя това? Все още съм Newbie и за това питам, дори с риск да бъда смъмрен от по-опитни :D

Линк към този отговор
Сподели в други сайтове

Защото в проверката пак присвояваш въведената стойност, дори и да е грешна:

while (enterGrade < 2 || enterGrade > 6)
                {
                    Console.WriteLine("Error!");
                    Console.Write("Please enter grade from 2 to 6: ");
                    // махни това -> enterGrade = int.Parse(Console.ReadLine());
                    if (enterGrade >= 2 || enterGrade <= 6)
                    {
                        break;
                    }
                }
            

Отбелязал съм ти кой ред да махнеш.

Линк към този отговор
Сподели в други сайтове

По този начин се пренабрегва и ще получа пак грешен output, т.е трябва да прочете оценки между 2 и 6, когато се въведе грешна (в този случай по-малка от 2 и по-голяма от 6) да се изпише Error, да поиска нов input и докато не е между 2 и 6 да продължава да иска. Когато получи този Input го прибавя към сметката и пренабрегва грешния.

Линк към този отговор
Сподели в други сайтове

Да, нещо ми се спи май :)

това:

sumGrade += enterGrade;
                
                

го правиш преди проверката, по този начин винаги ще ти добавя към сумата въведеното. Направи си проверка след въвеждането и ако въведеното е грешно не го добавяй и изкарай съобщение, ако е ок -> не прави нищо и го добави. Доста е объркан кода...

Линк към този отговор
Сподели в други сайтове
преди 1 час, Nikitobee написа:
using System;

namespace SumStudentGrade
{
    class Program
    {
        static void Main(string[] args)
        {
            string firstName;
            string lastName;
            string school;
            int currentClass = 0;
            int enterGrade = 0;
            double sumGrade = 0.0;
            int gradeCounter;
            int schoolSubjects;
            double totalGrade;
            Console.Write("Please enter your first name: ");
            firstName = Console.ReadLine();
            Console.Write("Please enter your last name: ");
            lastName = Console.ReadLine();
            Console.Write("Please enter your school name: ");
            school = Console.ReadLine();
            Console.WriteLine("Please enter your class (1 - 12)");
            Console.Write("Class: ");
            currentClass = int.Parse(Console.ReadLine());

            while (currentClass < 1 || currentClass > 12)
            {
                Console.WriteLine("Error!");
                Console.WriteLine("Enter class from 1 to 12: ");
                Console.Write("Class: ");
                currentClass = int.Parse(Console.ReadLine());
                if (currentClass >= 1 || currentClass <= 12)
                {
                    break;
                }
            }

            Console.WriteLine("How many school subjects u have in school?");
            Console.Write("Answer: ");
            schoolSubjects = int.Parse(Console.ReadLine());

            for (gradeCounter = 0; gradeCounter < schoolSubjects; gradeCounter++)
            {
                Console.Write("Please enter grade from 2 to 6: ");
                enterGrade = int.Parse(Console.ReadLine());
                sumGrade += enterGrade;
                
                while (enterGrade < 2 || enterGrade > 6)
                {
                    Console.WriteLine("Error!");
                    Console.Write("Please enter grade from 2 to 6: ");
                    enterGrade = int.Parse(Console.ReadLine());
                    if (enterGrade >= 2 || enterGrade <= 6)
                    {
                        break;
                    }
                }
            }
            if (gradeCounter == schoolSubjects)
            {
                totalGrade = sumGrade / schoolSubjects;
                if (totalGrade < 3)
                {
                    Console.WriteLine
                        ($"The student: {firstName} {lastName} who is {currentClass} class in {school} school will be in the same class" +
                        $", because his grade is {totalGrade:f2} and it's lower than 3.00 ");
                }
                else if (totalGrade >= 3.00 && currentClass < 12)
                {
                    Console.WriteLine
                        ($"the student: {firstName} {lastName} who is {currentClass} class in {school} school has grade {totalGrade:f2}" +
                        $" and goes to {currentClass + 1} class");
                }
                else if (totalGrade >= 3 && currentClass == 12)
                {
                    Console.WriteLine
                        ($"the student: {firstName} {lastName} who is {currentClass} class in {school} school has grade {totalGrade:f2} " +
                        $"and succesfully finished school!");
                }

            }


        }
    }
}

Кодът може да е хаос, но работи безпроблемно. Поне така мислех докато не забелязах, че когато въведа оценка по-голяма от 6 или по-малка от 2 я смята и нея. Как да го оправя това? Все още съм Newbie и за това питам, дори с риск да бъда смъмрен от по-опитни :D

Не се сърди, но кодът е уникален хаос. Само с един If/else (даже дивотията else if не трябва да я има) трябва да се напише всичко. Описва се всяка една поменлива от какъв клас ще бъде и какви условия ще изпълнява и след това "Break". Изкаваш дадено инфо че нещо е грешно и насочваш потребителят отново да въведе правилна стойност. Не знам за "къф чиф" са сложени и другите два цикъла.


Линк към този отговор
Сподели в други сайтове

Знам, че е хаос. 

  for (gradeCounter = 0; gradeCounter < schoolSubjects; gradeCounter++)
            {
                Console.Write("Please enter grade from 2 to 6: ");
                enterGrade = int.Parse(Console.ReadLine());
                sumGrade += enterGrade;
                while (enterGrade < 2 || enterGrade > 6)
                {
                    sumGrade -= enterGrade;
                    Console.WriteLine("Error!");
                    Console.Write("Please enter grade from 2 to 6: ");
                    enterGrade = int.Parse(Console.ReadLine());
                    if (enterGrade >= 2 || enterGrade <= 6)
                    {
                        sumGrade += enterGrade;
                        break;
                    }
                }
            }

Направих следната промяна, така безпроблемнно дава резултат, който трябва, но има друг проблем, който при задаването на различен вход намерих: Може да видите как при въвежданто на грешен резултат втори път не ми изписва "Error" а директно дава Please enter a grade from 2 to 6:. Може да видите примерният вход с 1 и 500. След 1 трябваше трябваше да има Error също. image.png.83d9c28a5cb97fd4ace95530000504c8.pngП.С: Както сте забелязали, дава, че резултата е 4,30 а трябва да е 4,20 - т.е добавя и тази единица, а големите числа не ги. No idea why.

Линк към този отговор
Сподели в други сайтове

Казах ти как да го оправиш - направи въвеждането и след това прави проверка какво е въведено. Ако резултата не е очаквания - даваш грешка и връщаш в началото, ако е правилен - приемаш го и го добавяш. Примерно не правиш цикъл for, а остави само while, като броиш колко резултата са въведени, там си сложи една променлива извън цикъла, например 'count=0', която да увеличаваш, ако е въведен правилен резултат и while проверявай стойността дали е равна на нужния брой 'schoolSubjects'. Например:

int count = 0;
while (count < schoolSubjects) {
                Console.Write("Please enter grade from 2 to 6: ");
                enterGrade = int.Parse(Console.ReadLine());
                if (enterGrade < 2 || enterGrade > 6) {
					Console.WriteLine("Error!");
				} else {
					sumGrade += enterGrade;
					count++;
                }
}

Избягвай да правиш повторения на един и същ код.

На горното май трябва да е наобратно проверката, сега ще редактирам.....

Линк към този отговор
Сподели в други сайтове

Thank you so much! Честно в момента яко ме е срам, че толкова елементарно нещо не успях да направя, а бях написал 20 реда повече. 

Линк към този отговор
Сподели в други сайтове

Добавете отговор

Можете да публикувате отговор сега и да се регистрирате по-късно. Ако имате регистрация, влезте в профила си за да публикувате от него.

Гост
Напишете отговор в тази тема...

×   Вмъкнахте текст, който съдържа форматиране.   Премахни форматирането на текста

  Разрешени са само 75 емотикони.

×   Съдържанието от линка беше вградено автоматично.   Премахни съдържанието и покажи само линк

×   Съдържанието, което сте написали преди беше възстановено..   Изтрий всичко

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Добави ново...

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите Условия за ползване