Починил, понял, что неверно работает функция

This commit is contained in:
AZEN-SGG 2024-12-21 01:05:32 +03:00
parent 610ed3990a
commit c14c8ef9c2
4 changed files with 64 additions and 70 deletions

View file

@ -14,7 +14,7 @@ circle MEC(point * I, int ilen, point * N, int nlen) {
} }
bool belongs(circle crcl, point p) { bool belongs(circle crcl, point p) {
if (powd(p.x - crcl.center.x) + powd(p.y - crcl.center.y) - powd(crcl.radius) <= exp) return true; if (powd(p.x - crcl.center.x) + powd(p.y - crcl.center.y) <= exp + powd(crcl.radius)) return true;
return false; return false;
} }

View file

@ -3,30 +3,24 @@
#include "hope.h" #include "hope.h"
int main(void) { int main(void) {
points * pts; points pts;
point N[3]; point N[3];
circle crcl; circle crcl;
pts = getPoints(file); pts = getPoints();
if (pts == NULL) return -1; if (pts.array == NULL) return -1;
/* printPoints(pts);
printf("\nPoints:\n");
for (int i = 0; i < ps.length; ++i) printf("(%.2lf, %.2lf) ", ps.array[i].x, ps.array[i].y);
printf("\n\n");
*/
printPoints(*pts);
printf("\nFast algorithm:\n"); printf("\nFast algorithm:\n");
crcl = MEC(ps->array, ps->length, N, 0); crcl = MEC(pts.array, pts.length, N, 0);
printCircle(crcl); printCircle(crcl);
printf("\nReliable algorithm:\n"); printf("\nReliable algorithm:\n");
crcl = hope(ps->array, ps->length); crcl = hope(pts.array, pts.length);
printCircle(crcl); printCircle(crcl);
free(ps->array); free(pts.array);
return 0; return 0;
} }

View file

@ -1,5 +1,36 @@
#include "tools.h" #include "tools.h"
points getPoints(void) {
int fileOrRandom;
printf("0 - if points from file\n1 - if random generation of points\nYour choice: ");
if (scanf("%d", &fileOrRandom) < 1) {
printf("Enter error!\n");
return (points){NULL, 0};
}
if (fileOrRandom == 0) {
return getPointsFromFile();
} else if (fileOrRandom == 1) {
return getRandomPoints();
} else {
printf("Wrong enter!\n");
return (points){NULL, 0};
}
}
points getPointsFromFile(void) {
FILE * file = getFile();
points pts = (points){NULL, 0};
if (file == NULL) return (points){NULL, 0};
pts = getFilePoints(file);
fclose(file);
return pts;
}
FILE * getFile(void) { FILE * getFile(void) {
char filename[50]; char filename[50];
@ -18,7 +49,7 @@ FILE * getFile(void) {
} }
} }
points * getFilePoints(FILE * file) { points getFilePoints(FILE * file) {
int i, size = 2; int i, size = 2;
point * array = NULL; point * array = NULL;
point p; point p;
@ -26,7 +57,7 @@ points * getFilePoints(FILE * file) {
if (fscanf(file, "%lf", &current) != 1) { if (fscanf(file, "%lf", &current) != 1) {
printf("File is empty!\n"); printf("File is empty!\n");
return NULL; return (points){NULL, 0};
} }
array = (point *)malloc(size * sizeof(point)); array = (point *)malloc(size * sizeof(point));
@ -36,7 +67,7 @@ points * getFilePoints(FILE * file) {
if (++i / 2 >= size) { if (++i / 2 >= size) {
size *= 2; size *= 2;
array = (point *)realloc(array, size * sizeof(point)); array = (point *)realloc(array, size * sizeof(point));
if (array == NULL) return NULL; if (array == NULL) return (points){NULL, 0};
} }
if (i % 2 == 1) { if (i % 2 == 1) {
@ -48,72 +79,40 @@ points * getFilePoints(FILE * file) {
if (i == 0) { if (i == 0) {
printf("Array is empty!\n"); printf("Array is empty!\n");
free(array); free(array);
return NULL return (points){NULL, 0};
} }
return &(points){array, (i + 1) / 2}; return (points){array, (i + 1) / 2};
} }
points * GetPointsFromFile(void) { points getRandomPoints(void) {
FILE * file = getFile(); points pts = (points){.array=NULL, .length=0};
points * pts = NULL;
if (file == NULL) return NULL;
getFilePoints(file)
fclose(file);
return pts;
}
points * getRandomPoints(void) {
points * pts = &(points){.array=NULL, .length=0};
int length; int length;
printf("Enter the number of points: "); printf("Enter the number of points: ");
if (scanf("%d", &length) < 1) return NULL; if (scanf("%d", &length) < 1) return pts;
pts->length = length; pts.length = length;
pts->array = (point *)malloc(length * sizeof(point)); pts.array = (point *)malloc(length * sizeof(point));
if (pts->array == NULL) return NULL; if (pts.array == NULL) return pts;
generate(pts); generatePoints(&pts);
return pts return pts;
} }
points * getPoints(void) { void generatePoints(points * pts) {
int fileOrRandom; srand(time(NULL));
printf("0 - if points from file\n1 - if random generation of points\nYour choice: "); for (int i = 0; i < pts->length; i++) {
(pts->array[i]).x = (rand() % (2*MAX_RAND_COORD + 1) - MAX_RAND_COORD) * RAND_MULTIPLIER;
if (scanf("%d", &fileOrRandom) < 1) { (pts->array[i]).y = (rand() % (2*MAX_RAND_COORD + 1) - MAX_RAND_COORD) * RAND_MULTIPLIER;
printf("Wrong enter!\n");
return NULL;
}
if (fileOrRandom == 0) {
return getPointsFromFile();
} else (fileOrRandom == 1) {
return getRandomPoints();
} else {
printf("Wrong enter!\n");
return NULL;
} }
} }
void printPoints(points pts) { void printPoints(points pts) {
for (int i = 0; i < ((MAX_PRINT_POINTS < pts.length) ? MAX_PRINT_POINTS : pts.length); ++i) { for (int i = 0; i < ((MAX_PRINT_POINTS < pts.length) ? MAX_PRINT_POINTS : pts.length); ++i) {
printf("%c = (%.4lf, %.4lf)\n", i + ASCII_FIRST_LETTER, pts.array[i].x, pts.array[i].y); printf("%c = (%.4lf, %.4lf)\n", i + ASCII_FIRST_LETTER, pts.array[i].x, pts.array[i].y);
} }
} }
void generate(points * pts)
{
srand(time(NULL));
for (int i = 0; pts->length; i++)
{
(pts->array[i]).x = (rand() % (2*MAX_RAND_COORD + 1) - MAX_RAND_COORD) * RAND_MULTIPLIER;
(pts->array[i]).y = (rand() % (2*MAX_RAND_COORD + 1) - MAX_RAND_COORD) * RAND_MULTIPLIER;
}
}

View file

@ -3,6 +3,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <time.h>
#include "types.h" #include "types.h"
#define ASCII_FIRST_LETTER 65 #define ASCII_FIRST_LETTER 65
@ -10,12 +11,12 @@
#define MAX_RAND_COORD 10000 #define MAX_RAND_COORD 10000
#define RAND_MULTIPLIER 1.e-2 #define RAND_MULTIPLIER 1.e-2
points getPoints(void);
points getPointsFromFile(void);
FILE * getFile(void); FILE * getFile(void);
points * getFilePoints(FILE * file) points getFilePoints(FILE * file);
points * GetPointsFromFile(void); points getRandomPoints(void);
points * getRandomPoints(void); void generatePoints(points * pts);
points * getPoints(void);
void printPoints(points pts); void printPoints(points pts);
void generate(points * pts);
#endif #endif