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);
}
}
Здравейте, благодаря за отделеното време и за съветите. Разгледах кода ви и въведох корекции в моя, като още при четенето на променливите въведох и типа им. Четях думата и преди, и след 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);
}
}
}
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);
}
}
}
Благодаря за подробните обяснения!
В Programing Basic не учим масиви, поне в моя курс не се учи. Благодаря за поправката в цикъла, че като започвам от 1 винаги ще пропускам първата дума.
Благодаря и за разяснението, че като изполвам word[i], изобщо няма да мога да взема първата буква и за това трябва да е word[0].
Опитах се и аз самостоятелно да нанеса корекции Ви в кода си и 100/100.
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);
}
}
}
Поздрави и много успехи и на Вас!
Ето едно малко по различно решение.
using System;
namespace The_Most_Powerful_Word
{
class Program
{
static void Main(string[] args)
{
string word = Console.ReadLine();
double sum = 0;
double theBiggestValue = 0;
string theMostPowerfulWord = "";
string[] vowels = { "a", "e", "i","o", "u", "y","A", "E", "I","O", "U", "Y" };
while (word != "End of words")
{
foreach (char i in word)
{
int digit = (int)i;
sum += digit;
}
var check = Array.Exists(vowels, x => x == Char.ToString(word[0]));
if (check)
{
sum *= word.Length;
}
else
{
sum = Math.Floor(sum / word.Length);
}
if (sum > theBiggestValue )
{
theMostPowerfulWord = word;
theBiggestValue = sum;
}
sum = 0;
word = Console.ReadLine();
}
Console.WriteLine($"The most powerful word is {theMostPowerfulWord} - {theBiggestValue}");
}
}
}