Определить площадь каждого прямоугольника - C (СИ)
Формулировка задачи:
Задать файл, содержащий координаты левого верхнего и нижнего правого угла прямоугольника – целые числа типа int. Определить площадь каждого прямоугольника, упорядочить эти значения по возрастанию и записать в файл.
Нужно решит задачу на C
вот код, но у меня не работает цикл (не выдает "неверное условие"), там a--x1, b--y1, c--x2, d--y2
и еще вопрос: как записать в файл площади???
t - это буферная переменная, zap1 - для упорядоченных площадей
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
struct koord{
int a;
int b;
int c;
int d;
} zap[40], zap1[40],t;
FILE *Fzap;
void main(void)
{ int i,j,a,b,c,d,S,size=sizeof(koord),N, nn=0;
clrscr();
Fzap=fopen("d:\\koord.dat","wb");
puts("Vvedi kol-vo pramoygolnikov ");
fflush(stdin);
scanf("%d",&N);
printf(" n=%d\n",N);
for (j=0; j<N; j++)
{ puts("vvedi a ");
fflush(stdin);
scanf("%d",&zap[j].a);
puts("vvedi b");
fflush(stdin);
scanf("%d",&zap[j].b);
puts("vvedi c");
fflush(stdin);
scanf("%d",&zap[j].c);
puts("vvedi d");
fflush(stdin);
scanf("%d",&zap[j].d);
fwrite(&zap[j], size, 1, Fzap); //5
}
{
if ((c>a) && (d<b)) S=fabs((c-a)*(b-d)); //проверка координат (явл-тся ли прямоугольником)
else puts("\n nevernoe yslovie");
}
puts("\ninfo");
for (j=0; j<N; j++)
{
printf("%3d %3d %3d %3d \n",zap[j].a, zap[j].b,zap[j].c,zap[j].d);
}
fclose(Fzap);
getch();
}Решение задачи: «Определить площадь каждого прямоугольника»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <locale.h>
#define MAX_ZAPS 100
#define FILE_NAME "d:\\koord.txt"
typedef struct koord {
int x1; int y1; // координаты левой верхней точки
int x2; int y2; // координаты нижней правой точки
int S; // площадь
};
int main(int argc, char ** argv)
{
FILE *Fzap;
struct koord zap[MAX_ZAPS];
struct koord *z = zap; // используем этот указатель вместо индекса
int size = sizeof(struct koord), j, N;
// чистим экран
system("cls");
setlocale(LC_ALL, "Russian");
// вводим кол-во
printf("Введите кол-во прямоугольников: ");
if (!scanf("%d", &N)) { fflush(stdin); N = 10; }
if (N >= MAX_ZAPS || N < 1) N = MAX_ZAPS;
// вводим данные в файл
Fzap = fopen(FILE_NAME, "wb");
j = 0;
for (;;)
{
printf("прямоугольник №%d\n", j + 1);
printf("x(1): "); scanf("%d", &z->x1);
printf("y(1): "); scanf("%d", &z->y1);
printf("x(2): "); scanf("%d", &z->x2);
printf("y(2): "); scanf("%d", &z->y2);
if ((z->x2 > z->x1) && (z->y2 < z->y1))
{
// пишем в файл
z->S = fabs((z->x2 - z->x1) * (z->y1 - z->y2));
fwrite(z, size, 1, Fzap);
++z;
if (++j == N) break;
}
else
printf("\n неверное условие\n");
}
fclose(Fzap);
// выводим координаты из файла из файла
Fzap = fopen(FILE_NAME,"rb");
if (!Fzap) { printf("немогу открыть файл :(\n"); return 1; }
// читаем из файла
fread(&zap, size, N, Fzap);
z = zap;
// выводим на консоль каждую запись
for (j = 0; j < N; ++j)
{
printf("(%d;%d) (%d;%d) %d\n", z->x1, z->y1, z->x2, z->y2, z->S);
++z;
}
fclose(Fzap);
// ждем когда пользователь нажмет кнопку
system("pause");
return 0;
}
Объяснение кода листинга программы
- Подключаем необходимые библиотеки
- Определяем структуру koord для хранения координат прямоугольников и их площади
- Устанавливаем размерность структуры koord
- Инициализируем переменные для ввода и вывода данных
- Запрашиваем у пользователя количество прямоугольников
- Проверяем корректность ввода и, при необходимости, устанавливаем значение по умолчанию
- Открываем файл для записи данных
- Организуем цикл для ввода данных о каждом прямоугольнике
- Проверяем условие для прямоугольника (разница между x2 и x1 положительна, а разница между y2 и y1 отрицательна)
- Если условие выполняется, то записываем данные в файл и переходим к следующему прямоугольнику
- Если условие не выполняется, то выводим сообщение об ошибке и прерываем цикл
- Закрываем файл
- Открываем файл для чтения данных
- Проверяем, удалось ли открыть файл
- Если файл успешно открыт, то читаем данные из файла
- Выводим данные на консоль
- Закрываем файл
- Ждем нажатия кнопки пользователем
- Завершаем программу