Stack Overflow на русском Asked on December 30, 2021
ЗАДАЧА
" Запросить у пользователя не более 10 целых положительных чисел. Пользователь может прекратить приём чисел, введя 0.
После прекращения приёма целых чисел (это происходит в случае если было введено 10 чисел, либо пользователь ввёл 0, чтобы не вводить все 10) подсчитать среднее значение целых положительных чисел кратных трём и вывести на консоль. "
ВОПРОСЫ :
1)Почему , если в цикле foreach использовать тернарные операторы(я их закомментировал), то значения переменных result и count не меняются. А если использовать if ,то всё работает корректно.
2)И ещё один вопрос – в си шарпе нет срезов как в пайтоне ???, например str[{с какого индекса}:{по какой индекс}:{шаг}]
гуглил – гуглил , и нагуглил , что это только через linq можно ( skip() и take() )
using System;
using System.Diagnostics.Tracing;
using System.Linq;
namespace BeginnerCourseHomeWork
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Enter some positive numbers");
Console.WriteLine("Enter "0" to indicate end of your sequence");
string userInput = Console.ReadLine();
int[] numbers = new int[0];
if (userInput.Trim().Split(' ').Length > 10)
{
string[] strArr = userInput.Trim().Split(' ').Take(10).ToArray();
numbers = Array.ConvertAll(strArr, int.Parse);
}
else if (userInput.Trim().Split(' ').Length <= 10 &&
Array.Exists(Array.ConvertAll(userInput.Trim().Split(' '), int.Parse), zero => zero == 0))
{
int zeroIndex = Array.IndexOf(Array.ConvertAll(userInput.Trim().Split(' '), int.Parse), 0);
Console.WriteLine(zeroIndex);
numbers = Array.ConvertAll(userInput.Trim().Split(' '), int.Parse).Take(zeroIndex).ToArray();
}
else
{
numbers = Array.ConvertAll(userInput.Trim().Split(' '), int.Parse);
}
int result = 0;
int count = 0;
foreach (int i in numbers)
{
if (i % 3 == 0)
{
result += i;
count++;
}
//result = i % 3 == 0 ? result + i : result;
//count = i % 3 == 0 ? count++ : count;
}
switch(count)
{
case 0:
Console.WriteLine("None of this numbers might be divided by three without reminder");
break;
default:
double average = (double)result / (double)count;
Console.WriteLine($"{count} number might be divided by three.{Environment.NewLine}" +
$"Their average equals {average:F}");
break;
}
}
}
}
Условный оператор:
result += i % 3 == 0 ? i : 0;
count += i % 3 == 0 ? 1 : 0;
А про срезы вот: https://stackoverflow.com/a/55498674/4928642, но шага там нет.
Answered by Qwertiy on December 30, 2021
result = i % 3 == 0 ? result + i : result; // - works
count = i % 3 == 0 ? count + 1 : count;
Answered by Igor on December 30, 2021
Ответ на первый вопрос:
Проблема в том что в данном случае в тернарной операции постфиксный инкремент игнорируется потому что сначала значение переменной count возвращается в качестве результата операции, а затем уже к нему прибавляется 1, и мы получим что к инкременту консоль не приступает а сразу делает возврат значения count(а это ноль). ПОЭТОМУ делай в подобных ситуациях префиксный инкремент, в твоей ситуации так:
count = i % 3 == 0 ? ++count : count;
Ответ на второй вопрос:
string text = "Хороший день";
text = text.Remove(3, 6);
Итог: 'Хорень'
Answered by Al-Tamir on December 30, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP