Menu
Coddy logo textTech

Преобразование с помощью 'map'

Часть раздела Логика и управление потоком путешествия по Dart на Coddy — урок 10 из 65.

Когда вам нужно преобразовать каждый элемент в списке во что-то новое, Dart предоставляет мощный метод map(). Этот метод применяет функцию преобразования к каждому элементу в списке и создает новый список, содержащий все преобразованные результаты.

Метод map() принимает функцию в качестве параметра, которая определяет, как должен быть преобразован каждый элемент. Эта функция получает каждый элемент из исходного списка и возвращает его преобразованную версию. Затем метод map() собирает все эти преобразованные значения в новый список.

List<int> numbers = [1, 2, 3, 4, 5];

// Преобразуем каждое число, удваивая его
var doubled = numbers.map((number) => number * 2);
print(doubled);  // (2, 4, 6, 8, 10)

Этот подход гораздо более элегантен, чем ручное создание нового списка и использование цикла для преобразования каждого элемента. Метод map() представляет собой фундаментальную концепцию функционального программирования, позволяющую выражать преобразования данных четким и лаконичным способом.

challenge icon

Задание

Легко

Создайте программу, которая управляет системой ценообразования продуктов, применяя процентную корректировку цен ко всем товарам в инвентаре магазина. Ваша программа должна:

  1. Прочитать строковый ввод, представляющий название магазина
  2. Прочитать несколько десятичных вводов, представляющих исходные цены на товары (ввод закончится, когда вы получите -1)
  3. Прочитать десятичный ввод, представляющий процентную корректировку (положительное число для повышения цены, отрицательное для скидки)
  4. Использовать метод map() для преобразования каждой цены путем применения процентной корректировки
  5. Вывести результаты корректировки цен в точном формате, показанном ниже

Например, если название магазина — "Tech Store", цены — 99.99, 149.50, 79.99, 199.99, а корректировка — 15.0 (увеличение на 15%), ваша программа должна вывести:

Store: Tech Store
Original prices: [99.99, 149.5, 79.99, 199.99]
Applying 15.0% adjustment
Adjusted prices: (114.9885, 171.925, 91.9885, 229.9885)
Total items processed: 4
Status: Price adjustment completed

Если название магазина — "Fashion Outlet", цены — 29.99, 45.00, а корректировка — -20.0 (скидка 20%), ваша программа должна вывести:

Store: Fashion Outlet
Original prices: [29.99, 45.0]
Applying -20.0% adjustment
Adjusted prices: (23.992, 36.0)
Total items processed: 2
Status: Price adjustment completed

Если название магазина — "Book Corner" и указана только одна цена 12.50 с корректировкой 0.0, ваша программа должна вывести:

Store: Book Corner
Original prices: [12.5]
Applying 0.0% adjustment
Adjusted prices: (12.5)
Total items processed: 1
Status: Price adjustment completed

Ваша программа должна использовать метод map() с функцией преобразования, которая рассчитывает новую цену по формуле: originalPrice * (1 + percentage / 100). Метод map() должен возвращать итерируемый объект, содержащий все скорректированные цены, которые будут отображаться в формате с круглыми скобками.

Шпаргалка

Метод map() преобразует каждый элемент в списке, применяя функцию к каждому элементу и создавая новый список с результатами.

Метод map() принимает функцию в качестве параметра, которая определяет преобразование. Эта функция получает каждый элемент и возвращает его преобразованную версию:

List<int> numbers = [1, 2, 3, 4, 5];

// Преобразуем каждое число, удваивая его
var doubled = numbers.map((number) => number * 2);
print(doubled);  // (2, 4, 6, 8, 10)

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

Попробуйте сами

import 'dart:io';

void main() {
  // Прочитать название магазина
  String? storeName = stdin.readLineSync();
  
  // Читать цены, пока не встретится -1
  List<double> prices = [];
  while (true) {
    String? input = stdin.readLineSync();
    double price = double.parse(input!);
    if (price == -1) {
      break;
    }
    prices.add(price);
  }
  
  // Прочитать процентную корректировку
  String? adjustmentInput = stdin.readLineSync();
  double adjustment = double.parse(adjustmentInput!);
  
  // TODO: Напишите свой код ниже
  // Используйте метод map(), чтобы применить процентную корректировку ко всем ценам
  // Формула: originalPrice * (1 + percentage / 100)
  
  // Вывести результаты
  print('Store: $storeName');
  print('Original prices: $prices');
  print('Applying $adjustment% adjustment');
  // Вывести скорректированные цены в формате в скобках
  // Вывести общее количество обработанных товаров
  // Вывести статусное сообщение
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком