From 33625b72e58b089ec73a773756602a4099f27ab5 Mon Sep 17 00:00:00 2001 From: cspark Date: Thu, 11 Jul 2024 17:01:45 +0100 Subject: [PATCH] Init repository --- .gitignore | 1 + comprun.sh | 4 ++ hello.c | 186 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 191 insertions(+) create mode 100644 .gitignore create mode 100755 comprun.sh create mode 100644 hello.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f8305e7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +a.out \ No newline at end of file diff --git a/comprun.sh b/comprun.sh new file mode 100755 index 0000000..5e1e058 --- /dev/null +++ b/comprun.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +gcc hello.c +./a.out diff --git a/hello.c b/hello.c new file mode 100644 index 0000000..0d628a4 --- /dev/null +++ b/hello.c @@ -0,0 +1,186 @@ +#include + +float farenheitToCelsius(float farenheit) { + return (farenheit - 32.0) / 1.8; +} + +float celsiusToFarenheit(float celsius) { + return (celsius * 1.8) + 32.0; +} + +int sizeofStr(char in[]) { + int i = 0; + for (i = 0; in[i] != '\0'; ++i) + ; + return i; +} + +void printStrArray(char in[]) { + int i; + printf("{ "); + for (i = 0; i < sizeofStr(in); ++i) { + printf("%c", in[i]); + if (i == sizeofStr(in) - 1) { + printf(" }\n"); + } else { + printf(", "); + } + } +} + +void printIntArray(int in[], int inLength) { + int i; + printf("{ "); + for (i = 0; i < inLength; ++i) { + printf("%d", in[i]); + if (i == inLength - 1) { + printf(" }\n"); + } else { + printf(", "); + } + } +} + +int checkIntArraySorted(int in[], int inLength) { + int i = 0; + while(i < inLength - 1) { + if (in[i] > in[i + 1]) + return 0; + ++i; + } + + return 1; +} + +void swapInt(int *x, int *y) { + int temp = *x; + *x = *y; + *y = temp; +} + +/* Count the number of digits an integer has */ +unsigned long long intDigitCount(unsigned long long in) { + unsigned long long largestDigit; + int digitCount = 0; + for (largestDigit = 1; in / largestDigit != 0; largestDigit *= 10) + ++digitCount; + return digitCount; +} + +/* Expand an integer into an integer whose first unit is 1 followed by a leading trail of 0's*/ +unsigned long long intDigitExpand(unsigned long long in) { + int expandedDigit; + for (expandedDigit = 1; in != 1; --in) + expandedDigit *= 10; + return expandedDigit; +} + +/* Convert an integer array into a combined integer */ +int intArrayToInt(int in[], int inLength) { + int i; + int out = 0; + int currentDigit = inLength; + for (i = 1; i <= inLength; ++i) { + out += in[i - 1] * intDigitExpand(currentDigit); + --currentDigit; + } + return out; +} + +/* Split an integer into an integer array */ +void intToIntArray(int in, int out[]) { + int i; + int j = 0; + int currentDigit; + for(i = intDigitCount(in); i >= 1; --i) { + out[j] = in / intDigitExpand(i); + in -= intDigitExpand(i) * out[j]; + ++j; + } +} + +/* Pseudo Random Number Generator using the Middle-square method */ +int randIntMiddleSquare(unsigned long long *seed, int iteration) { + int i; + int oldSeedLength = intDigitCount(*seed); + for (i = 0; i < iteration; ++i) { + unsigned long long seedSquared = *seed * *seed; + unsigned long long seedSquaredLength = intDigitCount(seedSquared); + printf("Seed squared: %d\n", seedSquared); + printf("Seed squared length: %d\n", seedSquaredLength); + int seedSquaredArray[seedSquaredLength]; + int middleStart = (seedSquaredLength - oldSeedLength) / 2; + printf("Middle start: %d\n", middleStart); + int newSeedArray[oldSeedLength]; + int j; + intToIntArray(seedSquared, seedSquaredArray); + for (int j = 0; j < oldSeedLength; ++j) { + newSeedArray[j] = seedSquaredArray[middleStart]; + ++middleStart; + } + printIntArray(newSeedArray, sizeof(newSeedArray) / sizeof(int)); + unsigned long long newSeed = intArrayToInt(newSeedArray, sizeof(newSeedArray) / sizeof(int)); + int newSeedLength = intDigitCount(newSeed); + /* If the result has fewer than 2n digits, leading zeroes are added to compensate */ + if (newSeedLength < oldSeedLength) + newSeed *= intDigitExpand(oldSeedLength - newSeedLength) * 10; + *seed = newSeed; + } + + return *seed; +} + +int randIntMiddleSquareRange(int start, int end, unsigned long long *seed) { + + int endLength = intDigitCount(end); + if (endLength > intDigitCount(*seed)) + return -1; + + unsigned long long randomNumber = randIntMiddleSquare(seed, 1); + printf("The random number: %d\n", randomNumber); + int randomNumberLength = intDigitCount(randomNumber); + int randomNumberArray[randomNumberLength]; + int truncatedNumber; + int truncatedNumberArray[endLength]; + int middleStart = (randomNumberLength - endLength) / 2; + intToIntArray(randomNumber, randomNumberArray); + for (int j = 0; j < endLength; ++j) { + truncatedNumberArray[j] = randomNumberArray[middleStart]; + ++middleStart; + } + truncatedNumber = intArrayToInt(truncatedNumberArray, sizeof(truncatedNumberArray) / sizeof(int)); + + if (truncatedNumber <= end && truncatedNumber >= start) + return truncatedNumber; + else + randIntMiddleSquareRange(start, end, seed); +} + +int main() { + int unsortedArray[] = { 1, 5, 2, 1, 4, 8, 3, 2, 6, 7 }; + int sortedArray[] = { 1, 2, 4, 8, 9, 9, 9 }; + + printf("Unsorted Array : "); + printIntArray(unsortedArray, sizeof(unsortedArray) / sizeof(int)); + printf("Unsorted Array Sorted?: %d\n", checkIntArraySorted(unsortedArray, sizeof(unsortedArray) / sizeof(int))); + printf("Sorted Array : "); + printIntArray(sortedArray, sizeof(sortedArray) / sizeof(int)); + printf("Sorted Array Sorted?: %d\n", checkIntArraySorted(sortedArray, sizeof(sortedArray) / sizeof(int))); + + int number = 3372; + int intArray[4]; + + intToIntArray(number, intArray); + printIntArray(intArray, sizeof(intArray) / sizeof(int)); + + printf("Back to int %d\n", intArrayToInt(intArray, sizeof(intArray) / sizeof(int))); + + unsigned long long seed = 3791; + printf("Squared: %d\n", seed * seed); + int iteration = 1; + printf("Starting random number %d\n", seed); + printf("Random number is %d after iteration %d\n", randIntMiddleSquare(&seed, iteration), iteration); + + printf("Random: %d\n", randIntMiddleSquareRange(1, 10, &seed)); + +}