Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 26.08.2023
Сообщений: 7

Являются ли значения М и N кратными трем

26.08.2023, 01:35. Показов 1776. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Нужен максимально короткий код на C++ с объяснением каждой строки кода.
Вот задача: Определить, являются ли значения целочисленных переменных М и N кратными трем. Если оба кратны трем, то вычислить их сумму, иначе вычислить их произведение.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.08.2023, 01:35
Ответы с готовыми решениями:

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

Доказать, что среди чисел Фибоначчи четными являются только числа с номерами, кратными трем
Докажите, что среди чисел Фибоначчи четными являются только числа с номерами, кратными трем. Буду благодарна за решение/идеи!

Найти количество элементов массива, являющихся кратными двум и не кратными трем
Дан массив целых чисел из 12 элементов. Найти количество элементов массива являющихся кратными двум и не кратными трем. Помогите пожалуйста

31
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6136 / 2830 / 1039
Регистрация: 01.06.2021
Сообщений: 10,317
26.08.2023, 21:24
Студворк — интернет-сервис помощи студентам
SmallEvil, видимо, повар1 применил правило "если два числа делятся на 3, то их сумма тоже делится на 3" в обратном порядке, что неверно. Это логическая ошибка. Когда идёт дождь - асфальт мокрый. Но если асфальт мокрый - не факт, что идёт дождь)
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
26.08.2023, 21:40
Передаём числа как аргументы командной строки:
C++
1
2
3
#include <iostream>
#include <cstdlib>
int main(int argc, char const *argv[]) { if (int m = (argc > 2 ? atoi(argv[1]) : 0), n = (argc > 2 ? atoi(argv[2]) : 0); m) std::cout << (m % 3 || n % 3 ? m * n : m + n) << '\n'; }
Под линуксом запускал так:
Bash
1
g++ -std=c++17 main.cpp && ./a.out 6 2
Результат:
12
Bash
1
g++ -std=c++17 main.cpp && ./a.out 6 3
Результат:
9

Этот вариант самый короткий, который я смог придумать - три строки всего.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6136 / 2830 / 1039
Регистрация: 01.06.2021
Сообщений: 10,317
26.08.2023, 21:43
Цитата Сообщение от sourcerer
Этот вариант самый короткий, который я смог придумать - три строки всего.
Насколько мне известно, в С++ любой код можно написать в одну строку. Поэтому нужно считать количество символов, а не строк.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
26.08.2023, 21:46
Royal_X, два стейтмента на одной строке - признак плохого кода. У меня получается один compound statement на одной строке. Такой код, конечно, изящным не назовёшь, но ТС хотел как можно короче. В принципе, если пренебречь правилом один стейтмент - одна строка, то можно ещё короче:
C++
1
2
#include <iostream>
int main(){ int m = 6, n = 3; std::cout << (m % 3 || n % 3 ? m * n : m + n) << '\n'; }
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
26.08.2023, 21:52
Лучший ответ Сообщение было отмечено Royal_X как решение

Решение

Если у нас драка за каждый символ, то можно даже так:
C++
1
2
#include<iostream>
int main(){int m=6,n=3;std::cout<<(m%3||n%3?m*n:m+n);}
1
Заблокирован
26.08.2023, 22:39
Цитата Сообщение от sourcerer Посмотреть сообщение
Если у нас драка за каждый символ, то можно даже так
Ну вот, приехали, а было так красиво и понятно, на удивление (в посте 17).
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
26.08.2023, 22:45
Цитата Сообщение от SmallEvil Посмотреть сообщение
Ну вот, приехали, а было так красиво и понятно, на удивление (в посте 17).
SmallEvil, ну что тут скажешь? Есть несколько вариантов. Кому какой нравится, тот такой себе и утащит.
0
0 / 0 / 0
Регистрация: 26.08.2023
Сообщений: 7
27.08.2023, 20:24  [ТС]
sourcerer, у вас самый маленький код а пояснения? Если можете можно ещё меньше?

Добавлено через 22 секунды
Ребята можете пояснить для новичка что такое плохой код?
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
27.08.2023, 22:16
Toyota Camry, пояснения другие уже дали. У меня всё то же самое, те же операторы.
0
0 / 0 / 0
Регистрация: 26.08.2023
Сообщений: 7
27.08.2023, 22:51  [ТС]
sourcerer, у вас чёто и код не работает.

Добавлено через 25 секунд
Вот этот:
C++
1
2
#include<iostream>
int main(){int m=6,n=3;std::cout<<(m%3||n%3?m*n:m+n);}
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
27.08.2023, 23:11
Toyota Camry, всё превосходно работает: https://onlinegdb.com/A60jpB8vL
Заменяйте в коде значения переменных m и n на те, которые нужны Вам, будет разный результат. А так - всё время будет складываться 6 и 3, потому что и 6 и 3 кратны трём, а значит складываем их - получаем 9.

Добавлено через 5 минут
Toyota Camry, по сути код из сообщения #25 представляет из себя вот такой код, просто записанный в одну строчку:
C++
1
2
3
4
5
6
#include <iostream>
int main()
{
    int m = 6, n = 3;
    std::cout << (m % 3 || n % 3 ? m * n : m + n);
}
Первая строка - это так называемая директива препроцессора (preprocessor directive). Каждая директива препроцессора начинается со знака решётки. Этой директивой мы подключаем заголовочный файл iostream. Собственно, include - английское слово, означающее "включить". Заголовочный файл iostream - это один из множества файлов стандартной библиотеки языка С++. Директива препроцессора include позволяет нам "включить" в наш файл библиотечный файл iostream. Этот процесс очень похож на обычную пару операций копировать/вставить. Представьте, что вместо этой одной строки в Вашем файле оказываются сотни строк библиотечного кода, написанного умными дядями задолго до Вас, и оттестированного миллионами пользователей. Нам этот заголовочный файл нужен для того, чтобы в нашем коде стали доступны определения библиотечных объектов std::cout и std::cin.
Библиотечный объект cout (произносится как "си-аут") - это сокращение от "character output" (по другой версии - от "console output"), то есть, "символьный вывод" или "консольный вывод". Этот объект определён где-то в недрах библиотечного файла iostream. Библиотечный объект cout знает, как выводить на консоль переменные фундаментальных типов (fundamental types) или как их ещё называют, встроенных типов (built-in types). Таким образом, Вам не приходится заботится о том, чтобы самостоятельно реализовывать эту функциональность - она уже доступна в виде готового библиотечного решения. Вы просто используете объект cout, а он выводит на консоль всё, что Вы в него закидываете.
Библиотечный объект cin (произносится как "си-ин") - это сокращение от "character input" (по другой версии - от "console input"), то есть "символьный ввод" или "консольный ввод". Этот объект позволяет осуществлять пользовательский ввод с устройства ввода (в нашем случае - с клавиатуры) и сохранять его в переменную.
Функция main - это точка входа в программу. Именно эту функцию вызывает операционная система, когда вы кликаете на иконку с Вашей программой или вызываете Вашу программу из командной строки. Слово main - с английского "главная". Функция main как и другие функции в языке С++ имеет чётко определённый синтаксис: сперва мы пишем тип возвращаемого значения (int - от английского "integer" - целое число). Функция main в самом конце своего выполнения вернёт вызывающей стороне (операционной системе) значение целого типа. Обычно это достигается выполнением инструкции return (return statement), и выглядит это так:
C++
1
2
3
4
5
6
7
#include <iostream>
int main()
{
    int m = 6, n = 3;
    std::cout << (m % 3 || n % 3 ? m * n : m + n);
    return 0;
}
Но функция main отличается от других функций тем, что если Вы явно не предоставите в самом конце инструкцию return, она будет подставлена туда компилятором. Поэтому, эту инструкцию мы можем опустить - всё равно компилятор позаботится, чтобы она там была. Любая функция возвращает поток управления вызывающей стороне. Но если функция не void, то она возвращает ещё и возвращаемое значение - в случае с функцией main, это ноль. Ноль - признак успешного завершения программы.
Около имени каждой функции (в случае, если мы говорим об определении функции) можно увидеть пару круглых скобок - это так называемый call operator. Внутри круглых скобок располагается список параметров (parameter list). В нашем случае список параметров пуст, то есть, это значит, что мы не передаём внутрь функции main никаких параметров, однако, Вы могли заметить, что в одном из предыдущих примеров я передавал в функцию main пару параметров. Обе этих формы (без параметров и с двумя параметрами) установлены стандартом языка С++.
Пара фигурных скобок представляет из себя тело функции (function body). Внутри тела функции располагаются инструкции (statements). Каждая законченная инструкция в языке программирования С++ заканчивается точкой с запятой (за исключением так называемых compound statements, но о них мы сейчас говорить не будем). Таким образом, в нашем примере выше три инструкции:
C++
1
2
3
int m = 6, n = 3; // объявление двух целочисленных переменных и инициализация их значениями 6 и 3
std::cout << (m % 3 || n % 3 ? m * n : m + n); // вывод на экран результата вычисления выражения (m % 3 || n % 3 ? m * n : m + n)
return 0; // возврат вызывающей стороне значения 0
Как Вы скорее всего заметили, перед объектом cout мы пишем идентификатор std и затем два двоеточия. std (или как на конференциях по С++ говорят "студ") - это имя стандартного пространства имён (namespace std). Все классы, функции, константы, объекты стандартной библиотеки помещены в пространство имён std. Это сделано для того, чтобы избежать конфликтов имён. Поскольку хороших имён ограниченное количество, может возникнуть ситуация, когда Вы и, скажем, разработчик сторонней библиотеки, использовали одно и то же имя. Не будь неймспейсов, компилятор не смог бы разобраться, какая именно сущность имеется ввиду - Ваша или библиотечная. Два двоеточия - это оператор разрешения контекста (scope resolution operator).
Рядом с объектом cout Вы могли заметить два знака меньше << - это так называемый оператор вставки в поток (insertion operator) или, как его называет в своей книге Стенли Липпман - оператор вывода (output operator). Этот оператор позволяет закинуть в объект cout результат вычисления выражения (m % 3 || n % 3 ? m * n : m + n)
В этом выражении используется условный оператор ?: или, как его ещё называют, тернарный оператор. Его синтаксис прост:
(условие) ? (если условие истинно, выполняем это выражение) : (если условие ложно, выполняем это выражение)
Результат вычисления выражения можно присвоить переменной или, как в нашем случае, закинуть в объект cout, чтобы вывести на консоль.
В качестве условия у нас выражение m % 3 || n % 3
Здесь мы используем оператор взятия остатка от целочисленного деления (значок процента). Если то, что лежит в переменной m (в нашем случае мы положили туда шестёрку, помните?) поделить на 3, то остаток будет ноль. То же верно и для n (мы сложили в неё значение 3). Получается, в обеих частях этого выражения у нас нули. А ноль в С++ в случае логических вычислений - это false. Выражение m % 3 || n % 3 - это и есть такое логическое выражение. Для его вычисления применяется оператор логического ИЛИ (logical OR operator) - это вот те самые две вертикальные палочки (в английской литературе их называют ещё pipe). Оператор || работает так: если хотя бы одна из частей (левая или правая) выражения x || y истинна (true), то всё выражение истинно, в противном случае, всё выражение ложно (false). А мы уже выяснили, что наше выражение m % 3 || n % 3 в случае m равной 6 и n равной 3 и в правой и в левой части ложно. Следовательно, вычисляться будет та ветка, которая после двоеточия, то есть m + n.
Запись с тернарным оператором короче, но может немного сбивать с толку начинающего. По сути, чтобы повысить читаемость кода, мы могли бы записать всё, что у нас в теле функции main вот таким образом:
C++
1
2
3
4
5
6
7
8
9
int m = 6, n = 3;
if (m % 3 || n % 3) // если m не кратно трём ИЛИ n не кратно трём, то
{
    std::cout << m * n; // вывести на консоль произведение
}
else // иначе 
{
    std::cout << m + n; // вывести на консоль сумму
}
Подробнее про все эти термины и концепции можно либо нагуглить, либо почитать в учебнике Стивена Праты или учебнике Стенли Липпмана. Если бы Вы спросили моего совета, я бы посоветовал почитать как минимум первые девять глав из учебника Стивена Праты. Я думаю, за два-три месяца вполне реально прочитать и усвоить с полного нуля то, что там написано (если ежедневно заниматься по два-три часа).
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
28.08.2023, 09:18
Цитата Сообщение от Toyota Camry Посмотреть сообщение
Если можете можно ещё меньше?
Toyota Camry, ещё меньше не могу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.08.2023, 09:18
Помогаю со студенческими работами здесь

Определить, являются ли значения целочисленных переменных N и M кратными 3.
Определить, являются ли значения целочисленных переменных N и M кратными 3. Если оба значения кратны 3, то вычислить их сумму, в противном...

Вывести на экран числа с индексами, кратными трем
Даны целые числа, вывести на экран числа с индексами, кратными трем.

Переписать в новый массив все элементы с порядковыми номерами, кратными трем
Дан целочисленный массив A размера N. Переписать в новый целочисленный массив B все элементы с порядковыми номерами, кратными трем (3, 6,...

Подсчитать количество цифровых символов в строке с кодами ASCII кратными трем.
Подсчитать количество цифровых символов в строке с кодами ASCII кратными трем. тут есть такая тема. но она без ответная чото!

Подсчитать количество цифровых символов в строке с кодами ASCII кратными трем
1)Подсчитать количество цифровых символов в строке с кодами ASCII кратными трем. 2)Дана строка. Преобразовать ее, заменив каждый...


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru