Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.90/30: Рейтинг темы: голосов - 30, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 26.10.2018
Сообщений: 31

Поиск целых чисел и манипуляции

26.10.2018, 17:12. Показов 6905. Ответов 59
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Передо мной задача, есть ряд рандомных чисел от 1 до 20 в строке, числа целые, через пробел
C#
1
string s = "5 16 12 3 7 14 10 25 4 3 21 5 16 8";
Далее при нажатии кнопки идет выпавшее число от 1 до 20 (это я сделал). К примеру нажал на кнопку 2 раза, выпали числа 5 и 16, они записываются уже в другую в строку
C#
1
string Word = "5 16"
через пробел. далее идет сравнение этих выпавших чисел string Word с заданной строкой string s. При совпадении мне должно отобразиться следующее число которое идет в заданной строке после 5 16, НО таких совпадений 2, и может быть больше двух, и оба этих числа (12 и 8 или более, зависит от количества совпадении) нужно пересчитать в %, т.е. если всего 2 числа то на каждое по 50%, если же у нас 3 последующих числа при совпадении 12 8 8, то тут уже должно просчитываться как 12 - 33%, 8 - 66% и так далее до бесконечности (поскольку начальных чисел у меня 25000). А так же вывести то число на экран в текст, у которого больше всего %. А если совпадении не найдено например после 5 случайных чисел, то string Word очищается. Моя проблема, я не знаю как правильно искать эту последовательность целых чисел через пробел.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.10.2018, 17:12
Ответы с готовыми решениями:

Из множества целых чисел 1..100 выделить множество чисел, являющихся, в свою очередь, квадратами целых чисел.
помогите, я в множествах не силен Из множества целых чисел 1..100 выделить множество чисел, являющихся, в свою очередь, квадратами...

Поиск наибольшего из двух целых чисел
поиск наибольшего (наименьшего) из двух целых чисел БЕЗ ИСПЛЬЗВАНИЯ УСЛОВНОГО ОПЕРАТОРА

Поиск числа в двухмерном массиве и манипуляции с ним
Нужно создать поиск и манипуляцию с цифрами в двумерном массиве по диагонали! Вот основа: array.GetLength(1); for(int = {...},...

59
0 / 0 / 0
Регистрация: 26.10.2018
Сообщений: 31
29.10.2018, 16:11  [ТС]
Студворк — интернет-сервис помощи студентам
Элд Хасп все круто, без ошибок, но теперь сама юнити не "умеет" читать C# 7.0, пытаюсь настроить -_-

Добавлено через 22 минуты
Таааак уже интересно)) все заработало но выдает не то что нужно...как будто вы меня не так поняли или я где то накосячил опять, и какое бы число не выпало в рандоме (оно у нас записывается в Word), в текст index.text он мне выводит среднее арифметическое (оно мне не нужно!) и в текст outt.text мне выдает постоянно "Число 4 встретилось больше всего всех раз - 5". вот код, а и еще не обнуляется строка Word когда нет совпадений, не пойму почему, вроде все указано
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
using System;
using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
 
 
public class MovingCube : MonoBehaviour
{
 
    public bool ReversY;
    private float NewY;
    private float PredY;
    private float InkY;
    int wordIndex = 1;
    public int Point = 1;
    public Text text1;
    public Text hod;
    public Text bd;
    public Text outt;
    public Text index;
    public Transform player;
    private string Word;
    private Vector2 MousePos;
 
    string numbers = "4 3 16 5 7 19 8 2 4 3 12 6 5 7 9 15 4 2 4 14 9 7 19 6 4";
 
    public static char[] Separators/* = "- , /\\\r\n\"() <> ".ToCharArray()*/;
 
    public void OnClick()
    {
        wordIndex = wordIndex + 1;
        Word = Word + Point.ToString() + " ";
        hod.text = Word;
 
        var SubStrings = numbers.Split(Separators, StringSplitOptions.RemoveEmptyEntries); // Разделение на подстроки
        List<int> ListNumbs = new List<int>(); // Подготовка нового списка целых чисел
        foreach (string subStr in SubStrings) // Цикл по подстрокам
        {
            int numb;
            if (int.TryParse(subStr, out numb)) // Проверка возможности преобразования подстроки в целое число
                    ListNumbs.Add(numb); // Если преобразование произошло, то запись результата в список.
        }
 
        SubStrings = Word.Split(Separators, StringSplitOptions.RemoveEmptyEntries); // Разделение на подстроки
        List<int> ListSeek = new List<int>(); // Подготовка нового списка целых чисел
        foreach (string subStr in SubStrings) // Цикл по подстрокам
        {
            int numb;
            if (int.TryParse(subStr, out numb)) // Проверка возможности преобразования подстроки в целое число
            ListNumbs.Add(numb); // Если преобразование произошло, то запись результата в список.
        }
 
        bool IsCoincidence(IEnumerable<int> Source, IEnumerable<int> Target, int Index)
        {
            int count = Target == null ? 0 : Target.Count(); // Длина цели -  последовательность которую ищем
            if (count == 0) return true; // Если цели нет то возврат true
                                         // Если длины источника (в котором ищем) не хватает для поиска, возвращаем false 
            if (count + Index >= Source?.Count()) return false;
            for (int indAt = 0; indAt < count; indAt++) // Цикл для прохода по элементам последовательностей
                if (Source.ElementAt(Index + indAt) != Target.ElementAt(indAt)) // Проверка на равенство всех элементов
                    return false; // Если хоть один элемент не равен, то возвращаем false
            return true; // Если все элементы равны возвращаем true
        }
 
        List<int> CoincidenceValues(IEnumerable<int> Source, IEnumerable<int> Target)
        {
            if (Source == null) return null; // Проверка на null - на всякий случай.
            List<int> ret = new List<int>(); // Подготовка возвращаемого списка
            int sourceCount = Source.Count();
            int targetCount = (int)Target?.Count();
            for (int index = 0; index < sourceCount - targetCount; index++)
                if (IsCoincidence(Source, Target, index))
                    ret.Add(Source.ElementAt(index + targetCount));
            return ret;
        }
 
        List<int> Values = CoincidenceValues(ListNumbs, ListSeek);
 
        if (Values?.Count() > 0)
        {
            index.text = ($"Среднее значение {Values.Average()}"); // Вывод среднего
            var ValMax = Values.GroupBy(val => val).OrderBy(gr => gr.Count()).Reverse().ElementAt(0);// Получение группированных чисел отсортированных по убыванию их количества
            outt.text = ($"Число {ValMax.Key} встретилось большего всех - {ValMax.Count()} раз.");// и извлечение максимального по количеству
        }
        else Word = "";
 
 
    }
}


Добавлено через 6 минут
ОТСТАВИТЬ!!! я нашел ошибку =D моя ошибка, что уж тут поделать =D ListNubms не переименовал в ListSeek

Добавлено через 10 минут
Элд Хасп Я вам очень благодарен, сам то я еще бы долго мучился с этим)
если не сложно, последнее что я хотел бы изменить, это вывести в текст сам % того насколько часто встречается число, например из ряда совпадений 12 12 12 6 мне должно вывести в текст outt.text = "12 75%"
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
29.10.2018, 17:15
Общее к-во полученных значений даёт Values.Count(), количество определённого значения даёт Values.Count(val => val==numb), где numb значение количество которых надо подсчитать.

Добавлено через 1 минуту
Поделив второе на первое получите искомую долю.

Добавлено через 1 минуту
Пишу здесь без студии, может ошибаюсь. Возможно во втором случае нужно такое выражение Values.Count(numb), а возможно и оба будут работать.

Добавлено через 10 минут
По моему, Вы писали, что строка к которой ищутся совпадения , у Вас постоянна или редко меняется.
Для оптимизации можно расчёт ListNumbs вынести в тот блок кода, где происходит установка значения строки numbers.
0
0 / 0 / 0
Регистрация: 26.10.2018
Сообщений: 31
29.10.2018, 17:28  [ТС]
пока что не до оптимизации, пытаюсь разобраться с делением, жалуется на numb, пишет не присвоено значение, ссылку нужно как то указать или что?

Добавлено через 3 минуты
до сих пор разбираюсь как это работает))
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
29.10.2018, 17:49
Цитата Сообщение от ClowMiX Посмотреть сообщение
пока что не до оптимизации, пытаюсь разобраться с делением, жалуется на numb, пишет не присвоено значение, ссылку нужно как то указать или что?
Да, конечною. В numb должно быть число количество которых Вы ищете. Если ищете число максимально раз вошедшее в список, то это будет int numb = ValMax.Key;
Можно переписать строчку
C#
86
            outt.text = ($"Число {ValMax.Key} встретилось большего всех - {ValMax.Count()} раз, что составляет {Values.Count()/ValMax.Count()*100}% ");// и извлечение максимального по количеству
0
0 / 0 / 0
Регистрация: 26.10.2018
Сообщений: 31
29.10.2018, 18:51  [ТС]
Постоянно 100% выдает, не зависимо от чего либо

Добавлено через 40 минут
по идее все правильно, но где то косяк....я в тупике опять -_-

C#
1
2
3
4
5
6
7
8
9
10
List<int> Values = CoincidenceValues(ListNumbs, ListSeek);
        if (Values?.Count() > 0)
        {
            
            index.text = ($"Среднее значение {Values.Average()}"); // Вывод среднего
            var ValMax = Values.GroupBy(val => val).OrderBy(gr => gr.Count()).Reverse().ElementAt(0);
            int numb = ValMax.Key;
            outt.text = ($"Число {ValMax.Key} встретилось {ValMax.Count()} раз, это {Values.Count(val => val == numb) / ValMax.Count() * 100}% ");
            
        }
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
29.10.2018, 19:11
[quote="ClowMiX;13012714"]Посмотрите в пост #24 , я там просто запутался что на что делить. Сделал наоборот. Надо так
C#
8
            outt.text = ($"Число {ValMax.Key} встретилось большего всех - {ValMax.Count()} раз, что составляет {ValMax.Count()/Values.Count()*100}% ");// и извлечение максимального по количеству
0
0 / 0 / 0
Регистрация: 26.10.2018
Сообщений: 31
29.10.2018, 19:54  [ТС]
Теперь постоянно 0 выдает, пытаюсь понять что на что он делит и откуда ноль, или в прошлом 100, и чет не пойму как так выходит блин
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
29.10.2018, 20:31
перед строкой вывода, проверьте в отладке значения выражений ValMax.Key, ValMax.Count(), Values.Count(), ValMax.Count()/Values.Count()*100

Добавлено через 10 минут
Опаньки....
Нашёл оплошность.
В выражении ValMax.Count()/Values.Count()*100 все целые и вместо деления, получаем операцию целочисленного деления.
Надо так
C#
1
            outt.text = ($"Число {ValMax.Key} встретилось большего всех - {ValMax.Count()} раз, что составляет {((double)ValMax.Count())/Values.Count()*100.0}% ");// и извлечение максимального по количеству
0
0 / 0 / 0
Регистрация: 26.10.2018
Сообщений: 31
29.10.2018, 20:34  [ТС]
вывел в текст отдельно и понял, делить нужно {Values.Count(val => val == numb)} на {Values.Count()} и умножать на 100. получается верный %, но почему то он не считает когда строка идет полностью

C#
1
outt.text = ($"Число {ValMax.Key} - {ValMax.Count()} раз, это {Values.Count(val => val == numb) / Values.Count() * 100}%")
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
29.10.2018, 20:38
Лучший ответ Сообщение было отмечено ClowMiX как решение

Решение

Цитата Сообщение от ClowMiX Посмотреть сообщение
вывел в текст отдельно и понял, делить нужно {Values.Count(val => val == numb)} на {Values.Count()} и умножать на 100. получается верный %, но почему то он не считает когда строка идет полностью
Это особенность синтаксиса C# - в нём обычное и целочисленное деление обозначаются одним оператором, и результат зависит от типа операндов. Сам порой забываю об этом.
Посмотрите пост #28 - я там уже написал решения.
0
0 / 0 / 0
Регистрация: 26.10.2018
Сообщений: 31
29.10.2018, 20:40  [ТС]
Вот это поворот, многому мне еще надо научиться, огромное Вам спасибо)
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
29.10.2018, 20:47
Цитата Сообщение от ClowMiX Посмотреть сообщение
Вот это поворот, многому мне еще надо научиться, огромное Вам спасибо)
Всем нам надо: Учиться, учиться и учиться - как сказал ВИЛ.
0
0 / 0 / 0
Регистрация: 26.10.2018
Сообщений: 31
29.10.2018, 21:20  [ТС]
И я как обычно ворона, мои числа то разделены на группы, например числа от 1-5 группа red, 6-10 green, 11-15 yellow, 16-20 blye, и выводить то надо % группы, в которой будет больше следующих повторяющихся чисел после поиска =D буду рад если подскажете с чего начать, я так понял все те числа что следующие, хранятся в списке...или нет

Добавлено через 14 минут
получается нужно все числа Value сначала пересчитать в %
потом сгруппировать все в группы соответственно и сложить все % для каждой группы
епамама
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
29.10.2018, 21:23
Цитата Сообщение от ClowMiX Посмотреть сообщение
И я как обычно ворона, мои числа то разделены на группы, например числа от 1-5 группа red, 6-10 green, 11-15 yellow, 16-20 blye, и выводить то надо % группы, в которой будет больше следующих повторяющихся чисел после поиска =D буду рад если подскажете с чего начать, я так понял все те числа что следующие, хранятся в списке...или нет
Добавлено через 14 минут
получается нужно все числа Value сначала пересчитать в %
потом сгруппировать все в группы и сложить все % для каждой группы
епамама
Ну...воще...
Ни чё не понял!
Подробне и желательно на примере.
0
0 / 0 / 0
Регистрация: 26.10.2018
Сообщений: 31
29.10.2018, 21:49  [ТС]

ну вот самое большое число то мы вывели, а как на счет остальных, им как бы тоже нужно привязать этот %.
(1-5 группа red, 6-10 green, 11-15 yellow, 16-20 blye)
после пары нажатий на кнопку допустим след числа у нас 1 2 3 4 6 7 11 18 19 20. т.к. тут 10 чисел и легко посчитать сейчас что каждое число у нас это 10%. но числа разделены на группы. получается группа red в сумме % имеет 40%, green - 20%, yellow 10%, и blue 30%, и вывести то на экран надо группу с наибольшим%, в нашем случае Red 40%

Добавлено через 13 минут
Пример то я привел, а на деле получается даже 5 групп, и 25 чисел надо брать...
Названия групп и числа которые в нее входят:
red - 1
yellow - 2 4 6 8 10 13 15 17 19 21 23 25
green - 3 7 11 16 20 24
blue - 5 12 14 22
purple - 9 18

да, пусть будет так, так будет удобнее (для меня))
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
29.10.2018, 22:14
Не знаю правильно ли понял Вас. Посмотрите такой код
C#
1
2
3
4
5
6
7
8
9
10
11
List<int> Values = CoincidenceValues(ListNumbs, ListSeek);
        if (Values?.Count() > 0)
        {
            
            index.text = ($"Среднее значение {Values.Average()}"); // Вывод среднего
            var ValMax = Values.GroupBy(val => val).OrderBy(gr => gr.Count()).Reverse().ElementAt(0);
            foreach (var val in Values.GroupBy(val => val).OrderBy(gr => gr.Count()).Reverse())
           {
                     outt.text = ($"Число {val.Key} встретилось - {val.Count()} раз, что составляет {((double)val.Count())/Values.Count()*100.0}% ");
           }
        }
0
0 / 0 / 0
Регистрация: 26.10.2018
Сообщений: 31
29.10.2018, 22:26  [ТС]
Я вас утомил наверное =)
В общем постараюсь сам разобраться, если правильно понимаю что Value это список чисел с которыми производится манипуляция, осталось только в группы объединить.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
29.10.2018, 22:31
Цитата Сообщение от ClowMiX Посмотреть сообщение
В общем постараюсь сам разобраться, если правильно понимаю что Value это список чисел с которыми производится манипуляция, осталось только в группы объединить.
Да. Выражение в цикле и создаёт группы отсортированные по убыванию частоты встречи Values.GroupBy(val => val).OrderBy(gr => gr.Count()).Reverse()

Добавлено через 1 минуту
Да, строка var ValMax = Values.GroupBy(val => val).OrderBy(gr => gr.Count()).Reverse().ElementAt(0); выбирает группу с максимальной частотой встречи. Если он не нужна - удалите её.

Добавлено через 1 минуту
Код в посте 36 должен вывести все полученные группы по убыванию. Выводит?
0
0 / 0 / 0
Регистрация: 26.10.2018
Сообщений: 31
29.10.2018, 22:40  [ТС]
Этот код для меня в новизну, вроде начал вникать, но как правильно задать теперь каждому числу группу? или я что то не так понимаю, ведь в итоге outt.text должен мне выдать например red 40%

Добавлено через 2 минуты
Код в посте 36 выводит мне цифру а не группу
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
29.10.2018, 22:46
Цитата Сообщение от ClowMiX Посмотреть сообщение
Этот код для меня в новизну, вроде начал вникать, но как правильно задать теперь каждому числу группу? или я что то не так понимаю, ведь в итоге outt.text должен мне выдать например red 40%
Мне трудно понять Вас. Мы в коде оперируем числами и их наборами. Вы задаёте вопросы про цвета или строковые значения. Я не понимаю Вас.
На выходе выражения Values.GroupBy(val => val).OrderBy(gr => gr.Count()).Reverse() получаются все извлечённые значения (числа) сгруппированные в группы по одинаковым значениям. Свойство Key группы даёт (в этом случае) значение, метод Count() - сколько их в группе, то есть сколько раз оно встречалось в исходном списке.

Добавлено через 2 минуты
Цитата Сообщение от ClowMiX Посмотреть сообщение
Код в посте 36 выводит мне цифру а не группу
Он должен вывести полностью все группы: число, количество раз и доля в процентах.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.10.2018, 22:46

Поиск в массиве целых чисел из 5 элементов минимального числа
Составить программу для поиска в массиве целых чмсел из 5 элементов минимального числа

Поиск заданного числа в упорядоченном массиве целых чисел
Написать рекурсивную функцию, которая осуществляет поиск заданного числа в упорядоченном массиве целых чисел. Зарание спасибо :)

Реализовать бинарный поиск в динамическом массиве целых чисел
4)Реализовать бинарный поиск в динамическом массиве целых чисел

Реализовать последовательный поиск в динамическом массиве целых чисел
2)Реализовать последовательный поиск в динамическом массиве целых чисел.

Поиск заданного элемента в упорядоченном по возрастанию массиве целых чисел
Осуществить поиск заданного элемента в упорядоченном по возрастанию (по убыванию) массиве целых чисел.


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. https:/ / youtu. be/ VpfFZSUDGnQ. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru