Организация вывода в массиве

91
18 февраля 2022, 00:10

Нужно вывести произведение чисел <50, не используя условие if для проверки значения pr в выводе :

        {
        //
        string noelem = "Элементов не найдено";
        int[] mas = new int[Mass_TB.Lines.Length];
        //
        for (int i = 0; i < mas.Length; i++)
            mas[i] = Convert.ToInt32(Mass_TB.Lines[i]);
        //
        int sum = 0;
        int pr = 1;
        for (int i = 0; i < mas.Length; i++)
        {
            if (mas[i] < 50)
                pr *= mas[i];
        }
        for (int i = 0; i < mas.Length; i++)
        {
            if (mas[i] > 100)
                sum += mas[i];
        }
        //
            TB2.Clear();
        TB2.AppendText((pr == 1) ? ((pr >= 1) ? pr.ToString() : noelem) : ((pr <= 0) ? pr.ToString() : noelem));
    }

Однако, при вводе числа > 50 должно выводится "Элементов не найдено", вместо этого в выводе всегда пишет единицу. В чём дело и как это исправить?

Answer 1

Вот вариант поиска произведения и суммы без условного оператора.

Формально тернарный оператор это тоже условие, но организовать вывод без него будет очень проблематично.

int sum = 0;
        int pr = 1;
        for (int i = 1; i < mas.Length; i++)
        {                
            pr=pr*(Convert.ToInt32(mas[i] < 50)*mas[i]+Convert.ToInt32(mas[i] >= 50));
            sum  = sum+Convert.ToInt32(mas[i] > 100)*mas[i];
        }
            string output=(pr > 1) ? Convert.ToString(pr): noelem;
            TB2.Clear();
       TB2.AppendText(output);

Пояснение

Convert.ToInt32(mas[i] < 50) 1 если меньше и 0 если больше Convert.ToInt32(mas[i] >= 50) 0 если меньше и 1 если больше

Выражение

Convert.ToInt32(mas[i] < 50)*mas[i]+Convert.ToInt32(mas[i] >= 50)

Если mas[i]<50, то Convert.ToInt32(mas[i] < 50)=1, а Convert.ToInt32(mas[i] >= 50)=0, получаем 1*mas[i]+0=mas[i].

Если mas[i]>=50, то Convert.ToInt32(mas[i] < 50)=0, а Convert.ToInt32(mas[i] >= 50)=1, получаем 0*mas[i]+1=1.

Answer 2

Нельзя проверить значение переменной pr через значение этой самой pr, так как при вводе любого числа >50 будет выведена единица, то есть программа "думает", что значение pr изменялось. Это, конечно, неправильно. Вместо этого надо использовать счётчик :

        {
        int[] mas = new int[Mass_TB.Lines.Length];
        for (int i = 0; i < mas.Length; i++)
            mas[i] = Convert.ToInt32(Mass_TB.Lines[i]);
        int sum = 0; string noelem = "Элементов не найдено";
        int pr = 1;
        int d = 0;
        for (int i = 0; i < mas.Length; i++)
        {
            if (mas[i] > 50) 
            {
                pr *= mas[i];
                d++;
            }
            if (d > 0)
                TB2.Text = pr.ToString();
            else
                TB2.Text = noelem;
        }
    }
READ ALSO
Vue js - как программно отрендерить компонент?

Vue js - как программно отрендерить компонент?

Есть компонент, который принимает один параметр для отображенияВозникла необходимость отрендерить его не в шаблоне, а в методе (для последующей...

634
Не могу понять, как написать манипулятор для оператора ввода

Не могу понять, как написать манипулятор для оператора ввода

Есть класс, который отвечает за установку двунаправленного соединения между процессами(через pipe), ввод в stdin дочернего процесса и вывод через...

102
Как нарисовать линию с символьным паттерном?

Как нарисовать линию с символьным паттерном?

Необходимо нарисовать линию со сложным паттерном в виде символа при помощи QPainterКак в примере ниже

69
uint8_t работает также как int8_t

uint8_t работает также как int8_t

Недавно начал изучать C++Написал простенький скрипт, дабы проверить свои знания, в итоге вместо ожидаемого 255, консоль выводит -1(тоже самое,...

107