// CS 2SC3 / SE 2S03 solution for assignment 5 -- Pouya Larjani #include #include #include #include #include #define MAX_SEQ_LENGTH 128 typedef struct {double x,y;} vector; typedef struct vs {int size; vector seq[MAX_SEQ_LENGTH];} *vec_store; vector def = {0.0/0.0, 0.0/0.0}; double vec_mag(vector v) { return sqrt(v.x*v.x+v.y*v.y); } vec_store make_vec_store() { vec_store s = (vec_store)malloc(sizeof(struct vs)); s->size = 0; return s; } vector get_vec(vec_store s, int i) { if (!s || i<0 || i>=s->size) { fprintf(stderr, "! Index out of bounds.\n"); return def; } else return s->seq[i]; } void delete_vec(vec_store s, int i) { if (!s || i<0 || i>=s->size) fprintf(stderr, "! Index out of bounds.\n"); else { memmove(&s->seq[i],&s->seq[i+1],(s->size-i-1)*sizeof(vector)); s->size--; } } void insert_vec(vec_store s, vector v) { if (!s || s->size>=MAX_SEQ_LENGTH) fprintf(stderr, "! Vector store is full.\n"); else { int i=0; while (isize && vec_mag(v)>vec_mag(s->seq[i])) i++; memmove(&s->seq[i+1],&s->seq[i],(s->size-i)*sizeof(vector)); s->seq[i] = v; s->size++; } } /// Testing // Semi-periodic vector generator vector genvec(int i) { vector v; double f = (double)i; v.x = f * cos(f) - sqrt(f) + 1.1111; v.y = exp(sin(f)) + f * cos(f); return v; } // Compare vectors int vec_cmp(vector x, vector y) { return x.x==y.x && x.y==y.y; } // Assess correctness and give appropriate marks int mark = 0; void assess(int c, const char* msg) { if (c) { mark++; printf("Testing %s succeeded.\n", msg); } else printf("Testing %s failed!\n", msg); } // Handle program crashes void crash(int sig) { fprintf(stderr, "Program crashed!\n"); printf("Your mark is %d/20\n", mark); exit(0); } int main() { int sorted = 1, i; signal(SIGABRT, crash); signal(SIGFPE , crash); signal(SIGILL , crash); signal(SIGINT , crash); signal(SIGSEGV, crash); signal(SIGTERM, crash); // Make store (2 marks) vec_store s1 = make_vec_store(), s2 = make_vec_store(); assess(s1->size == 0, "size of empty store"); assess(s2->size == 0, "size of empty store"); // Empty get (3 marks) get_vec(s1, 0); assess(s1->size == 0, "empty get"); get_vec(s2, 5); assess(s2->size == 0, "empty get"); get_vec(s1,-1); assess(s1->size == 0, "empty get"); // Insert (5 marks) insert_vec(s1, genvec(15)); assess(s1->size == 1, "inserting"); insert_vec(s2, genvec(55)); assess(s2->size == 1, "inserting"); insert_vec(s1, genvec(0 )); assess(s1->size == 2, "inserting"); assess(vec_cmp(get_vec(s2, 0), genvec(55)), "insertion sort"); assess(vec_cmp(get_vec(s1, 1), genvec(15)), "insertion sort"); // Delete (4 marks) delete_vec(s1, 0); assess(s1->size == 1, "delete"); delete_vec(s2, 0); assess(s2->size == 0, "delete"); assess(vec_cmp(get_vec(s1, 0), genvec(15)), "deletion sort"); delete_vec(s1, 0); assess(s1->size == 0, "delete"); // Full insert (3) for (i=0; isize == MAX_SEQ_LENGTH, "size of full insert"); for (i=0; i vec_mag(get_vec(s1,i+1))) sorted = 0; assess(sorted, "sorted store after full insert"); // Full clean (3 marks) for (i=0; isize == 0, "size of full clean"); delete_vec(s1, 0); assess(s1->size == 0, "empty delete"); printf("Your mark is %d/20\n", mark); return 0; }