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

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

03.01.2015, 17:12. Показов 1872. Ответов 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
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
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
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
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
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
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
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru