From 74e6219517317d6565cb7f5da9d60ba349b20bf7 Mon Sep 17 00:00:00 2001 From: Bruno Raoult Date: Sun, 15 Aug 2021 16:33:15 +0200 Subject: [PATCH] C: complex numbers + sum of multiples --- c/complex-numbers/GNUmakefile | 51 ++++++++++++ c/complex-numbers/README.md | 67 +++++++++++++++ c/complex-numbers/makefile | 38 +++++++++ c/complex-numbers/src/complex_numbers.c | 96 ++++++++++++++++++++++ c/complex-numbers/src/complex_numbers.h | 70 ++++++++++++++++ c/grade-school/src/grade_school.c | 11 ++- c/square-root/src/square_root.c | 14 +++- c/sum-of-multiples/GNUmakefile | 51 ++++++++++++ c/sum-of-multiples/README.md | 47 +++++++++++ c/sum-of-multiples/makefile | 37 +++++++++ c/sum-of-multiples/src/a | Bin 0 -> 16096 bytes c/sum-of-multiples/src/a.c | 9 ++ c/sum-of-multiples/src/a.c.sav | 8 ++ c/sum-of-multiples/src/b | Bin 0 -> 16144 bytes c/sum-of-multiples/src/b.c | 29 +++++++ c/sum-of-multiples/src/sum_of_multiples.c | 57 +++++++++++++ c/sum-of-multiples/src/sum_of_multiples.h | 21 +++++ 17 files changed, 599 insertions(+), 7 deletions(-) create mode 100644 c/complex-numbers/GNUmakefile create mode 100644 c/complex-numbers/README.md create mode 100644 c/complex-numbers/makefile create mode 100644 c/complex-numbers/src/complex_numbers.c create mode 100644 c/complex-numbers/src/complex_numbers.h create mode 100644 c/sum-of-multiples/GNUmakefile create mode 100644 c/sum-of-multiples/README.md create mode 100644 c/sum-of-multiples/makefile create mode 100755 c/sum-of-multiples/src/a create mode 100644 c/sum-of-multiples/src/a.c create mode 100644 c/sum-of-multiples/src/a.c.sav create mode 100755 c/sum-of-multiples/src/b create mode 100644 c/sum-of-multiples/src/b.c create mode 100644 c/sum-of-multiples/src/sum_of_multiples.c create mode 100644 c/sum-of-multiples/src/sum_of_multiples.h diff --git a/c/complex-numbers/GNUmakefile b/c/complex-numbers/GNUmakefile new file mode 100644 index 0000000..ec085d0 --- /dev/null +++ b/c/complex-numbers/GNUmakefile @@ -0,0 +1,51 @@ +# The original 'makefile' has a flaw: +# 1) it overrides CFLAGS +# 2) it does not pass extra "FLAGS" to $(CC) that could come from environment +# +# It means : +# - we need to edit 'makefile' for different builds (DEBUG, etc...), which is +# not practical at all. +# - Also, it does not allow to run all tests without editing the test source +# code. +# +# To use this makefile (GNU make only): +# "make": build with all predefined tests (without editing test source code) +# "make debugall": build with all predefined tests and debug code +# "make mem": perform memcheck with all tests enabled +# "make unit": build standalone (unit) test +# "make debug": build standalone test with debugging code +# +# Original 'makefile' targets can be used (test, memcheck, clean, ...) + +.PHONY: default all mem unit debug std debugtest + +default: all + +# default is to build with all predefined tests +BUILD := teststall + +include makefile + +all: CFLAGS+=-DTESTALL +all: clean test + +debugall: CFLAGS+=-DDEBUG +debugall: all + +debugtest: CFLAGS+=-DDEBUG +debugtest: test + +mem: CFLAGS+=-DTESTALL +mem: clean memcheck + +unit: CFLAGS+=-DUNIT_TEST +unit: clean std + +debug: CFLAGS+=-DUNIT_TEST -DDEBUG +debug: clean std + +debugtest: CFLAGS+=-DDEBUG +debugtest: test + +std: src/*.c src/*.h + $(CC) $(CFLAGS) src/*.c -o test.out diff --git a/c/complex-numbers/README.md b/c/complex-numbers/README.md new file mode 100644 index 0000000..3055202 --- /dev/null +++ b/c/complex-numbers/README.md @@ -0,0 +1,67 @@ +# Complex Numbers + +A complex number is a number in the form `a + b * i` where `a` and `b` are real and `i` satisfies `i^2 = -1`. + +`a` is called the real part and `b` is called the imaginary part of `z`. +The conjugate of the number `a + b * i` is the number `a - b * i`. +The absolute value of a complex number `z = a + b * i` is a real number `|z| = sqrt(a^2 + b^2)`. The square of the absolute value `|z|^2` is the result of multiplication of `z` by its complex conjugate. + +The sum/difference of two complex numbers involves adding/subtracting their real and imaginary parts separately: +`(a + i * b) + (c + i * d) = (a + c) + (b + d) * i`, +`(a + i * b) - (c + i * d) = (a - c) + (b - d) * i`. + +Multiplication result is by definition +`(a + i * b) * (c + i * d) = (a * c - b * d) + (b * c + a * d) * i`. + +The reciprocal of a non-zero complex number is +`1 / (a + i * b) = a/(a^2 + b^2) - b/(a^2 + b^2) * i`. + +Dividing a complex number `a + i * b` by another `c + i * d` gives: +`(a + i * b) / (c + i * d) = (a * c + b * d)/(c^2 + d^2) + (b * c - a * d)/(c^2 + d^2) * i`. + +Raising e to a complex exponent can be expressed as `e^(a + i * b) = e^a * e^(i * b)`, the last term of which is given by Euler's formula `e^(i * b) = cos(b) + i * sin(b)`. + +Implement the following operations: + - addition, subtraction, multiplication and division of two complex numbers, + - conjugate, absolute value, exponent of a given complex number. + + +Assume the programming language you are using does not have an implementation of complex numbers. + +## Getting Started + +Make sure you have read the "Guides" section of the +[C track][c-track] on the Exercism site. This covers +the basic information on setting up the development environment expected +by the exercises. + +## Passing the Tests + +Get the first test compiling, linking and passing by following the [three +rules of test-driven development][3-tdd-rules]. + +The included makefile can be used to create and run the tests using the `test` +task. + + make test + +Create just the functions you need to satisfy any compiler errors and get the +test to fail. Then write just enough code to get the test to pass. Once you've +done that, move onto the next test. + +As you progress through the tests, take the time to refactor your +implementation for readability and expressiveness and then go on to the next +test. + +Try to use standard C99 facilities in preference to writing your own +low-level algorithms or facilities by hand. + +## Source + +Wikipedia [https://en.wikipedia.org/wiki/Complex_number](https://en.wikipedia.org/wiki/Complex_number) + +## Submitting Incomplete Solutions +It's possible to submit an incomplete solution so you can see how others have completed the exercise. + +[c-track]: https://exercism.io/my/tracks/c +[3-tdd-rules]: http://butunclebob.com/ArticleS.UncleBob.TheThreeRulesOfTdd diff --git a/c/complex-numbers/makefile b/c/complex-numbers/makefile new file mode 100644 index 0000000..d005aac --- /dev/null +++ b/c/complex-numbers/makefile @@ -0,0 +1,38 @@ +### If you wish to use extra libraries (math.h for instance), +### add their flags here (-lm in our case) in the "LIBS" variable. + +LIBS = -lm + +### +CFLAGS = -std=c99 +CFLAGS += -g +CFLAGS += -Wall +CFLAGS += -Wextra +CFLAGS += -pedantic +CFLAGS += -Werror +CFLAGS += -Wmissing-declarations +CFLAGS += -DUNITY_SUPPORT_64 +CFLAGS += -DUNITY_INCLUDE_DOUBLE + +ASANFLAGS = -fsanitize=address +ASANFLAGS += -fno-common +ASANFLAGS += -fno-omit-frame-pointer + +.PHONY: test +test: tests.out + @./tests.out + +.PHONY: memcheck +memcheck: test/*.c src/*.c src/*.h + @echo Compiling $@ + @$(CC) $(ASANFLAGS) $(CFLAGS) src/*.c test/vendor/unity.c test/*.c -o memcheck.out $(LIBS) + @./memcheck.out + @echo "Memory check passed" + +.PHONY: clean +clean: + rm -rf *.o *.out *.out.dSYM + +tests.out: test/*.c src/*.c src/*.h + @echo Compiling $@ + @$(CC) $(CFLAGS) src/*.c test/vendor/unity.c test/*.c -o tests.out $(LIBS) diff --git a/c/complex-numbers/src/complex_numbers.c b/c/complex-numbers/src/complex_numbers.c new file mode 100644 index 0000000..a9bbf4f --- /dev/null +++ b/c/complex-numbers/src/complex_numbers.c @@ -0,0 +1,96 @@ +#include "complex_numbers.h" + +#ifdef USE_COMPLEX_FUNCTIONS + +complex_t c_add(complex_t a, complex_t b) +{ + return (complex_t) { + .real = a.real+b.real, + .imag = a.imag+b.imag + }; +} + +complex_t c_sub(complex_t a, complex_t b) +{ + return (complex_t) { + .real = a.real-b.real, + .imag = a.imag-b.imag + }; +} + +complex_t c_mul(complex_t a, complex_t b) +{ + return (complex_t) { + .real = a.real*b.real - a.imag*b.imag, + .imag = a.imag*b.real + a.real*b.imag, + }; +} + +complex_t c_div(complex_t a, complex_t b) +{ + double d = b.real*b.real + b.imag*b.imag; + return (complex_t) { + .real = (a.real*b.real + a.imag*b.imag)/d, + .imag = (a.imag*b.real - a.real*b.imag)/d + }; +} + +double c_abs(complex_t x) +{ + return sqrt(x.real*x.real + x.imag*x.imag); +} + +complex_t c_conjugate(complex_t x) +{ + return (complex_t) { + .real = x.real, + .imag = -x.imag + }; +} + +double c_real(complex_t x) +{ + return x.real; +} + +double c_imag(complex_t x) +{ + return x.imag; +} + +complex_t c_exp(complex_t x) +{ + return (complex_t) { + .real = exp(x.real)*cos(x.imag), + .imag = exp(x.real)*sin(x.imag) + }; +} + +#endif + +/* See GNUmakefile below for explanation + * https://github.com/braoult/exercism/blob/master/c/templates/GNUmakefile + */ +#ifdef UNIT_TEST +#include +#include + +int main(int ac, char **av) +{ + int arg=1; + complex_t c1, c2, c3; + + for (; arg + +typedef struct { + double real; + double imag; +} complex_t; + +/* default is to use macros */ +#ifdef USE_COMPLEX_FUNCTIONS + +complex_t c_add(complex_t a, complex_t b); +complex_t c_sub(complex_t a, complex_t b); +complex_t c_mul(complex_t a, complex_t b); +complex_t c_div(complex_t a, complex_t b); +double c_abs(complex_t x); +complex_t c_conjugate(complex_t x); +double c_real(complex_t x); +double c_imag(complex_t x); +complex_t c_exp(complex_t x); + +#else + +#define c_add(a,b) (complex_t) { \ + (a).real+(b).real, \ + (a).imag+(b).imag } + +#define c_sub(a,b) (complex_t) { \ + (a).real-(b).real, \ + (a).imag-(b).imag } + +#define c_mul(a,b) (complex_t) { \ + (a).real*(b).real - (a).imag*(b).imag, \ + (a).imag*(b).real + (a).real*(b).imag } + +#define c_div(a,b) (complex_t) { \ + ((a).real*(b).real + (a).imag*(b).imag)/ \ + ((b).real*(b).real + (b).imag*(b).imag), \ + ((a).imag*(b).real - (a).real*(b).imag)/ \ + ((b).real*(b).real + (b).imag*(b).imag) } + +#define c_exp(x) (complex_t) { \ + exp((x).real) * cos((x).imag), \ + exp((x).real) * sin((x).imag) } + +#define c_abs(x) { sqrt((x).real*(x).real + (x).imag*(x).imag) } + +#define c_conjugate(x) (complex_t){ (x).real, -(x).imag } + +#define c_real(x) (x).real + +#define c_imag(x) (x).imag + + +#endif + +/* See GNUmakefile below for explanation + * https://github.com/braoult/exercism/blob/master/c/templates/GNUmakefile + */ +#if defined UNIT_TEST || defined DEBUG +#include +#include +#endif +#ifdef TESTALL +#undef TEST_IGNORE +#define TEST_IGNORE() {} +#endif + +#endif diff --git a/c/grade-school/src/grade_school.c b/c/grade-school/src/grade_school.c index 1ee6b91..b7dce30 100644 --- a/c/grade-school/src/grade_school.c +++ b/c/grade-school/src/grade_school.c @@ -2,8 +2,13 @@ #include #include -#define STD(i) roster.students[i] -#define NAME(i) roster.students[i].name +/* V1: initial version + * V2: removed useless static struct (was planned for a static list + * of grades students, that I will not do). + */ + +#define STD(i) roster.students[i] +#define NAME(i) roster.students[i].name #define GRADE(i) roster.students[i].grade static roster_t roster; @@ -39,7 +44,7 @@ int add_student(char *s, uint8_t g) */ roster_t get_grade(uint8_t g) { - static roster_t r; + roster_t r; unsigned i, j=0; for (i=0; i= NBITS || i <= max) { - sq2 = (1L << (j >> 1)); + sq2 = (1 << (j >> 1)); break; } } @@ -45,11 +44,18 @@ unsigned square_root(unsigned i) #ifdef UNIT_TEST int main(int ac, char **av) { - unsigned i, j; + unsigned i; +/* int arg=1; + for (; arg# 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 RD*0E_A2yVA9tV%8{t2W0RGR<* literal 0 HcmV?d00001 diff --git a/c/sum-of-multiples/src/a.c b/c/sum-of-multiples/src/a.c new file mode 100644 index 0000000..03e77ef --- /dev/null +++ b/c/sum-of-multiples/src/a.c @@ -0,0 +1,9 @@ +main(){ + printf("%u\n", sizeof(unsigned)); + printf("%u\n", (unsigned)-1); + printf("%d\n", !!8); + printf("%d\n", !!1); + printf("%d\n", !!0); +} +//536,870,911 +bsqua diff --git a/c/sum-of-multiples/src/a.c.sav b/c/sum-of-multiples/src/a.c.sav new file mode 100644 index 0000000..b881da2 --- /dev/null +++ b/c/sum-of-multiples/src/a.c.sav @@ -0,0 +1,8 @@ +main(){ + printf("%u\n", sizeof(unsigned)); + printf("%u\n", (unsigned)-1); + printf("%d\n", !!8); + printf("%d\n", !!1); + printf("%d\n", !!0); +} +//536,870,911 diff --git a/c/sum-of-multiples/src/b b/c/sum-of-multiples/src/b new file mode 100755 index 0000000000000000000000000000000000000000..cd0065b6db173735392275f78ce0360054ce1019 GIT binary patch literal 16144 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 DrP>HD literal 0 HcmV?d00001 diff --git a/c/sum-of-multiples/src/b.c b/c/sum-of-multiples/src/b.c new file mode 100644 index 0000000..c4f54ea --- /dev/null +++ b/c/sum-of-multiples/src/b.c @@ -0,0 +1,29 @@ +#include +#include + +main() +{ + char *p1, *p2, *p3; + printf("%lu\n", sizeof(unsigned)); + printf("%u\n", (unsigned)-1); + printf("%d\n", !!8); + printf("%d\n", !!1); + printf("%d\n", !!0); + p1=malloc(1); + p2=malloc(1); + p3=malloc(1); + *p1='1'; + *p3='3'; + printf("p1=%d\n", *p1); + printf("p2=%d\n", *p2); + printf("p3=%d\n", *p3); + *(unsigned *)p2=0xffffffff; + + printf("p1=%lu\n", p1); + printf("p2=%lu\n", p2); + printf("p3=%lu\n", p3); + printf("p1=%d\n", *p1); + printf("p2=%d\n", *p2); + printf("p3=%d\n", *p3); +} +//536,870,911 diff --git a/c/sum-of-multiples/src/sum_of_multiples.c b/c/sum-of-multiples/src/sum_of_multiples.c new file mode 100644 index 0000000..2fd1901 --- /dev/null +++ b/c/sum-of-multiples/src/sum_of_multiples.c @@ -0,0 +1,57 @@ +#include +#include + +/* V1: initial version + * V2: bug fix: force full unsigned allocation instead of bytes. + */ +#include "sum_of_multiples.h" + +#define BITS (sizeof(unsigned)*8) + +#define getbit(i) (!!(sieve[(i) / BITS] & (1 << ((i) % BITS)))) +#define setbit(i) (sieve[(i) / BITS] |= (1 << ((i) % BITS))) + +/* use a kind of eratosthenes's sieve, to avoid the trivial solution :-) + */ +unsigned sum(const unsigned *f, const size_t n, const unsigned l) +{ + unsigned sieve_size = (l-1)/BITS+1; + unsigned num, i, res=0; + unsigned *sieve; + + sieve = calloc(sieve_size, sizeof(unsigned)); /* l bits array */ + if (!sieve) + return 0; + for (i=0; i2) { + last=atol(av[1]); + for (i=2; i + +unsigned int sum(const unsigned int *factors, + const size_t number_of_factors, const unsigned int limit); + +/* See GNUmakefile below for explanation + * https://github.com/braoult/exercism/blob/master/c/templates/GNUmakefile + */ +#if defined UNIT_TEST || defined DEBUG +#include +#include +#endif +#ifdef TESTALL +#undef TEST_IGNORE +#define TEST_IGNORE() {} +#endif + +#endif