Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2011, 22:00   #1
forses2901
Новичок
Джуниор
 
Регистрация: 25.09.2011
Сообщений: 2
По умолчанию упростить код на С++

прошу подсказать мне, как можно упростить код программы.

нужно ввести координаты 3х королев и проверить кто кому угрожает на шахматной доске.

вот собственно сама программа :


Код:
int main() {
    int x1,x2,x3;
    int y1,y2,y3;
        printf("enter coordinate (x,y) of the 1st queen:\t");
        scanf("%d %d",&x1,&y1);
        printf("enter coordinate (x,y) of the 2nd queen:\t");
        scanf("%d %d",&x2,&y2);
        printf("enter coordinate (x,y) of the 3rd queen:\t");
        scanf("%d %d",&x3,&y3);       
            if ((x1==x2)&&(x2==x3)) { //проверяем находятся ли ферзи на одной горизонтали
                                    if (y1>y2){
                                                if(y2>y3) printf("1-2 & 2-3");
                                                else {if(y1>y3) printf("1-3 & 3-2");
                                                      else printf("2-1 & 1-3");
                                                      }
                                     }
                                     else {if (y1>y3) printf("2-1 & 1-3");
                                          else {if(y2>y3)  printf("1-3 & 3-2");
                                                else printf("1-2 & 2-3");//если да, то находим ферзя по середине и выводим кто кому угрожает
                                                }  
                                            }            
                                      }
                                      
              else { if (((abs(x1-x2)==abs(y1-y2))&&(abs(x2-x3)==abs(y2-y3))&&(abs(x1-x3)==abs(y1-y3)))||(y1==y2)&&(y2==y3)) {//иначе проверяем нахоятся ли на одной веритикали иди диагонали
                                                                             if (x1>x2){
                                                                                        if(x2>x3) printf("1-2 & 2-3");
                                                                                        else {if(x1>x3) printf("1-3 & 3-2");
                                                                                              else printf("2-1 & 1-3");
                                                                                              }
                                                                                         }
                                                                             else {if (x1>x3) printf("2-1 & 1-3");
                                                                                   else {if(x2>x3)  printf("1-3 & 3-2");
                                                                                          else printf("1-2 & 2-3");//аналогично с горизонталью
                                                                                         }
                                                                                   }
                                                                                                              }
                                                                                   
                            else { if ((x1==x2)||(y1==y2)||(abs(x1-x2)==abs(y1-y2))||(x2==x3)||(y2==y3)||(abs(x2-x3)==abs(y2-y3))||(x1==x3)||(y1==y3)||(abs(x1-x3)==abs(y1-y3)))
                            { //иначе проверяем лежат ли 2 ферзя на одной прямой
                                   if ((x1==x2)||(y1==y2)||(abs(x1-x2)==abs(y1-y2))) printf ("1-2\t");
                                   if ((x2==x3)||(y2==y3)||(abs(x2-x3)==abs(y2-y3))) printf ("2-3\t");
                                   if ((x1==x3)||(y1==y3)||(abs(x1-x3)==abs(y1-y3))) printf ("1-3\t");//если да, то выводи кто кому угрожает
                                               } else printf("queens do not threaten each other");//иначе выводим, что угрожающих ферзей нет
                                               
                                        
                                  }
                }
    
    getch();
}

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

Последний раз редактировалось Stilet; 26.09.2011 в 08:13.
forses2901 вне форума Ответить с цитированием
Старый 26.09.2011, 01:42   #2
AnKor94
Пользователь
 
Регистрация: 24.11.2009
Сообщений: 54
По умолчанию

Сразу падает взгляд на вот это

Код:
int x1,x2,x3;
int y1,y2,y3;

printf("enter coordinate (x,y) of the 1st queen:\t");
scanf("%d %d",&x1,&y1);
printf("enter coordinate (x,y) of the 2nd queen:\t");
scanf("%d %d",&x2,&y2);
printf("enter coordinate (x,y) of the 3rd queen:\t");
scanf("%d %d",&x3,&y3);
Всяко было бы рациональнее сделать вот так:

Код:
int x[3];
int y[3];

printf("enter coordinate (x,y) of the "+i+"rd queen:\t");
scanf("%d %d",&x[3],&y[3]);
[/CODE]
141.116.168.135 : damiu2d449028.dami.army.pentagon.mi l (.MIL | US Military)
AnKor94 вне форума Ответить с цитированием
Старый 26.09.2011, 07:38   #3
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

надо вынести проверку того, бьет ли ферзь некоторое поле в отдельную функцию и вызвать ее 6 раз - [3! = 6](хотя т.к. все фигуры одинаковые - то достаточно только 3 раза[половина вызовов ненужна])
rrrFer вне форума Ответить с цитированием
Старый 26.09.2011, 07:44   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

проверку вертикалей и диагоналей можно сделать как то так:
Код:
bool checkQueenTo(int ii,int jj){
	int i,j;
	for(i=0;i<n;i++)
		if((i!=ii&&t[i][jj].type==1)||(i!=jj&&t[ii][i].type==1))
			return 0;
return 1;
}
тут n - размер поля, t - поле, t[][].type - тип клетки поля(1 если клетка занята, 0 - свободна)
ИМХО было бы удобно в вашем случае в место типа подставлять номер ферзя

Еще, у вас в программе не проверяются диагонали, т.е. не ферзь а ладья у вас ? ))
rrrFer вне форума Ответить с цитированием
Старый 26.09.2011, 17:20   #5
forses2901
Новичок
Джуниор
 
Регистрация: 25.09.2011
Сообщений: 2
По умолчанию

диагонали проверяются, во втором условии

вот тут :

else { if (((abs(x1-x2)==abs(y1-y2))&&(abs(x2-x3)==abs(y2-y3))&&(abs(x1-x3)==abs(y1-y3)))||(y1==y2)&&(y2==y3))


спасибо всем, всё работает, работу приняли =)
forses2901 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Упростить код Shouldercannon Общие вопросы Delphi 7 20.10.2010 17:01
Упростить код (Паскаль) crocodile Помощь студентам 2 26.01.2010 22:22
помогите упростить код serafim09 Microsoft Office Excel 9 14.10.2009 15:01
Помогите упростить код Ralf_ru Помощь студентам 7 01.04.2009 17:17