С Новым годом! Форум программистов, компьютерный форум, киберфорум
F# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/65: Рейтинг темы: голосов - 65, средняя оценка - 4.85
-1 / 1 / 0
Регистрация: 08.12.2019
Сообщений: 177

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

19.07.2020, 20:38. Показов 13523. Ответов 11

Студворк — интернет-сервис помощи студентам
Пытался разобраться со списками, но не получилось.
Есть пару вопросов:
1) Как сделать ввод списка с клавиатуры?
2) Как правильно отмечать элемент списка?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.07.2020, 20:38
Ответы с готовыми решениями:

Все ли элементы заданного списка положительные числа и упорядочены по возрастанию
Здравствуйте. Помогите, пожалуйста, задачу решить. Проверить являются ли все элементы заданного списка положительными числами и...

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

Выяснить сколько и какие строки в матрице не упорядочены по возрастанию
Ввести матрицу А.Выяснить сколько и какие строки в матрице не упорядочены по возрастанию.

11
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
21.07.2020, 14:06
Лучший ответ Сообщение было отмечено nottheprogramer как решение

Решение

Цитата Сообщение от nottheprogramer Посмотреть сообщение
1) Как сделать ввод списка с клавиатуры?
F#
1
let x = Console.ReadLine();
Цитата Сообщение от nottheprogramer Посмотреть сообщение
2) Как правильно отмечать элемент списка?
Вопрос не понятен.
1
-1 / 1 / 0
Регистрация: 08.12.2019
Сообщений: 177
27.07.2020, 22:47  [ТС]
Цитата Сообщение от Shamil1 Посмотреть сообщение
Вопрос не понятен.
я имею ввиду, к примеру, в С++ это a[i], тут также или же иначе?
0
41 / 28 / 13
Регистрация: 31.10.2019
Сообщений: 126
27.07.2020, 23:18
Лучший ответ Сообщение было отмечено nottheprogramer как решение

Решение

почти так же
C
1
a.[i]
2
-1 / 1 / 0
Регистрация: 08.12.2019
Сообщений: 177
29.07.2020, 23:46  [ТС]
Благодарю))

Добавлено через 1 час 41 минуту
Тут проблема есть.
Код:
open System
F#
1
2
3
4
5
6
7
8
9
10
11
12
13
[<EntryPoint>]
let main argv =
     
  let sort list =
     
     for i = list.[0] to list.[i] do
       if list.[i] < list.[i-1] then printf "Элементы списка сортированы по возрастанию"
       else printfn "Элементы списка НЕ сортированы по возрастанию"
 
  printfn "Введите список"
  let list = Console.ReadLine()
  printfn "%i" (sort list)
  0
Жалуется на все строчки с list.[i] и list.[0] так:
Ошибка FS0752 Оператор "expr.[idx]" применялся к объекту неопределенного типа на основе информации, полученной до этой точки программы. Попробуйте добавить дополнительные ограничения типа

Также жалуется на строчку:
F#
1
  printfn "%i" (sort list)

так:
Ошибка FS0001 Тип "unit" несовместим с любыми типами byte,int16,int32,int64,sbyte,uint16,uint 32,uint64,nativeint,unativeint, возникающими при использовании строки формата printf-style

Не понимаю, в чем может быть проблема. при a.[i] тоже самое
0
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
30.07.2020, 11:07
Цитата Сообщение от nottheprogramer Посмотреть сообщение
let list = Console.ReadLine()
Нужно в цикле
F#
1
list.[i] = Console.ReadLine()
либо парсить строку
F#
1
let list = Console.ReadLine().Split(' ')
Добавлено через 1 минуту
У Вас в одном месте list - массив, а в другом list - строка.

Добавлено через 1 минуту
Цитата Сообщение от nottheprogramer Посмотреть сообщение
Ошибка FS0001 Тип "unit" несовместим с любыми типами byte,int16,int32,int64,sbyte,uint16,uint 32,uint64,nativeint, unativeint, возникающими при использовании строки формата printf-style
У Вас функция sort возвращает unit, а printfn "%i" ожидает число.

