๐ Struct
Complex
.c
โถ
#include <stdio.h>
#include <math.h>
//problem 2) Complex numbers from practice exercises
struct Complex {
double real;
double imag;
};
//add two complex numbers
struct Complex add(struct Complex c1, struct Complex c2) {
struct Complex result;
result.real = c1.real + c2.real;
result.imag = c1.imag + c2.imag;
return result;
}
//multiply two complex numbers
//the formula is (a+bi)(c+di) = (ac-bd) + (ad+bc)i
struct Complex multiply(struct Complex c1, struct Complex c2) {
struct Complex result;
result.real = c1.real * c2.real - c1.imag * c2.imag;
result.imag = c1.real * c2.imag + c1.imag * c2.real;
return result;
}
//print complex number as "a + bi"
void print_complex(struct Complex c) {
printf("%.2f + %.2fi", c.real, c.imag);
}
//calculate magnitude = sqrt(aยฒ + bยฒ)
double magnitude(struct Complex c) {
return sqrt(c.real * c.real + c.imag * c.imag);
}
int main() {
struct Complex c1 = {6, 7};
struct Complex c2 = {1, 2};
struct Complex sum = add(c1, c2);
printf("Sum: ");
print_complex(sum);
printf("\n");
struct Complex product = multiply(c1, c2);
printf("product: ");
print_complex(product);
printf("\n");
printf("magnitude of c1: %.2f\n", magnitude(c1));
return 0;
}
Date
.c
โถ
#include <stdio.h>
#include <stdbool.h>
//problem 5 from practices(struct)
struct Date {
int day;
int month;
int year;
};
//check if date is valid
bool is_valid_date(struct Date d) {
//check month
if (d.month < 1 || d.month > 12) return false;
//days in each month
int days_in_month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
//check february
bool is_leap = (d.year % 4 == 0 && d.year % 100 != 0) || (d.year % 400 == 0);
if (is_leap && d.month == 2) {
days_in_month[1] = 29;
}
//check day
return (d.day >= 1 && d.day <= days_in_month[d.month - 1]);
}
//compare two dates
int compare_dates(struct Date d1, struct Date d2) {
if (d1.year != d2.year) {
return d1.year < d2.year ? -1 : 1;
}
if (d1.month != d2.month) {
return d1.month < d2.month ? -1 : 1;
}
if (d1.day != d2.day) {
return d1.day < d2.day ? -1 : 1;
}
return 0;
}
// check if date1 is earlier than date2
bool is_earlier(struct Date d1, struct Date d2) {
return compare_dates(d1, d2) == -1;
}
int main(void) {
struct Date d1 = {7, 6, 2006};
struct Date d2 = {8, 7, 2006};
printf("date1 valid? %s\n", is_valid_date(d1) ? "Yes" : "No");
printf("is_earlier? %s\n", is_earlier(d1, d2) ? "Yes" : "No");
return 0;
}
SmartArray
.c
โถ
#include <stdio.h>
#include <stdlib.h>
//SmartArray struct from practices
struct SmartArray {
int* data;
int size;
int capacity;
};
//dynamically allocate memory and initialize it
struct SmartArray* create(int capacity) {
struct SmartArray* arr = malloc(sizeof(struct SmartArray));
arr->data = malloc(capacity * sizeof(int));
arr->size = 0;
arr->capacity = capacity;
return arr;
}
//print only valid elements
void print(struct SmartArray* arr) {
printf("[");
for (int i = 0; i < arr->size; i++) {
printf("%d", arr->data[i]);
if (i < arr->size - 1) {
printf(", ");
}
}
printf("]\n");
}
// add element at end push back logic
void push_back(struct SmartArray* arr, int value) {
if (arr->size >= arr->capacity) {
printf(" the array is full\n");
return;
}
arr->data[arr->size] = value;
arr->size++;
}
//insert at specific position
void insert_at(struct SmartArray* arr, int index, int value) {
if (arr->size >= arr->capacity) {
printf("the array is full\n");
return;
}
if (index < 0 || index > arr->size) {
printf("invalid index\n");
return;
}
for (int i = arr->size; i > index; i--) {
arr->data[i] = arr->data[i - 1];
}
arr->data[index] = value;
arr->size++;
}
// remove element at position
void remove_at(struct SmartArray* arr, int index) {
if (index < 0 || index >= arr->size) {
printf("invalid index\n");
return;
}
for (int i = index; i < arr->size - 1; i++) {
arr->data[i] = arr->data[i + 1];
}
arr->size--;
}
void destroy(struct SmartArray* arr) {
free(arr->data);
free(arr);
}
int get(struct SmartArray* arr, int index) {
if (index < 0 || index >= arr->size) {
printf("invalid index\n");
return -1;
}
return arr->data[index];
}
void set(struct SmartArray* arr, int index, int value) {
if (index < 0 || index >= arr->size) {
printf("invalid index\n");
return;
}
arr->data[index] = value;
}
int main() {
struct SmartArray* arr = create(10);
printf("after creation: ");
print(arr);
push_back(arr, 10);
push_back(arr, 20);
push_back(arr, 30);
printf("after pushes: ");
print(arr);
insert_at(arr, 1, 67);
printf("after insert at index 1: ");
print(arr);
remove_at(arr, 2);
printf("after remove at index 2: ");
print(arr);
printf("value at index 1: %d\n", get(arr, 1));
set(arr, 1, 100);
printf("After set: ");
print(arr);
destroy(arr);
return 0;
}