@@ -0,0 +1,2 @@ | |||
BasedOnStyle: LLVM | |||
IndentWidth: 4 |
@@ -0,0 +1,13 @@ | |||
all: ex1 ex2 ex3 ex4 | |||
ex1: ex1.c | |||
gcc $< -o $@ | |||
ex2: ex2.c | |||
gcc $< -o $@ -lm | |||
ex3: ex3.c | |||
gcc $< -o $@ -lm | |||
ex4: ex4.c | |||
gcc $< -o $@ -lm |
@@ -0,0 +1,33 @@ | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
#include <time.h> | |||
int foo(int age) { | |||
int result; | |||
time_t t = time(NULL); | |||
result = localtime(&t)->tm_year + 1900 - age; | |||
return result; | |||
} | |||
int main() { | |||
const int x = 10; | |||
const int *q = &x; | |||
const int *const p = malloc(sizeof(int) * 5); | |||
for (int *i = (int *)p; i < p + 5; ++i) { | |||
*i = x; | |||
printf("%p%c", i, (i < p + 4 ? ' ' : '\n')); | |||
} | |||
for (int *i = (int *)p; i < p + 5; ++i) { | |||
scanf("%d", i); | |||
} | |||
for (int *i = (int *)p; i < p + 5; ++i) { | |||
*i = foo(*i); | |||
printf("%d%c", *i, (i < p + 4 ? ' ' : '\n')); | |||
} | |||
free((int *)p); | |||
} |
@@ -0,0 +1,2 @@ | |||
gcc ex1.c -o ex1 | |||
./ex1 |
@@ -0,0 +1,28 @@ | |||
#include <math.h> | |||
#include <stdio.h> | |||
typedef struct Point { | |||
float x, y; | |||
} Point; | |||
float distance(Point p1, Point p2) { | |||
return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y)); | |||
} | |||
float area(Point A, Point B, Point C) { | |||
return 0.5 * fabsf(A.x * B.y - B.x * A.y + B.x * C.y - C.x * B.y + | |||
C.x * A.y - A.x * C.y); | |||
} | |||
int main() { | |||
Point A = {2.5, 6}; | |||
Point B = {1, 2.2}; | |||
Point C = {10, 6}; | |||
float f = distance(A, B); | |||
printf("A -- B distance is %f\n", f); | |||
float a = area(A, B, C); | |||
printf("Area of triangle ABC is %f\n", a); | |||
} |
@@ -0,0 +1,2 @@ | |||
gcc ex2.c -o ex2 -lm | |||
./ex2 |
@@ -0,0 +1,195 @@ | |||
#include <memory.h> | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
struct Directory; | |||
struct File; | |||
struct File { | |||
int id; | |||
unsigned long size; | |||
char data[2048]; | |||
char name[64]; | |||
struct Directory *directory; // The parent directory | |||
}; | |||
struct Directory { | |||
int nf; | |||
int nd; | |||
char path[4096]; | |||
struct File *files[256]; | |||
struct Directory *directories[8]; | |||
}; | |||
typedef struct Directory Directory; | |||
typedef struct File File; | |||
// Operations on files | |||
void add_to_file(File *file, const char *content); | |||
void append_to_file(File *file, const char *content); | |||
void pwd_file(File *file); | |||
// Operations on directories | |||
void add_file(File *file, Directory *dir); | |||
void add_dir(Directory *dir1, Directory *dir2); // given to you | |||
// Helper functions | |||
void show_dir(Directory *dir); | |||
void show_file(File *file); | |||
void show_file_detailed(File *file); | |||
void init_dir(Directory *dir, char *name); | |||
void init_file(File *file, char *name); | |||
int cur_id = 0; | |||
int main() { | |||
char content1[] = "int printf(const char * format, ...);"; | |||
char content2[] = "int main(){printf('Hello World');}"; | |||
char content3[] = "//This is a comment in C language"; | |||
char content4[] = "Bourne Again Shell!"; | |||
Directory home, bin, root; | |||
init_dir(&root, "/"); | |||
init_dir(&home, "home"); | |||
init_dir(&bin, "bin"); | |||
// Example: the path of the folder home is /home | |||
// Add subdirectories | |||
add_dir(&home, &root); | |||
add_dir(&bin, &root); | |||
File bash, ex31, ex32; | |||
init_file(&bash, "bash"); | |||
init_file(&ex31, "ex3_1.c"); | |||
init_file(&ex32, "ex3_2.c"); | |||
//<WRITE YOUR CODE HERE> | |||
add_file(&bash, &bin); | |||
add_file(&ex31, &home); | |||
add_file(&ex32, &home); | |||
add_to_file(&bash, content4); | |||
add_to_file(&ex31, content1); | |||
add_to_file(&ex32, content3); | |||
append_to_file(&ex31, content2); | |||
show_dir(&root); | |||
show_file_detailed(&bash); | |||
show_file_detailed(&ex31); | |||
show_file_detailed(&ex32); | |||
pwd_file(&bash); | |||
pwd_file(&ex31); | |||
pwd_file(&ex32); | |||
return EXIT_SUCCESS; | |||
} | |||
// Helper functions | |||
// Displays the content of the Directory dir | |||
void show_dir(Directory *dir) { | |||
printf("\nDIRECTORY\n"); | |||
printf(" path: %s\n", dir->path); | |||
printf(" files:\n"); | |||
printf(" [ "); | |||
for (int i = 0; i < dir->nf; i++) { | |||
show_file(dir->files[i]); | |||
} | |||
printf("]\n"); | |||
printf(" directories:\n"); | |||
printf(" { "); | |||
for (int i = 0; i < dir->nd; i++) { | |||
show_dir(dir->directories[i]); | |||
} | |||
printf("}\n"); | |||
} | |||
// Prints the name of the File file | |||
void show_file(File *file) { printf("%s ", file->name); } | |||
// Shows details of the File file | |||
void show_file_detailed(File *file) { | |||
printf("\nFILE\n"); | |||
printf(" id: %d\n", file->id); | |||
printf(" name: %s\n", file->name); | |||
printf(" size: %lu\n", file->size); | |||
printf(" data:\n"); | |||
printf(" [ %s ]\n", file->data); | |||
} | |||
// Implementation: Operations on files | |||
// Adds the content to the File file | |||
void add_to_file(File *file, const char *content) { | |||
if (file && content) { | |||
strcpy(file->data, content); | |||
file->size = strlen(file->data) + 1; | |||
} | |||
} | |||
// Appends the content to the File file | |||
void append_to_file(File *file, const char *content) { | |||
if (file && content) { | |||
int sz = strlen(file->data); | |||
strcpy(file->data + sz, content); | |||
file->size = strlen(file->data) + 1; | |||
} | |||
} | |||
// Prints the path of the File file | |||
void pwd_file(File *file) { | |||
if (file) { | |||
printf("%s/%s\n", file->directory->path, file->name); | |||
} | |||
} | |||
// Implementation: Operations on directories | |||
// Adds the File file to the Directory dir | |||
void add_file(File *file, Directory *dir) { | |||
if (file && dir) { | |||
dir->files[dir->nf] = file; | |||
dir->nf++; | |||
file->directory = dir; | |||
} | |||
} | |||
// Given to you | |||
// Adds the subdirectory dir1 to the directory dir2 | |||
void add_dir(Directory *dir1, Directory *dir2) { | |||
if (dir1 && dir2) { | |||
dir2->directories[dir2->nd] = dir1; | |||
dir2->nd++; | |||
int sz1 = strlen(dir1->path), sz2 = strlen(dir2->path); | |||
if (dir2->path[sz2 - 1] == '/') { | |||
memmove(dir1->path + sz2, dir1->path, sz1 + 1); | |||
} else { | |||
memmove(dir1->path + sz2 + 1, dir1->path, sz1 + 1); | |||
*(dir1->path + sz2) = '/'; | |||
} | |||
memcpy(dir1->path, dir2->path, sz2); | |||
} | |||
} | |||
void init_dir(Directory *dir, char *name) { | |||
dir->nd = dir->nf = 0; | |||
strcpy(dir->path, name); | |||
} | |||
void init_file(File *file, char *name) { | |||
file->data[0] = '\0'; | |||
file->id = cur_id++; | |||
strcpy(file->name, name); | |||
file->size = 0; | |||
} |
@@ -0,0 +1,2 @@ | |||
gcc ex3.c -o ex3 | |||
./ex3 |
@@ -0,0 +1,155 @@ | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
void* aggregate(void* base, size_t size, int n, void* initial_value, void* (*opr)(const void*, const void*)); | |||
void* addInt(const void* a, const void* b){ | |||
int *result = malloc(sizeof(int)); | |||
*result = *(double*)a + *(int*)b; | |||
return result; | |||
} | |||
void* addDouble(const void* a, const void* b){ | |||
double *result = malloc(sizeof(double)); | |||
*result = *(double*)a + *(double*)b; | |||
return result; | |||
} | |||
void* mulInt(const void* a, const void* b){ | |||
int *result = malloc(sizeof(int)); | |||
*result = *(double*)a * *(int*)b; | |||
return result; | |||
} | |||
void* mulDouble(const void* a, const void* b){ | |||
double *result = malloc(sizeof(double)); | |||
*result = *(double*)a + *(double*)b; | |||
return result; | |||
} | |||
void* meanInt(const void* a, const void* b){ | |||
double *result = malloc(sizeof(double)); | |||
*result = (*(double*)a + *(int*)b) / 2.0; | |||
return result; | |||
} | |||
void* meanDouble(const void* a, const void* b){ | |||
double *result = malloc(sizeof(double)); | |||
*result = (*(double*)a + *(double*)b) / 2.0; | |||
return result; | |||
} | |||
void* aggregate(void* base, size_t size, int n, void* initial_value, void* (*opr)(const void*, const void*)){ | |||
void* output; | |||
if (size==sizeof(int)){ // base is a pointer to an integer | |||
if (opr == meanInt) { | |||
output = malloc(sizeof(double)); | |||
*(double *)output = *(double*)initial_value; | |||
for (int i = 0; i < n; ++i) { | |||
double* res = opr(output, ((int*)base) + i); | |||
*(double*)output = *res; | |||
free(res); | |||
} | |||
} else { | |||
output = malloc(sizeof(int)); | |||
*(int *)output = *(int*)initial_value; | |||
for (int i = 0; i < n; ++i) { | |||
int* res = opr(output, ((int*)base) + i); | |||
*(int*)output = *res; | |||
free(res); | |||
} | |||
} | |||
}else{ // base is a pointer to a double | |||
for (int i = 0; i < n; ++i) { | |||
double* res = opr(output, ((double*)base) + i); | |||
*(double*)output = *res; | |||
free(res); | |||
} | |||
} | |||
return output; | |||
} | |||
int main(){ | |||
int* ints = malloc(sizeof(int)*5); | |||
double* doubles = malloc(sizeof(double)*5); | |||
double *init_mult = malloc(sizeof(double)); | |||
double *init_add = malloc(sizeof(double)); | |||
double *init_mean_int = malloc(sizeof(double)); | |||
double *init_mean_double = malloc(sizeof(double)); | |||
*init_mult = 1; | |||
*init_add = 0; | |||
*init_mean_int = ints[0]; | |||
*init_mean_double = doubles[0]; | |||
// Addition | |||
int* result1a; | |||
result1a = aggregate(ints, sizeof(int), 5, init_add, addInt); | |||
printf("%d\n", *result1a); | |||
free(result1a); | |||
double* result2a; | |||
result1a = aggregate(doubles, sizeof(double), 5, init_add, addDouble); | |||
printf("%f\n", *result2a); | |||
free(result2a); | |||
// Multiplication | |||
int* result1m; | |||
//<WRITE YOUR CODE HERE>; | |||
result1m = aggregate(ints, sizeof(int), 5, init_mult, mulInt); | |||
printf("%d\n", *result1m); | |||
free(result1m); | |||
double* result2m; | |||
result2m = aggregate(doubles, sizeof(double), 5, init_mult, mulDouble); | |||
printf("%f\n", *result2m); | |||
free(result2m); | |||
// Mean | |||
double* result1mean; | |||
result1mean = aggregate(ints, sizeof(int), 5, init_mean_int, meanInt); | |||
printf("%lf\n", *result1mean); | |||
free(result1mean); | |||
double* result2mean; | |||
result2mean = aggregate(doubles, sizeof(double), 5, init_mean_double, meanDouble); | |||
printf("%f\n", *result2mean); | |||
free(result2mean); | |||
// free the pointers | |||
//<WRITE YOUR CODE HERE>; | |||
free(ints); | |||
free(doubles); | |||
free(init_add); | |||
free(init_mult); | |||
free(init_mean_double); | |||
free(init_mean_int); | |||
return EXIT_SUCCESS; | |||
} |
@@ -0,0 +1,2 @@ | |||
gcc ex4.c -o ex4 | |||
./ex4 |