Добавлено через 56 минут
Если написать так:
F#
1
2
3
4
5
  let sort list =
     for i = list.[0] to list.[i] do
       if list.[i] < list.[i-1] then printf "Элементы списка сортированы по возрастанию"
       else printfn "Элементы списка НЕ сортированы по возрастанию"
     list
то функция будет возвращать массив.

Для печати массива нужно использовать %A
F#
1
printfn "%A" (sort list)
Добавлено через 2 минуты
Только будет ругаться из-за этого:
Цитата Сообщение от Shamil1 Посмотреть сообщение
for i = list.[0] to list.[i]
И ещё Console.ReadLine() возвращает строку, а Вам, судя по всему, нужны числа.
1
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,149
Записей в блоге: 43
30.07.2020, 12:33
Цитата Сообщение от nottheprogramer Посмотреть сообщение
Ошибка FS0752 Оператор "expr.[idx]" применялся к объекту неопределенного типа на основе информации, полученной до этой точки программы. Попробуйте добавить дополнительные ограничения типа
Ну так на самом же деле непонятно какого типа параметр. В принципе в таких случаях(я имею в виду случаи, когда появляется подобное сообщение об ошибке) можно просто указать тип параметра функции и обычно проблема решается. Но тут есть и другие проблемы, о которых надо сказать.
По поводу второго сообщения, ну тут функция же не возвращает ничего, она просто выполняет какой-то странный цикл и в каждой итерации выводит на консоль одно из сообщений. В то время как при выполнении printfn со строкой форматирования %i ожидается, что будет возвращено что-то, что можно отобразить как число.
Почему цикл я назвал странным? Ну тут надо иметь в виду, что в данном случае величины list.[0] и list.[i] это крайние значения, которые будет принимать переменная i при выполнении цикла. То есть первоначально она инициируется первым элементом списка, а цикл будет завершен когда она примет значение того элемента списка, который будет совпадать с индексом, по котором этот элемент расположен в списке. Это какой-то вынос мозга. Зачем такое делать - непонятно.
Исходя из названия топика могу предположить, что ты хотел сделать что-то типа
F#
1
     for i = 1 to List.length list do
Если так, то здесь есть пара моментов.
Если ты действительно работаешь именно со списком, то данный подход будет очень плох в плане производительности. На малых списках это будет незаметно, но вот с большими могут быть проблемы. Дело в том, что индексация не является (так скажем) естественным способом работы со списком. У списка есть доступ к первому элементу (голове) и списку содержащему оставшиеся элементы (хвосту), и для того, чтобы найти элемент по индексу выполняется перебор всех элементов начиная с головы вплоть до нужного элемента по порядку следования). Если делать это для каждого элемента списка да еще и по два раза, то можешь себе представить вычислительную сложность такого алгоритма. Но такой подход вполне нормален, если вместо списка использовать массив. То есть, если ты хочешь использовать именно такой алгоритм, то конвертирую список в массив и работай с ним.
Для списков же можно использовать следующие подходы. Я буду писать функции, которые принимают список и возвращают булево значение, зависящее о того, упорядочен ли этот список.
Если производительность не критична, то проще всего сравнить исходный список с его же отсортированной версией.
F#
1
let isOrdered1 l = List.sort l |> (=) l
Другой подход - это использование функции zip. То есть нужно объединить исходный список с таким же списком без первого элемента. Для списка такой подход приведет к ошибке, но последовательности с этим справляются и у более длинного списка отбрасываю излишки. В результате объединения у нас будет коллекция кортежей с соседними элементами, которые можно просто сравнить между собой.
F#
1
2
3
let isOrdered2 l =
    let s = Seq.ofList l
    Seq.skip 1 s |> Seq.zip s |> Seq.forall (fun (a,b) -> a <= b)
Ну и наконец можно использовать рекурсивную функцию, которая решит задачу за один проход без всяких преобразований к другим типам коллекций
F#
1
2
3
4
let rec isOrdered3 = function
    | [] | _::[] -> true
    | a::b::_ when a > b -> false
    | _::t -> isOrdered3 t
Протестировать можно так
F#
1
2
3
4
5
6
7
8
9
10
11
12
13
    let ordered = [5..15]
    let unordered = [1;2;3;4;5;6;7;6;8;9;10]
    printfn "isOrdered1"
    isOrdered1 ordered |> printfn "ordered %b"
    isOrdered1 unordered |> printfn "unordered %b"
 
    printfn "isOrdered2"
    isOrdered2 ordered |> printfn "ordered %b"
    isOrdered2 unordered |> printfn "unordered %b"
 
    printfn "isOrdered3"
    isOrdered3 ordered |> printfn "ordered %b"
    isOrdered3 unordered |> printfn "unordered %b"
1
41 / 28 / 13
Регистрация: 31.10.2019
Сообщений: 126
30.07.2020, 17:36
Цитата Сообщение от nottheprogramer Посмотреть сообщение
Тут проблема есть.
тут не только проблема, а вообще не понятно что. ReadLine возвращает строку из консоли. для теста функции лучше вообще избавься от такого ввода данных, просто захардкодь исходный массив в сам код и на нем тестируй. а ввод данных уже как нибудь потом добавь

C++ (Qt)
1
for i = list.[0] to list.[i] do
на этой строчке вообще можно исключение словить и сам цикл сделан неправильно

так будет достаточно
C++ (Qt)
1
for i in list do
вообще, на мой взгляд, можно попытаться сделать проще. берем исходный массив, сортируем его и результат сравниваем с исходным массивом. если оба массива одинаковые, значит можно сказать, то исходный массив был упорядочен. иначе - нет.
1
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
31.07.2020, 10:57
F#
1
2
3
4
5
6
7
8
9
10
11
12
13
// чтение строки
let str = Console.ReadLine()
 
// превращение строки в число
let num = int str // вместо "int str" можно писать "str |> int"
 
// создание массива длины N, заполненого нулями
let N = 3
let arr = Array.create N 0
 
// заполнение массива числами с клавиатуры в цикле
for i = 0 to arr.Length - 1 do
    arr.[i] <- Console.ReadLine() |> int
Но лучше обходиться без циклов.
F#
1
2
let N = 3
let arr = Array.init N (fun _ -> Console.ReadLine() |> int)
1
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
31.07.2020, 11:33
Лучший ответ Сообщение было отмечено nottheprogramer как решение

Решение

В целом решение будет выглядеть так:
F#
1
2
3
4
5
6
7
8
printfn "%s" "Введите размер"
let size = Console.ReadLine() |> int
 
printfn "%s" "Введите элементы"
let arr = Array.init size (fun _ -> Console.ReadLine() |> int)
 
let isSorted = arr |> Seq.pairwise |> Seq.forall (fun (x,y) -> x <= y)
printfn "%s" <| if isSorted then "Да" else "Нет"
Только непонятно, почему массив, если в сабже список.
1
Модератор
Эксперт функциональных языков программирования
3134 / 2281 / 469
Регистрация: 26.03.2015
Сообщений: 8,877
31.07.2020, 11:35
Для списка нужно в строке 5 заменить "Array" на "List"
1
1195 / 588 / 88
Регистрация: 20.09.2012
Сообщений: 1,881
02.08.2020, 19:31
F#
1
2
3
4
5
6
7
8
9
10
11
12
    let xs = [ printfn "%s" "Введите размер"
               let size = Console.ReadLine() |> int
               printfn "%s" "Введите элементы"
               for i = 1 to size do yield Console.ReadLine() |> int ]
 
    let rec isSorted xs = 
        match xs with 
        | a :: b :: t when a < b -> isSorted (b :: t)
        | [] | [_] -> true
        | _ -> false
 
    printfn "%s" <| if isSorted xs then "Да" else "Нет"
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.08.2020, 19:31
Помогаю со студенческими работами здесь

Определить, упорядочены ли положительные элементы по возрастанию
5. Вводится последовательность вещественных чисел, оканчивающаяся нулём, и состоящая более чем из одного ненулевого элемента. Определить,...

Определить упорядочены ли элементы массива по возрастанию
Как сделать программу: Ввести одномерный массив А , вывести его. Определить упорядочены ли элементы массива по возрастанию. Если не...

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

Определить, упорядочены ли элементы массива по возрастанию
определить, выставлены ли элементы массива по возрастанию. 1) выставлены 2) не выставлены

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru