Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
paradox_1326
0 / 0 / 0
Регистрация: 17.12.2014
Сообщений: 111
#1

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

03.01.2015, 17:12. Просмотров 748. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2015, 17:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Можно ли написать этот код более компактно? (C++):

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

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

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

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

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

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

26
rikimaru2013
C++ Game Dev
2439 / 1133 / 240
Регистрация: 30.11.2013
Сообщений: 3,690
03.01.2015, 17:28 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
нет
1
maxillion
273 / 183 / 38
Регистрация: 25.12.2012
Сообщений: 616
03.01.2015, 17:47 #3
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
char* c[] = 
{
    "Tochka nahoditsa v nachale koordinat",
    "Tochka nahoditsa na osi Y kotoraya razdelaet 3-u i 4-uu chetverti",
    "Tochka nahoditsa na osi Y kotoraya razdelaet 1-uu i 2-uu chetverti",
    "Tochka nahoditsa na osi X kotoraya razdelaet 2-uu i 3-u chetverti",
    "Tochka v 3-ey chetverty ",
    "Tochka vo 2-oy chetverty ",
    "Tochka nahoditsa na osi X kotoraya razdelaet 1-uu i 4-uu chetverti ",
    "Tochka v 4-oy chetverty ",
    "Tochka nahoditsa v 1-oy chetverty "
};
 
int _tmain(int argc, _TCHAR* argv[])
{   
    int x, y, z;
    cout << "input x = ";   cin >> x;
    x= (x<0?1:x>0?2:0)*3; 
    cout << "input y = ";   cin >> y;
    y= (y<0?1:y>0?2:0);
    z=y+x;  
    cout << c[z] << '\n';
    return 0;
}
1
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
03.01.2015, 18:55 #4
подобное:
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
#include <iostream>
 
using namespace std;
 
int main()
{
    int x, y;
    cout << "input x = ";
    cin >> x;
    cout << "input y = ";
    cin >> y;
    int val [ 4 ] = { 3 , 2 , 4 , 1 } ;
    if (  x == 0 || y == 0 )
    {
        bool f_x = (x!=0) ;
        bool f_y = (y!=0) ;
        int f_xy = ( ( int(x>0) + (y>0) ) << f_x ) ;
        if ( x==0 && y == 0 )
            cout << "Tochka nahoditsa v nachale koordinat " << '\n' ;
        else
            cout << "Tochka nahoditsa na osi " << (f_x?"X":"Y") << " kotoraya razdelaet chetverti " << val[f_xy+(0 << f_y)] << " i " << val[f_xy+(1 << f_y)] << "\n" ;
    } else
        cout << "Tochka nahoditsa v chetverty " << val[int( (x>0) << 1 ) + (y>0)] << "\n" ;
}
1
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
03.01.2015, 19:26 #5
Croessmah, у ТС первая четверть особенная ("nahoditsa").
По-моему, этот код намного очевиднее выглядит в первоначальной интерпретации. Хотя попытка обобщения кода занятие, безусловно, полезное и интересное, наверное, для любого программиста. Но в данном случае, это имхо скорее спорт, чем реальная потребность в какой-то оптимизации и/или исключении копи-пасты.
Цитата Сообщение от maxillion Посмотреть сообщение
C++
1
char* c[]
Справедливости ради, замечу, что тип элементов массива должен быть const char*.
2
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
03.01.2015, 19:32 #6
Цитата Сообщение от Tulosba Посмотреть сообщение
Croessmah, у ТС первая четверть особенная ("nahoditsa").
Цитата Сообщение от Croessmah Посмотреть сообщение
подобное:
что не нравится?

Добавлено через 37 секунд
Цитата Сообщение от Tulosba Посмотреть сообщение
Но в данном случае, это имхо скорее спорт, чем реальная потребность в какой-то оптимизации и/или исключении копи-пасты.
ну так сугубо для интереса и писалось
1
maxillion
273 / 183 / 38
Регистрация: 25.12.2012
Сообщений: 616
03.01.2015, 19:44 #7
Ещё вот так можно
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
#define d(x,y)  ( ((x < 0 )*2 + (x < 0)^(y < 0))+1 )
 
int _tmain(int argc, _TCHAR* argv[])
{   
    int x, y, z;
    cout << "input x = ";   cin >> x;
    cout << "input y = ";   cin >> y;       
 
    if(x != 0 && y != 0)
    {
        cout << "Tochka nahoditsa v chetverty " << d(x,y) << "\n" ;
    }
    else if( x == 0 ^ y == 0 )
    {
        cout << "Tochka nahoditsa na osi " << (x>0?"Y":"X") << " kotoraya razdelaet chetverti ";
        if(x>0)
             cout << d(x,y+1) << " i " << d(x,y-1) << "\n" ;
        else
            cout << d(x+1,y) << " i " << d(x-1,y) << "\n" ;
    }
    else
    {
        cout << "Tochka nahoditsa v nachale koordinat \n";
    }
    return 0;
}
Правда мне больше нравится вариант ТС, потому что его легче понять
1
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
03.01.2015, 19:54 #8
maxillion, а в чем сакральный смысл использования побитового xor для булевских аргументов? Экономия символа вместо "!=" ?
0
rikimaru2013
03.01.2015, 20:18
  #9

Не по теме:


C++
1
2
3
4
5
6
7
8
9
10
11
int isTrue(int x)
{
    if (x == 0)
    {
        return 0;
    }
    else if (x != 0)
    {
        return 1;
    }
}
кого-то вы меня напоминаете - в попытках сделать код не читабельным, но короче)

0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
03.01.2015, 20:25 #10
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
кого-то вы меня напоминаете - в попытках сделать код не читабельным, но короче
где написано о читабельности?
можно ли написть этот код более компактно
1
ValeryS
Модератор
6705 / 5114 / 482
Регистрация: 14.02.2011
Сообщений: 17,182
03.01.2015, 20:32 #11
rikimaru2013,
Вот твоя же функция
C++
1
2
3
4
int isTrue(int x)
{
    return (int)(x != 0);
}
а вот она же с более логичным возвращаемым значением(логическое)

C++
1
2
3
4
bool isTrue(int x)
{
    return x != 0;
}
короче? Да Быстрее? да, нет ветвлений
не понятней? трудно сказать
вот еще более непонятная но делает тоже самое
C++
1
2
3
4
bool isTrue(int x)
{
    return !!x;
}
0
Croessmah
Ушел
Эксперт CЭксперт С++
13553 / 7704 / 872
Регистрация: 27.09.2012
Сообщений: 19,006
Записей в блоге: 3
Завершенные тесты: 1
03.01.2015, 20:33 #12
ValeryS, а еще преобразование bool в int даст такой же результат, но это просто пример, что нечитабельно )))
0
ValeryS
03.01.2015, 20:35
  #13

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
ValeryS, а еще преобразование bool в int даст такой же результат
а кто спорит
просто написал явное приведение, но можно и без него

0
hoggy
6690 / 2872 / 492
Регистрация: 15.11.2014
Сообщений: 6,461
Завершенные тесты: 1
03.01.2015, 21:04 #14
Как то так:

http://rextester.com/DGY9511

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
30
31
32
33
#include <iostream>
using namespace std;
 
 
const char* msg[3][3] = 
{
    "4 четверть"                              , "на оси ординат между 4й и 1й чертвертями"  ,  "1 чертверть"  ,
    "на оси абцисс между 4й и 3ю чертвертями" , "в начале координат"                        ,  " на оси абцисс между 1й и 2й чертвертями",
    "3 четверть"                              , "на оси ординат между 3й и 2й чертвертями"  ,  "2 четверть"  ,
};
 
 
void detected(const int x, const int y)
{
    const int xx = 1 + (x<0 ? -1: int(bool(x)));
    const int yy = 1 - (y<0 ? -1: int(bool(y)));
    
    cout<<"----------------\n";
    cout<<"detected: "<< msg[yy][xx] << "\n";
}
 
 
int main()
{
    detected(0,0);        // начало координат
    detected(10,10);      // 1-я чертверть
    detected(10,0);       // между 1-2 
    detected(10,-10);     // 2-я чертверть
    detected(0,-10);      // между 3-2 
    detected(-10,-10);    // 3-я чертверть
    detected(-10,0);      // между 4-3 
    detected(-10,10);     // 4-я чертверть
}
1
ValeryS
Модератор
6705 / 5114 / 482
Регистрация: 14.02.2011
Сообщений: 17,182
03.01.2015, 22:25 #15
вот реализация с if
не знаю как насчет короче, но быстрее точно

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
30
31
32
33
34
35
36
37
38
39
40
 if (x > 0)
{
      if( y > 0) // x>0&&y>0
          cout << "Tochka nahoditsa v 1-oy chetverty " << '\n';
      else
        {
        if( y < 0)  // x>0&&y<0 
          cout << "Tochka v 4-oy chetverty " << '\n';      
        else   //x>0 &&y==0
          cout << "Tochka nahoditsa na osi X kotoraya razdelaet 1-uu i 4-uu chetverti " << '\n';
  
        }
 } 
else
  {
     if (x < 0)
     {
         if( y>0) //x<0&&y>0
            cout << "Tochka vo 2-oy chetverty " << '\n';
    else 
        {
         if(y < 0) // x<0&&y<0
           cout << "Tochka v 3-ey chetverty " << '\n';  
        else //x<0&&y==0
           cout << "Tochka nahoditsa na osi X kotoraya razdelaet 2-uu i 3-u chetverti " << '\n';
        }
     }
     else  //x==0
     {
        if( y > 0) //x==0&&y>0
        cout << "Tochka nahoditsa na osi Y kotoraya razdelaet 1-uu i 2-uu chetverti " << '\n';
        else
        {
         if(y < 0)//x==0&&y<0
          cout << "Tochka nahoditsa na osi Y kotoraya razdelaet 3-u i 4-uu chetverti " << '\n';
        else //x==0&&y==0
            cout << "Tochka nahoditsa v nachale koordinat " << '\n';
        } 
     }     
}
в самом пиковом случае x==0 и y==0 пройдет 4 сравнения (два по x и два по y)
в отличии от оригинала где пройдет 9
0
03.01.2015, 22:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.01.2015, 22:25
Привет! Вот еще темы с ответами:

Как можно записать код в более компактном виде? - C++
Вывести столбиком след. числа 3,2, 3,2, 3,3, 3,3,........3,9 у меня вышло довольно размазан: #include &quot;iostream&quot; #include &quot;conio.h&quot; ...

код, который прекрасно выполняет Code::Blocks не выполняеться в Студии, как сделатьь так чтобы Студия воспринимала этот код?? - C++
Ребята, обьясните мне чего код, который прекрасно выполняет Code::Blocks не выполняеться в Студии, там требуються существенно другие...

Написать программу, которая вводит с клавиатуры строку не более 100 символов, еще одну строку не более 50 символов и выводит на экран позиции вхождени - C++
Задание: Написать программу, которая вводит с клавиатуры строку не более 100 символов, еще одну строку не более 50 символов и выводит на...

Как исправить этот код? - C++
Помогите исправить код. Знаю в чем проблема,но не знаю как решить. В книге дается схожий пример,и там все так же. Суть в том,что в классе...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru