Ëåêöèÿ 9


Çàäà÷à 1. Íàéòè ïëîùàäü è ïåðèìåòð ïåðåñå÷åíèÿ äâóõ ïðÿìîóãîëüíèêîâ, ñòîðîíû êîòîðûõ ïàðàëëåëüíû îñÿì êîîðäèíàò


Ïåðåñå÷åíèå — ìíîæåñòâî âñåõ òî÷åê, êîòîðûå ïðèíàäëåæàò îáîèì ïðÿìîóãîëüíèêàì

Òî÷êà x ïðèíàäëåæèò ïðÿìîóãîëüíèêó (x0, y0)*(x1,y1), åñëè x0<=x<=x1 è y0<=y<=y1.

Òî÷êà x ïðèíàäëåæèò ïåðåñå÷åíèþ ïðÿìîóãîëüíèêîâ (x0, y0)*(x1,y1) è (x2, y2)*(x3,y3), åñëè x0<=x<=x1, x2<=x<=x3, y0<=y<=y1 è y2<=y<=y3.


1) x >= x0 è x >= x2 <=> x >= max(x0,x2)

2) x <= x1 è x <= x3 <=> x <= min(x1,x3)

.



(max(x0,x2), max(y2,x2))*(min(x1,x3), min(y1,y3))




Çàäà÷à 2.  ôàéëàõ ina.txt è inb.txt çàäàíû äâà ìàññèâà âåùåñòâåííûõ ÷èñåë.

Ìàññèâ A “ìåíüøå» ìàññèâà B, åñëè â îòñîðòèðîâàííûõ ïî âîçðàñòàíèþ ìàññèâàõ A è B âñå A[i]<B[i].

 ñëó÷àå, åñëè îäèí ìàññèâ êîðî÷å äðóãîãî, òî îí äîïîëíÿåòñÿ ïîñëåäíèì ÷èñëîì (òî åñòü ìàêñèìàëüíûì, òàê êàê â îòñîðòèðîâàííîì ìàññèâå ìàêñèìàëüíûé — ýòî ïîñëåäíèé).

Îòâåò âûâåñòè â ôàéë output.txt â âèäå ñëîâ YES èëè NO.

Ïðîãðàììà âîçâðàùàåò -1, åñëè îäèí èç ôàéëîâ îòñóòñòâóåò èëè ïóñò.


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

int size(char *name);
void sort(double *array, int size);
int lt(double *ar1, int size1, double *ar2, int size2);

int main() {
FILE *INA = NULL, *INB = NULL, *OUT = NULL;
double *A, *B;
int sizeA, sizeB, i;
sizeA = size("ina.txt");
if (sizeA == -1) {
return -1;
}
sizeB = size("inb.txt");
if (sizeB == -1) {
return -1;
}
if ((sizeA <= 0) || (sizeB <= 0)) {
printf("File is empty\n");
return -1;
}
A = (double*)malloc(sizeA * sizeof(double));
if (A == NULL) {
printf("Memory not allocated\n");
return -1;
}
B = (double*)malloc(sizeB * sizeof(double));
if (B == NULL) {
free(A);
printf("Memory not allocated\n");
return -1;
}
INA = fopen("ina.txt", "r");
if (INA == NULL) {
printf("File ina.txt not opened\n");
return -1;
}
for (i = 0; i < sizeA; i++) {
if (fscanf(INA, "%lf", &A[i]) != 1) {
fclose(INA);
free(A);
free(B);
printf("Not enough numbers\n");
return -1;
}
}
fclose(INA);
INB = fopen("inb.txt", "r");
if (INB == NULL) {
printf("File inb.txt not opened\n");
return -1;
}
for (i = 0; i < sizeB; i++) {
if (fscanf(INB, "%lf", &B[i]) != 1) {
fclose(INB);
free(A);
free(B);
printf("Not enough numbers\n");
return -1;
}
}
fclose(INB);
sort(A, sizeA);
sort(B, sizeB);
OUT = fopen("output.txt", "w");
if (OUT == NULL) {
printf("File output.txt not opened\n");
return -1;
}
if (lt(A, sizeA, B, sizeB)) {
fprintf(OUT, "YES");
} else {
fprintf(OUT, "NO");
}
fclose(OUT);
free(A);
free(B);
return 0;
}

int size(char *name) {
double *x;
FILE *IN = NULL;
int res = 0;
IN = fopen(name, "r");
if (IN == NULL) {
printf("File %s not opened\n", name);
return -1;
}
while (fscanf(IN, "%lf", &x) == 1) {
++res;
}
fclose(IN);
return res;
}

void sort(double *ar, int size) {
int i, j;
double buf;
for (i = 0; i < size; i++) {
for (j = 0; j < size - 1; j++) {
if(ar[j] > ar[j+1]) {
buf = ar[j];
ar[j] = ar[j+1];
ar[j+1] = buf;
}
}
}
}

int lt(double *A, int sizeA, double *B, int sizeB) {
double a, b;
int i;
int len = sizeA;
if (sizeB > len)
len = sizeB;
for (i = 0; i < len; i++) {
if (i < sizeA)
a = A[i];
else
a = A[sizeA - 1];
if (i < sizeB)
b = B[i];
else
b = B[sizeB - 1];
if (a >= b)
return 0;
}

return 1;
}