Лекция 13.

Избранные задачи.


Задача 1. Определить, меньше ли массив A массива B (один массив меньше другого, если в отсортированных массивах все элементы А меньше соответствующих элементов B; более короткий массив дополняется до нужного размера своим максимальным элементом). Элементы массивов находятся в файлах ina.txt и inb.txt, их количество неизвестно. В файл output.txt записать “YES”/”NO”


Исходный текст, разработанный во время лекции


#include <stdio.h>

int func(double *a, int nA, double *b, int nB);

void sort(double *a, int n);

int main(void) {

FILE *INA, *INB, *OUT;

double *a, *b;

int nA = 0, nB = 0;

double x;

int i;

int res;

INA = fopen("ina.txt", "r");

if (INA == NULL) return -1;

while (fscanf(INA, "%lf", &x) == 1) ++nA;

fclose(INA);

INB = fopen("inb.txt", "r");

if (INB == NULL) return -1;

while (fscanf(INB, "%lf", &x) == 1) ++nB;

fclose(INB);

INA = fopen("ina.txt", "r");

if (INA == NULL) return -1;

if ((nA <= 0) || (nB <= 0)) return -1;

a = (double*)malloc(nA * sizeof(double));

if (a == NULL) return -1;

for (i = 0; i < nA; i++) {

if (fscanf(INA, "%lf", &a[i]) != 1) {

fclose(INA);

return -1;

}

}

fclose(INA);

INB= fopen("inb.txt", "r");

if (INB == NULL) return -1;

b = (double*)malloc(nB * sizeof(double));

if (b == NULL) return -1;

for (i = 0; i < nB; i++) {

if (fscanf(INB, "%lf", &b[i]) != 1) {

fclose(INB);

return -1;

}

}

sort(a, nA);

sort(b, nB);

res = func(a, nA, b, nB);

OUT = fopen("output.txt", "w");

if (OUT == NULL) return -1;

fprintf(OUT, "%s", res ? "YES" : "NO");

fclose(OUT);

return 0;

}

int func(double *a, int nA, double *b, int nB) {

double A, B;

int N = nA;

int i;

if (nB > N) N = nB;

for (i = 0; i < N; i++) {

A = (i < nA) ? a[i] : a[nA-1];

B = (i < nB) ? b[i] : b[nB-1];

if (A >= B)

return 0;

}

return 1;

}

void sort(double *a, int n) {

double buf;

int i, j;

for (i = 0; i < n; i++) {

for (j = 0; j < n-1; j++) {

if (a[j] > a[j+1]) {

buf = a[j];

a[j] = a[j+1];

a[j+1] = buf;

}

}

}

}