Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
 Аватар для paradox_1326
0 / 0 / 3
Регистрация: 17.12.2014
Сообщений: 111

Можно ли написать этот код более компактно?

03.01.2015, 17:12. Показов 2025. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
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
#include <iostream>
#include <cmath>
using namespace std;
void main()
{
    int x, y;
    cout << "input x = ";
    cin >> x;
    cout << "input y = ";
    cin >> y;
    if (x > 0 && y > 0)
        cout << "Tochka nahoditsa v 1-oy chetverty " << '\n';
    else if (x < 0 && y>0)
        cout << "Tochka vo 2-oy chetverty " << '\n';
    else if (x < 0 && y < 0)
        cout << "Tochka v 3-ey chetverty " << '\n';
    else if (x > 0 && y < 0)
        cout << "Tochka v 4-oy chetverty " << '\n';
    else if(x>0 && y == 0)
        cout << "Tochka nahoditsa na osi X kotoraya razdelaet 1-uu i 4-uu chetverti " << '\n';
    else if (x<0 && y == 0)
        cout << "Tochka nahoditsa na osi X kotoraya razdelaet 2-uu i 3-u chetverti " << '\n';
    else if(x == 0 && y > 0)
        cout << "Tochka nahoditsa na osi Y kotoraya razdelaet 1-uu i 2-uu chetverti " << '\n';
    else if (x == 0 && y < 0)
        cout << "Tochka nahoditsa na osi Y kotoraya razdelaet 3-u i 4-uu chetverti " << '\n';
    else if(x == 0 && y == 0)
        cout << "Tochka nahoditsa v nachale koordinat " << '\n';
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.01.2015, 17:12
Ответы с готовыми решениями:

Можно ли написать более оптимальный код, используя цикл while?
собственно сабж. #include &lt;iostream&gt; using namespace std; int main() { int x, y, s, step = 1; cout &lt;&lt;...

Можно ли написать более оптимальный или простой код, используя цикл for?
собственно сабж. #include &lt;iostream&gt; using namespace std; int main() { int sum, count, ost; for (count = 0;...

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

26
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,874
04.01.2015, 04:52
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от hoggy Посмотреть сообщение
который непонятно, как вообще работает.
очень даже понятно
Цитата Сообщение от hoggy Посмотреть сообщение
почему сложение двух булей дает инт:
сложение двух интов, каждый буль приведется к инту(ну можно сделать явное приведение)

Цитата Сообщение от hoggy Посмотреть сообщение
4 An rvalue of type bool can be converted to an rvalue of type int, with false becoming zero and true becoming one.
false 0 true 1

Цитата Сообщение от hoggy Посмотреть сообщение
Потому что реально не логично
не сказал бы что эта запись, более понятна
Цитата Сообщение от hoggy Посмотреть сообщение
int xx = 1 + ( x<0 ? -1: cast(x) );

пока не расшифруешь кто такой cast
Цитата Сообщение от hoggy Посмотреть сообщение
Оптимизация. На современных процах арифметические операции над целыми, не совпадающими с разрядной сеткой машины, работают медленно.
если с памятью работать то да
а если с регистрами (х86) то там один регистр разбит на несколько, так скажем подрегистров
eax-32 бита ax-16бит ah-8бит al-8бит, так что скорость одинаковая чего не скажешь про ARM
Цитата Сообщение от hoggy Посмотреть сообщение
Экономия на спичках ценой чрезмерного ухудшения читабельности, имхо.
здесь да
но когда попадется огромный цикл, в котором куча ветвлений, то скорость будет очень заметна
Цитата Сообщение от hoggy Посмотреть сообщение
Я не специалист по ассемблеру,
попытаюсь объяснить на пальцах
современные процессоры имеют конвеерную архитектуру
скачал из памяти кучу команд и выполняет, параллельно загружает следующие
и вот пришло ветвление, а он не угадал
приходится выгружать эту кучу команд и загружать из другой ветки
а это время, вот она и потеря производительности
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
04.01.2015, 05:30
Цитата Сообщение от ValeryS Посмотреть сообщение
сложение двух интов, каждый буль приведется к инту(ну можно сделать явное приведение)
там нет сложения двух интов:
C++
1
int xx= (x>=0)+(x>0);
эквивалентно:

C++
1
2
3
const bool r1 = x>=0;
const bool r2 = x>0;
int xx= r1 + r2;
Сложение именно, что двух булей.

Которое в принципе не логично.

Для булей логично &&, или ||
А вот операция +, да ещё которая на выхлопе дает int - это ни разу не логично, и не очевидно.

Цитата Сообщение от ValeryS Посмотреть сообщение
не сказал бы что эта запись, более понятна
пока не расшифруешь кто такой cast
C++
1
int xx = 1 + ( x<0 ? -1: cast(x) );
Это - тривильная запись, и совершенно очевидно, что cast есть функция.

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

Даже более того: для читабельности есть смысл бить код на функции просто потому, что понять что делают несколько очень простых кусочков, а затем - что они делают все вместе зачастую намного(!) проще, чем понять, что делает километровая стена монолитного текста.

Цитата Сообщение от ValeryS Посмотреть сообщение
попытаюсь объяснить на пальцах
Мне вот что не понятно.

Допустим вот такое выражение:

C++
1
const auto r = x>0;
Принимает значение 1, либо 0.

Но что бы понять, что там будет точно, нужно же проверить условие.
То есть я хочу сказать: получается, что сравнение - это же тоже своего рода ветвление.

Компилятору жеж придется сгенерировать код, согласно которому значение будет выбрано либо 1, либо 0.

От if отличается вероятно простотой конструкции, которая не имеет штрафов для механизма предсказаний.
М?

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
приходится выгружать эту кучу команд и загружать из другой ветки
а это время, вот она и потеря производительности
Но он же не останавливает работу.
Он просто сбрасывает "ненужную ветку", и заново наполняет буфер.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,874
04.01.2015, 07:20
Цитата Сообщение от hoggy Посмотреть сообщение
Сложение именно, что двух булей.
Которое в принципе не логично.
вот именно
у булей не может быть сложения
посему складываются уже инты
Цитата Сообщение от hoggy Посмотреть сообщение
ринимает значение 1, либо 0.
Но что бы понять, что там будет точно, нужно же проверить условие.
То есть я хочу сказать: получается, что сравнение - это же тоже своего рода ветвление.
нет
сравнение это a==b а ветвление это if(?) т.е если истина то выплняем один код если ложь то другой
в ассемблере есть два типа команд
cmp сравнивает два регистра и выставляет флаги
и допустим jz(переход если выставлен флаг Zero), на самом деле их куча jz,jnz,ja,jb
т.е наша конструкция типа
C++
1
2
3
4
if(a==b)
  a=0;
else
  b=0;
может превратится во что то типа
Assembler
1
2
3
4
5
6
7
cmp eax,ebx
 jz m1;
   mov ebx,0
 jmp m2
m1:
   mov eax,0
m2:
на Си это выгладит примерно так
C++
1
2
3
4
5
6
7
8
bool flag=a==b;
if(flag)
 goto m1;
b=0;
 goto m2;
 m1:
  a=0;
m2:
так вот эти jz,jnz,ja,jb и страшны, процессор разогнался а ему стоп, разгружайся по другому пути поедем
Цитата Сообщение от hoggy Посмотреть сообщение
Но он же не останавливает работу.
получается, что останавливает, пока новых команд нет АЛУ простаивает
конечно есть модули предсказания, которые предсказывают какую ветку( if/else) грузить, но они бывают ошибаются
а процессоры которые имеют два конвеера ( if/else) насколько мне известно еще не появились
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
04.01.2015, 07:50
Цитата Сообщение от ValeryS Посмотреть сообщение
вот именно
у булей не может быть сложения
посему складываются уже инты
Если у булей не может быть сложения, тогда логичной была бы ошибка компиляции на такое сложение.
Неявное приведение к булю здесь - неожиданно, и не логично.

Цитата Сообщение от ValeryS Посмотреть сообщение
сравнение это a==b
Как вы узнаете, что a==b ?
Как в принципе можно узнать, что а равно б, если у вас нет конструкции if ?

Мой отец когда то показывал мне математические формулы вида:
x = f(a,b), где x будет равен либо а, либо б в зависимости от нужного условия.

то есть, можно было сделать так:

Code
1
goto( метка1, метка2, a, b );
если a больше b, результат получится метка1, иначе - метка2.

Но я точно не помню уже что там за математика такая была.
И думаю, что у процессоров есть моральные машинные ифы: условные переходы.

Чем они отличаются от обычных ифов - хз.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.01.2015, 12:16
Цитата Сообщение от hoggy Посмотреть сообщение
Как в принципе можно узнать, что а равно б, если у вас нет конструкции if ?
Хотя бы путем вычитания (если такая операция реализована для типов) a из b, если получили 0, то они равны.
Насчет различий ветвлений исполняемого кода и вычислений ValeryS вроде бы всё подробно объяснил. Но я попробую привести ещё такой пример, чтоб по теме раздела, т.е. на C++:
Как известно есть, как минимум, два варианта реализации ассоциативного контейнера. Это std::map и std::unordered_map (в простонародии hash). В первом поиск реализуется через цепочку ветвлений (те самые jz,jnz и пр.) и кол-во сравнений зависит от размера контейнера, а во втором путем вычисления хеш-функции (по сути, линейное выполнение кода), при этом время доступа к элементу не зависит от размера контейнера.
Цитата Сообщение от hoggy Посмотреть сообщение
у процессоров есть моральные машинные ифы: условные переходы.
Безусловно, т.к. даже при сложении двух чисел нужно учитывать перенос в старший разряд, если сумма не помещается в текущих. Но это не то ветвление из-за которого случаются ошибки предсказания переходов.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,874
04.01.2015, 12:22
Цитата Сообщение от hoggy Посмотреть сообщение
Как вы узнаете, что a==b ?
а вот так
C++
1
bool flag=a==b;
a сравнивается с b и результат записывается в flag если равны то true если не равны то false
Цитата Сообщение от hoggy Посмотреть сообщение
И думаю, что у процессоров есть моральные машинные ифы: условные переходы.
есть и я их показал, часть,
Цитата Сообщение от ValeryS Посмотреть сообщение
jz,jnz,ja,jb
у процессора есть флаги Zero(результат равен 0) Z, переполнения C, паритета P,переноса вспомогательного переноса.......
и в зависимости от состояния флагов срабатывает переход или нет
например jz перход по метке если выставлен флаг Z
а флаг Z раньше в результате других операций
например cmp команда сравнения,кастрированая sub(вычитание)
если операнды равны то в результате вычитания получится 0 , установится флаг Z
это так очень упрощено
Цитата Сообщение от hoggy Посмотреть сообщение
Как в принципе можно узнать, что а равно б, если у вас нет конструкции if ?
if срабатывает если в скобках true, если false идем на ветку else
а вот в скобках идет сравнение которое и выдает результат

кстати есть такая штучка,как даже не знаю как сказать
есть кусок кода который нужно выбросить, ну не так идет или пока не нужен чтобы выпятить проблему
можно его закомментировать, можно при помощи препроцессора условную компиляцию, а можно и так
C++
1
2
3
4
if(0)
{
a=5;
}
потом когда этот кусок понадобится просто пишешь if(1) и он опять на месте

или так
C++
1
2
3
4
5
6
7
8
if(0)
{
a=5;
}
else
{
a=10;
}
ставя 0 или 1 включаешь тот или иной кусок кода
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.01.2015, 12:29
По развитию кода и устранению копипасты предлагаю ещё добавить такую функцию:
C++
1
2
3
4
inline int shift(int x)
{
    return x<0 ? -1: cast(x);
}
Получим:
C++
1
2
3
4
5
6
7
8
void detected(const int x, const int y)
{
    const int xx = 1 + shift(x);
    const int yy = 1 - shift(y);
    
    cout<<"----------------\n";
    cout<<"detected: "<< msg[yy][xx] << "\n";
}
А учитывая простоту выражений для xx,yy можно (хотя и не обязательно) и вовсе от них избавиться:
C++
1
2
3
4
5
void detected(const int x, const int y)
{
    cout<<"----------------\n";
    cout<<"detected: "<< msg[1 - shift(y)][1 + shift(x)] << "\n";
}
Ну и преобразование в "булевский инт" имхо показательнее сделать так (без static_cast'ов):
C++
1
2
3
4
inline int cast(const int v)
{
    return v ? 1 : 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.01.2015, 12:29

Можно как-то оптимизировать этот код?
#include &lt;iostream&gt; using namespace std; int main() { unsigned int num, trueNum, a, howMany, endwrite, fail; fail = 0; ...

Как можно перевести этот код с паскаля в с++?
uses crt; const n=10; var a:array of integer; i,j,p,k:byte; begin clrscr;

Как можно перевести этот код с паскаля в с++?
program razbienie_mnozhestwa(input,output); var i,j,k,n:byte;wper:arrayof boolean; sled,pred,blok:arrayof byte; procedure...

На каком языке этот код и можно ли его переделать?
Добрый день Дамы и Господа Программисты. Вот тут мне дали код и попросили переделать под С++. Только,вроде бы сам этот код написал на С++....

Как этот код написать грамотно?
__int64 __fastcall api::LicCheckUpdate(api *this) { __int64 v1; // rdi@1 _BYTE *v2; // rsi@2 unsigned __int64 v3; // rax@2 ...


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
сукцессия 9. Математика подлости: как растения предали грибных друзей
anaschu 27.06.2026
Статья 2. Глобальная фосфорная война: эволюционно-экономические механизмы распределения биомов Земли Введение: Экологический рынок как игра с нулевой суммой Традиционная экология долгое время. . .
сукцессия 8. Как я спорил с ИИ, которые - агенты растений и ненавистники грибов!
anaschu 27.06.2026
Статья 1. Хроники грибного восстания: как Сократов диалог разрушил академические догмы ИИ Введение: Синдром «цифрового учебника» Современные большие языковые модели (LLM) обладают колоссальным. . .
Главный вопрос моделирования сукцессии
anaschu 27.06.2026
главный вопрос. Если эктомикориза лучше добывает недоступный фосфор. И ее масса максимальна из всех. А широколиственный лес тоже имеет самую крутую биомассу. То почему не возникло их симбиоза? Это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru