Професионална програма
Loading...
+ Нов въпрос
Elena123456 avatar Elena123456 30 Точки

6. The most powerful word- Изпит 6 и 7 юли 2019- C#,Java Script- Сбор от ASCII стойности

Здравейте,

може ли малко помощ в логиката ми за поредната задача с използването на ASCII стойности? Някъде кодът ми се чупи и не осъзнавам къде точно.

А на Java Script какъв е метода за взимане стойностите на символите от ASCII таблицата?

 

Предварително благодаря!

 

За Лора думите притежават голяма сила. Тя те моли да измислиш алгоритъм, с който да откриеш коя е "най-силната" дума. До получаване на команда "End of words"ще се четат от конзолата думи. За да се открие силата на всяка една, трябва да се намери сборът от ASCII стойностите на символите, от които се състои думата. Ако започва с гласна буква-'a', 'e', 'i', 'o', 'u', 'y'(или техните еквивалентни главни букви),полученият сбор трябва да се умножи по дължината на думата, в противен случай, да се раздели на дължината и да се закръгли до най-близкото цяло число надолу.

Вход

До получаване на команда "End of words"се чете по един ред от конзолата:

•дума–текст

Изход

След приключване на програмата се печата на един ред думата с "най-голяма сила":

•"The most powerful word is {думата с най-голяма сила}-{силата на думата}"

 

Моя неуспешен опит на С#: https://judge.softuni.bg/Contests/Practice/Index/1745#11

using System;
                    
public class Program
{
    public static void Main()
    {
        
        var word=Console.ReadLine();
        var end="End of words";
        var sum=0;
        var maxSum=0;
        var result=0;
        var maxResult=1;
        var mostPowerfulWord = "";
        
        while(word!=end) {
        word=Console.ReadLine();
         for(var i=1;i<=word.Length;i++) {
            var letter=(int)word[i];
             sum=sum+letter;
             if(letter=='a'||letter=='A'||letter=='e'||letter=='E'||letter=='i'||letter=='I'||letter=='o'||letter=='O'||letter=='u'||letter=='U'||letter=='y'||letter=='Y') {
                 result=sum*word.Length;
             }
             else{
            result=Math.Floor(sum/word.Length); // и тук не работи
             }
            
         }
            if(result>maxResult) {
                maxResult=result;
                mostPowerfulWord=word;
            }
        }
            
        Console.WriteLine("The most powerful word is {0}-{1}",  mostPowerfulWord,maxResult);        
        
    }
}

 

Тагове:
0
Programming Basics 01/06/2020 20:24:39
nickwork avatar nickwork 368 Точки

Това ти е кода ... вече работи. Съветвам те да го сравниш с твоето решение. Като съвет не пиши вар, а давай точният тип на променливите, за да се научиш как работят (например Math.Floor(charSum / word.Length) връща децимал, а с този вар му подаваше инт).While цикъла беше грешен, първо провераше да не е енд, а после четеше, което тябва да е на обратно. Постарал съм се да не пиша много съкратено за да ти е по ясно. Ако имаш въпроси питай...

JS

var string = "Some string";

for (var i = 0; i < string.length; i++) {
  console.log(string.charCodeAt(i));
}

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

 

using System;
using System.Linq;

namespace Test
{
    class Program
    {
        static void Main()
        {
            string end = "End of words";

            decimal maxResult = decimal.MinValue;
            string mostPowerfulWord = string.Empty;

            while (true)
            {
                string word = Console.ReadLine(); // първо четеш, после проверяваш!

                if (word == end)
                {
                    break;
                }


                decimal charSum = 0;
                decimal result = 0;

                foreach (var currentChar in word)
                {
                    charSum += currentChar;
                }

                char[] vowels = new[] { 'a', 'A', 'e', 'E', 'u', 'U', 'i', 'I', 'o', 'O' };

                if (vowels.Any(x => word.StartsWith(x))) // тук можеш да изброиш всички гласни по този начин word.StartsWith('а') || word.StartsWith('A') || word.StartsWith('e')....аз съм ти дал съкратен вариант
                {
                    result = charSum * word.Length;
                }
                else
                {
                    result = Math.Floor(charSum / word.Length); // и тук не работи
                }


                if (result > maxResult)
                {
                    maxResult = result;
                    mostPowerfulWord = word;
                }
            }

            Console.WriteLine($"The most powerful word is {mostPowerfulWord} - {maxResult}");
        }
    }
}
 

1
Elena123456 avatar Elena123456 30 Точки

Здравейте, благодаря за отделеното време и за съветите. Разгледах кода ви и въведох корекции в моя, като още при четенето на променливите въведох и типа им. Четях думата и преди, и след while цикъла, но го коригирах първо да се чете думата и после да се проверява. Добавих след while цикъла и една if проверка- ако думата съвпада с "End". Много Ви благодаря!

Заедно с вашия код разгледах кода и на други колеги, като се опитах да ги сравня с моя. Отново не мога да разбера къде е грешката в моя код. Моля за помощ! :)

 


  using System;
                    
