Форум кафедры Техники и Электрофизики Высоких Напряжений

Онлайн-сообщество ТВНщиков
Гостям форума:

Добро пожаловать на форум по технике высоких напряжений!
Для получения доступа ко всем разделам необходимо зарегистрироваться


Текущее время: 14 ноя 2018, 22:43

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
СообщениеДобавлено: 03 июн 2010, 00:20 
Не в сети
Site Admin
Аватара пользователя

Зарегистрирован: 03 сен 2008, 17:00
Сообщения: 339
Откуда: Д-4а
Отсутствие правильного решения этой задачи абсолютно у всех студентов натолкнуло меня на мысль предложить её сообществу. Для тренировки, так сказать.

Итак, задача.
Есть массив, каждым элементом которого является структура, содержащая поля "Name" и "Numbers".
Поле "Numbers" содержит набор из N целых случайных чисел в диапазоне от 0 до 100. (Число N для каждого элемента массива структур разное и меняется в диапазоне от 5 до 20.)
Поле "Name" - это имя "хозяина" набора случайных значений.
Написать функцию, которая возвращает имя человека (или нескольких человек), у которого в наборе "Numbers" присутствует максимальное по значению число.
Методические указания: не применять циклы.

Очевидно, что первая строка у всех одинакова и выглядит так:
Код:
function names = getNamesWithMaxValues(people)

Пример исходных данных:
Код:
S = [ ...
struct('Name', 'Иванов', 'Numbers', round(rand(1,10) * 100), ...
struct('Name', 'Петров', 'Numbers', round(rand(1,15) * 100), ...
struct('Name', 'Сидоров', 'Numbers', randi([0 100], 1, 7) ];


Налетай! :woo:


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
СообщениеДобавлено: 03 июн 2010, 01:22 
Не в сети
Site Admin

Зарегистрирован: 03 сен 2008, 16:09
Сообщения: 4258
Откуда: Д-3
А мне Л.Л. прислал решение по аське и лишил возможности подумать :cry:

Там хорошее решение, в две строчки, думаю, никто не решит ;-)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
СообщениеДобавлено: 03 июн 2010, 23:06 
Не в сети
ГИПСОКАРТОН - 8(926)8949755 (Эдуарт)
Аватара пользователя

Зарегистрирован: 20 апр 2009, 20:07
Сообщения: 67
Откуда: Э-04-05
Опять двойка! :woo:


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
СообщениеДобавлено: 06 окт 2010, 23:46 
Не в сети
Site Admin
Аватара пользователя

Зарегистрирован: 03 сен 2008, 17:00
Сообщения: 339
Откуда: Д-4а
Ну, почему, почему никто не хочет решать эту задачу? :hysteric:


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
СообщениеДобавлено: 07 окт 2010, 13:54 
Не в сети
Site Admin

Зарегистрирован: 03 сен 2008, 16:09
Сообщения: 4258
Откуда: Д-3
Не расстраивайся, просто ты - неудачник! :bebebe:


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
СообщениеДобавлено: 07 окт 2010, 16:22 
Не в сети
Site Admin
Аватара пользователя

Зарегистрирован: 03 сен 2008, 17:00
Сообщения: 339
Откуда: Д-4а
Странная логика... :rofl:


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
СообщениеДобавлено: 07 окт 2010, 20:02 
Не в сети
Изучает еще один язык
Аватара пользователя

Зарегистрирован: 02 сен 2009, 20:50
Сообщения: 469
Откуда: из Ногинска
Попробуем решить.

_________________
我愛 Matlab的


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
СообщениеДобавлено: 07 окт 2010, 22:16 
Не в сети
Site Admin

Зарегистрирован: 03 сен 2008, 16:09
Сообщения: 4258
Откуда: Д-3
как успехи? :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
СообщениеДобавлено: 08 окт 2010, 17:41 
Не в сети
Изучает еще один язык
Аватара пользователя

Зарегистрирован: 02 сен 2009, 20:50
Сообщения: 469
Откуда: из Ногинска
Решил задачу еще на зачете, вот вспоминать лень

_________________
我愛 Matlab的


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
СообщениеДобавлено: 08 окт 2010, 17:50 
Не в сети
Site Admin
Аватара пользователя

Зарегистрирован: 03 сен 2008, 17:00
Сообщения: 339
Откуда: Д-4а
Неправда. Вы решали частную (другую) задачу: Вы приняли, что у каждого одинаковый по числу случайных величин набор значений (тогда действительно всё сильно упрощается). А по условию задачи это не так!


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
СообщениеДобавлено: 08 окт 2010, 18:25 
Не в сети
Site Admin

Зарегистрирован: 03 сен 2008, 16:09
Сообщения: 4258
Откуда: Д-3
blecklov писал(а):
Решил задачу еще на зачете, вот вспоминать лень

Тьфу.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
СообщениеДобавлено: 25 окт 2018, 19:05 
Не в сети

Зарегистрирован: 28 фев 2015, 15:34
Сообщения: 33
Можно так:
Вариант 1. Подробно
Код:
clear
close all
clc

S = [ ...
    struct('Name', 'Иванов', 'Numbers', round(rand(1,10) * 100)), ...
    struct('Name', 'Петров', 'Numbers', round(rand(1,15) * 100)), ...
    struct('Name', 'Сидоров', 'Numbers', randi([0 100], 1, 7)) ]

getNamesWithMaxValues(S)

function names = getNamesWithMaxValues(people)
    maxValue = max([people.Numbers;]);
    func = @(x) any(x==maxValue);
    fields2cells = {people.Numbers;};
    idx = cellfun(func,fields2cells);
    names = {people(idx).Name;};
end


Вариант 2. Тоже самое, но одной строкой
Код:
clear
close all
clc

S = [ ...
    struct('Name', 'Иванов', 'Numbers', round(rand(1,10) * 100)), ...
    struct('Name', 'Петров', 'Numbers', round(rand(1,15) * 100)), ...
    struct('Name', 'Сидоров', 'Numbers', randi([0 100], 1, 7)) ]

getNamesWithMaxValues(S)

function names = getNamesWithMaxValues(people)
    names = {people(cellfun(@(x) any(x==max([people.Numbers;])),{people.Numbers;})).Name;};
end

_________________
Намного интереснее жить не зная, чем с ответами, которые, возможно, ложны.
Ричард Ф.Фейнман


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
СообщениеДобавлено: 26 окт 2018, 00:58 
Не в сети
Site Admin
Аватара пользователя

Зарегистрирован: 03 сен 2008, 17:00
Сообщения: 339
Откуда: Д-4а
Уже близко... Но перемудрили. Можно чуть проще... и без ячеек.

Я бы сделал так
Код:
maxValue = max([people.Numbers])
people(arrayfun(@(x)any(x.Numbers==maxValue), people)).Name
или так
Код:
maxValue = max([people.Numbers])
people(arrayfun(@(x)ismember(maxValue, x.Numbers), people)).Name


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB