TransWikia.com

Тернарный оператор не работает а if работает

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;
            }
        }
    }
}

3 Answers

Условный оператор:

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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP