I have a problem. I'm trying to write a program to take user-input data points (as one would have on a standard Cartesian graph ... you know, (x, y) etc.), a user-input number of sides (n), a user-input average side length (d), and a user-input margin of error (e), and have the program return the number of unique (or even non-unique... I'm not picky) polygons withnsides of lengthd+/-e.

So far, the program correctly sorts out all the pairs of points whose distance is withind+/-e, and stores the names of those points (A,B, etc.) to the two-dimensional arraysegment. Thus, if the distanceABwas in the range ofd+/-e, thensegment[0][0] = 'A' andsegment[0][1] = 'B'.

What the programdoesn'tdo correctly is to cycle through all the segments insegmentand pick ends that match. When it's done cycling through all possibilities, it should list all the possible "polygons" whosensides are each lengthd+/-e... except that what itactuallydoes is print off a subset of the segments that meet the "segment" criteria and then cheerfully exclaim that there aren't any polygons that are formed from those segments.

What am I doing wrong? Can anyone help me so that I don't have to write if/then statements for everyn? Thanks!

Code:#include <stdio.h> #include <conio.h> #include <math.h> float distance(int* x, int* y, int i, int j); main(){ int number_of_points, number_of_sides; int i,j,k,t; float avg_side_length, variation; printf("How many points are to be considered?: "); scanf("%d", &number_of_points); while (number_of_points < 4){ printf("\nCannot generate polygons with the number of points given.\n\n"); printf("How many points are to be considered?: "); scanf("%d", &number_of_points); } printf("How many sides should each polygon have?: "); scanf("%d", &number_of_sides); while ((number_of_sides < 2) || (number_of_sides > number_of_points)){ printf("\nCannot generate polygons with %d sides.\n\n", number_of_sides); printf("How many sides should each polygon have?: "); scanf("%d", &number_of_sides); } printf("What is the length of an average side?: "); scanf("%f", &avg_side_length); printf("How much variation (in terms of percent) are allowed?: "); scanf("%f", &variation); float var = (variation/100.0); int x[number_of_points]; int y[number_of_points]; char index[number_of_points]; float segment_length; int segments_printed = 0; int polygons_printed = 0; char segment[(number_of_points*(number_of_points-1)*2)][3]; char polygon[number_of_sides+1]; for (i=0; i<number_of_sides; i++){ polygon[i] = ' '; } polygon[number_of_sides] = '\0'; for (i=0; i<number_of_points; i++){ if (i < 26) index[i] = (i + 65); else if ( (26 <= i) && (i < 52) ) index[i] = (i + 71); else if ( (52 <= i) && (i < 67) ) index[i] = (i + 172); else if ( (67 <= i) && (i < 71) ) index[i] = (i - 32); else if ( (71 <= i) && (i < 81) ) index[i] = (i - 23); else if ( (i == 81) ) index[i] = 64; else index[i] = (i + 46); } printf("\n\nFor each point, list the x- and y-coordiates as an ordered pair.\n[Ex., A(x,y): 2,4 ]\n"); for (i=0; i<number_of_points; i++){ printf("%c(x,y): ", index[i]); scanf("%d,%d", &x[i], &y[i]); } printf("\n\n"); printf("SEGMENTS\n========\n"); for (i=0; i<number_of_points; i++){ for (j=(i+1); j<number_of_points; j++){ segment_length = distance(x, y, i, j); if ( ((1.00 - var)*(avg_side_length) <= segment_length) && (segment_length <= (1.00 + var)*(avg_side_length)) ){ segment[segments_printed][0] = index[i]; segment[segments_printed][1] = index[j]; segment[segments_printed][2] = '\0'; segments_printed++; } } } if (segments_printed == 0){ printf("No segments found within %d percent.\n", variation); } int i_bin, j_bin; for (i=0; i<segments_printed; i++){ for (i_bin=0; i_bin<2; i_bin++){ polygon[0] = segment[i][i_bin]; polygon[1] = segment[i][((i_bin+1)%2)]; polygon[2] = '\0'; t = 2; for (j=0; j<segments_printed; j++){ for (j_bin=0; j_bin<2; j_bin++){ if (segment[j][j_bin] == polygon[(t-1)]){ if (i == j){ break; } for (k=0; k<t, t<=number_of_sides; k++){ if (polygon[k] == segment[j][((j_bin+1)%2)]){ break; } if (polygon[k] != segment[j][((j_bin+1)%2)]){ polygon[t] = segment[j][((j_bin+1)%2)]; t++; j = 0; j_bin = 0; } if (t > number_of_sides){ if (polygon[0] == polygon[t-1]){ polygon[t-1] = '\0'; printf("%s\n", polygon); polygons_printed++; t-=2; } } } } } } } } if (polygons_printed == 0){ printf("No polygons of %d sides found within %f percent.\n", number_of_sides, variation); } else{ printf("%d %d-sided polygons found.\n", polygons_printed, number_of_sides); } getch(); while (1){ printf("\n"); printf("How many sides should each polygon have?: "); scanf("%d", &number_of_sides); while ((number_of_sides < 2) || (number_of_sides > number_of_points)){ printf("\nCannot generate polygons with %d sides.\n\n", number_of_sides); printf("How many sides should each polygon have?: "); scanf("%d", &number_of_sides); } printf("What is the length of an average side?: "); scanf("%f", &avg_side_length); printf("How much variation (in terms of percent) are allowed?: "); scanf("%f", &variation); var = (variation/100.0); segments_printed = 0; polygons_printed = 0; for (i=0; i<number_of_sides; i++){ polygon[i] = ' '; } polygon[number_of_sides] = '\0'; printf("\n\n"); printf("SEGMENTS\n========\n"); for (i=0; i<number_of_points; i++){ for (j=(i+1); j<number_of_points; j++){ segment_length = distance(x, y, i, j); if ( ((1.00 - var)*(avg_side_length) <= segment_length) && (segment_length <= (1.00 + var)*(avg_side_length)) ){ printf("%c%c\n", index[i], index[j]); segments_printed++; } } } if (segments_printed == 0){ printf("No segments found within %d percent.\n", variation); } for (i=0; i<segments_printed; i++){ for (i_bin=0; i_bin<2; i_bin++){ polygon[0] = segment[i][i_bin]; polygon[1] = segment[i][((i_bin+1)%2)]; polygon[2] = '\0'; t = 2; for (j=0; j<segments_printed; j++){ for (j_bin=0; j_bin<2; j_bin++){ if (segment[j][j_bin] == polygon[(t-1)]){ if (i == j){ break; } for (k=0; k<t, t<=number_of_sides; k++){ if (polygon[k] == segment[j][((j_bin+1)%2)]){ break; } if (polygon[k] != segment[j][((j_bin+1)%2)]){ polygon[t] = segment[j][((j_bin+1)%2)]; t++; j = 0; j_bin = 0; } if (t > number_of_sides){ if (polygon[0] == polygon[t-1]){ polygon[t-1] = '\0'; printf("%s\n", polygon); polygons_printed++; t-=2; } } } } } } } } if (polygons_printed == 0){ printf("No polygons of %d sides found within %f percent.\n", number_of_sides, variation); } else{ printf("%d %d-sided polygons found.\n", polygons_printed, number_of_sides); } getch(); } } float distance(int* x, int* y, int i, int j){ return ( sqrt( pow((y[i] - y[j]),2) + pow((x[i] - x[j]),2) ) ); }