Помогите студенту

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Helen11
Сообщения: 31
Зарегистрирован: 21 сен 2013, 22:44

Я окончательно запуталась,помогите плиз разпутаться) Программа не законченная

С клавиатуры ввести последовательность структур, каждая из которых задает координаты двух противоположных (левой верхней и правой нижней) вершин прямоугольника, стороны которого параллельны осям координат. Распечатать введенные данные в виде таблицы, отсортировав их по возрастанию левой координаты x прямоугольника. Определить и указать прямоугольники с наибольшей и наименьшей площадью.

Код: Выделить всё

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

struct pryamoug
{
	int x;
	int y;

};
struct pryamoug A,B,C,D;

struct pryamoug p[8]={ {A.x,A.y},{B.x,B.y}, {C.x,C.y}, {D.x,D.y} };

int main (void)
{

	int sort (struct pryamoug p[8]);


		printf("Enter koord tochky A, D");
		scanf("%i %i %i %i",&A.x,&A.y,&D.x,&D.y);
		if(A.x>=D.x || A.y<=D.y)
		{
			printf("Nevirni dani, povtorit vvedennya");

		}

	B.x=D.x;
	B.y=A.y;
	C.x=A.x;
	C.y=D.y;

	sort(p[8]);
	return 0;

}
int sort(struct pryamoug p[8])
{
	int i,j,temp,n=7;
	for(i=0;i<n-1;i++)
	 for(j=i+1;j<n;j++)
	 if(p[i]>p[j])
	 {
		temp=p[i];
		p[i]=p[j];
		p[j]=temp;
	 }


}

void show(struct pryamoug p[8])
{
	int i;
	printf("\n\t===========================================\n");
	printf("\t |	A.x	|	A.y	|	B.x	|	B.y	|	C.x	|	C.y	|	 D.x	|	D.y");
	for(i=0;i<p[8];i++)
	{
		printf("\t|	%i	|	%i	|	%i 	|	%i	|	%i	|	%i	|	%i	|	%i	|	%i",
				  p[i]);
	}


}


Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Исправлять тут нечего, так как неправильно абсолютно всё. Структурам присваиваются числа, числам - структуры. Печатается вообще непонятно что. Единственное правильное решение: переписать всё полностью.

Прямоугольник задётся двумя точками, каждая точка имеет две координаты x и y. Именно отсюда нужно начинать:

Код: Выделить всё

struct Point // структура точка
{
   int x;
   int y;
};

struct Rectangle // структура прямоугольник
{
   Point lt; // left-top - левая верхняя точка
   Point rb; // right-bottom - правая нижняя точка
}

Rectangle rects[8]; // массив из 8 элементов типа прямоугольник
Далее читаем данные:

Код: Выделить всё

for (int i = 0; i < 8; ++i)
{
   printf("Enter coordinates of 2 rectangle's points:");
   scanf("%d %d %d %d", &rects[i].lt.x, &rects[i].lt.y, &rects[i].rb.x, &rects[i].rb.y);
}
Далее введённые данные нужно обработать, а именно отсортировать по x координате левой-верхней точки (то есть по lt.x), а также посчитать площади прямоугольников (напоминаю, площадь прямоугольника считается, как произведение длин его сторон).

Предлагаю дальше пробовать писать самостоятельно и задавать вопросы в этой теме, если что-то не получается.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Helen11
Сообщения: 31
Зарегистрирован: 21 сен 2013, 22:44

Вот исправила, все равно как-то не так работает

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
#define N 3
#include <conio.h>

typedef struct pr{
	double x1,y1,x2,y2,S;
}pr;

void show(pr *,int);
void MM(pr *,int);
void sort(pr *,int);

int max_i,min_i;

int main()
{
	clrscr();
	pr arr[N];
	int i;

	for(i=0;i<N;i++)
	{
		printf("Vvedit' koordunatu 1 tochky(-100 - exit):");
		scanf("%ld %ld",&arr[i].x1,&arr[i].y1);
		if(arr[i].x1 == -100 || arr[i].y1 == -100) break;
		else
		{
		printf("Vvedit' koordunatu 2 tochky(-100 - exit):");
		scanf("%ld %ld",&arr[i].x2,&arr[i].y2);
		if(arr[i].x2 == -100 || arr[i].y2 == -100) break;
		}
	  /*	if(arr[i].x1>=arr[i].x2 || arr[i].y1<=arr[i].y2)
		{
			printf("\nNe virni dani, povtorit' vvid:\n");
			i--;
		}         */
	}

	MM(arr,i);
	show(arr,i);

	printf("\n\tmax S = %lf; min S = %lf\n",arr[max_i].S,arr[min_i].S);

	sort(arr,i);
	show(arr,i);


	return 0;
}
void MM(pr *p,int s_count){
	int i;
	max_i = min_i = 0;
	 for(i=0;i<s_count;i++,p++){
		p->S = abs(p->x2 - p->x1) * abs(p->y2 - p->y1);
		if((p-i+max_i)->S < p->S)
		max_i = i;
		if((p-i+min_i)->S > p->S)
		min_i = i;
	}
}


void sort(pr *p,int s_count){
	int i,j;
	pr tmp;
	for(i=0;i<s_count;i++)
		for(j=i+1;j<s_count;j++)
			if((p+i)->x1<(p+j)->x1){
				tmp = *(p+i);
				*(p+i) = *(p+j);
				*(p+j) = tmp;
			}
}

void show(pr *p,int s_count){
	int i;
	printf("\n\t===================================================\n");
	printf("\t|   x1    |   y1    |    x2   |    y2   |    S    |\n");
	for(i=0;i<s_count;i++,p++){
		printf("\t|  %5.2lf  |  %5.2lf  |  %5.2lf  |  %5.2lf  |  %5.2lf  |\n"
				,p->x1,p->y1,p->x2,p->y2,p->S);
	}
	printf("\t===================================================\n");
}

Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

При вводе с клавиатуры координат используется модификатор форматирования %ld, что не верно. Следует использовать %lf. В выводе координат, кстати, всё правильно.

После исправления ошибки результаты работы программы:
$ ./test
Vvedit' koordunatu 1 tochky(-100 - exit):1 1
Vvedit' koordunatu 2 tochky(-100 - exit):6 6
Vvedit' koordunatu 1 tochky(-100 - exit):2 2
Vvedit' koordunatu 2 tochky(-100 - exit):5 5
Vvedit' koordunatu 1 tochky(-100 - exit):3 3
Vvedit' koordunatu 2 tochky(-100 - exit):4 4

===================================================
| x1 | y1 | x2 | y2 | S |
| 1.00 | 1.00 | 6.00 | 6.00 | 25.00 |
| 2.00 | 2.00 | 5.00 | 5.00 | 9.00 |
| 3.00 | 3.00 | 4.00 | 4.00 | 1.00 |
===================================================

max S = 25.000000; min S = 1.000000

===================================================
| x1 | y1 | x2 | y2 | S |
| 3.00 | 3.00 | 4.00 | 4.00 | 1.00 |
| 2.00 | 2.00 | 5.00 | 5.00 | 9.00 |
| 1.00 | 1.00 | 6.00 | 6.00 | 25.00 |
===================================================
Press any key to continue...
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Helen11
Сообщения: 31
Зарегистрирован: 21 сен 2013, 22:44

Точно)Спасибо за помощь!
Ответить