Loading...
Elena123456 avatar Elena123456 235 Точки

08. Letters Change Numbers*- (Text Processing - Exercise) 40/100

I need some help for this exercise. I will apreciate it a lot if somebody takes out of their time to check my rounded method.

With this input "A12b s17G" my output is correct- "330.00" and with this input "a1A" my output is correct too, but with " P34562Z q2576f H456z" my output is "46015.00", not "46015.13".

https://softuni.bg/trainings/resources/officedocument/49591/text-processing-exercise-csharp-fundamentals-may-2020/2830

https://judge.softuni.bg/Contests/Compete/Index/1217#7

 

using System;
using System.Text;
using System.Linq;

namespace text
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            string[] inputArray = Console.ReadLine().Split(" ",StringSplitOptions.RemoveEmptyEntries);
            string alphabetUpperCase = "ABCDEFGHIGKLMNOPQRSTUVWXYZ";
            string alphabetLowerCase = "abcdefghigklmnopqrstuvwxyz";
            int allSum = 0;

            foreach (var text in inputArray)
            {
                int firstCurrentSum = 0;
                int lastCurrentSum = 0;
                char firstLetter = text[0];
                char lastLetter = text[text.Length - 1];
                int numberLength = text.Length - 2;
                string numberLikeString = text.Substring(1, numberLength);
                int number = int.Parse(numberLikeString);

                if (alphabetUpperCase.Contains(firstLetter))
                {
                    int firstLetterPositionInAlphabet = alphabetUpperCase.IndexOf(firstLetter)+1;
                    firstCurrentSum=number / firstLetterPositionInAlphabet;
                }

                else if (alphabetLowerCase.Contains(firstLetter))
                {
                    int firstLetterPositionInAlphabet = alphabetLowerCase.IndexOf(firstLetter)+1;
                    firstCurrentSum =number * firstLetterPositionInAlphabet;
                }

                if (alphabetUpperCase.Contains(lastLetter))
                {
                    int lastLetterPositionInAlphabet = alphabetUpperCase.IndexOf(lastLetter)+1;
                    lastCurrentSum = firstCurrentSum - lastLetterPositionInAlphabet;
                }

                else if (alphabetLowerCase.Contains(lastLetter))
                {
                    int lastLetterPositionInAlphabet = alphabetLowerCase.IndexOf(lastLetter)+1;
                    lastCurrentSum =firstCurrentSum + lastLetterPositionInAlphabet;
                }

                allSum += lastCurrentSum;
            }

            Console.WriteLine($"{allSum:f2}");
        }
    }
}
 

Тагове:
0
C# Fundamentals 14/11/2020 19:25:15
Axiomatik avatar Axiomatik 2422 Точки
Best Answer

Hi Elena,

The exercise can only be solve when using: totalSum = Math.Round(totalSum, 2, MidpointRounding.AwayFromZero);

Strangely enough, Midpoint Rounding is never used again in the latter exercises, so I guess it is solely used for some demo-purpose. Otherwise your code seems OK so that should be the only problem.

using System;
using System.Text;

namespace lettersChangeNumbers
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] input = Console.ReadLine().Split(" ", StringSplitOptions.RemoveEmptyEntries);
            double totalSum = 0;


            for (int i = 0; i < input.Length; i++)
            {
                StringBuilder sb = new StringBuilder(input[i]);
                char firstLetter = sb[0];
                char lastLetter = sb[^1];
                string numbers = input[i].Substring(1, input[i].Length - 2);
                double num = int.Parse(numbers);
                if ((int)firstLetter >= 65 && (int)firstLetter <= 90)
                {
                    num = FirstCapitalLetter(firstLetter, num);
                }
                else if ((int)firstLetter >= 97 && (int)firstLetter <= 122)
                {
                    num = FirstLowerLetter(firstLetter, num);
                }
                if ((int)lastLetter >= 65 && (int)lastLetter <= 90)
                {
                    num = SecondCapitalLetter(lastLetter, num);
                }
                else if ((int)lastLetter >= 97 && (int)lastLetter <= 122)
                {
                    num = SecondLowerLetter(lastLetter, num);
                }

                totalSum += num;
                
            }
            totalSum = Math.Round(totalSum, 2, MidpointRounding.AwayFromZero);
            Console.WriteLine($"{totalSum:F2}");
        }

        static double FirstCapitalLetter(char firstLetter, double num)
        {
            int firstL = (int)firstLetter - 64;
            num = num / firstL;
            return num;
        }

        static double FirstLowerLetter(char firstLetter, double num)
        {
            int firstL = (int)firstLetter - 96;
            num = num * firstL;
            return num;
        }

        static double SecondCapitalLetter(char lastLetter, double num)
        {
            int lastL = (int)lastLetter - 64;
            num = num - lastL;
            return num;
        }

        static double SecondLowerLetter(char lastLetter, double num)
        {
            int lastL = (int)lastLetter - 96;
            num = num + lastL;
            return num;
        }
    }
}

 

0
Elena123456 avatar Elena123456 235 Точки

Hi Axiomatik,

thanks for your code. As far as I remember about  MidpointRounding.AwayFromZero from one lecture in Basic this rounding is used in some bank operations.. and for this letter exercise .

On my Monodevelop this rounding isn't working and my code is still 40/100. It wouldn't matter and I can go to another exercise, because acording to you my code seems Ok.

Thanks a lot for all your help!

Best regards!

 

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.