Start using header files, remove old middle square PRNG. Will switch to Lehmers random number generator
This commit is contained in:
parent
33625b72e5
commit
d38053870d
|
|
@ -1,4 +1,4 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
gcc hello.c
|
gcc main.c lib/*.c
|
||||||
./a.out
|
./a.out
|
||||||
|
|
|
||||||
186
hello.c
186
hello.c
|
|
@ -1,186 +0,0 @@
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
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));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,70 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "base10.h"
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
#ifndef ARRAY_H
|
||||||
|
#define ARRAY_H
|
||||||
|
|
||||||
|
int sizeofStr(char in[]);
|
||||||
|
|
||||||
|
void printStrArray(char in[]);
|
||||||
|
|
||||||
|
void printIntArray(int in[], int inLength);
|
||||||
|
|
||||||
|
int checkIntArraySorted(int in[], int inLength);
|
||||||
|
|
||||||
|
void intToIntArray(int in, int out[]);
|
||||||
|
|
||||||
|
int intArrayToInt(int in[], int inLength);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
/* 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;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
#ifndef BASE10_H
|
||||||
|
#define BASE10_H
|
||||||
|
|
||||||
|
unsigned long long intDigitCount(unsigned long long in);
|
||||||
|
|
||||||
|
unsigned long long intDigitExpand(unsigned long long in);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
float farenheitToCelsius(float farenheit) {
|
||||||
|
return (farenheit - 32.0) / 1.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
float celsiusToFarenheit(float celsius) {
|
||||||
|
return (celsius * 1.8) + 32.0;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
#ifndef TEMP_H
|
||||||
|
#define TEMP_H
|
||||||
|
|
||||||
|
float farenheitToCelsius(float farenheit);
|
||||||
|
|
||||||
|
float celsiusToFarenheit(float celsius);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "lib/temperature.h"
|
||||||
|
#include "lib/array.h"
|
||||||
|
#include "lib/base10.h"
|
||||||
|
|
||||||
|
void swapInt(int *pX, int *pY) {
|
||||||
|
int temp = *pX;
|
||||||
|
*pX = *pY;
|
||||||
|
*pY = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
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)));
|
||||||
|
|
||||||
|
printf("40C == %dF", (int) celsiusToFarenheit(40.0));
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue