Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/19: Рейтинг темы: голосов - 19, средняя оценка - 5.00
13 / 10 / 3
Регистрация: 01.01.2020
Сообщений: 85

Условие верное, но код не выполняется. Окончание консольной программы через делегат

20.03.2021, 21:22. Показов 3698. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime;
 
namespace TelegaOrder
{
    class Program
    {
        static Baggage[] BaggageList = new Baggage[] { new Baggage(), new Baggage(), new Baggage()}; //создание массива типа Baggage(наш клас, который создан внизу скрипта)
        static string[] Info = new string[] { "", "", ""}; //Масив, в котором будут хранится строки. В строках будет написано какая вещ и из какого багажа подходит под критерии задачи
 
        static void Main(string[] args)
        {
 
            //заполнение масива BaggageList данными
            BaggageList[0].MassThing = 
                new float[] { 1f, 2.5f, 1.2f, 0.5f }; //заполнение информации о весе вещей в первом(по индексу равен нулю) багаже
            for(int x = 0; x < BaggageList[0].MassThing.Length; x++) //Цикл для расчёта середнего веса вещей багажа
            {
                BaggageList[0].middleMass += BaggageList[0].MassThing[x]; //добавление веса
                if (x + 1 == BaggageList[0].MassThing.Length) //если было добавлено последнее значаение веса, то переменная делится на количество вещей(тем самым мы узнаём среднее значение)
                    BaggageList[0].middleMass /= BaggageList[0].MassThing.Length;
            }
 
            BaggageList[1].MassThing = new float[] { 0.4f, 2.8f, 2.1f}; //заполнение информации о весе вещей в первом(по индексу равен нулю) багаже
            for (int x = 0; x < BaggageList[1].MassThing.Length; x++) //Цикл для расчёта середнего веса вещей багажа
            {
                BaggageList[1].middleMass += BaggageList[1].MassThing[x]; //добавление веса
                if (x + 1 == BaggageList[1].MassThing.Length) //если было добавлено последнее значаение веса, то переменная делится на количество вещей(тем самым мы узнаём среднее значение)
                    BaggageList[1].middleMass /= BaggageList[1].MassThing.Length;
            }
 
 
            BaggageList[2].MassThing = new float[] { 2.9f, 0.8f }; //заполнение информации о весе вещей в первом(по индексу равен нулю) багаже
            for (int x = 0; x < BaggageList[2].MassThing.Length; x++) //Цикл для расчёта середнего веса вещей багажа
            {
                BaggageList[2].middleMass += BaggageList[2].MassThing[x]; //добавление веса
                if (x + 1 == BaggageList[2].MassThing.Length) //если было добавлено последнее значаение веса, то переменная делится на количество вещей(тем самым мы узнаём среднее значение)
                    BaggageList[2].middleMass /= BaggageList[2].MassThing.Length;
            }
            //заполнение масива BaggageList данными
 
            //Вывод таблици о пасажирах через цикл. Через цикл, чтобы не писать однотиного кода много раз
            for(int x = 0; x < 3; x++)
            {
                Console.WriteLine("Пасажир під номером " + (x + 1)); //вывод номера псажира
                Console.WriteLine("Номер    Вага"); //Заголовки таблици
 
                for (int I = 0; I < BaggageList[x].MassThing.Length; I++) //вывод номера(это значение переменной I) и масы вещи в багаже пасажира 
                {
                    Console.WriteLine(I + "         " + BaggageList[x].MassThing[I]);
                }
 
                Console.WriteLine("Середня вага його речей дорівнює " + BaggageList[x].middleMass + "\n \n"); //выоыд среднего значение мас вещей из багажа этого пасажира. "\n \n" - это для двух абзацев(так легче визуально разделять таблици)
            }
            
 
            for(int x = 0; x < 3; x++) //поиск по критерию из задачи. Цик проходится по всем багажам
            {
                for (int i = 0; i < BaggageList[x].MassThing.Length; i++)//Цик проходит по всем вещам из багажа
                {
                    
                    if (BaggageList[x].middleMass - BaggageList[x].MassThing[i] == 0.3f || BaggageList[x].middleMass - BaggageList[x].MassThing[i] == -0.3f)//Если маса какой-то из вещи отличается на 0,3кг от среднего значения масс багажа, то...
                    {
                        
                        for (int z = 0; z < Info.Length; z++)//Цик проходится по всему массиву
                        {
                            if (Info[z] == "")//Если найден первый пустой элемент в масиве(их со страрта 3 штуки. в будущем будет выводится только те элементы из масива, которые не пустые), то ...
                                Info[z] = "\n \n \n Вага річі(" + i + ") " + "із багажу людини(" + x + ") відрізняється на 0,3 кг від середньої ваги багажу цього пасажира"; //перезаписывается пустой элеммент из масива 
                        }
                    }
                }
            }
 
            //Вывод массива Info
            for(int x = 0; x < Info.Length; x++)
            {
                if (Info[x] != "") //Если элемент не пустой, то он выводится на экран
                    Console.WriteLine(Info[x]);
                else break; //иначе цикл завершается. Он завершается сразуже ибо после этого элемента по логике кода не должно быть НЕпустых элеменотов, поэтому нет смысла далее продолжать цикл
            }
            
        }
    }
 
 
    //Класс, который хранит в себе параметры багажа 
    class Baggage
    {
        public float[] MassThing = new float[0]; //Список, который будет хранить массу вещи. 1 элемент со списка равен вещи под номером 1. Если 1 элемент списка имеет значение 2,5, то 1 вещь в этом багаже имеет массу 2,5кг
        public float middleMass;//середнее масы всех вещей в этом багаже
    }
}
Проблема в поиске по критерию. Критерий - среднее число масс вещей в багаже отличается на 0,3 от массы одной из вещи этого багажа. В этом ифе(if (BaggageList[x].middleMass - BaggageList[x].MassThing[i] == 0.3f)) условие не выполняется, хотя первая вещь в первом багаже подходит под критерий. Проверял это и выводом Console.WriteLine(BaggageList[x].middleMass - BaggageList[x].MassThing[i]); Выводит, что равно 0,3, но при этом условие в ифе не выполняется.

