36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111

Определить какая из версий программы старше

13.01.2019, 21:16. Показов 9285. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача выглядит следующим образом: Есть две строки неограниченной длины, содержащие версии программ. Версия программы – это строка из 4 чисел, разделенных точками. Числа целые положительные или ноль. Могут начинаться с нулей. Обработка должна определить, какая из версий старше (без использования встроенных функций). Примеры версий: ∙ 8.1.13.41 ∙ 8.1.009.125
Вот все вроде бы просто. Понятно, что сравнивать нужно "по-разрядно", начиная со старшего "разряда". В java я бы разбил строку сплитом и прошелся бы по массиву, сравнивая значения элементов. Но написано - "без использования встроенных функций". Я теряюсь в догадках. Есть у кого-нибудь мысли?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.01.2019, 21:16
Ответы с готовыми решениями:

Как сделать приложение для версий framework 2.0 и старше
Всем привет! Кто знает как сделать приложение для версий framework 2.0 и старше? Если рядом с файлом класть файл конфигурации с...

Какая из версий c\c++ совметима с windows 7
Помогите пожалуйста, я уже несколько разных версий си устанавливал и ни одна из них не идет у меня Извините, но ссылки на варез...

Какая разница в линейках версий Apache 1.3.x; 2.0.x и 2.2.x?
Какая между ними разница и почему поддерживаются целых три линейки? Есть ли разница для новичка? Навскидку, какое примерно процентное...

18
Эксперт .NET
 Аватар для Rius
12306 / 7370 / 1628
Регистрация: 25.05.2015
Сообщений: 22,297
Записей в блоге: 14
13.01.2019, 21:23
Njula, это вы теоретически придумали или для какой-то среды разработки конкретно требуется?

Добавлено через 4 минуты
В C# есть класс Version для этого.
Абстрагируясь от него, можно номер версии перевести в число и просто сравнить:
Если каждый компонент занимает 1 байт, то
8 * 224 + 1 * 216 + 13 * 28 + 41 = 134352169
8 * 224 + 1 * 216 + 009 * 28 + 125 = 134351229

Добавлено через 49 секунд
Если компоненты по 16 бит, как в Windows, то умножать надо на соответственно бОльшие числа.
0
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111
13.01.2019, 22:01  [ТС]
Rius, спасибо за ответ!
Цитата Сообщение от Rius Посмотреть сообщение
это вы теоретически придумали или для какой-то среды разработки конкретно требуется?
- это один из часто задаваемых вопросов при приеме на работу. Я немного подумал и решил, что так тоже может прокатить: сам же сказал - по-разрядно, вот и формируем разряды - получаются десятичные числа
8113041 и 8109125, которые легко сравниваются. Что вы думаете?
0
Эксперт .NET
 Аватар для Rius
12306 / 7370 / 1628
Регистрация: 25.05.2015
Сообщений: 22,297
Записей в блоге: 14
13.01.2019, 22:11
Njula, это прокатит только тогда, когда компоненты фиксированной длины.
У вас же 13 и 9, 41 и 125.
Так не сравнить.
0
 Аватар для vantfiles
1018 / 1910 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
13.01.2019, 22:11
Насколько я понимаю, нужно реализовать две собственные ф-ции:

1) Взять от строки подстроку начиная с позиции N до знака-разделителя (в данном случае до точки)
2) Посимвольно сравнить две строки цифр, начиная с конца строки

К исходной строке добавляем символ точки, разбиваем строку на четыре, сравниваем.

Rius, скорее всего не годится, потому что "Есть две строки неограниченной длины"
1
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111
13.01.2019, 22:12  [ТС]
Но при этом разрядность чисел должна быть одинаковой. Где-то лишние нули убрать, где-то добавить. Сложно. Алгоритмически ваш способ проще.
0
Эксперт .NET
 Аватар для Rius
12306 / 7370 / 1628
Регистрация: 25.05.2015
Сообщений: 22,297
Записей в блоге: 14
13.01.2019, 22:14
Я ни разу не видел строки версии неограниченной длины.
В Windows так вообще отведено под это 64 бита, т.е. 4 числа от 0 до 65535.
Но если надо совсем так, то выбираем компоненты из каждой строки от точки до точки, преобразуем в целые числа. И сравниваем. До первого неравенства.
0
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111
13.01.2019, 22:19  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
выбираем компоненты из каждой строки от точки до точки, преобразуем в целые числа. И сравниваем. До первого неравенства.
- да, это понятно. А как понимать "без использования встроенных функций". Разбить строку по разделителю - это встроенная функция? split() например
0
Эксперт .NET
 Аватар для Rius
12306 / 7370 / 1628
Регистрация: 25.05.2015
Сообщений: 22,297
Записей в блоге: 14
13.01.2019, 22:22
Смотря до какого уровня они считают встроенными или нет.
Можно и split, а можно и перебором символов.

Да, кстати, посимвольное сравнение с конца строки тоже пойдёт.
1
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111
13.01.2019, 22:24  [ТС]
Rius, спасибо за скорую помощь!
0
 Аватар для vantfiles
1018 / 1910 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
13.01.2019, 22:24
off: Я тоже никогда не видел живьем кита, но если заказчику нужно нарисовать кита, я ему нарисую кита, а не знакомую соседскую собаку.
0
Эксперт .NET
 Аватар для Rius
12306 / 7370 / 1628
Регистрация: 25.05.2015
Сообщений: 22,297
Записей в блоге: 14
14.01.2019, 00:00
Кликните здесь для просмотра всего текста
0
Модератор
Эксперт функциональных языков программирования
3107 / 2255 / 467
Регистрация: 26.03.2015
Сообщений: 8,799
14.01.2019, 10:10
Строки разбивать не нужно - лишняя работа. Просто сравнить строки посимвольно (так как '.' < '0'):
C#
1
2
3
4
5
6
7
8
9
10
int CompareVersions(string v1, string v2)
{
    for(int i = 0;; i++)
    {
        if(i >= v1.Length) return i >= v2.Length ? 0 : -1;
        if(i >= v2.Length) return 1;
        if(v1[i] < v2[i]) return -1;
        if(v1[i] > v2[i]) return 1;
    }
}
Цитата Сообщение от Njula Посмотреть сообщение
Разбить строку по разделителю - это встроенная функция? split() например
Да.

Добавлено через 5 минут
Можно так написать (смысл тот же):
C#
1
2
3
4
5
6
7
8
9
int CompareVersions2(string v1, string v2)
{
    for (int i = 0; i < v1.Length; i++)
    {
        if (i >= v2.Length || v1[i] > v2[i]) return 1;
        if (v1[i] < v2[i]) return -1;
    }
    return v1.Length == v2.Length ? 0 : -1;
}
0
Эксперт .NET
 Аватар для Rius
12306 / 7370 / 1628
Регистрация: 25.05.2015
Сообщений: 22,297
Записей в блоге: 14
14.01.2019, 10:15
Цитата Сообщение от Shamil1 Посмотреть сообщение
Строки разбивать не нужно - лишняя работа. Просто сравнить строки посимвольно (так как '.' < '0'):
Нельзя. Версия это не строка, а набор чисел.
Так как числа могут быть записаны по разному, а не только фиксированным количеством знаков с присутствием ведущих нулей, то как строки их сравнивать нельзя.
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
using System;
 
namespace ConsoleApp1
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            Console.WriteLine(CompareVersions("8.1.13.41", "8.1.009.125"));
            Console.WriteLine(CompareVersions("8.1.013.41", "8.1.009.125"));
            Console.WriteLine(CompareVersions("8.1.013.41", "8.1.9.125"));
            Console.WriteLine(CompareVersions("8.1.099.41", "8.1.001.41"));
            Console.WriteLine(CompareVersions("8.1.099.41", "8.1.1.41"));
        }
 
        private static int CompareVersions(string v1, string v2)
        {
            for (int i = 0; ; i++)
            {
                if (i >= v1.Length)
                {
                    return i >= v2.Length ? 0 : -1;
                }
 
                if (i >= v2.Length)
                {
                    return 1;
                }
 
                if (v1[i] < v2[i])
                {
                    return -1;
                }
 
                if (v1[i] > v2[i])
                {
                    return 1;
                }
            }
        }
    }
}
1
1
-1
1
-1
2
Модератор
Эксперт функциональных языков программирования
3107 / 2255 / 467
Регистрация: 26.03.2015
Сообщений: 8,799
14.01.2019, 10:32
Rius,
Вижу проблему с ведущими нулями. Для решения, достаточно их пропускать.

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
int CompareVersions(string v1, string v2)
{
    int i = 0, j = 0;
    while(true)
    {
        if (i >= v1.Length) return j >= v2.Length ? 0 : -1;
        if (j >= v2.Length) return 1;
        
        if (v1[i] == '0')
        {
            i++;
            continue;
        }
        if (v2[j] == '0')
        {
            j++;
            continue;
        }
        
        if (v1[i] < v2[j]) return -1;
        if (v1[i] > v2[j]) return 1;
 
        i++; j++;
    }
}
0
Эксперт .NET
 Аватар для Rius
12306 / 7370 / 1628
Регистрация: 25.05.2015
Сообщений: 22,297
Записей в блоге: 14
14.01.2019, 10:32
Для простого сравнения, например, хорошо подходит формат даты ISO-8601 YYYY-MM-DDThh:mm:ss. Компоненты выстроены так, что даты можно сравнивать как строки. Спецом для этого
0
36 / 3 / 0
Регистрация: 21.05.2018
Сообщений: 111
14.01.2019, 10:34  [ТС]
Rius, спасибо! Тогда наверно лучше переопределить метод compareTo(), чтобы в коллекциях можно было сортировать по возрастанию...
0
Модератор
Эксперт функциональных языков программирования
3107 / 2255 / 467
Регистрация: 26.03.2015
Сообщений: 8,799
14.01.2019, 10:36
дел
0
Эксперт .NET
 Аватар для Rius
12306 / 7370 / 1628
Регистрация: 25.05.2015
Сообщений: 22,297
Записей в блоге: 14
14.01.2019, 10:41
Цитата Сообщение от Shamil1 Посмотреть сообщение
В каком случае даёт неправильный результат, если пропускать ведущие нули?
Это к предыдущему посту. Сообщения склеиться не успели.

Добавлено через 4 минуты
Но если ещё раз посмотреть, то вот:
Первое должно быть равно. А второе и третье - точно нет.
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
using System;
 
namespace ConsoleApp1
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            Console.WriteLine(CompareVersions("8.1.1020.41", "8.1.1020.41"));
            Console.WriteLine(CompareVersions("8.1.1021.41", "8.1.121.41"));
            Console.WriteLine(CompareVersions("8.1.10001.41", "8.1.11.41"));
        }
 
        static int CompareVersions(string v1, string v2)
        {
            int i = 0, j = 0;
            while (true)
            {
                if (i >= v1.Length) return j >= v2.Length ? 0 : -1;
                if (j >= v2.Length) return 1;
 
                if (v1[i] == '0')
                {
                    i++;
                    continue;
                }
                if (v2[j] == '0')
                {
                    j++;
                    continue;
                }
 
                if (v1[i] < v2[j]) return -1;
                if (v1[i] > v2[j]) return 1;
 
                i++; j++;
            }
        }
    }
}
0
0
0
Добавлено через 39 секунд
Для учтения всего этого код обрастает всё большими костылями, и split уже не кажется таким уж лишним...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.01.2019, 10:41
Помогаю со студенческими работами здесь

Для введенного целого трехзначного числа определить, какая цифра в числе является первой, какая второй и какая третьей
Разработать программу, которая для введенного целого трехзначного числа определяет, какая цифра в числе является первой, какая – второй и...

Какая из версий убунту поддерживает автоматическое переключение?
Скачала недавно убунту и заметила что компьютер стал быстро перегреватся. повысить порог температурный по отключению ноута я не решилась....

Определить возраст каждого человека и определить, кто из них старше
Помогите пожалуйста. Известны год и номер месяца рождения двух человек. Определить, возраст каждого человека (число полных лет)....

Выборка из БД мужчин от 60 и старше, женщин от 55 и старше на Foxpro 2.6
Помогите осуществить Выборку из БД мужчин от 60 и старше, женщин от 55 и старше Часть кода, где DATW - дата выписки, DATP-дата...

Поиск программы Maple версии 9.5 и старше
Здравствуйте. Вышло так, что для лабораторных работ мне нужна программа Maple версии 9.5 или старше. Посоветуйте, пожалуйста, где можно...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

Новые блоги и статьи
50 самых полезных примеров кода Python для частых задач
py-thonny 17.06.2025
Эффективность работы разработчика часто измеряется не количеством написаных строк, а скоростью решения задач. Готовые сниппеты значительно ускоряют разработку, помогают избежать типичных ошибок и. . .
C# и продвинутые приемы работы с БД
stackOverflow 17.06.2025
Каждый . NET разработчик рано или поздно сталкивается с ситуацией, когда привычные методы работы с базами данных превращаются в источник бессонных ночей. Я сам неоднократно попадал в такие ситуации,. . .
Angular: Вопросы и ответы на собеседовании
Reangularity 15.06.2025
Готовишься к техническому интервью по Angular? Я собрал самые распространенные вопросы, с которыми сталкиваются разработчики на собеседованиях в этом году. От базовых концепций до продвинутых. . .
Архитектура Onion в ASP.NET Core MVC
stackOverflow 15.06.2025
Что такое эта "луковая" архитектура? Термин предложил Джеффри Палермо (Jeffrey Palermo) в 2008 году, и с тех пор подход только набирал обороты. Суть проста - представьте себе лук с его. . .
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
С днём независимости России!
Hrethgir 13.06.2025
Решил побеседовать, с утра праздничного дня, с LM о завоеваниях. То что она написала о народе, представителем которого я являюсь сам сначала возмутило меня, но дальше только смешило. Это чисто. . .
Лето вокруг.
kumehtar 13.06.2025
Лето вокруг. Наполненное бурями и ураганами событий. На фоне магии Жизни, священной и вечной, неумелой рукой человека рисуется панорама душевного непокоя. Странные серые краски проникают и. . .
Популярные LM модели ориентированы на увеличение затрат ресурсов пользователями сгенерированного кода (грязь -заслуги чистоплюев).
Hrethgir 12.06.2025
Вообще обратил внимание, что они генерируют код (впрочем так-же ориентированы разработчики чипов даже), чтобы пользователь их использующий уходил в тот или иной убыток. Это достаточно опытные модели,. . .
Топ10 библиотек C для квантовых вычислений
bytestream 12.06.2025
Квантовые вычисления - это та область, где теория встречается с практикой на границе наших знаний о физике. Пока большая часть шума вокруг квантовых компьютеров крутится вокруг языков высокого уровня. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru