Написал две задачи к Автотесту

This commit is contained in:
AZEN-SGG 2024-12-11 18:04:54 +03:00
parent b4cb5098c2
commit 19e0da8dc6
9 changed files with 295 additions and 1 deletions

5
.gitignore vendored
View file

@ -2,4 +2,7 @@
*.exe
*~
*.out
.*.sw*
.*.sw*
*.zip
*.rar
*output*

1
Session/1Ex/ina.txt Normal file
View file

@ -0,0 +1 @@
1 2 3 4 5 6 7

1
Session/1Ex/inb.txt Normal file
View file

@ -0,0 +1 @@
2 3 4 6 7

117
Session/1Ex/main.c Normal file
View file

@ -0,0 +1,117 @@
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef struct {
double * arr;
int len;
} arr;
#define exp 1.e-6
FILE * getFile(const char * name);
arr getArray(FILE * file);
bool compare(arr first, arr second);
int max(int f, int s);
int min(int f, int s);
int write(const char * str);
FILE * getFile(const char * name) {
FILE * file = fopen(name, "r");
return file;
}
arr getArray(FILE * file) {
int size = 2, len = 0;
double * array = (double *)malloc(size * sizeof(double));
double current;
if (fscanf(file, "%lf", &current) != 1) return (arr){NULL, -1};
do {
if (++len > size) {
size *= 2;
array = (double *)realloc(array, size * sizeof(double));
}
array[len - 1] = current;
} while (fscanf(file, "%lf", &current) == 1);
return (arr){array, len};
}
bool compare(arr first, arr second) {
int len = min(first.len, second.len);
double maximf = 0, maxims = 0;
for (int i = 0; i < len; ++i) {
if (first.arr[i] - second.arr[i] > -exp) return false;
maximf = max(maximf, first.arr[i]);
maxims = max(maxims, second.arr[i]);
}
if (first.len > second.len) {
for (int i = len; i < first.len; ++i) {
if (first.arr[i] - maxims > -exp) return false;
}
} else {
for (int i = len; i < second.len; ++i) {
if (maximf - second.arr[i] > -exp) return false;
}
}
return true;
}
int min(int f, int s) {
if (f > s) return s;
return f;
}
int max(int f, int s) {
if (f < s) return s;
return f;
}
int write(const char * str) {
FILE * file = fopen("output.txt", "w");
if (file == NULL) return -1;
if (fprintf(file, "%s", str) < 1) {
fclose(file);
return -1;
}
if (fclose(file) != 0) return -1;
return 0;
}
int main(void) {
arr arr1, arr2;
FILE * file;
bool answer;
file = getFile("ina.txt");
if (file == NULL) return -1;
arr1 = getArray(file);
if (fclose(file) != 0) return -1;
if (arr1.arr == NULL) return -1;
file = getFile("inb.txt");
if (file == NULL) return -1;
arr2 = getArray(file);
if (fclose(file) != 0) return -1;
if (arr2.arr == NULL) return -1;
answer = compare(arr1, arr2);
if (answer) return write("YES");
else return write("NO");
}

37
Session/1Ex/makefile Normal file
View file

@ -0,0 +1,37 @@
CFLAGS = -mfpmath=sse \
-fstack-protector-all \
-W \
-Wall \
-Wextra \
-Wunused \
-Wcast-align \
-Werror \
-pedantic \
-pedantic-errors \
-Wfloat-equal \
-Wpointer-arith \
-Wformat-security \
-Wmissing-format-attribute \
-Wformat=1 \
-Wwrite-strings \
-Wcast-align \
-Wno-long-long \
-std=gnu99 \
-Wstrict-prototypes \
-Wmissing-prototypes \
-Wmissing-declarations \
-Wold-style-definition \
-Wdeclaration-after-statement \
-Wbad-function-cast \
-Wnested-externs \
-O2 \
-D_DEBUG -g \
-c
all: main.o
gcc main.o -lssp && del *.o
a.exe
main.o: main.c
gcc $(CFLAGS) main.c

1
Session/2Ex/ina.txt Normal file
View file

@ -0,0 +1 @@
1 2 3 4 5

1
Session/2Ex/inb.txt Normal file
View file

@ -0,0 +1 @@
1 2 3 5 6

96
Session/2Ex/main.c Normal file
View file

@ -0,0 +1,96 @@
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#define exp 1.e-6
typedef struct {
double * arr;
int len;
} array;
int min(int f, int s);
FILE * getFile(const char * name);
array getArray(FILE * file);
bool compare(array first, array second);
int write(const char * str);
int min(int f, int s) {
if (f > s) return s;
return f;
}
FILE * getFile(const char * name) {
FILE * file = fopen(name, "r");
return file;
}
array getArray(FILE * file) {
int size = 2, len = 0;
double * arr = (double *)malloc(size * sizeof(double));
double current;
if (fscanf(file, "%lf", &current) != 1) return (array){NULL, -1};
do {
if (++len > size) {
size *= 2;
arr = (double *)realloc(arr, size * sizeof(double));
}
arr[len - 1] = current;
} while (fscanf(file, "%lf", &current) == 1);
return (array){arr, len};
}
bool compare(array first, array second) {
int count = 0;
for (int i = 0; i < min(first.len, second.len); ++i) {
if (first.arr[i] - second.arr[i] > -exp) --count;
else ++count;
}
if (count > 0) return true;
else return false;
}
int write(const char * str) {
FILE * file = fopen("output.txt", "w");
if (file == NULL) return -1;
if (fprintf(file, "%s", str) < 1) {
fclose(file);
return -1;
}
if (fclose(file) != 0) return -1;
return 0;
}
int main(void) {
array arr1, arr2;
FILE * file;
bool answer;
file = getFile("ina.txt");
if (file == NULL) return -1;
arr1 = getArray(file);
if (fclose(file) != 0) return -1;
if (arr1.arr == NULL) return -1;
file = getFile("inb.txt");
if (file == NULL) return -1;
arr2 = getArray(file);
if (fclose(file) != 0) return -1;
if (arr2.arr == NULL) return -1;
answer = compare(arr1, arr2);
if (answer) return write("YES");
else return write("NO");
}

37
Session/2Ex/makefile Normal file
View file

@ -0,0 +1,37 @@
CFLAGS = -mfpmath=sse \
-fstack-protector-all \
-W \
-Wall \
-Wextra \
-Wunused \
-Wcast-align \
-Werror \
-pedantic \
-pedantic-errors \
-Wfloat-equal \
-Wpointer-arith \
-Wformat-security \
-Wmissing-format-attribute \
-Wformat=1 \
-Wwrite-strings \
-Wcast-align \
-Wno-long-long \
-std=gnu99 \
-Wstrict-prototypes \
-Wmissing-prototypes \
-Wmissing-declarations \
-Wold-style-definition \
-Wdeclaration-after-statement \
-Wbad-function-cast \
-Wnested-externs \
-O2 \
-D_DEBUG -g \
-c
all: main.o
gcc main.o -lssp && del *.o
a.exe
main.o: main.c
gcc $(CFLAGS) main.c