Как сделать эту программу на C? Часть 3.2-3.9 [закрыта]

Требуется ли несколько условий, как в нескольких операторах if else, чтобы прямоугольники пересечения печатались правильно?

Шаг 3: Два прямоугольника пересекаются, если у них есть общая площадь. Два прямоугольника не пересекаются, если они только касаются (общего края или общего угла)

Два прямоугольника пересекаются (как указано выше) тогда и только тогда, когда

i) max(xmin1, xmin2) ‹ min(xmax1, xmax2) и

ii) max(ymin1, ymin2) ‹ min(ymax1, ymax2)

Ваш вывод должен быть отформатирован. Как показано ниже, где прямоугольник показан как его нижние левые координаты (xmin, ymin) и координаты верхнего правого угла (xmax, ymax). Где координаты - это координаты в декартовой плоскости.

Пример вывода:

enter two rectangles: 

1 1 4 4

2 2 5 5

rectangle 1: (1,1)(4,4) 

rectangle 2: (2,2)(5,5) 

intersection rectangle: (2,2)(4,4)  

и

enter two rectangles: 

1 1 4 4

5 5 10 10

rectangle 1: (1,1)(4,4) 

rectangle 2: (5,5)(10,10) 

these two rectangles do not intersect 

Код:

#include <stdio.h>
#include <stdlib.h>

int readRect (int *w, int *x, int *y, int *z){
return scanf("%d%d%d%d",w,x,y,z);
}

int minInt(int x1, int x2){
return x1, x2;
}

int maxInt(int y1, int y2){
    return y1, y2;
}

int main (void){

int a,b,c,d,e,f,g,h;
printf(">>enter two rectangles:\n");

readRect(&a,&b,&c,&d);
readRect(&e,&f,&g,&h);
printf("rectangle 1:(%d,%d)(%d,%d)\n",a,b,c,d);
printf("rectangle 2:(%d,%d)(%d,%d)\n",e,f,g,h);

if(maxInt(a,e) < minInt(c,g) && maxInt(b,f) < minInt(d,g)){
        printf("intersection rectangle: (%d,%d)(%d,%d)\n",?,?,?,?);
}
else {
         printf("these rectangles do not intersect\n");
}

return EXIT_SUCCESS;
}

person Community    schedule 14.10.2013    source источник
comment
Покажите свой выходной формат?   -  person haccks    schedule 14.10.2013
comment
Разве вы не имели в виду int minInt(int x1, int x2){return x1‹x2;} и int maxInt(int y1, int y2){return y1›y2;}   -  person Jerry Jeremiah    schedule 14.10.2013
comment
@ДжерриДжеремия; Это вернет логическое значение. ОП хочет максимум или минимум двух чисел.   -  person haccks    schedule 14.10.2013
comment
Я думаю, что этот вопрос не должен быть закрыт. По крайней мере, ОП придумал его усилия. Кажется, что он не может реализовать свою логику, так как он новичок. Проголосовали за открытие.   -  person haccks    schedule 14.10.2013


Ответы (3)


Ваша функция для max и min неверна.
1. вы не сравниваете параметр, переданный внутри этих функций, для максимума/минимума двух.
2. Вы не можете вернуть два значения из функции.

Вы должны сделать так;

int minInt(int x1, int x2){
    if(x1 < x2)     
        return x1;
    else 
        return x2;
}

int maxInt(int x1, int x2){
    if(x1 > x2)     
        return x1;
    else 
        return x2;
} 

И измените свой printf, печатающий прямоугольник пересечения, на

printf("intersection rectangle: (%d,%d)(%d,%d)\n", maxInt(a,e), maxInt(b,f), minInt(c,g), minInt(d,h) );
person haccks    schedule 14.10.2013
comment
А для печати пересечения? Какими должны быть переменные? Я очень благодарен за вашу помощь. Я всего лишь начинающий программист, я никогда не начинал программировать в детстве, как многие из вас. Но люди просто продолжают голосовать за меня, конечно, мои вопросы связаны с заданиями, но я не использую людей в Интернете для выполнения своих заданий, они могут помочь мне учиться. - person user2805620; 14.10.2013
comment
На самом деле я смущен вашим вопросом и выводом, который вы показываете. В вашей программе вы вводите стороны прямоугольника, но ваш вопрос говорит о вершинах: As shown below where a rectangle is shown as its lower left coordinates (xmin, ymin) and top right corner coordinates (xmax, ymax). - person haccks; 14.10.2013
comment
Программа фактически предназначена для ввода нижней левой вершины и верхней правой вершины прямоугольника. Вот что такое координаты. Мне очень жаль за недоразумение. - person user2805620; 14.10.2013
comment
Я отредактировал свой ответ. Теперь он работает как шарм! - person haccks; 14.10.2013
comment
Да, это будет. Посмотрите на свою функцию minInt, которая должна быть int minInt(int x, int y){ if(x < y){ return x; }else{ return y; } }. Но вы возвращаете y для if и else для обоих! - person haccks; 14.10.2013
comment
Да, я сделал ошибку, извините за это. Является ли помещение цикла do while лучшим способом заставить его перейти в бесконечный цикл? - person user2805620; 14.10.2013
comment
Да. Вы можете поместить его в цикл do while или, лучше, в цикл while. - person haccks; 14.10.2013
comment
Спасибо за терпение ко мне, а также за всю вашу помощь, я очень ценю это. Неопытному программисту здесь действительно сложно получить помощь, некоторые люди просто не понимают, у других разные отправные точки, например, я познакомился с программированием всего месяц назад, и люди здесь ожидают, что я уже много знаю . Извините за разглагольствование. - person user2805620; 14.10.2013
comment
Неважно, что вы поздно начали программировать, но то, насколько вы преданы этому делу, имеет большое значение. Я начал программировать всего 4 месяца назад и сейчас отвечаю на некоторые основные вопросы по SO. Никогда не недооценивайте себя. Не беспокойтесь о резких комментариях окружающих вас людей. Продолжайте пытаться улучшить себя. И да будь уверен. - person haccks; 14.10.2013

шаг 1 - Виновником является "\n" в scanf. Если вы удалите это, это сработает. Дайте мне знать, если вам нужна конкретная помощь на шаге 2 или шаге 3.

person alunarbeach    schedule 14.10.2013
comment
Проголосовал: я хотел убрать \n из своего ответа. Сейчас отредактировал! - person Baldrick; 14.10.2013

Первым делом:

return scanf("%d%d%d%d\n",w,x,y,z);

должно быть

return scanf("%d %d %d %d",w,x,y,z);

Затем вы можете ввести свой список номеров в виде списка, разделенного пробелами, и он будет правильно их сканировать.

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

person Baldrick    schedule 14.10.2013