Форум программистов, компьютерный форум, киберфорум
Rust
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
2 / 2 / 1
Регистрация: 15.07.2022
Сообщений: 37

Можно ли более кратко реализовать эту функцию?

01.05.2023, 09:09. Показов 1660. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток. Начал я учить Rust по учебнику, сначала по книге. Но потом понял, что быстро всё забываю, да и на практике у меня плохо получается писать код и решил делать параллельно задания из Rust by Example и читать учебник. Пытаясь написать функцию, которая будет находить площадь прямоугольника, я столкнулся с тем, что тело этой функции выглядит громоздко. Можно ли его как-то сократить или это нормальное решение? (Не нашёл других ответов на этот вопрос, если они были, то не ругайте)

Rust
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
#[derive(Debug)]
struct Point {
    x: f32,
    y: f32,
}
struct Rectangle {
    top_left: Point,
    bottom_right: Point,
}
 
 
fn rect_area(rectangle: &Rectangle) -> f32{
    let (top_left, bottom_right) = (&rectangle.top_left, &rectangle.bottom_right);
    let width =  bottom_right.x - top_left.x;
    let height = top_left.y - bottom_right.y;
    width * height
}
 
 
fn main() {
    let rectangle = Rectangle { 
        top_left: Point { 
            x: 10.0, 
            y: 15.0,
        },
        bottom_right: Point {
            x: 5.0,
            y: 23.0,
        },
    };
 
    println!("{}", rect_area(&rectangle));
}
Добавлено через 26 минут
P. S.
Начал делать следующее задание, проблема такая же.

Rust
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
#[derive(Debug)]
struct Point {
    x: f32,
    y: f32,
}
 
#[derive(Debug)]
struct Rectangle {
    top_left: Point,
    bottom_right: Point,
}
 
 
fn rect_area(rectangle: &Rectangle) -> f32{
    let (top_left, bottom_right) = (&rectangle.top_left, &rectangle.bottom_right);
    let width =  bottom_right.x - top_left.x;
    let height = top_left.y - bottom_right.y;
    width * height
}
 
fn square(top_left: Point, side_size: f32) -> Rectangle{
    Rectangle {
        bottom_right: Point {
            x: (top_left.x + side_size),
            y: (top_left.y - side_size) },
        top_left: top_left,
    }
}
 
 
fn main() {
    let point = Point { x: 10.0, y: 56.0};
    let square = square(point, 10.5);
 
    println!("{:?}", square);
    println!("{}", rect_area(&square));
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.05.2023, 09:09
Ответы с готовыми решениями:

Подскажите кратко, как можно это реализовать
Добрый день, вечер, ночь форумчане. Появилась такая идея в голове. Но сколько не штудировал интернет, не нашёл нужную информацию. ...

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

Реализовать функцию strstr на ассемблере, и подключить эту функцию в проект MVS2008
Нужно реализовать функцию strstr на ассемблере, и подключить эту функцию в проет MVS2008. Код функции: .386 extern _strstr:near...

6
Модератор
 Аватар для Curry
5158 / 3482 / 536
Регистрация: 01.06.2013
Сообщений: 7,549
Записей в блоге: 9
02.05.2023, 02:37
Может так ?
Rust
1
2
3
4
5
6
7
8
fn rect_area(rectangle: &Rectangle) -> f32{
    
    let Rectangle { top_left     : Point { x: left, y: top}, 
                    bottom_right : Point { x: right, y: bottom}} = &rectangle;
    let width =  right - left;
    let height = top   - bottom;
    width * height
}
0
77 / 40 / 11
Регистрация: 18.11.2015
Сообщений: 98
26.05.2023, 09:12
Rust
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
#[derive(Debug)]
struct Point {
    x: f32,
    y: f32,
}
 
impl Point {
    fn new(x: f32, y: f32) -> Self {
        Self { x, y }
    }
}
 
#[derive(Debug)]
struct Size {
    width: f32,
    height: f32,
}
 
impl Size {
    fn new(width: f32, height: f32) -> Self {
        Self { width, height }
    }
 
    fn area(&self) -> f32 {
        self.width * self.height
    }
}
 
#[derive(Debug)]
struct Rectangle {
    top_left: Point,
    size: Size,
}
 
impl Rectangle {
    fn square(top_left: Point, size: f32) -> Self {
        Self {
            top_left,
            size: Size::new(size, size),
        }
    }
 
    fn area(&self) -> f32 {
        self.size.area()
    }
}
 
fn main() {
    let point = Point::new(10.0, 56.0);
    let square = Rectangle::square(point, 10.5);
 
    println!("{:?}", square);
    println!("{}", square.area());
}
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
26.05.2023, 12:25
Priz01,

Rust
1
2
3
4
5
6
7
8
9
10
11
fn rect_area(r: &Rectangle) -> f32 {
    rect_width(r) * rect_height(r)
}
 
fn rect_width(r: &Rectangle) -> f32 {
    r.bottom_rigth.x - r.top_left.x
}
 
fn rect_height(r: &Rectangle) -> f32 {
    r.bottom_right.y - r.top_left.y
}
0
2 / 2 / 1
Регистрация: 15.07.2022
Сообщений: 37
30.05.2023, 16:40  [ТС]
На мой взгляд, создавать новые экземпляры структуры Point будет тратить больше ресурсов, чем просто заимствовать значения.

Добавлено через 1 минуту
Решение безусловно лучше, чем моё, но в задании в книге были именно верхний левый и правый нижний углы прямоугольника, а в данной реализации структуры Rectangle появляется экземпляр структуры Size, что не соответствует условиям задачи.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
03.06.2023, 11:52
Может, я чего-то не понимаю, а?

Rust
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
impl Rectangle {
    pub fn area(&self) -> f32 {
        self.width() * self.height()
    }
 
    pub fn width(&self) -> f32 {
        (self.bottom_right.x - self.top_left.x).abs()
    }
 
    pub fn height(&self) -> f32 {
        (self.bottom_right.y - self.top_left.y).abs()
    }
}
 
 
fn main() {
    let rectangle = Rectangle {
        top_left: Point {
            x: 10.0,
            y: 15.0,
        },
        bottom_right: Point {
            x: 5.0,
            y: 23.0,
        },
    };
 
    println!("{}", rectangle.area());
}
0
Заблокирован
05.06.2023, 15:37
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
Может, я чего-то не понимаю, а?
да. у него задание написать именно так как он пишет.
чего он хочет ещё, если там сказано писать именно так - не понятно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.06.2023, 15:37
Помогаю со студенческими работами здесь

Числа считаются равными если они отличаются не более, чем на (10^-12) / c++ / как реализовать эту возможность?
На плоскости заданы три точки А, В и С. Определить, какая из двух последних точек (B или C) расположена ближе к A, и вывести расстояние от...

Более кратко записать (переделать) код
Здравствуйте! Узнал что функцию printf() можно использовать для вывода ведущих символов, но не могу грамотно собрать программу. То есть,...

Можно ли, проделав эту операцию несколько раз, получить число более 10 000?
На доске записано натуральное число n, 1000 < n < 3000. Вася может прибавить к числу произведение его первой и последней цифры и записать...

Как можно реализовать эту задачку?
Прилагаю скриншот П.5.4. Правил Запрещено создавать темы с бессмысленными названиями вроде "Помогите!", "Вопрос" и...

Как можно реализовать эту программу с использованием класса?
using namespace std; int main() { int N; double x; bool flag; cout << "Enter a matrix size:" << endl; ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru