summaryrefslogtreecommitdiff
path: root/wk5/pset
diff options
context:
space:
mode:
authorFudgerboy <91767657+Fudgerboy@users.noreply.github.com>2024-04-14 04:22:10 +0000
committerFudgerboy <91767657+Fudgerboy@users.noreply.github.com>2024-04-14 04:22:10 +0000
commitfcc3f3d59c9ce190dfeffe6c22c604bd9d68ea32 (patch)
tree36934ff166f128c21e1396c41f1c5c0e472a6275 /wk5/pset
parente3e60555e7d926a29c426377941111e417ae4867 (diff)
Sat, Apr 13, 2024, 9:22 PM -07:00
Diffstat (limited to 'wk5/pset')
-rw-r--r--wk5/pset/inheritance/inheritance.c141
1 files changed, 141 insertions, 0 deletions
diff --git a/wk5/pset/inheritance/inheritance.c b/wk5/pset/inheritance/inheritance.c
new file mode 100644
index 0000000..0f3fd13
--- /dev/null
+++ b/wk5/pset/inheritance/inheritance.c
@@ -0,0 +1,141 @@
+// Simulate genetic inheritance of blood type
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <math.h>
+
+// Each person has two parents and two alleles
+typedef struct person
+{
+ struct person *parents[2];
+ char alleles[2];
+} person;
+
+const int GENERATIONS = 3;
+const int INDENT_LENGTH = 4;
+
+person *create_family(int generations);
+void print_family(person *p, int generation);
+void free_family(person *p);
+char random_allele();
+
+int main(void)
+{
+ // Seed random number generator
+ srand(time(0));
+
+ // Create a new family with three generations
+ person *p = create_family(GENERATIONS);
+
+ // Print family tree of blood types
+ print_family(p, 0);
+
+ // Free memory
+ free_family(p);
+}
+
+// Create a new individual with `generations`
+person *create_family(int generations)
+{
+ // TODO: Allocate memory for new person
+ person *new = malloc(sizeof(person));
+
+ // If there are still generations left to create
+ if (generations > 1)
+ {
+ // Create two new parents for current person by recursively calling create_family
+ person *parent0 = create_family(generations - 1);
+ person *parent1 = create_family(generations - 1);
+
+ // TODO: Set parent pointers for current person
+ new->parents[0] = *parent0;
+ new->parents[1] = *parent1;
+
+ // TODO: Randomly assign current person's alleles based on the alleles of their parents
+ new->alleles[0] = new->parents[0]->alleles[round(random() / ((double) RAND_MAX + 1))];
+ new->alleles[1] = new->parents[1]->alleles[round(random() / ((double) RAND_MAX + 1))];
+ }
+
+ // If there are no generations left to create
+ else
+ {
+ // TODO: Set parent pointers to NULL
+ new->parents[0] = NULL;
+ new->parents[1] = NULL;
+
+ // TODO: Randomly assign alleles
+ // new->alleles[0] = round(random() / ((double) RAND_MAX + 1));
+ // new->alleles[1] = round(random() / ((double) RAND_MAX + 1));
+ }
+
+ // TODO: Return newly created person
+ return NULL;
+}
+
+// Free `p` and all ancestors of `p`.
+void free_family(person *p)
+{
+ // TODO: Handle base case
+
+ // TODO: Free parents recursively
+
+ // TODO: Free child
+}
+
+// Print each family member and their alleles.
+void print_family(person *p, int generation)
+{
+ // Handle base case
+ if (p == NULL)
+ {
+ return;
+ }
+
+ // Print indentation
+ for (int i = 0; i < generation * INDENT_LENGTH; i++)
+ {
+ printf(" ");
+ }
+
+ // Print person
+ if (generation == 0)
+ {
+ printf("Child (Generation %i): blood type %c%c\n", generation, p->alleles[0], p->alleles[1]);
+ }
+ else if (generation == 1)
+ {
+ printf("Parent (Generation %i): blood type %c%c\n", generation, p->alleles[0], p->alleles[1]);
+ }
+ else
+ {
+ for (int i = 0; i < generation - 2; i++)
+ {
+ printf("Great-");
+ }
+ printf("Grandparent (Generation %i): blood type %c%c\n", generation, p->alleles[0], p->alleles[1]);
+ }
+
+ // Print parents of current generation
+ print_family(p->parents[0], generation + 1);
+ print_family(p->parents[1], generation + 1);
+}
+
+// Randomly chooses a blood type allele.
+char random_allele()
+{
+ int r = rand() % 3;
+ if (r == 0)
+ {
+ return 'A';
+ }
+ else if (r == 1)
+ {
+ return 'B';
+ }
+ else
+ {
+ return 'O';
+ }
+}