public class Program
{
    public static void Main()
    {
        
        string word=Console.ReadLine();
        string end="End of words";
        decimal charSum=0;
        decimal result=0;
        decimal maxResult=decimal.MinValue;
        decimal charletter=0;
        string mostPowerfulWord = "";
        
        while(word!=end) {
       
         for(int i=1;i<=word.Length;i++) {
            charletter=word[i];
             charSum=charSum+charletter;
         }
             if(charletter=='a'||charletter=='A'||charletter=='e'||charletter=='E'||charletter=='i'||charletter=='I'||charletter=='o'||charletter=='O'||charletter=='u'||charletter=='U'||charletter=='y'||charletter=='Y') {
                 result=charSum*word.Length;
             }
             else{
            result=Math.Floor(charSum/word.Length);
             }
            
         
            if(result>maxResult) {
                maxResult=result;
                mostPowerfulWord=word;
            }
        
            result = 0;
            word = Console.ReadLine();
        }
        
        if(word == "End of words")
                {
        Console.WriteLine("The most powerful word is {0}-{1}",  mostPowerfulWord,maxResult);  
            
        
    }
}
}

 

0
nickwork avatar nickwork 368 Точки

1. Не попадаш в това условие (. Ако започва с гласна буква - 'a', 'e', 'i', 'o', 'u', 'y' ....), защото за тази проверка (дали започва с гласна) използваш charletter=word[i] , word[i] винаги ти дава последната буква на думата , за да вземеш първата трябва да е word[0].

2. Не зануляваш charSum след всяка нова дума.

3.При сумиране на аски стойностите  (for (int i = 1; i <= word.Length; i++)) трябва да трябва да итерираш от 0 за да минеш през всички символи (стринг е масив от чарове с начален индекс 0, а не 1, ако много държиш цикъла да започва от 1 виж решението което съм дал). Ако итерираш от 1 винаги ще пропускаш първата буква (дебъгни и ще видиш)

4. При печатане на резултата трябва да има спейсове между ({думата с най-голяма сила} - {силата на думата})

...Горе долу това са грешките. Като съвет разбивай кода на части, всяка част я проверявай дали работи правилно с дебъгера, не пиши много код на един път и винаги тествай новото парче код, което си написала :) Успех 

Цикъла трябва да започва така : 

while (word != end)
        {
            decimal charSum = 0;

            for (int i = 1; i <= word.Length; i++)
            {
                charletter = word[0]; //
                charSum = charSum + word[i -1];
            }

 

Цялото решение :

 

using System;

public class Program
{
    public static void Main()
    {

        string word = Console.ReadLine();
        string end = "End of words";
        decimal result = 0;
        decimal maxResult = decimal.MinValue;
        decimal charletter = 0;
        string mostPowerfulWord = "";

        while (word != end)
        {
            decimal charSum = 0;

            for (int i = 1; i <= word.Length; i++)
            {
                charletter = word[0]; // тук взимаме само първата буква, която ще използваме в иф проверката после
                charSum = charSum + word[i -1]; // i -1 за да хванем всички букви на стринга, да стартираме от нулев индекс
            }

            if (charletter == 'a' || charletter == 'A' || charletter == 'e' || charletter == 'E' || charletter == 'i' || charletter == 'I' || charletter == 'o' || charletter == 'O' || charletter == 'u' || charletter == 'U' || charletter == 'y' || charletter == 'Y')
            {
                result = charSum * word.Length;
            }
            else
            {
                result = Math.Floor(charSum / word.Length);
            }


            if (result > maxResult)
            {
                maxResult = result;
                mostPowerfulWord = word;
            }

            result = 0;
            word = Console.ReadLine();
        }

        if (word == "End of words")
        {
            Console.WriteLine("The most powerful word is {0}-{1}", mostPowerfulWord, maxResult);


        }
    }
}

1
Elena123456 avatar Elena123456 30 Точки

Благодаря за подробните обяснения!

В Programing Basic не учим масиви, поне в моя курс не се учи. Благодаря за поправката в цикъла, че като започвам от 1 винаги ще пропускам първата дума.

Благодаря и за разяснението, че като изполвам word[i], изобщо няма да мога да взема първата буква и за това трябва да е word[0].

Опитах се и аз самостоятелно да нанеса корекции Ви в кода си и 100/100. smiley


  using System;
                    
public class Program
{
    public static void Main()
    {
        
        string word=Console.ReadLine();
        string end="End of words";
        decimal charSum=0;
        decimal result=0;
        decimal maxResult=decimal.MinValue;
        decimal charletter=0;
        string mostPowerfulWord = "";
        
        while(word!=end) {
       
         for(int i=0;i<word.Length;i++) {
            charletter=word[i];
             charSum=charSum+charletter;
         }
             if(word[0]=='a'||word[0]=='A'||word[0]=='e'||word[0]=='E'||word[0]=='i'||word[0]=='I'||word[0]=='o'||word[0]=='O'||word[0]=='u'||word[0]=='U'||word[0]=='y'||word[0]=='Y') {
                 result=charSum*word.Length;
             }
             else{
            result=Math.Floor(charSum/word.Length);
             }
            
         
            if(result>maxResult) {
                maxResult=result;
                mostPowerfulWord=word;
            }
            charSum=0;
            result = 0;
            word = Console.ReadLine();
        }
        
        if(word == end)
                {
        Console.WriteLine("The most powerful word is {0} - {1}",  mostPowerfulWord,maxResult);  
            
        
    }
}
}

 

Поздрави и много успехи и на Вас!

0