01. Encrypt, Sort and Print Array C#-Fund
Здравейте колеги,
нещо забих с тази задача от Arrays - More Exercises.
В Judge ми дават 60/100. Проверих дадените примери от условието - излизат ...
Може ли някой да погледне кода и евентуално да каже къде бъркам?
ето линк за моето решение: http://pastebin.com/wP5ZYkaz
Благодаря, предварително!
Условието:
Write a program that reads a sequence of strings from the console. Encrypt every string by summing:
- The code of each vowel multiplied by the string length
Input |
Output |
Comments |
4 Peter Maria Katya Todor |
1032 1071 1168 1532 |
Peter = 1071 Maria = 1532 Katya = 1032 Todor = 1168 |
3 Sofia London Washington |
1396 1601 3202 |
Sofia = 1601 London = 1396 Washington = 3202 |
- The code of each consonant divided by the string length
Sort the number sequence in ascending order and print it on the console.
On first line, you will always receive the number of strings you have to read.
Може ли малко помощ и за тази задача, ще съм много благодарна. Може би вече малко прекалявам, защото усещам, че и на работа аз си мисля само и единствено за задачите и лесно се отегчавам от всичко друго. :)
@krum_43 ,
приблизително логиката, която първоначално ми хрумна е подобна на вашата, която я прочетох в друга тема( https://softuni.bg/forum/22676/encrypt-sort-and-print-array )- с лист. При тестване на MonoDevelop аутпутите са ми точно тези, които трябва да се получат. Judge само 1 и 2 нулев тест ми изписва, че са коректни, а за другите получавам RunTime Error. Опитах да променя сумата от интове в дабъли, но отново RunTime Error. Махнах и всички нули от листа и отново същото положение.
Видях, че в някои решения колеги пишат, че е достатъчно да има само една if проверка и else съответно. Не мисля, че е достатъчна само else проверка, защото потребителя може да реши да си въведе каквото иска освен гласни или съгласни-интове наприме. А и отделно от това видях, че списъка не трябва да съдържа нула.
Найстина не мога да си обясня от къде идва RunTime Error.
using System;
using System.Collections.Generic;
using System.Linq;
namespace ArrayMoreExe
{
class MainClass
{
public static void Main(string[] args)
{
List<char> vowels = new List<char>
{
'a','A',
'e','E',
'i','I',
'o','O',
'u','U'
};
List<char> consonants = new List<char>
{
'B','b','C','c','d','D','F','f','G','g','H','h','J','j','K','k','L','l','M','m','N','n','P','p',
'Q','q','R','r','S','s','T','t','V','v','W','w','X','x','Y','y','z','Z'
};
int linesNumbers = int.Parse(Console.ReadLine());
double[] sumOfAll = new double[4];
for (int i = 0; i <linesNumbers; i++)
{
string word = Console.ReadLine();
double sum = 0;
for (int k = 0; k < word.Length; k++)
{
if (vowels.Contains(word[k]))
{
sum = sum + ((double) word[k] * word.Length);
}
else if(consonants.Contains(word[k]))
{
sum=sum + (double)(word[k] / word.Length);
}
}
sumOfAll[i] =sum;
}
var listOfSum = sumOfAll.ToList();
var newListWithoutZero= listOfSum.Where(x => x != 0);
var newOrderList = newListWithoutZero.OrderBy(x => x);
foreach (var item in newOrderList)
{
Console.WriteLine(item);
}
}
}
}
@Elena123456
Здравейте, Елена,
На пръв поглед, заложена е дължина на масива 4, вместо linesNumber double[] sumOfAll = new double[4];
След това наистина няма нужда от else if, нито от кастване към дабъл. Сложи си сумата да е инт. Мисля, че и аз бях тръгнала да се подсигурявам толкова много, но входните данни се оказват доста прости и с толкова проверки, накрая излиза грешно решение. Ето как ти коригирах кода:
using System;
using System.Collections.Generic;
using System.Linq;
namespace ForumProblemWithFirst
{
class Program
{
static void Main(string[] args)
{
List<char> vowels = new List<char>
{
'a','A',
'e','E',
'i','I',
'o','O',
'u','U'
};
List<char> consonants = new List<char>
{
'B','b','C','c','d','D','F','f','G','g','H','h','J','j','K','k','L','l','M','m','N','n','P','p',
'Q','q','R','r','S','s','T','t','V','v','W','w','X','x','Y','y','z','Z'
};
int linesNumbers = int.Parse(Console.ReadLine());
double[] sumOfAll = new double[linesNumbers];
for (int i = 0; i < linesNumbers; i++)
{
string word = Console.ReadLine();
int sum = 0;
for (int k = 0; k < word.Length; k++)
{
if (vowels.Contains(word[k]))
{
sum = sum + (word[k] * word.Length);
}
else
{
sum = sum + (word[k] / word.Length);
}
}
sumOfAll[i] = sum;
}
var listOfSum = sumOfAll.ToList();
var newListWithoutZero = listOfSum.Where(x => x != 0);
var newOrderList = newListWithoutZero.OrderBy(x => x);
foreach (var item in newOrderList)
{
Console.WriteLine(item);
}
}
}
}
Здравейте @ MarinaRadusheva и благодаря много за отделеното време. :)
Не мога да си обясня как се появи масив с дължина 4 в кода ми. Още в началото исках да е с дължина, толкова колкото и инпути (стрингове) имаме. Но да, не е станало така както съм си го мислили и отново благодаря за доглеждането Ви и желанието Ви да ми го съобщите. :)
А колкото до условието на задачата, може би по-коректно е да бъде така зададено: "ако стринга съдържа гласна буква, кода на всяка гласна умножете с дължината на самия стринг, но ако съдържа всичко останало друго съотвения код разделете на неговата дължина." Дефакто излиза, че изобщо няма нужда от масив/лист, в които да държим всички съгласни букви. Програмата изобщо не се интересува дали имаме съгласни, защото и ето това решение, без и да споменавам някъде за съгласни букви, е 100/100. Странно, но факт.
Поздрави и всичко най-добро!
using System;
using System.Collections.Generic;
using System.Linq;
namespace ArrayMoreExe
{
class MainClass
{
public static void Main(string[] args)
{
List<char> vowels = new List<char>
{
'a','A',
'e','E',
'i','I',
'o','O',
'u','U'
};
int linesNumbers = int.Parse(Console.ReadLine());
int[] sumOfAll = new int[linesNumbers];
for (int i = 0; i <linesNumbers; i++)
{
string word = Console.ReadLine();
int sum = 0;
for (int k = 0; k < word.Length; k++)
{
if (vowels.Contains(word[k]))
{
sum = sum + (int) word[k] * word.Length;
}
else
{
sum=sum + (int)(word[k] / word.Length);
}
}
sumOfAll[i] =sum;
}
var listOfSum = sumOfAll.ToList();
var newListWithoutZero= listOfSum.Where(x => x != 0);
var newOrderList = newListWithoutZero.OrderBy(x => x);
foreach (var item in newOrderList)
{
Console.WriteLine(item);
}
}
}
}