Ещё нужно добавить закрытие програмы при нажатии на "Esc" через делегат. Этого я никогда не делал. Гуглил, но всё же не понял...

Добавлено через 9 минут
Есть ошибки в словах. Писал на скорую руку)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.03.2021, 21:22
Ответы с готовыми решениями:

Почему не выполняется верное условие?
var s,xt,yt,x1,x2,x3,y1,y2,y3,s1,s2,s3:real; begin writeln ('Введите координаты точки: '); readln (xt,yt); writeln ('Введите...

Не выполняется код при запуске программы через батник
Запускаю вручную бат файл, который запускает программу, которая выполняет следующий код: private void Form1_Load(object sender, EventArgs...

Подобрать верное окончание числительного
помогите решить задачи на C++ условный оператор!! Бизнесмен Василий после прочтения известной книги решил открыть новый бизнес –...

11
sleep
 Аватар для I can
4935 / 4617 / 841
Регистрация: 13.04.2015
Сообщений: 9,790
21.03.2021, 01:51
Лучший ответ Сообщение было отмечено Cliffster как решение

Решение

Цитата Сообщение от Cliffster Посмотреть сообщение
if (BaggageList[x].middleMass - BaggageList[x].MassThing[i] == 0.3f
Нельзя так делать.

Добавлено через 3 минуты
Цитата Сообщение от Cliffster Посмотреть сообщение
среднее число масс вещей в багаже отличается на 0,3 от массы одно
Прямо вот ровно на 0.3 должно отличаться? Тогда округляй при сравнении хотя бы до 4 знаков после запятой.

Добавлено через 1 минуту
Познай прелести сравнения типов с плавающей запятой(точкой)

Добавлено через 6 минут
Дело в том, что в двоичном представлении чисел с плавающей точкой используется конечное число разрядом мантиcсы и экспоненты и при выходе за пределы разрядности происходит переполнение.

В результате С# считает, что два равных числа различны, потому что они различаются в конечных разрядах.

Чтобы избежать подобных проблем, вместо проверки a == b следует проверить, отличается ли первое число от второго на очень малый интервал ( delta).

Размер интервала определяется минимальной разностью, начиная с которой два числа считаются разными, это значение мы устанавливаем произвольно, исходя из того, какой точности сравнения хотим добиться.

Ну и, наконец, для получения абсолютного значения разности мы используем функцию Abs().
1
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
21.03.2021, 02:00
.delete
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
21.03.2021, 02:05
Лучший ответ Сообщение было отмечено Cliffster как решение

Решение

Цитата Сообщение от Cliffster Посмотреть сообщение
Выводит, что равно 0,3
Это капча для проверки что ты не человек. XD



выше уже расписали почему. Чтобы не страдать, придумали decimal.

Цитата Сообщение от Cliffster Посмотреть сообщение
Ещё нужно добавить закрытие програмы при нажатии на "Esc" через делегат.
Вот прям через делегат? Т.е. ипользовать delegate? Малость не понимаю что за требование, все равно после ReadKey программа пойдет по коду дальше, и толку от вызова делегата ноль.
1
13 / 10 / 3
Регистрация: 01.01.2020
Сообщений: 85
21.03.2021, 09:19  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
Вот прям через делегат? Т.е. ипользовать delegate? Малость не понимаю что за требование, все равно после ReadKey программа пойдет по коду дальше, и толку от вызова делегата ноль.
Wolfdp, да, через делегат. При нажатии определённой клавиши завершается программа. По дефолту это Enter, а мне нужно сделать на кнопку Esc.

I can, спасибо. Теперь понял

Добавлено через 36 минут
I can, смысл я понял, а вот как это сделать нет. Не выходит. Не могли бы вы показать как это сделать?
0
sleep
 Аватар для I can
4935 / 4617 / 841
Регистрация: 13.04.2015
Сообщений: 9,790
21.03.2021, 09:33
Я спросил:
Цитата Сообщение от I can Посмотреть сообщение
ровно на 0.3 должно отличаться?
Обычно так условия не ставятся.

Добавлено через 6 минут
В общем вот твоё условие
C#
1
  if (Math.Abs(Math.Round(BaggageList[x].middleMass - BaggageList[x].MassThing[i],4))== 0.3f)//Если масcа какой-то из вещи отличается на 0,3кг от среднего значения масс багажа, то...
Но скорее всего нужно так
C#
1
   if (Math.Abs(BaggageList[x].middleMass - BaggageList[x].MassThing[i])>0.3f)//Если масcа какой-то из вещи отличается более чем на 0,3кг от среднего значения масс багажа, то...
0
13 / 10 / 3
Регистрация: 01.01.2020
Сообщений: 85
21.03.2021, 09:39  [ТС]
Цитата Сообщение от I can Посмотреть сообщение
Я спросил:
Сообщение от I can
ровно на 0.3 должно отличаться?
Обычно так условия не ставятся.
Нужно именно так. Такое условие задачи

Добавлено через 2 минуты
I can, всё, всё работает. Не сможешь подсказать с делегатом?
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
21.03.2021, 19:57
Цитата Сообщение от Cliffster Посмотреть сообщение
Wolfdp, да, через делегат.
Кажись мы говорим на разных языках. Делегаты

Цитата Сообщение от Cliffster Посмотреть сообщение
По дефолту это Enter, а мне нужно сделать на кнопку Esc.
C#
1
while (Console.ReadKey().Key != ConsoleKey.Escape) ;
0
13 / 10 / 3
Регистрация: 01.01.2020
Сообщений: 85
06.04.2021, 13:09  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
Кажись мы говорим на разных языках. Делегаты
Да нет. Всё верно. Задача в том, что бы сделать это через делегат. Я уже сделал это
0
0 / 0 / 0
Регистрация: 17.11.2021
Сообщений: 21
09.04.2022, 18:09
Привет не подскажешь как ты закрыл програму нажатием Esc через делегат ?
0
13 / 10 / 3
Регистрация: 01.01.2020
Сообщений: 85
09.04.2022, 18:35  [ТС]
hfzhart1, привет. Если честно, то забыл уже. Моя специальность такова, что у меня есть более мощный инструмент, который упрощает работу с делегатами.

Если не ошибаюсь стандартный делегат - это такая себе ссылка на метод, который можно вызвать когда тебе нужно. Ну и соответственно можно изменять эту ссылку, чтобы она вела к другим методам. Это в некоторых случаях полезно.

Тебе нужен метод завершения игры. Объявить делегат и инициализировать его как ссылку на тот метод. В методе Main можно при приёме ввода вызывать этот метод. Он внутри себя будет сохранять ввод и возвращать тебе. И в нём же можно делать проверку на нажатие кливиши , чтобы выйти с программы.

Если тебе нужно постоянно ловить нажатие клавиши, а не только при вводе каких-то данных, то можно при старте приложения вызывать корутину, которая раз в какое-то время(ты сам выбираешь какое время будет "спать" твоя корутина) будет делать ту же саму проверку. Тогда проверка от ввода не будет зависеть. Эту проверку и "сон" корутины поместить в бесконечный цикл, чтобы она работала до конца программы.


Но на самом деле это странная задача. Я выполнял курсовую своему знакомому и вот у него такая задача стала. Т. к. в любом случае будет вызываться метод завершения программы, то нету смысла делать делегат. Делегат нужен, только если вам нужно запускать метод, но какой именно решается во время выполнения программы, а у нас он постоянный.
0
0 / 0 / 0
Регистрация: 17.11.2021
Сообщений: 21
09.04.2022, 21:06
Я щас в универе учусь и задали такое сделать, мы с однокурсником уже весь интернет перелазили, ничего толкового не нашли, а срок сдачи уже завтра. Ладно спасибо за ответ, будем рещать что-то.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.04.2022, 21:06
Помогаю со студенческими работами здесь

В зависимости от числа дописать к существительному верное окончание
using System; using System.Collections.Generic; using System.Linq; using System.Text; class Program { static...

В зависимости от числа дописать к существительному верное окончание
Привет всем!!! Есть слово &quot;город&quot;. В единственном числе окончания нет (&quot; &quot;), дальше есть 2 варианта ( в диапазоне 0, 5...9 -...

Верное окончание слова в зависимости от его количества
Переменная $user в моем случае содержит число от 1 до 1000. echo &quot;У вас $user монет&lt;br&gt;&quot;; Как сделать условие и дописать код чтобы если...

Подобрать верное окончание существительного в зависимости от количества
по введенному натуральному числу n(n&lt;=100) обозначаешему количество ворон вывести надпись ,на дереве n ворон.где ворона склоняеться...

Узнать сколько пользователю лет, указав верное окончание
Не работает если возраст от 11 до 14,помогите доработать мой код,пожалуйста Dim vozrin, vozrout, sStr As String vozrin =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru