From 91ce50b1899fcb2ae71d0a2efa63b93c234f2e00 Mon Sep 17 00:00:00 2001 From: cdez Date: Fri, 10 Nov 2023 14:34:28 -0700 Subject: [PATCH] Initialize PA10, STUB Functions ++ PA10 Files ++ Makefile for PA10 --- PA10-1115/Console_IO_Utility.c | 590 ++++++++++++++++++++++++++ PA10-1115/Console_IO_Utility.h | 289 +++++++++++++ PA10-1115/File_Input_Utility.c | 717 ++++++++++++++++++++++++++++++++ PA10-1115/File_Input_Utility.h | 295 +++++++++++++ PA10-1115/File_Output_Utility.c | 511 +++++++++++++++++++++++ PA10-1115/File_Output_Utility.h | 236 +++++++++++ PA10-1115/GeneralUtility.c | 81 ++++ PA10-1115/GeneralUtility.h | 78 ++++ PA10-1115/HashUtility.c | 209 ++++++++++ PA10-1115/HashUtility.h | 186 +++++++++ PA10-1115/Makefile | 43 ++ PA10-1115/PA10_Main.c | 240 +++++++++++ PA10-1115/PA10_SampleRun.txt | 399 ++++++++++++++++++ PA10-1115/StandardConstants.h | 73 ++++ PA10-1115/StateDataUtility.c | 83 ++++ PA10-1115/StateDataUtility.h | 74 ++++ PA10-1115/inData.csv | 50 +++ 17 files changed, 4154 insertions(+) create mode 100644 PA10-1115/Console_IO_Utility.c create mode 100644 PA10-1115/Console_IO_Utility.h create mode 100644 PA10-1115/File_Input_Utility.c create mode 100644 PA10-1115/File_Input_Utility.h create mode 100644 PA10-1115/File_Output_Utility.c create mode 100644 PA10-1115/File_Output_Utility.h create mode 100644 PA10-1115/GeneralUtility.c create mode 100644 PA10-1115/GeneralUtility.h create mode 100644 PA10-1115/HashUtility.c create mode 100644 PA10-1115/HashUtility.h create mode 100644 PA10-1115/Makefile create mode 100644 PA10-1115/PA10_Main.c create mode 100644 PA10-1115/PA10_SampleRun.txt create mode 100644 PA10-1115/StandardConstants.h create mode 100644 PA10-1115/StateDataUtility.c create mode 100644 PA10-1115/StateDataUtility.h create mode 100644 PA10-1115/inData.csv diff --git a/PA10-1115/Console_IO_Utility.c b/PA10-1115/Console_IO_Utility.c new file mode 100644 index 0000000..38b9f46 --- /dev/null +++ b/PA10-1115/Console_IO_Utility.c @@ -0,0 +1,590 @@ +// Header files included +#include "Console_IO_Utility.h" + +// Function Implementations + +/* +Name: clearLeadingCharacters +Process: Clears all leading non-printable characters from the console stream +Function input/parameters: allow space return (Boolean) +Function output/parameters: none +Function output/returned: first printable character as integer +Device input/keyboard: none +Device output/monitor: none +Dependencies: getchar +*/ +int clearLeadingCharacters( bool allowSpaceReturn ) + { + // initialize data, set input character to getChar, set count to zero + // function: getchar + int intChar = getchar(); + int charCount = 0; + + // loop while non-printable characters and space if not set + // also limits looping to constant limit + while( ( intChar < (int)SPACE + || ( !allowSpaceReturn && intChar == SPACE ) ) + && charCount < MAX_STR_LEN ) + { + // update character count + charCount++; + + // get new input character + // function: getchar + intChar = getchar(); + } + + // return captured character + return intChar; + } + +/* + +Name: getChar +Process: returns next character in stream, + ignores all white space (including SPACE) prior to character +Function input/parameters: flag to accept space (Boolean) +Function output/parameters: none +Function output/returned: one character (char) is returned to calling method +Device input/keyboard: places one or more characters in stream +Device output/monitor: none +Dependencies: getCharFiltered +*/ +char getChar() + { + // initialize variables, set space accept flag to false + bool dontAcceptSpace = false; + + // call filtered function with space accept flag + // function: getCharFiltered + return getCharFiltered( dontAcceptSpace ); + } + +/* +Name: getCharFiltered +Process: returns next character in stream, + ignores non printable characters prior to input character + but may accept space depending on flag +Function input/parameters: flag to accept space (boolean) +Function output/parameters: none +Function output/returned: first printable character or space (if configured) + returned (char) +Device input/keyboard: places one or more characters in stream +Device output/monitor: none +Dependencies: getchar(), clearLeadingCharacters +*/ +char getCharFiltered( bool acceptSpace ) + { + //Initialize variables + int inCharInt; + + // clear leading characters, capture first usable character + // function: clearLeadingCharacters + inCharInt = clearLeadingCharacters( acceptSpace ); + + // check for input character set to end of file + if( inCharInt == EOF ) + { + // return character zero + return '0'; + } + + // return input character as character + return (char)inCharInt; + } + +/* +Name: getInputString +Process: acquires input string from keyboard, if clear white space flag set, + ignores all white space, including space character +Function input/parameters: clear white space control (Boolean) +Function output/parameters: character array (char[]) +Function output/returned: none +Device input/keyboard: user entry of a character stream +Device output/monitor: none +Dependencies: getchar(), clearLeadingCharacters +*/ +void getInputString( char inputArr[], bool clearWhiteSpace ) + { + //Initialize Variables, set character count and index to zero + int charCount = 0; + int index = 0; + int intChar; + + // check for clear white space flag + if( clearWhiteSpace ) + { + // clear leading characters, set flag to ignore space + // function: clearLeadingCharacters + intChar = clearLeadingCharacters( !clearWhiteSpace ); + } + + // otherwise, assume white space flag not set + else + { + // get first character + // function: getchar + intChar = getChar(); + } + + // loop until enter key found, limit loop to constant + while( intChar != (int)NEWLINE_CHAR && charCount < MAX_STR_LEN ) + { + // set current value to array element + inputArr[ index ] = (char)intChar; + + // increment string array index + index++; + + // add null character to end of string array + inputArr[ index ] = NULL_CHAR; + + // increment character count + charCount++; + + // get next character + // function: getchar + intChar = getchar(); + } + } + +/* +Name: printCharacter +Process: prints a single character +Function input/parameters: character to be printed (char) +Function output/parameters: None +Function output/returned: None +Device input/keyboard: None +Device output/monitor: character printed as specified +Dependencies: printCharacters +*/ +void printCharacter( char outputChar ) + { + // initialize number of characters to one + int numberOfChars = 1; + + // print one character + // function: printChars + printCharacters( numberOfChars, outputChar ); + } + +/* +Name: printCharacters +Process: prints given number of characters +Function input/parameters: number of characters (int), + character to be printed (char) +Function output/parameters: None +Function output/returned: None +Device input/keyboard: None +Device output/monitor: Number of specified characters printed +Dependencies: printf +*/ +void printCharacters( int numChars, char outputChar ) + { + // check for reminaing characters to print + if( numChars > 0 ) + { + // print one character + // function: printf + printf( "%c", outputChar ); + + // (recursive) print remaining characters + // function: printChars + printCharacters( numChars - 1, outputChar ); + } + } + +/* +Name: printDouble +Process: simple print double function +Function input/parameters: + outVal - the double value to be output (double) + precision - the number of digits to the right of the decimal point (int) +Function output/parameters: none +Function output/returned: none +Device input: none +Device output/monitor: one double value displayed +Dependencies: printDoubleJustified +*/ +void printDouble( double outVal, int precision ) + { + // initialize variables, set block size to zero and justified to "LEFT" + int blockSize = 0; + char justified[] = "LEFT"; + + // call justified function with specified parameters + // function: printDoubleJustified + printDoubleJustified( outVal, precision, blockSize, justified ); + } + +/* +Name: printDoubleJustified +Process: the precision is set for the double value, then the pre-spaces + and post-spaces are calculated for the requested justification, + and then the pre-spaces are printed, the double value is printed, + and then the post-spaces are printed +Function input/parameters: + outVal - the double value to be output (double) + blockSize - the width of the block within which + to print the integer value (int) + justify - "LEFT," "RIGHT," or "CENTER" justification in block (c-string) +Function output/parameters: none +Function output/returned: none +Device input: none +Device output/monitor: one double value displayed, justified, with precision +Dependencies: formatDouble, printStringJustified +*/ +void printDoubleJustified( double outVal, int precision, + int blockSize, const char* justify ) + { + // initialize variables, create temp string for configuration string + char specStr[ MIN_STR_LEN ]; + + // initialize variables, create temporary output string + char outStr[ MIN_STR_LEN ]; + + // set configuration string with precision value + // function: sprintf + sprintf( specStr, "%s0.%dlf", "%", precision ); + + // set output string + // function: sprintf + sprintf( outStr, specStr, outVal ); + + // print string justified + // function: printStringJustified + printStringJustified( outStr, blockSize, justify ); + } + +/* +Name: printEndline +Process: prints single endline character to end a line or create vertical space +Function input/parameters: none +Function output/parameters: none +Function output/returned: none +Device input: none +Device output/monitor: one endline character output +Dependencies: printf +*/ +void printEndline() + { + // print one newline character + // function: printf + printf( "\n" ); + } + +/* +Name: printEndlines +Process: prints the specified number of endline characters + to end a line and/or create vertical space(s) +Function input/parameters: number of endlines (int) +Function output/parameters: none +Function output/returned: none +Device input: none +Device output/monitor: endline characters output as specified +Dependencies: printEndline +*/ +void printEndlines( int numEndlines ) + { + // check for number of end lines remaining + if( numEndlines > 0 ) + { + // print one endling + // function: printEndline + printEndline(); + + // (recursive) print remaining end lines + printEndlines( numEndlines - 1 ); + } + } + +/* + Name: printInteger + Process: prints integer value +Function input/parameters: outVal - the integer value to be output + Output: None + Device Input: None + Device Output: Integer is displayed as specified + Dependencies: printIntegerJustified + */ +void printInteger( int outVal ) + { + // initialize variables, set block size to zero, justifification to "LEFT" + int blockSize = 0; + char justified[] = "LEFT"; + + // print justified integer with specified parameters + // function: printIntegerJustified + printIntegerJustified( outVal, blockSize, justified ); + } + +/* + Name: printIntegerJustified + Process: prints integer value with the specified justification + within the specified blockSize +Function input/parameters: + outVal - the integer value to be output + blockSize - the width of the block within which + to print the integer value (int) + justify - "LEFT," "RIGHT," or "CENTER" justification in block (c-string) + Output: None + Device Input: None + Device Output: Integer is displayed as specified + Dependencies: sprintf, printStringJustified + */ +void printIntegerJustified( int outVal, int blockSize, const char *justify ) + { + // initialize variables, create temporary output string + char outStr[ MIN_STR_LEN ]; + + // convert integer to string + // function: sprintf + sprintf( outStr, "%d", outVal ); + + // print justified string + // function: printStringJustified + printStringJustified( outStr, blockSize, justify ); + } + +/* +Name: printLongInteger +Process: prints long integer +Function input/Parameters: outVal - the long integer value to be output +Function output/parameters: None +Function output/returned: None +Device Input/keyboard: None +Device Output/Monitor: integer is displayed as specified +Dependencies: printLongIntJustified +*/ +void printLongInteger( long outVal ) + { + // initialize variables, set block size to zero, justification to "LEFT" + int blockSize = 0; + char justified[] = "LEFT"; + + // print justified long integer with specified parameters + // function: printLongIntegerJustified + printLongIntegerJustified( outVal, blockSize, justified ); + } + +/* +Name: printLongIntegerJustified +Process: prints long integer with the specified justification + within the specified blockSize +Function input/Parameters: + outVal - the long integer value to be output + blockSize - the width of the block within which + to print the integer value (int) + justify - "LEFT," "RIGHT," or "CENTER" justification in block (c-string) +Function output/parameters: None +Function output/returned: None +Device Input/keyboard: None +Device Output/Monitor: integer is displayed as specified +Dependencies: sprintf, printStringJustified +*/ +void printLongIntegerJustified( long outVal, + int blockSize, const char *justify ) + { + // initialize variables, create temporary output string + char outStr[ MIN_STR_LEN ]; + + // convert long integer to string + // function: sprintf + sprintf( outStr, "%ld", outVal ); + + // print justified string + // function: printStringJustified + printStringJustified( outStr, blockSize, justify ); + } + +/* + Name: printString + Process: prints string +Function input/parameters: outVal - the string value to be output +Function output/parameters: None +Function output/returned: None +Function input/keyboard: None +Device output/monitor: string is displayed as specified +Dependencies: printStringJustified +*/ +void printString( const char *outStr ) + { + // initialize variables, set block size to zero, justification to "LEFT" + int blockSize = 0; + char justified[] = "LEFT"; + + // print justified string with specified parameters + // function: printStringJustified + printStringJustified( outStr, blockSize, justified ); + } + +/* + Name: printStringJustified + Process: prints string within specified block size + and with specified justification +Function input/parameters: + outVal - the string value to be output + blockSize - the width of the block within which + to print the integer value (int) + justify - "LEFT," "RIGHT," or "CENTER" justification in block (c-string) +Function output/parameters: None +Function output/returned: None +Function input/keyboard: None +Device output/monitor: string is displayed as specified +Dependencies: strlen, strcmp, printCharacters, printf +*/ +void printStringJustified ( const char *outStr, + int blockSize, const char *justify ) + { + // initialize variables, set pre-, post- spaces to zero + int preSpaces = 0, postSpaces = 0, strLength; + + // find length of string + // function: strlen + strLength = strlen( outStr ); + + // check justification for "LEFT" + // function: strcmp + if( strcmp( justify, "LEFT" ) == 0 ) + { + // set post spaces for left justification + postSpaces = blockSize - strLength; + } + + // otherwise, check justification for "RIGHT" + // function: strcmp + else if( strcmp( justify, "RIGHT" ) == 0 ) + { + // set pre spaces for right justification + preSpaces = blockSize - strLength; + } + + // Otherwise, assume "CENTER" justification + else + { + // set pre spaces for centered + preSpaces = blockSize / 2 - strLength / 2; + + // set post spaces for centered + postSpaces = blockSize - strLength - preSpaces; + } + + // print pre spaces + // function: printChars + printCharacters( preSpaces, SPACE ); + + // print string + // function: printf + printf( "%s", outStr ); + + // print post spaces + // function: printChars + printCharacters( postSpaces, SPACE ); + } + +/* +Name: promptForCharacter +Process: prompts user for character, then returns it +Function input/parameters: text to prompt user (c-string) +Function output/parameters: None +Function output/returned: one character (chars +Device input/keyboard: user entry of a character +Device output/monitor: prompt string displayed +Dependencies: printf, getChar +*/ +char promptForCharacter( const char *promptString ) + { + // initialize variables + char outChar; + + // print prompt string + // function: printf + printf( "%s", promptString ); + + // get character from stream + // function: getChar + outChar = (char)getChar(); + + // return captured character + return outChar; + } + +/* +Name: promptForDouble +Process: prompts user for double, then returns it +Function input/parameters: test to prompt user (c-string) +Function output/parameters: None +Function output/returned: value (double) +Device input/keyboard: user entry of an integer value +Device output/monitor: prompt string displayed +Dependencies: printf, scanf + */ +double promptForDouble( const char *promptString ) + { + // initialize variables + double outDouble; + + // print prompt string + // function: printf + printf( "%s", promptString ); + + // get double value + // function: scanf + scanf( "%lf", &outDouble ); + + // return captured double + return outDouble; + } + +/* +Name: promptForInteger +Process: prompts user for integer, then returns it +Function input/parameters: text to prompt user (c-string) +Function output/parameters: none +Function output/returned: integer value (int) +Device input/keyboard: user entry of a double value +Device output/monitor: prompt string displayed +Dependencies: printf, scanf +*/ +int promptForInteger( const char *promptString ) + { + // initialize variables + int outInt; + + // print prompt string + // function: printf + printf( "%s", promptString ); + + // input integer + // function: scanf + scanf( "%d", &outInt ); + + // return captured integer + return outInt; + } + +/* +Name: promptForString +Process: prompts user for string, then returns it +Function input/parameters: text to prompt user (c-string) +Function output/parameters: input string from user(c-string) +Function output/returned: none +Device input/keyboard: user entry of a string value +Device output/monitor: prompt string displayed +Dependencies: printf, getInputString +*/ +void promptForString( const char *promptString, char returnStr[] ) + { + // initialize variables, don't allow white space capture + bool dontClearWhitespace = false; + + // pring prompt string + // function: printf + printf( "%s", promptString ); + + // get input string from user (returned via parameter) + // function: getInputString + getInputString( returnStr, dontClearWhitespace ); + } + + diff --git a/PA10-1115/Console_IO_Utility.h b/PA10-1115/Console_IO_Utility.h new file mode 100644 index 0000000..cb76f1c --- /dev/null +++ b/PA10-1115/Console_IO_Utility.h @@ -0,0 +1,289 @@ +// Preprocessor directive +#ifndef CONSOLE_IO_UTILITY_H +#define CONSOLE_IO_UTILITY_H + +//Header Files +#include +#include +#include +#include "StandardConstants.h" + +//Global Constants + + // none + +//Function Prototypes + +/* +Name: clearLeadingCharacters +Process: Clears all leading non-printable characters from the console stream +Function input/parameters: allow space return (bool) +Function output/parameters: none +Function output/returned: first printable character as integer +Device input/keyboard: none +Device output/monitor: none +Dependencies: getchar +*/ +int clearLeadingCharacters( bool allowSpaceReturn ); + +/* +Name: getChar +Process: returns next character in stream, + ignores all white space (including SPACE) prior to character +Function input/parameters: flag to accept space (bool) +Function output/parameters: none +Function output/returned: one character (char) is returned to calling method +Device input/keyboard: places one or more characters in stream +Device output/monitor: none +Dependencies: +*/ +char getChar(); + +/* +Name: getCharFiltered +Process: returns next character in stream, + ignores non printable characters prior to input character + but may accept space depending on flag +Function input/parameters: flag to accept space (bool) +Function output/parameters: none +Function output/returned: first printable character or space (if configured) + returned (char) +Device input/keyboard: places one or more characters in stream +Device output/monitor: none +Dependencies: getchar(), clearLeadingCharacters +*/ +char getCharFiltered( bool acceptSpace ); + +/* +Name: getInputString +Process: acquires input string from keyboard, if clear white space flag set, + ignores all white space, including space character +Function input/parameters: clear white space control (bool) +Function output/parameters: character array (char[]) +Function output/returned: none +Device input/keyboard: user entry of a character stream +Device output/monitor: none +Dependencies: getchar(), clearLeadingCharacters +*/ +void getInputString(char inputArr[], bool clearWhiteSpace ); + +/* +Name: printCharacter +Process: prints a single character +Function input/parameters: character to be printed (char) +Function output/parameters: None +Function output/returned: None +Device input/keyboard: None +Device output/monitor: character printed as specified +Dependencies: printCharacters +*/ +void printCharacter( char outputChar ); + +/* +Name: printCharacters +Process: prints given number of characters +Function input/parameters: number of characters (int), + character to be printed (char) +Function output/parameters: None +Function output/returned: None +Device input/keyboard: None +Device output/monitor: Number of specified characters printed +Dependencies: printf +*/ +void printCharacters( int numChars, char outputChar ); + +/* +Name: printDouble +Process: simple print double function +Function input/parameters: + outVal - the double value to be output (double) + precision - the number of digits to the right of the decimal point (int) +Function output/parameters: none +Function output/returned: none +Device input: none +Device output/monitor: one double value displayed +Dependencies: printDoubleJustified +*/ +void printDouble( double outVal, int precision ); + +/* +Name: printDoubleJustified +Process: the precision is set for the double value, then the pre-spaces + and post-spaces are calculated for the requested justification, + and then the pre-spaces are printed, the double value is printed, + and then the post-spaces are printed +Function input/parameters: + outVal - the double value to be output (double) + blockSize - the width of the block within which + to print the integer value (int) + justify - "LEFT," "RIGHT," or "CENTER" justification in block (c-string) +Function output/parameters: none +Function output/returned: none +Device input: none +Device output/monitor: one double value displayed, justified, with precision +Dependencies: formatDouble, printStringJustified +*/ +void printDoubleJustified( double outVal, int precision, + int blockSize, const char* justify ); + +/* +Name: printEndline +Process: prints single endline character to end a line or create vertical space +Function input/parameters: none +Function output/parameters: none +Function output/returned: none +Device input: none +Device output/monitor: one endline character output +Dependencies: printEndline +*/ +void printEndline(); + +/* +Name: printEndlines +Process: prints the specified number of endline characters + to end a line and/or create vertical space(s) +Function input/parameters: number of endlines (int) +Function output/parameters: none +Function output/returned: none +Device input: none +Device output/monitor: endline characters output as specified +Dependencies: printEndline +*/ +void printEndlines( int numEndlines ); + +/* + Name: printInteger + Process: prints integer value + Function input/parameters: outVal - the integer value to be output + Function output/parameters: None + Device Input: None + Device Output: Integer is displayed as specified + Dependencies: printIntegerJustified + */ +void printInteger( int outVal ); + +/* + Name: printIntegerJustified + Process: prints integer value with the specified justification + within the specified blockSize + Function input/parameters: + outVal - the integer value to be output (int) + blockSize - the width of the block within which + to print the integer value (int) + justify - "LEFT," "RIGHT," or "CENTER" justification in block (c-string) + Function output/parameters: none + Device Input: None + Device Output: Integer is displayed as specified + Dependencies: sprintf, printStringJustified + */ +void printIntegerJustified( int outVal, int blockSize, const char *justify ); + +/* +Name: printLongInteger +Process: prints long integer +Function input/Parameters: outVal - the long integer value to be output +Function output/parameters: None +Function output/returned: None +Device Input/keyboard: None +Device Output/Monitor: integer is displayed as specified +Dependencies: printLongIntJustified +*/ +void printLongInteger( long outVal ); + +/* +Name: printLongIntegerJustified +Process: prints long integer with the specified justification + within the specified blockSize +Function Input/Parameters: + outVal - the long integer value to be output (long int) + blockSize - the width of the block within which + to print the integer value (int) + justify - "LEFT," "RIGHT," or "CENTER" justification in block (c-string) +Function output/parameters: None +Function output/returned: None +Device Input/keyboard: None +Device Output/Monitor: integer is displayed as specified +Dependencies: sprintf, printStringJustified +*/ +void printLongIntegerJustified( long outVal, + int blockSize, const char *justify ); + +/* + Name: printString + Process: prints string +Function input/parameters: outVal - the string value to be output +Function output/parameters: None +Function output/returned: None +Function input/keyboard: None +Device output/monitor: string is displayed as specified +Dependencies: printStringJustified +*/ +void printString( const char *outStr ); + +/* + Name: printStringJustified + Process: prints string within specified block size + and with specified justification +Function input/parameters: + outStr - the string value to be output (c-string) + blockSize - the width of the block within which + to print the integer value (int) + justify - "LEFT," "RIGHT," or "CENTER" justification in block (c-string) +Function output/parameters: None +Function output/returned: None +Function input/keyboard: None +Device output/monitor: string is displayed as specified +Dependencies: strlen, strcmp, printCharacters, printf +*/ +void printStringJustified( const char *outStr, + int blockSize, const char *justify ); + +/* +Name: promptForCharacter +Process: prompts user for character, then returns it +Function input/parameters: text to prompt user (c-string) +Function output/parameters: None +Function output/returned: one character (chars +Device input/keyboard: user entry of a character +Device output/monitor: prompt string displayed +Dependencies: printf, getChar +*/ +char promptForCharacter( const char *promptString ); + +/* +Name: promptForDouble +Process: prompts user for double, then returns it +Function input/parameters: test to prompt user (c-string) +Function output/parameters: None +Function output/returned: value (double) +Device input/keyboard: user entry of an integer value +Device output/monitor: prompt string displayed +Dependencies: printf, scanf + */ +double promptForDouble( const char *promptString ); + +/* +Name: promptForInteger +Process: prompts user for integer, then returns it +Function input/parameters: text to prompt user (c-string) +Function output/parameters: none +Function output/returned: integer value (int) +Device input/keyboard: user entry of a double value +Device output/monitor: prompt string displayed +Dependencies: printf, scanf +*/ +int promptForInteger( const char *promptString ); + +/* +Name: promptForString +Process: prompts user for string, then returns it +Function input/parameters: text to prompt user (c-string) +Function output/parameters: input string captured (c-string) +Function output/returned: none +Device input/keyboard: user entry of a string value +Device output/monitor: prompt string displayed +Dependencies: printf, getInputString +*/ +void promptForString( const char *promptString, char returnStr[] ); + +#endif // end CONSOLE_IO_UTILITY_H diff --git a/PA10-1115/File_Input_Utility.c b/PA10-1115/File_Input_Utility.c new file mode 100644 index 0000000..a7bbd68 --- /dev/null +++ b/PA10-1115/File_Input_Utility.c @@ -0,0 +1,717 @@ +/* +Formatted file input utility, function implementations + +Copyright (c) 2021 by Michael E. Leverington + +Code is free for use in whole or in part and may be modified for other +non-commercial use as long as the above copyright statement is included. +*/ + +// header files +#include "File_Input_Utility.h" +#include //////////////////////////test + +// local global constants, used only in this file + + // dummy file pointer for accessInputFilePointer + const FILE *DUMMY_INPUT_FILE_PTR = NULL; + + // dummy Boolean for accessEndOfInputFileFlag, accessOpenFlag + const char DUMMY_INPUT_FLAG = false; + + // control code for accessing file pointer, accessInputFilePointer + const int GET_INPUT_FILE_PTR = 3003; + + // control code for accessing flag value, + // accessEndOfInputFileFlag, accessOpenFlag + const int GET_INPUT_FLAG = 2002; + + // control code for setting file pointer, accessInputFilePointer + const int SET_INPUT_FILE_PTR = 4004; + + // control code for setting flag value, accessEndOfInputFileFlag, + // accessOpenFlag + const int SET_INPUT_FLAG = 1001; + + + /* + Name: accessEndOfInputFileFlag + process: allows accessing or modifying end of file flag state; + note: flag is maintained (static) value initialized to false + Function input/parameters: control code (int), flag state (bool) + Function output/parameters: none + Function output/returned: result of flag state (bool) + Device input/file: none + Device output/monitor: none + Dependencies: none + */ + bool accessEndOfInputFileFlag( int ctrlCode, bool setFlag ) + { + // initialize end of file flag to false + static bool endOfFileFlag = false; + + // test for set flag + if( ctrlCode == SET_INPUT_FLAG ) + { + // set flag to given state + endOfFileFlag = setFlag; + } + + // return flag state + return endOfFileFlag; + } + + /* + Name: accessInputFilePointer + process: allows setting or accessing file pointer; + note: pointer is maintained (static) value initialized to NULL + Function input/parameters: control code (int), file pointer (FILE *) + DUMMY_INPUT_FILE_PTR used + if not setting file pointer + Function output/parameters: none + Function output/returned: file pointer (FILE *) + Device input/file: none + Device output/monitor: none + Dependencies: none + */ + FILE *accessInputFilePointer( int ctrlCode, const FILE *filePtr ) + { + // initialize file pointer to null + static FILE *filePointer = NULL; + + // check for set new pointer + if( ctrlCode == SET_INPUT_FILE_PTR ) + { + // set file pointer to parameter + filePointer = (FILE *)filePtr; + } + + // return file pointer + return filePointer; + } + + /* + Name: checkForEndOfInputFile + process: checks to see if end of file flag has been encountered, + returns true if EOF has been encountered, false otherwise + Function input/parameters: none + Function output/parameters: none + Function output/returned: result of specified test (bool) + Device input/file: none + Device output/monitor: none + Dependencies: accessEndOfInputFileFlag + */ + bool checkForEndOfInputFile() + { + // return access to end of file flag + // function: accessEndOfInputFileFlag + return accessEndOfInputFileFlag( GET_INPUT_FLAG, DUMMY_INPUT_FLAG ); + } + + /* + Name: checkForInputFileOpen + process: checks to see if file is currently open + returns true if file pointer not null, false otherwise + Function input/parameters: none + Function output/parameters: none + Function output/returned: result of specified test (bool) + Device input/file: none + Device output/monitor: none + Dependencies: accessInputFilePointer + */ + bool checkForInputFileOpen() + { + // return access to end of file flag + // function: accessInputFilePointer + return accessInputFilePointer( GET_INPUT_FLAG, + DUMMY_INPUT_FILE_PTR ) != NULL; + } + + /* + Name: clearLeadingWhiteSpace + process: captures non printable characters, + and space if flag set, + returns first non white space value found as integer + Function input/parameters: file pointer (FILE *), clear space flag (bool) + Function output/parameters: none + Function output/returned: first non WS character as integer + Device input/file: value captured from file + Device output/monitor: none + Dependencies: fgetc + */ + int clearLeadingWhiteSpace( FILE *filePtr, bool clearSpace ) + { + // initialize character input value + // function: fgetc + int charInt = fgetc( filePtr ); + + while( + // continue if not at end of file + ( charInt != EOF ) + + // AND + // continue if character is non printable + && ( ( charInt < (int)SPACE || charInt > (int)HIGHEST_PRINTABLE_CHAR ) + + // OR + // continue if clear space flag set and space is found + || ( clearSpace && charInt == SPACE ) ) + ) + { + // capture next character + // function: fgetc + charInt = fgetc( filePtr ); + } + + // return input value as character + return (char)charInt; + } + + /* + Name: closeInputFile + process: closes input file, returns true if successful, false otherwise + Function input/parameters: none + Function output/parameters: none + Function output/returned: none + Device input/file: file closed + Device output/monitor: none + Dependencies: accessInputFilePointer, fclose, accessEndOfInputFileFlag + */ + bool closeInputFile() + { + // set local file pointer to working file pointer + // function: accessInputFilePointer + FILE *filePtr = accessInputFilePointer( GET_INPUT_FILE_PTR, + DUMMY_INPUT_FILE_PTR ); + + // check for valid file pointer + if( filePtr != NULL ) + { + // close file + fclose( filePtr ); + + // set pointer to NULL + // function: accessInputFilePointer + accessInputFilePointer( SET_INPUT_FILE_PTR, NULL ); + + // set end of file flag to false + // function: accessEndOfInputFileFlag + accessEndOfInputFileFlag( SET_INPUT_FLAG, false ); + + // return successful operation + return true; + } + + // return failed operation + return false; + } + + /* + Name: openInputFile + process: opens input file, sets file pointer and unsets end of file flag, + returns true if successful, false otherwise + Function input/parameters: file name (c-string) + Function output/parameters: none + Function output/returned: success of operation (bool) + Device input/file: file opened + Device output/monitor: none + Dependencies: fopen, accessInputFilePointer, accessEndOfInputFileFlag + */ + bool openInputFile( const char *fileName ) + { + // initialize variables + FILE *filePtr = NULL; + char readOnlyCharacter[] = "r"; + + // check for file not open + // function: checkForInputFileOpen + if( !checkForInputFileOpen() ) + { + // open file + // function: fopen + filePtr = fopen( fileName, readOnlyCharacter ); + + // check for success of file open + if( filePtr != NULL ) + { + // set pointer in access function + // function: accessInputFilePointer + accessInputFilePointer( SET_INPUT_FILE_PTR, filePtr ); + + // reset end of file flag, if needed + // accessEndOfInputFileFlag + accessEndOfInputFileFlag( SET_INPUT_FLAG, false ); + + // return operation success + return true; + } + } + // end of file not previously opened block + + // return operation failure + return false; + } + + /* + Name: readCharacterFromFile + process: ignores leading unprintable characters, including space, + captures first printable character + Function input/parameters: allow space capture (bool) + Function output/parameters: none + Function output/returned: character found if successful, ZERO_CHAR otherwise + Device input/file: character(s) captured from file as needed + Device output/monitor: none + Dependencies: readCharacterFromFileConfigured + */ + char readCharacterFromFile() + { + // initialize parameter to not allow space + bool noSpaceCapture = false; + + // capture character, return + // function: getCharFromFileConfigured + return readCharacterFromFileConfigured( noSpaceCapture ); + } + + /* + Name: readCharacterFromFileConfigured + process: ignores leading unprintable characters, + captures first printable character, + including space if allowed + Function input/parameters: allow space capture (bool) + Function output/parameters: none + Function output/returned: character found if successful, ZERO_CHAR otherwise + Device input/file: character(s) captured from file as needed + Device output/monitor: none + Dependencies: checkForInputFileOpen, checkForEndOfInputFile, + accessInputFilePointer, clearLeadingWhiteSpace, + accessEndOfInputFileFlag + */ + char readCharacterFromFileConfigured( bool captureSpace ) + { + // initialize variables + FILE *filePtr; + int intChar = ZERO_CHAR; + + // check for file open and data accessible + // function: checkForInputFileOpen, checkForEndOfInputFile + if( checkForInputFileOpen() && !checkForEndOfInputFile() ) + { + // set file pointer + // function: accessInputFilePointer + filePtr = accessInputFilePointer( GET_INPUT_FILE_PTR, + DUMMY_INPUT_FILE_PTR ); + + // get character + // function: clearLeadingWhiteSpace + intChar = clearLeadingWhiteSpace( filePtr, !captureSpace ); + + // check for end of file found + if( intChar == EOF ) + { + // set end of file flag + // function: accessEndOfInputFileFlag + accessEndOfInputFileFlag( SET_INPUT_FLAG, true ); + + // set return value to zero + intChar = ZERO_CHAR; + } + } + + // return value as character + return intChar; + } + + /* + Name: readDoubleFromFile + process: ignores leading unprintable characters, + captures first contiguous double value + Function input/parameters: none + Function output/parameters: none + Function output/returned: double value found if successful (double) + Device input/file: double value captured from file + Device output/monitor: none + Dependencies: checkForInputFileOpen, checkForEndOfInputFile, + accessInputFilePointer, fscanf, accessEndOfInputFileFlag + */ + double readDoubleFromFile() + { + // initialize variables + FILE *filePtr = NULL; + int fscanfReturn = EOF; + double doubleVal = ZERO_VALUE; + + // check for file open and data accessible + // function: checkForInputFileOpen, checkForEndOfInputFile + if( checkForInputFileOpen() && !checkForEndOfInputFile() ) + { + // set file pointer + // function: accessInputFilePointer + filePtr = accessInputFilePointer( GET_INPUT_FILE_PTR, + DUMMY_INPUT_FILE_PTR ); + + // get double value + // function: fscanf + fscanfReturn = fscanf( filePtr, "%lf", &doubleVal ); + + // check for end of file found + if( fscanfReturn == EOF ) + { + // set end of file flag + // function: accessEndOfInputFileFlag + accessEndOfInputFileFlag( SET_INPUT_FLAG, true ); + + // set return value to zero + doubleVal = ZERO_VALUE; + } + } + + // return acquired value + return doubleVal; + } + + /* + Name: readIntegerFromFile + process: ignores leading unprintable characters, + captures first contiguous integer + Function input/parameters: none + Function output/parameters: none + Function output/returned: integer found if successful, ZERO_VALUE otherwise + Device input/file: character(s) captured from file as needed + Device output/monitor: none + Dependencies: checkForInputFileOpen, checkForEndOfInputFile, + accessInputFilePointer, fscanf, accessEndOfInputFileFlag + */ + int readIntegerFromFile() + { + // initialize variables + FILE *filePtr = NULL; + int fscanfReturn = EOF; + int intVal = ZERO_VALUE; + + // check for file open and data accessible + // function: checkForInputFileOpen, checkForEndOfInputFile + if( checkForInputFileOpen() && !checkForEndOfInputFile() ) + { + // set file pointer + // function: accessInputFilePointer + filePtr = accessInputFilePointer( GET_INPUT_FILE_PTR, + DUMMY_INPUT_FILE_PTR ); + + // get integer value + // function: fscanf + fscanfReturn = fscanf( filePtr, "%d", &intVal ); + + // check for end of file found + if( fscanfReturn == EOF ) + { + // set end of file flag + // function: accessEndOfInputFileFlag + accessEndOfInputFileFlag( SET_INPUT_FLAG, true ); + + // set return value to zero + intVal = ZERO_VALUE; + } + } + + // return acquired value + return intVal; + } + + /* + Name: readLongFromFile + process: ignores leading unprintable characters, + captures first contiguous long int + Function input/parameters: none + Function output/parameters: none + Function output/returned: long integer found if successful, + ZERO_VALUE otherwise + Device input/file: long value captured from file + Device output/monitor: none + Dependencies: checkForInputFileOpen, checkForEndOfInputFile, + accessInputFilePointer, fscanf, accessEndOfInputFileFlag + */ + long readLongFromFile() + { + // initialize variables + FILE *filePtr = NULL; + int fscanfReturn = EOF; + long longVal = ZERO_VALUE; + + // check for file open and data accessible + // function: checkForInputFileOpen, checkForEndOfInputFile + if( checkForInputFileOpen() && !checkForEndOfInputFile() ) + { + // set file pointer + // function: accessInputFilePointer + filePtr = accessInputFilePointer( GET_INPUT_FILE_PTR, + DUMMY_INPUT_FILE_PTR ); + + // get long value + // function: fscanf + fscanfReturn = fscanf( filePtr, "%ld", &longVal ); + + // check for end of file found + if( fscanfReturn == EOF ) + { + // set end of file flag + // function: accessEndOfInputFileFlag + accessEndOfInputFileFlag( SET_INPUT_FLAG, true ); + + // set return value to zero + longVal = ZERO_VALUE; + } + } + + // return acquired value + return longVal; + } + + /* + Name: readRawCharFromFile + process: captures first character in file stream including non-printable + Function input/parameters: none + Function output/parameters: none + Function output/returned: character found if successful, ZERO_CHAR otherwise + Device input/file: character captured from file + Device output/monitor: none + Dependencies: checkForInputFileOpen, checkForEndOfInputFile, + accessInputFilePointer, fgetc, accessEndOfInputFileFlag + */ + char readRawCharFromFile() + { + // initialize variables + FILE *filePtr = NULL; + int intChar = (int)ZERO_CHAR; + + // check for file open and data accessible + // function: checkForInputFileOpen, checkForEndOfInputFile + if( checkForInputFileOpen() && !checkForEndOfInputFile() ) + { + // set file pointer + // function: accessInputFilePointer + filePtr = accessInputFilePointer( GET_INPUT_FILE_PTR, + DUMMY_INPUT_FILE_PTR ); + + // get character + // function: fgetc + intChar = fgetc( filePtr ); + + // check for end of file found + if( intChar == EOF ) + { + // set end of file flag + // function: accessEndOfInputFileFlag + accessEndOfInputFileFlag( SET_INPUT_FLAG, true ); + + // set return value to zero + intChar = (int)ZERO_CHAR; + } + } + + // return acquired value + return (char)intChar; + } + + /* + Name: readStringConfiguredFromFile + Process: captures string with options: + - clear leading non printable (bool) + - clear leading space character (bool) + - adquires characters up to any non-printable (bool) + - adquires characters up to any printable delimiter (char) + - use constant NON_PRINTABLE if no delimiter + - also stops capture when full (MAX_STR_LEN) + Note: This function consumes the last character input, + including the space, delimiter, or non-printable character + Function input/parameters: see process above + Function output/parameters: captured string (char *), EMPTY_STRING otherwise + Function output/returned: success of operation (bool) + Device input/file: character(s) captured from file as needed + Device output/monitor: none + Dependencies: checkForInputFileOpen, checkForEndOfInputFile, + clearLeadingWhiteSpace, fgetc, accessEndOfInputFileFlag + */ + bool readStringConfiguredFromFile( bool clearLeadingNonPrintable, + bool clearLeadingSpace, + bool stopAtNonPrintable, + char delimiter, + char *capturedString ) + { + // initialize variables + int intChar = EOF, index = 0; + FILE *filePtr = NULL; + + // initialize output string + capturedString[ index ] = NULL_CHAR; + + // check for file open and data accessible + // function: checkForInputFileOpen, checkForEndOfInputFile + if( checkForInputFileOpen() && !checkForEndOfInputFile() ) + { + // get file pointer + // function: accessFilePtr + filePtr = accessInputFilePointer( GET_INPUT_FILE_PTR, + DUMMY_INPUT_FILE_PTR ); + + // check for clearing non printable + if( clearLeadingNonPrintable ) + { + // clear leading white space, with clear space character flag + // function: clearLeadingWhiteSpace + intChar = clearLeadingWhiteSpace( filePtr, clearLeadingSpace ); + } + + // otherwise, assume non printable not cleared + else + { + // get first character + // function: fgetc + intChar = fgetc( filePtr ); + + // check for clearing spaces + if( clearLeadingSpace ) + { + // loop while spaces found and end of file not found + while( intChar != EOF && intChar == (int)SPACE ) + { + // capture new character + // function: fgetc + intChar = fgetc( filePtr ); + } + } + } // end leading character clearing process + + // check for end of file found + if( intChar == EOF ) + { + // set end of file flag + // function: accessEndOfInputFileFlag + accessEndOfInputFileFlag( SET_INPUT_FLAG, true ); + + // return failed operation + return false; + } + + // loop to capture input + while( + // continues if not at end of file and max string length not reached + ( intChar != EOF && index < MAX_STR_LEN - 1 ) + + // AND + // continues if not printable flag set and characters are printable + // OR not printable flag not set + && ( ( stopAtNonPrintable && intChar >= (int)SPACE ) + || ( !stopAtNonPrintable ) ) + + // AND + // continues if specified delimiter is not found + && ( intChar != (char)delimiter ) + ) + { + // place character in array element + capturedString[ index ] = (char)intChar; + + // increment array index + index++; + + // set next element to null character / end of c-string + capturedString[ index ] = NULL_CHAR; + + // get next character as integer + // function: fgetc + intChar = fgetc( filePtr ); + } + // end loop + + // return successful operation + return true; + } + // end of open file and accessible data block + + return false; // temporary stub return + } + + /* + Name: readStringSegmentFromFile + process: ignores leading white space, including space character, + captures series of characters up to first space, + or end of line, or full string + Function input/parameters: none + Function output/parameters: captured string (char *), EMPTY_STRING otherwise + Function output/returned: success of operation (bool) + Device input/file: character(s) captured from file as needed + Device output/monitor: none + Dependencies: readStringConfigured with appropriate parameters + */ + bool readStringSegmentFromFile( char *capturedString ) + { + // initialize variables + bool clearLeadingNonPrintable = true; + bool clearLeadingSpace = true; + bool stopAtNonPrintable = true; + char delimiter = SPACE; + + // call utility function, return + return readStringConfiguredFromFile( clearLeadingNonPrintable, + clearLeadingSpace, + stopAtNonPrintable, + delimiter, + capturedString ); + } + + /* + Name: readStringToLineEndFromFile + process: ignores leading white space, including space character, + captures series of characters up to end of current line + or full string + Function input/parameters: none + Function output/parameters: captured string (char *), EMPTY_STRING otherwise + Function output/returned: string found if successful + Device input/file: character(s) captured from file as needed + Device output/monitor: none + Dependencies: readStringConfigured with appropriate parameters + */ + bool readStringToLineEndFromFile( char *capturedString ) + { + // initialize variables + bool clearLeadingNonPrintable = true; + bool clearLeadingSpace = true; + bool stopAtNonPrintable = true; + char delimiter = NON_PRINTABLE; + + // call utility function, return + return readStringConfiguredFromFile( clearLeadingNonPrintable, + clearLeadingSpace, + stopAtNonPrintable, + delimiter, + capturedString ); + } + + /* + Name: readStringToDelimiterFromFile + process: ignores leading white space, including space character, + captures series of characters up to specified character + Function input/parameters: none + Function output/parameters: captured string (char *), EMPTY_STRING otherwise + Function output/returned: string found if successful + Device input/file: character(s) captured from file as needed + Device output/monitor: none + Dependencies: readStringConfigured with appropriate parameters + */ + bool readStringToDelimiterFromFile( char delimiter, char *capturedString ) + { + // initialize variables + bool clearLeadingNonPrintable = true; + bool clearLeadingSpace = true; + bool stopAtNonPrintable = true; + + // call utility function, return + return readStringConfiguredFromFile( clearLeadingNonPrintable, + clearLeadingSpace, + stopAtNonPrintable, + delimiter, + capturedString ); + } + + diff --git a/PA10-1115/File_Input_Utility.h b/PA10-1115/File_Input_Utility.h new file mode 100644 index 0000000..70d3552 --- /dev/null +++ b/PA10-1115/File_Input_Utility.h @@ -0,0 +1,295 @@ +/* +Formatted file input utility, function prototypes + +Copyright (c) 2021 by Michael E. Leverington + +Code is free for use in whole or in part and may be modified for other +non-commercial use as long as the above copyright statement is included. +*/ +/* +Rev 0.0: 30 June 2021, Initial creation of file + +UTILITY USAGE INSTRUCTIONS: + +1) This utility contains functions that may be used for file input operations + using the C programming language with text files. + The utility must be linked with the program code with which + it will be used. + +2) Specifications for all the functions + are provided in a standardized format below. + +3) Use this code at your own risk. There is no guarantee of any performance, + implied or otherwise, for any part of this code + + END OF INSTRUCTIONS +*/ + +// PreProcessor test +#ifndef FILE_INPUT_UTILITY_H +#define FILE_INPUT_UTILITY_H + +// header files +#include +#include +#include "StandardConstants.h" + +// constants shared with other files + + // non printable flag, used in getStringConfigured + static const char NON_PRINTABLE = (char)(127); + + // constant used for zero character return + static const char ZERO_CHAR = '0'; + + // constant used for zero int/double value return + static const char ZERO_VALUE = 0; + +// function prototypes + + /* + Name: accessEndOfInputFileFlag + process: allows accessing or modifying end of file flag state; + note: flag is maintained (static) value initialized to false + Function input/parameters: control code (int), flag state (bool) + Function output/parameters: none + Function output/returned: result of flag state (bool) + Device input/file: none + Device output/monitor: none + Dependencies: none + */ + bool accessEndOfInputFileFlag( int ctrlCode, bool setFlag ); + + /* + Name: accessInputFilePointer + process: allows setting or accessing file pointer; + note: pointer is maintained (static) value initialized to NULL + Function input/parameters: control code (int), file pointer (FILE *) + DUMMY_INPUT_FILE_PTR used + if not setting file pointer + Function output/parameters: none + Function output/returned: file pointer (FILE *) + Device input/file: none + Device output/monitor: none + Dependencies: none + */ + FILE *accessInputFilePointer( int ctrlCode, const FILE *filePtr ); + + /* + Name: checkForEndOfInputFile + process: checks to see if end of file flag has been encountered, + returns true if EOF has been encountered, false otherwise + Function input/parameters: none + Function output/parameters: none + Function output/returned: result of specified test (bool) + Device input/file: none + Device output/monitor: none + Dependencies: accessEndOfInputFileFlag + */ + bool checkForEndOfInputFile(); + + /* + Name: checkForInputFileOpen + process: checks to see if file is currently open + returns true if file pointer not null, false otherwise + Function input/parameters: none + Function output/parameters: none + Function output/returned: result of specified test (bool) + Device input/file: none + Device output/monitor: none + Dependencies: accessInputFilePointer + */ + bool checkForInputFileOpen(); + + /* + Name: clearLeadingWhiteSpace + process: captures non printable characters, + and space if flag set, + returns first non white space value found as integer + Function input/parameters: file pointer (FILE *), clear space flag (bool) + Function output/parameters: none + Function output/returned: first non WS character as integer + Device input/file: value captured from file + Device output/monitor: none + Dependencies: fgetc + */ + int clearLeadingWhiteSpace( FILE *filePtr, bool clearSpace ); + + /* + Name: closeInputFile + process: closes input file, returns true if successful, false otherwise + Function input/parameters: none + Function output/parameters: none + Function output/returned: none + Device input/file: file closed + Device output/monitor: none + Dependencies: accessInputFilePointer, fclose, accessEndOfInputFileFlag + */ + bool closeInputFile(); + + /* + Name: openInputFile + process: opens input file, sets file pointer and unsets end of file flag, + returns true if successful, false otherwise + Function input/parameters: file name (c-string) + Function output/parameters: none + Function output/returned: success of operation (bool) + Device input/file: file opened + Device output/monitor: none + Dependencies: fopen, accessInputFilePointer, accessEndOfInputFileFlag + */ + bool openInputFile( const char *fileName ); + + /* + Name: readCharacterFromFile + process: ignores leading unprintable characters, including space, + captures first printable character + Function input/parameters: allow space capture (bool) + Function output/parameters: none + Function output/returned: character found if successful, ZERO_CHAR otherwise + Device input/file: character(s) captured from file as needed + Device output/monitor: none + Dependencies: readCharacterFromFileConfigured + */ + char readCharacterFromFile(); + + /* + Name: readCharacterFromFileConfigured + process: ignores leading unprintable characters, + captures first printable character, + including space if allowed + Function input/parameters: allow space capture (bool) + Function output/parameters: none + Function output/returned: character found if successful, ZERO_CHAR otherwise + Device input/file: character(s) captured from file as needed + Device output/monitor: none + Dependencies: checkForInputFileOpen, checkForEndOfInputFile, + accessInputFilePointer, clearLeadingWhiteSpace, + accessEndOfInputFileFlag + */ + char readCharacterFromFileConfigured( bool captureSpace ); + + /* + Name: readDoubleFromFile + process: ignores leading unprintable characters, + captures first contiguous double value + Function input/parameters: none + Function output/parameters: none + Function output/returned: double value found if successful (double) + Device input/file: double value captured from file + Device output/monitor: none + Dependencies: checkForInputFileOpen, checkForEndOfInputFile, + accessInputFilePointer, fscanf, accessEndOfInputFileFlag + */ + double readDoubleFromFile(); + + /* + Name: readIntegerFromFile + process: ignores leading unprintable characters, + captures first contiguous integer + Function input/parameters: none + Function output/parameters: none + Function output/returned: integer found if successful, ZERO_VALUE otherwise + Device input/file: character(s) captured from file as needed + Device output/monitor: none + Dependencies: checkForInputFileOpen, checkForEndOfInputFile, + accessInputFilePointer, fscanf, accessEndOfInputFileFlag + */ + int readIntegerFromFile(); + + /* + Name: readLongFromFile + process: ignores leading unprintable characters, + captures first contiguous long int + Function input/parameters: none + Function output/parameters: none + Function output/returned: long integer found if successful, + ZERO_VALUE otherwise + Device input/file: long value captured from file + Device output/monitor: none + Dependencies: checkForInputFileOpen, checkForEndOfInputFile, + accessInputFilePointer, fscanf, accessEndOfInputFileFlag + */ + long readLongFromFile(); + + /* + Name: readRawCharFromFile + process: captures first character in file stream including non-printable + Function input/parameters: none + Function output/parameters: none + Function output/returned: character found if successful, ZERO_CHAR otherwise + Device input/file: character captured from file + Device output/monitor: none + Dependencies: checkForInputFileOpen, checkForEndOfInputFile, + accessInputFilePointer, fgetc, accessEndOfInputFileFlag + */ + char readRawCharFromFile(); + + /* + Name: readStringConfiguredFromFile + Process: captures string with options: + - clear leading non printable (bool) + - clear leading space character (bool) + - adquires characters up to any non-printable (bool) + - adquires characters up to any printable delimiter (char) + - use constant NON_PRINTABLE if no delimiter + - also stops capture when full (MAX_STR_LEN) + Note: This function consumes the last character input, + including the space, delimiter, or non-printable character + Function input/parameters: see process above + Function output/parameters: captured string (char *), EMPTY_STRING otherwise + Function output/returned: success of operation (bool) + Device input/file: character(s) captured from file as needed + Device output/monitor: none + Dependencies: checkForInputFileOpen, checkForEndOfInputFile, + clearLeadingWhiteSpace, fgetc, accessEndOfInputFileFlag + */ + bool readStringConfiguredFromFile( bool clearLeadingNonPrintable, + bool clearLeadingSpace, + bool stopAtNonPrintable, + char delimiter, + char *capturedString ); + + /* + Name: readStringSegmentFromFile + process: ignores leading white space, including space character, + captures series of characters up to first space, + or end of line, or full string + Function input/parameters: none + Function output/parameters: captured string (char *), EMPTY_STRING otherwise + Function output/returned: success of operation (bool) + Device input/file: character(s) captured from file as needed + Device output/monitor: none + Dependencies: readStringConfigured with appropriate parameters + */ + bool readStringSegmentFromFile( char *capturedString ); + + /* + Name: readStringToLineEndFromFile + process: ignores leading white space, including space character, + captures series of characters up to end of current line + or full string + Function input/parameters: none + Function output/parameters: captured string (char *), EMPTY_STRING otherwise + Function output/returned: string found if successful + Device input/file: character(s) captured from file as needed + Device output/monitor: none + Dependencies: readStringConfigured with appropriate parameters + */ + bool readStringToLineEndFromFile( char *capturedString ); + + /* + Name: readStringToDelimiterFromFile + process: ignores leading white space, including space character, + captures series of characters up to specified character + Function input/parameters: none + Function output/parameters: captured string (char *), EMPTY_STRING otherwise + Function output/returned: string found if successful + Device input/file: character(s) captured from file as needed + Device output/monitor: none + Dependencies: readStringConfigured with appropriate parameters + */ + bool readStringToDelimiterFromFile( char delimiter, char *capturedString ); + +#endif // FILE_INPUT_UTILITY_H + diff --git a/PA10-1115/File_Output_Utility.c b/PA10-1115/File_Output_Utility.c new file mode 100644 index 0000000..f982995 --- /dev/null +++ b/PA10-1115/File_Output_Utility.c @@ -0,0 +1,511 @@ +/* +Formatted file ouput utility, function implementations + +Copyright (c) 2021 by Michael E. Leverington + +Code is free for use in whole or in part and may be modified for other +non-commercial use as long as the above copyright statement is included. +*/ + +// header files +#include "File_Output_Utility.h" + +// local global constants, used only in this file + + // dummy file pointer for accessInputFilePointer + const FILE *DUMMY_OUTPUT_FILE_PTR = NULL; + + // dummy Boolean for accessEndOfInputFileFlag, accessOpenFlag +// const char DUMMY_OUTPUT_FLAG = false; + + // control code for accessing file pointer, accessInputFilePointer + const int GET_OUTPUT_FILE_PTR = 6006; + + // control code for accessing flag value, + // accessEndOfInputFileFlag, accessOpenFlag + const int GET_OUTPUT_FLAG = 9009; + + // control code for setting file pointer, accessInputFilePointer + const int SET_OUTPUT_FILE_PTR = 8008; + + // control code for setting flag value, accessEndOfInputFileFlag, + // accessOpenFlag +// const int SET_OUTPUT_FLAG = 1001; + + /* + Name: accessOutputFilePointer + process: allows setting or accessing file pointer; + note: pointer is maintained (static) value initialized to NULL + Function input/parameters: control code (int), file pointer (FILE *) + DUMMY_OUTPUT_FILE_PTR used + if not setting file pointer + Function output/parameters: none + Function output/returned: file pointer (FILE *) + Device input/file: none + Device output/monitor: none + Dependencies: none + */ + FILE *accessOutputFilePointer( int ctrlCode, const FILE *filePtr ) + { + static FILE *filePointer = NULL; + + // check for set new pointer + if( ctrlCode == SET_OUTPUT_FILE_PTR ) + { + // set file pointer to parameter + filePointer = (FILE *)filePtr; + } + + // return file pointer + return filePointer; + } + + /* + Name: closeOutputFile + Process: closes output file, returns true if successful, false otherwise + Function input/parameters: none + Function output/parameters: none + Function output/returned: operation success (bool) + Device input/file: none + Device output/file: output file closed + Dependencies: accessOutputFilePointer, fclose + */ + bool closeOutputFile() + { + // set local file pointer to working file pointer + // function: accessOutputFilePointer + FILE *filePtr = accessOutputFilePointer( GET_OUTPUT_FILE_PTR, + DUMMY_OUTPUT_FILE_PTR ); + + // check for valid file pointer + if( filePtr != NULL ) + { + // add two more endlines to verify that the data is ended + // and has at least one extra newline after the data + // function: fprintf + fprintf( filePtr, "\n\n" ); + + // flush all data to the device + // function: fflush + fflush( filePtr ); + + // close file + // function: fclose + fclose( filePtr ); + + // set pointer to NULL + // function: accessOutputFilePointer + accessOutputFilePointer( SET_OUTPUT_FILE_PTR, NULL ); + + // return successful operation + return true; + } + + // return failed operation + return false; + } + + /* + Name: openOutputFile + Process: opens input file, returns true if successful, false otherwise + Function input/parameters: file name (c-string) + Function output/parameters: none + Function output/returned: operation success (bool) + Device input/file: none + Device output/file: output file opened + Dependencies: accessOutputFilePointer, fopen + */ + bool openOutputFile( const char *fileName ) + { + // initialize variables + FILE *filePtr = accessOutputFilePointer( GET_OUTPUT_FILE_PTR, + DUMMY_OUTPUT_FILE_PTR ); + char writeCharacter[] = "w"; + + // check for file not open + if( filePtr == NULL ) + { + // open file + // function: fopen + filePtr = fopen( fileName, writeCharacter ); + + // check for success of file open + if( filePtr != NULL ) + { + // set pointer in access function + // function: accessInputFilePointer + accessOutputFilePointer( SET_OUTPUT_FILE_PTR, filePtr ); + + // return operation success + return true; + } + } + // end of file not previously opened block + + // return operation failure + return false; + } + + /* + Name: writeCharacterToFile + Process: writes individual character to file, + returns true if successful, false otherwise + Function input/parameters: character to output (char) + Function output/parameters: none + Function output/returned: operation success (bool) + Device input/file: none + Device output/file: character written to file + Dependencies: accessOutputFilePointer, fprintf + */ + bool writeCharacterToFile( char outChar ) + { + // initialize variables, set file pointer + // function: accessOutputFilePointer + FILE *filePtr = accessOutputFilePointer( GET_OUTPUT_FILE_PTR, + DUMMY_OUTPUT_FILE_PTR ); + + // check for open file + // function: checkForOutputFileOpen + if( filePtr != NULL ) + { + // write character + // function: fprintf + fprintf( filePtr, "%c", outChar ); + + // return successful operation + return true; + } + + // return failed operation + return false; + } + + /* + Name: writeCharactersToFile + Process: writes multiple characters to file, + returns true if successful, false otherwise + Function input/parameters: number of characters to output (int), + character to output (char) + Function output/parameters: none + Function output/returned: operation success (bool) + Device input/file: none + Device output/file: multiple characters written to file + Dependencies: writeCharacterToFile + */ + bool writeCharactersToFile( int numChars, char outChar ) + { + // check for number of characters remaining, + if( numChars > 0 ) + { + // write character, check for success + // function: writeChar + if( writeCharacterToFile( outChar ) ) + { + // continue recursion, + // check for downstream success + // function: writeChars + return writeCharactersToFile( numChars - 1, outChar ); + } + + // quit recursion + // return unsuccessful operation - write operation failed + return false; + } + + // return successful operation - all characters have been written + return true; + } + + /* + Name: writeDoubleToFile + Process: writes individual formatted double value to file, + returns true if successful, false otherwise + Function input/parameters: double value to output (double), + number of digits to right of radix point + (precision) (int) + Function output/parameters: none + Function output/returned: operation success (bool) + Device input/file: none + Device output/file: double written to file + Dependencies: writeDoubleJustifiedToFile + */ + bool writeDoubleToFile( double outVal, int precision ) + { + // initialize variables, set block size to zero and justified to "LEFT" + int blockSize = 0; + char justified[] = "LEFT"; + + // call to justified function + // function: writeDoubleJustifiedToFile + return writeDoubleJustifiedToFile( outVal, precision, + blockSize, justified ); + } + + /* + Name: writeDoubleToFileJustified + Process: writes individual formatted double value to file justified, + returns true if successful, false otherwise + outVal - the double value to be output + precision - number of digits to the right of the radix point + blockSize - the width of the block within which + to print the integer value (int) + justify - "LEFT," "RIGHT," or "CENTER" justification + in block (c-string) + Function output/parameters: none + Function output/returned: operation success (bool) + Device input/file: none + Device output/file: double written to file as specified + Dependencies: sprintf, writeStringJustifiedToFile + */ + bool writeDoubleJustifiedToFile( double outVal, int precision, + int blockSize, const char *justified ) + { + // initialize variables, create temp string for configuration string + char specStr[ MIN_STR_LEN ]; + + // initialize variables, create temporary output string + char outStr[ MIN_STR_LEN ]; + + // set configuration string with precision value + // function: sprintf + sprintf( specStr, "%s0.%dlf", "%", precision ); + + // set double to string + // function: sprintf + sprintf( outStr, specStr, outVal ); + + // write as string, return result + // function: writeStringJustified + return writeStringJustifiedToFile( outStr, blockSize, justified ); + } + + /* + Name: writeEndlineToFile + Process: writes newline ('\n') to file, + returns true if successful, false otherwise + Function input/parameters: none + Function output/parameters: none + Function output/returned: operation success (bool) + Device input/file: none + Device output/file: newline written to file + Dependencies: accessOutputFilePointer, fprintf + */ + bool writeEndlineToFile() + { + // get file pointer, initialize variable + // function: accessOutputFilePointer + FILE *filePtr = accessOutputFilePointer( GET_OUTPUT_FILE_PTR, + DUMMY_OUTPUT_FILE_PTR ); + + // check for open file + if( filePtr != NULL ) + { + // print endline to file + // function: fprintf + fprintf( filePtr, "%c", NEWLINE_CHAR ); + + // return successful operation + return true; + } + + // file not open, return failed operation + return false; + } + + /* + Name: writeEndlinesToFile + Process: writes multiple carriage return ('\r') + and newline ('\n') pairs to file, + returns true if successful, false otherwise + Function input/parameters: number of endline pairs to write (int) + Function output/parameters: none + Function output/returned: operation success (bool) + Device input/file: none + Device output/file: multiple newline characters written to file + Dependencies: writeString + */ + bool writeEndlinesToFile( int numEndlines ) + { + // check for number of characters remaining, + if( numEndlines > 0 ) + { + // write endline, check for success + // function: writeEndlineTofile + if( writeEndlineToFile() ) + { + // continue recursion, + // check for downstream success + // function: writeEndlinesToFile + return writeEndlinesToFile( numEndlines - 1 ); + } + + // quit recursion + // return unsuccessful operation - write operation failed + return false; + } + + // return successful operation - all endlines have been written + return true; + } + + /* + Name: writeIntegerToFile + Process: writes individual integer to file, + returns true if successful, false otherwise + Function input/parameters: integer to output (int) + Function output/parameters: none + Function output/returned: operation success (bool) + Device input/file: none + Device output/file: integer written to file + Dependencies: writeIntegerJustifiedToFile + */ + bool writeIntegerToFile( int outVal ) + { + // initialize variables, set block size to zero and justified to "LEFT" + int blockSize = 0; + char justified[] = "LEFT"; + + // call to justified function + // function: writeDoubleJustifiedToFile + return writeIntegerJustifiedToFile( outVal, blockSize, justified ); + } + + /* + Name: writeIntegerJustifiedToFile + Process: writes individual integer to file, + returns true if successful, false otherwise + Function input/parameters: + outVal - the integer value to be output + precision - number of digits to the right of the radix point + blockSize - the width of the block within which + to print the integer value (int) + justify - "LEFT," "RIGHT," or "CENTER" justification + in block (c-string) + Function output/parameters: none + Function output/returned: operation success (bool) + Device input/file: none + Device output/file: integer written to file as specified + Dependencies: sprintf, writeStringJustifiedToFile + */ + bool writeIntegerJustifiedToFile( int outVal, int blockSize, + const char *justified ) + { + // initialize variables, create temporary output string + char outStr[ MIN_STR_LEN ]; + + // set integer to string + // function: sprintf + sprintf( outStr, "%d", outVal ); + + // write as string, return result + // function: writeStringJustified + return writeStringJustifiedToFile( outStr, blockSize, justified ); + } + + /* + Name: writeStringToFile + Process: writes String value to file, + returns true if successful, false otherwise + Function input/parameters: double value to output (double), + number of digits to right of radix point + (precision) (int) + Function output/parameters: none + Function output/returned: operation success (bool) + Device input/file: none + Device output/file: String written to file + Dependencies: writeStringJustifiedToFile + */ + bool writeStringToFile( const char *outString ) + { + // initialize variables, set block size to zero and justified to "LEFT" + int blockSize = 0; + char justified[] = "LEFT"; + + // call to justified function + // function: writeStringJustifiedToFile + return writeStringJustifiedToFile( outString, blockSize, justified ); + } + + /* + Name: writeStringJustifiedToFile + Process: write string to file within specified block size + and with specified justification + Function input/parameters: + outVal - the string value to be output + blockSize - the width of the block within which + to print the integer value (int) + justify - "LEFT," "RIGHT," or "CENTER" justification + in block (c-string) + Function output/parameters: None + Function output/returned: success of output operation (bool) + Function input/keyboard: None + Device output/file: string written to file as specified + Dependencies: strlen, strcmp, writeCharactersToFile, fprint + */ + bool writeStringJustifiedToFile( const char *outStr, + int blockSize, const char *justify ) + { + // initialize variables, set pre-, post- spaces to zero + int preSpaces = 0, postSpaces = 0, strLength; + + // get file pointer + // function: accessFileOutputFilePointer + FILE *filePtr = accessOutputFilePointer( GET_OUTPUT_FILE_PTR, + DUMMY_OUTPUT_FILE_PTR ); + + if( filePtr != NULL ) + { + // find length of string + // function: strlen + strLength = strlen( outStr ); + + // check justification for "LEFT" + // function: strcmp + if( strcmp( justify, "LEFT" ) == 0 ) + { + // set post spaces for left justification + postSpaces = blockSize - strLength; + } + + // otherwise, check justification for "RIGHT" + // function: strcmp + else if( strcmp( justify, "RIGHT" ) == 0 ) + { + // set pre spaces for right justification + preSpaces = blockSize - strLength; + } + + // Otherwise, assume "CENTER" justification + else + { + // set pre spaces for centered + preSpaces = blockSize / 2 - strLength / 2; + + // set post spaces for centered + postSpaces = blockSize - strLength - preSpaces; + } + + // print pre spaces, check for success + // function: writeCharactersToFile + writeCharactersToFile( preSpaces, SPACE ); + + // print string + // function: fprintf + fprintf( filePtr, "%s", outStr ); + + // print post spaces + // function: printChars + writeCharactersToFile( postSpaces, SPACE ); + + // return successful operation + return true; + } + + // return failed operation + return false; + } + + + + + diff --git a/PA10-1115/File_Output_Utility.h b/PA10-1115/File_Output_Utility.h new file mode 100644 index 0000000..cf06d34 --- /dev/null +++ b/PA10-1115/File_Output_Utility.h @@ -0,0 +1,236 @@ +/* +Formatted file output utility, function prototypes + +Copyright (c) 2021 by Michael E. Leverington + +Code is free for use in whole or in part and may be modified for other +non-commercial use as long as the above copyright statement is included. +*/ +/* +Rev 0.0: 30 June 2021, Initial creation of file + +UTILITY USAGE INSTRUCTIONS: + +1) This utility contains functions that may be used for file input operations + using the C programming language with text files. + The utility must be linked with the program code with which + it will be used. + +2) Specifications for all the functions + are provided in a standardized format below. + +3) Use this code at your own risk. There is no guarantee of any performance, + implied or otherwise, for any part of this code + + END OF INSTRUCTIONS +*/ + +// PreProcessor directives +#ifndef FILE_OUTPUT_UTILITY_H +#define FILE_OUTPUT_UTILITY_H + +// header files +#include +#include +#include +#include "StandardConstants.h" + +// function prototypes + + /* + Name: accessOutputFilePointer + process: allows setting or accessing file pointer; + note: pointer is maintained (static) value initialized to NULL + Function input/parameters: control code (int), file pointer (FILE *) + DUMMY_OUTPUT_FILE_PTR used + if not setting file pointer + Function output/parameters: none + Function output/returned: file pointer (FILE *) + Device input/file: none + Device output/monitor: none + Dependencies: none + */ + FILE *accessOutputFilePointer( int ctrlCode, const FILE *filePtr ); + + /* + Name: closeOutputFile + Process: closes output file, returns true if successful, false otherwise + Function input/parameters: none + Function output/parameters: none + Function output/returned: operation success (bool) + Device input/file: none + Device output/file: output file closed + Dependencies: accessOutputFilePointer, fclose + */ + bool closeOutputFile(); + + /* + Name: openOutputFile + Process: opens input file, returns true if successful, false otherwise + Function input/parameters: file name (c-string) + Function output/parameters: none + Function output/returned: operation success (bool) + Device input/file: none + Device output/file: output file opened + Dependencies: accessOutputFilePointer, fopen + */ + bool openOutputFile( const char *fileName ); + + /* + Name: writeCharacterToFile + Process: writes individual character to file, + returns true if successful, false otherwise + Function input/parameters: character to output (char) + Function output/parameters: none + Function output/returned: operation success (bool) + Device input/file: none + Device output/file: character written to file + Dependencies: accessOutputFilePointer, fprintf + */ + bool writeCharacterToFile( char outChar ); + + /* + Name: writeCharactersToFile + Process: writes multiple characters to file, + returns true if successful, false otherwise + Function input/parameters: number of characters to output (int), + character to output (char) + Function output/parameters: none + Function output/returned: operation success (bool) + Device input/file: none + Device output/file: multiple characters written to file + Dependencies: writeCharacterToFile + */ + bool writeCharactersToFile( int numChars, char outChar ); + + /* + Name: writeDoubleToFile + Process: writes individual formatted double value to file, + returns true if successful, false otherwise + Function input/parameters: double value to output (double), + number of digits to right of radix point + (precision) (int) + Function output/parameters: none + Function output/returned: operation success (bool) + Device input/file: none + Device output/file: double written to file + Dependencies: writeDoubleJustifiedToFile + */ + bool writeDoubleToFile( double outVal, int precision ); + + /* + Name: writeDoubleToFileJustified + Process: writes individual formatted double value to file justified, + returns true if successful, false otherwise + outVal - the double value to be output + precision - number of digits to the right of the radix point + blockSize - the width of the block within which + to print the integer value (int) + justify - "LEFT," "RIGHT," or "CENTER" justification + in block (c-string) + Function output/parameters: none + Function output/returned: operation success (bool) + Device input/file: none + Device output/file: double written to file as specified + Dependencies: sprintf, writeStringJustifiedToFile + */ + bool writeDoubleJustifiedToFile( double outVal, int precision, + int blockSize, const char *justified ); + + /* + Name: writeEndlineToFile + Process: writes newline ('\n') to file, + returns true if successful, false otherwise + Function input/parameters: none + Function output/parameters: none + Function output/returned: operation success (bool) + Device input/file: none + Device output/file: newline written to file + Dependencies: accessOutputFilePointer, fprintf + */ + bool writeEndlineToFile(); + + /* + Name: writeEndlinesToFile + Process: writes multiple carriage return ('\r') + and newline ('\n') pairs to file, + returns true if successful, false otherwise + Function input/parameters: number of endline pairs to write (int) + Function output/parameters: none + Function output/returned: operation success (bool) + Device input/file: none + Device output/file: multiple newline characters written to file + Dependencies: writeString + */ + bool writeEndlinesToFile( int numEndlines ); + + /* + Name: writeIntegerToFile + Process: writes individual integer to file, + returns true if successful, false otherwise + Function input/parameters: integer to output (int) + Function output/parameters: none + Function output/returned: operation success (bool) + Device input/file: none + Device output/file: integer written to file + Dependencies: writeIntegerJustifiedToFile + */ + bool writeIntegerToFile( int outVal ); + + /* + Name: writeIntegerJustifiedToFile + Process: writes individual integer to file, + returns true if successful, false otherwise + Function input/parameters: + outVal - the integer value to be output + precision - number of digits to the right of the radix point + blockSize - the width of the block within which + to print the integer value (int) + justify - "LEFT," "RIGHT," or "CENTER" justification + in block (c-string) + Function output/parameters: none + Function output/returned: operation success (bool) + Device input/file: none + Device output/file: integer written to file as specified + Dependencies: sprintf, writeStringJustifiedToFile + */ + bool writeIntegerJustifiedToFile( int outVal, int blockSize, + const char *justified ); + + /* + Name: writeStringToFile + Process: writes String value to file, + returns true if successful, false otherwise + Function input/parameters: double value to output (double), + number of digits to right of radix point + (precision) (int) + Function output/parameters: none + Function output/returned: operation success (bool) + Device input/file: none + Device output/file: String written to file + Dependencies: writeStringJustifiedToFile + */ + bool writeStringToFile( const char *outString ); + + /* + Name: writeStringJustifiedToFile + Process: write string to file within specified block size + and with specified justification + Function input/parameters: + outVal - the string value to be output + blockSize - the width of the block within which + to print the integer value (int) + justify - "LEFT," "RIGHT," or "CENTER" justification + in block (c-string) + Function output/parameters: None + Function output/returned: success of output operation (bool) + Function input/keyboard: None + Device output/file: string written to file as specified + Dependencies: strlen, strcmp, writeCharactersToFile, fprint + */ + bool writeStringJustifiedToFile( const char *outStr, + int blockSize, const char *justify ); + + +#endif // FILE_OUTPUT_UTILITY_H + diff --git a/PA10-1115/GeneralUtility.c b/PA10-1115/GeneralUtility.c new file mode 100644 index 0000000..501a73f --- /dev/null +++ b/PA10-1115/GeneralUtility.c @@ -0,0 +1,81 @@ +// Header files /////////////////////////////////////////////////////////////// +#include "GeneralUtility.h" + +// global constants //////////////////////////////////////////////////////////// + + // none + +// data structures ///////////////////////////////////////////////////////////// + + // None + +/* +Name: privateCompareStrings +Process: compares two strings as follows: + - if left string is alphabetically greater than the right string, + returns value greater than zero + - if left string is alphabetically less than the right string, + returns value less than zero + - if strings are alphabetically equal but one is longer, + longer one is greater + - otherwise, returns zero +Function input/parameters: two strings to be compared (const char *) +Function output/parameters: none +Function output/returned: result as specified above (int) +Device input/ ---: none +Device output/ ---: none +Dependencies: privateGetStringLength +*/ +int privateCompareStrings( const char *leftStr, const char *rightStr ) +{ + // return zero (temp) + return 0; +} + +/* +Name: privateCopyString +Process: copies string character for character up to NULL_CHAR of source string +Function input/parameters: source string to be copied (const char *) +Function output/parameters: destination string (char *) +Function output/returned: none +Device input/---: none +Device output/---: none +Dependencies: none +*/ +void privateCopyString( char *dest, const char *source ) +{ + // no return, void. +} + +/* +Name: privateGetStringLength +Process: finds length of string +Function input/parameters: c-style string (const char *) +Function output/parameters: none +Function output/returned: calculated length of string (int) +Device input/ ---: none +Device output/ ---: none +Dependencies: none +*/ +int privateGetStringLength( const char *str ) +{ + // return zero (temp) + return 0; +} + +/* +Name: privateToPower +Process: recursively calculates result of given base to given exponent, + for exponents >= 0 +Function input/parameters: base and exponent (int) +Function output/parameters: none +Function output/returned: result of specified calculations (int) +Device input/---: none +Device output/---: none +Dependencies: toPower (recursively) +*/ +int privateToPower( int base, int exponent ) +{ + // return zero (temp) + return 0; +} \ No newline at end of file diff --git a/PA10-1115/GeneralUtility.h b/PA10-1115/GeneralUtility.h new file mode 100644 index 0000000..4c613a3 --- /dev/null +++ b/PA10-1115/GeneralUtility.h @@ -0,0 +1,78 @@ +// Precompiler directives ///////////////////////////////////////////////////// + +#ifndef GENERAL_UTILITY_H +#define GENERAL_UTILITY_H + +// Header files /////////////////////////////////////////////////////////////// + +#include "StandardConstants.h" + +// global constants //////////////////////////////////////////////////////////// + + // none + +// data structures ///////////////////////////////////////////////////////////// + + // None + +/* +Name: privateCompareStrings +Process: compares two strings as follows: + - if left string is alphabetically greater than the right string, + returns value greater than zero + - if left string is alphabetically less than the right string, + returns value less than zero + - if strings are alphabetically equal but one is longer, + longer one is greater + - otherwise, returns zero +Function input/parameters: two strings to be compared (const char *) +Function output/parameters: none +Function output/returned: result as specified above (int) +Device input/ ---: none +Device output/ ---: none +Dependencies: privateGetStringLength +*/ +int privateCompareStrings( const char *leftStr, const char *rightStr ); + +/* +Name: privateCopyString +Process: copies string character for character up to NULL_CHAR of source string +Function input/parameters: source string to be copied (const char *) +Function output/parameters: destination string (char *) +Function output/returned: none +Device input/---: none +Device output/---: none +Dependencies: none +*/ +void privateCopyString( char *dest, const char *source ); + +/* +Name: privateGetStringLength +Process: finds length of string +Function input/parameters: c-style string (const char *) +Function output/parameters: none +Function output/returned: calculated length of string (int) +Device input/ ---: none +Device output/ ---: none +Dependencies: none +*/ +int privateGetStringLength( const char *str ); + +/* +Name: privateToPower +Process: recursively calculates result of given base to given exponent, + for exponents >= 0 +Function input/parameters: base and exponent (int) +Function output/parameters: none +Function output/returned: result of specified calculations (int) +Device input/---: none +Device output/---: none +Dependencies: toPower (recursively) +*/ +int privateToPower( int base, int exponent ); + + +#endif // GENERAL_UTILITY_H + + + diff --git a/PA10-1115/HashUtility.c b/PA10-1115/HashUtility.c new file mode 100644 index 0000000..aee2614 --- /dev/null +++ b/PA10-1115/HashUtility.c @@ -0,0 +1,209 @@ +// header files +#include "HashUtility.h" + +// constants + +/* +typedef struct HashStruct + { + StateDataType *array; + + int tableSize; + + ProbeType probeStrategy; + } ProbingHashType; +*/ + +// function definitions + +/* +Name: addItemFromData +Process: adds item to hash table using data input, + sets node to used state +Function input/parameters: hash data (ProbingHashType *), + state name (const char *), + average, lowest, and highest temperatures (double), +Function output/parameters: updated hash table data (ProbingHashType *) +Function output/returned: result of operation (bool) +Device input/---: none +Device output/monitor: probing process displayed (in called function) +Dependencies: setDataNodeFromData, addItemFromStruct +*/ +bool addItemFromData( ProbingHashType *hashTable, const char *stateName, + double avgTemp, double lowTemp, double highTemp ) +{ + // return false (temp) + return false; +} + +/* +Name: addItemFromStruct +Process: adds item to hash table using struct input, + uses probing as specified in hashTable data, + either LINEAR_PROBING or QUADRATIC_PROBING, + may probe as many as tableSize times +Function input/parameters: hash data (ProbingHashType *), + new item (StateDataType) +Function output/parameters: updated hash table data (ProbingHashType *) +Function output/returned: result of operation (bool) +Device input/---: none +Device output/monitor: probing process displayed +Dependencies: getHashIndex, privateToPower, printf, stateDataToString, + setDataNodeFromStruct +*/ +bool addItemFromStruct( ProbingHashType *hashTable, StateDataType newItem ) +{ + // return false (temp) + return false; +} + +/* +Name: clearHashTable +Process: clear hash table array, deallocates hash struct +Function input/parameters: hash data (ProbingHashType *) +Function output/parameters: updated hash table data (ProbingHashType *) +Function output/returned: none +Device input/---: none +Device output/---: none +Dependencies: free +*/ +void clearHashTable( ProbingHashType *hashTable ) +{ + // no return, void. +} + +/* +Name: displayHashTable +Process: array data dump of numbered data to screen, + shows data where used, shows "Unused" where not +Function input/parameters: provided hashTable data (const ProbingHashType *) +Function output/parameters: none +Function output/returned: none +Device input/---: none +Device output/monitor: displayed as specified +Dependencies: printf, stateDataToString +*/ +void displayHashTable( const ProbingHashType *hashTable ) +{ + // no return, void. +} + +/* +Name: findItem +Process: finds item in hash table, returns +Function input/parameters: provided search data (const StateDataType), + hashTable (const ProbingHashType *) +Function output/parameters: none +Function output/returned: state data set to struct (StateDataType), + or search parameter set to empty node if not found +Device input/---: none +Device output/---: none +Dependencies: findItemIndex, setEmptyDataNode +*/ +StateDataType findItem( const ProbingHashType *hashTable, + StateDataType searchItem ) +{ + // return NULL (temp) + return; +} + +/* +Name: findItemIndex +Process: finds item index, using probing strategy provided in hashTable data, + otherwise, + returns ITEM_NOT_FOUND if search fails after tableSize attempts, + displays index probing attempts +Function input/parameters: provided search data (const StateDataType), + hashTable (const ProbingHashType *) +Function output/parameters: none +Function output/returned: index or ITEM_NOT_FOUND (int) as specified +Device input/---: none +Device output/monitor: displays probing action, provided in sample run file +Dependencies: getHashIndex, printf, privateCompareStrings, privateToPower, + setDataNodeFromStruct +*/ +int findItemIndex( const ProbingHashType *hashTable, StateDataType searchItem ) +{ + // return zero (temp) + return 0; +} + +/* +Name: getHashIndex +Process: finds hashed index for given data item, + sums integer values of state name characters, + if state name length is less than MINIMUM_HASH_LETTER_COUNT, + repeats going over the state letters as needed to meet this minimum +Function input/parameters: provided search data (const StateDataType), + hashTable (const ProbingHashType) +Function output/parameters: none +Function output/returned: array index generated from state name (int) +Device input/---: none +Device output/---: none +Dependencies: privateGetStringLength +*/ +int getHashIndex( const ProbingHashType hashTable, const StateDataType state ) +{ + // return zero (temp) + return 0; +} + +/* +Name: initializeHashTable +Process: creates dynamically allocated hashTable, + creates dynamically allocated array of empty StateDataType items, + initializes tableSize to given capacity, + initializes probe strategy to given strategy +Function input/parameters: provided capacity (int), + provided probe strategy (ProbeType) +Function output/parameters: none +Function output/returned: pointer to created hashTable (ProbingHashType *) +Device input/---: none +Device output/---: none +Dependencies: malloc, setEmptyDataNode, +*/ +ProbingHashType *initializeHashTable( int capacity, ProbeType probe ) +{ + // return NULL (temp) + return NULL; +} + +/* +Name: removeState +Process: finds item in hash table, removes, + sets array location to unused (but does not set any other data), + returns removed state +Function input/parameters: provided search data (const StateDataType), + hashTable (const ProbingHashType) +Function output/parameters: returned state (StateDataType *) +Function output/returned: Boolean result of action (bool) +Device input/---: none +Device output/---: none +Dependencies: findItemIndex, setDataNodeFromStruct +*/ +bool removeState( StateDataType *removedState, + const StateDataType toBeRemoved, const ProbingHashType hashTable ) +{ + // return false (temp) + return false; +} + +/* +Name: showHashTableStatus +Process: displays array ata values and unused values + as a string of letters, + displays number of items in hashTable, + displays minimum number of contiguous data items, + displays maximum number of contiguous data items, + displays number of empty/unused array elements +Function input/parameters: hashTable (const ProbingHashType) +Function output/parameters: none +Function output/returned: none +Device input/---: none +Device output/monitor: hash data status displayed as specified +Dependencies: sprintf, printf +*/ +void showHashTableStatus( const ProbingHashType hashTable) +{ + // no return, void. +} \ No newline at end of file diff --git a/PA10-1115/HashUtility.h b/PA10-1115/HashUtility.h new file mode 100644 index 0000000..bc603b8 --- /dev/null +++ b/PA10-1115/HashUtility.h @@ -0,0 +1,186 @@ +#ifndef HASH_UTILITIES_H +#define HASH_UTILITIES_H + +// header files +#include "StandardConstants.h" +#include "GeneralUtility.h" +#include "StateDataUtility.h" +#include +#include + +// constants +typedef enum { NO_PROBING, LINEAR_PROBING = 101, + QUADRATIC_PROBING = 202 } ProbeType; +extern const int MINIMUM_HASH_LETTER_COUNT; +extern const int ITEM_NOT_FOUND; +extern const bool USED_NODE; +extern const bool UNUSED_NODE; + +typedef struct HashStruct + { + StateDataType *array; + + int tableSize; + + ProbeType probeStrategy; + } ProbingHashType; + +// prototypes + +/* +Name: addItemFromData +Process: adds item to hash table using data input, + sets node to used state +Function input/parameters: hash data (ProbingHashType *), + state name (const char *), + average, lowest, and highest temperatures (double), +Function output/parameters: updated hash table data (ProbingHashType *) +Function output/returned: result of operation (bool) +Device input/---: none +Device output/monitor: probing process displayed (in called function) +Dependencies: setDataNodeFromData, addItemFromStruct +*/ +bool addItemFromData( ProbingHashType *hashTable, const char *stateName, + double avgTemp, double lowTemp, double highTemp ); + +/* +Name: addItemFromStruct +Process: adds item to hash table using struct input, + uses probing as specified in hashTable data, + either LINEAR_PROBING or QUADRATIC_PROBING, + may probe as many as tableSize times +Function input/parameters: hash data (ProbingHashType *), + new item (StateDataType) +Function output/parameters: updated hash table data (ProbingHashType *) +Function output/returned: result of operation (bool) +Device input/---: none +Device output/monitor: probing process displayed +Dependencies: getHashIndex, privateToPower, printf, stateDataToString, + setDataNodeFromStruct +*/ +bool addItemFromStruct( ProbingHashType *hashTable, StateDataType newItem ); + +/* +Name: clearHashTable +Process: clear hash table array, deallocates hash struct +Function input/parameters: hash data (ProbingHashType *) +Function output/parameters: updated hash table data (ProbingHashType *) +Function output/returned: none +Device input/---: none +Device output/---: none +Dependencies: free +*/ +void clearHashTable( ProbingHashType *hashTable ); + +/* +Name: displayHashTable +Process: array data dump of numbered data to screen, + shows data where used, shows "Unused" where not +Function input/parameters: provided hashTable data (const ProbingHashType *) +Function output/parameters: none +Function output/returned: none +Device input/---: none +Device output/monitor: displayed as specified +Dependencies: printf, stateDataToString +*/ +void displayHashTable( const ProbingHashType *hashTable ); + +/* +Name: findItem +Process: finds item in hash table, returns +Function input/parameters: provided search data (const StateDataType), + hashTable (const ProbingHashType *) +Function output/parameters: none +Function output/returned: state data set to struct (StateDataType), + or search parameter set to empty node if not found +Device input/---: none +Device output/---: none +Dependencies: findItemIndex, setEmptyDataNode +*/ +StateDataType findItem( const ProbingHashType *hashTable, + StateDataType searchItem ); + +/* +Name: findItemIndex +Process: finds item index, using probing strategy provided in hashTable data, + otherwise, + returns ITEM_NOT_FOUND if search fails after tableSize attempts, + displays index probing attempts +Function input/parameters: provided search data (const StateDataType), + hashTable (const ProbingHashType *) +Function output/parameters: none +Function output/returned: index or ITEM_NOT_FOUND (int) as specified +Device input/---: none +Device output/monitor: displays probing action, provided in sample run file +Dependencies: getHashIndex, printf, privateCompareStrings, privateToPower, + setDataNodeFromStruct +*/ +int findItemIndex( const ProbingHashType *hashTable, StateDataType searchItem ); + +/* +Name: getHashIndex +Process: finds hashed index for given data item, + sums integer values of state name characters, + if state name length is less than MINIMUM_HASH_LETTER_COUNT, + repeats going over the state letters as needed to meet this minimum +Function input/parameters: provided search data (const StateDataType), + hashTable (const ProbingHashType) +Function output/parameters: none +Function output/returned: array index generated from state name (int) +Device input/---: none +Device output/---: none +Dependencies: privateGetStringLength +*/ +int getHashIndex( const ProbingHashType hashTable, const StateDataType state ); + +/* +Name: initializeHashTable +Process: creates dynamically allocated hashTable, + creates dynamically allocated array of empty StateDataType items, + initializes tableSize to given capacity, + initializes probe strategy to given strategy +Function input/parameters: provided capacity (int), + provided probe strategy (ProbeType) +Function output/parameters: none +Function output/returned: pointer to created hashTable (ProbingHashType *) +Device input/---: none +Device output/---: none +Dependencies: malloc, setEmptyDataNode, +*/ +ProbingHashType *initializeHashTable( int capacity, ProbeType probe ); + +/* +Name: removeState +Process: finds item in hash table, removes, + sets array location to unused (but does not set any other data), + returns removed state +Function input/parameters: provided search data (const StateDataType), + hashTable (const ProbingHashType) +Function output/parameters: returned state (StateDataType *) +Function output/returned: Boolean result of action (bool) +Device input/---: none +Device output/---: none +Dependencies: findItemIndex, setDataNodeFromStruct +*/ +bool removeState( StateDataType *removedState, + const StateDataType toBeRemoved, const ProbingHashType hashTable ); + +/* +Name: showHashTableStatus +Process: displays array ata values and unused values + as a string of letters, + displays number of items in hashTable, + displays minimum number of contiguous data items, + displays maximum number of contiguous data items, + displays number of empty/unused array elements +Function input/parameters: hashTable (const ProbingHashType) +Function output/parameters: none +Function output/returned: none +Device input/---: none +Device output/monitor: hash data status displayed as specified +Dependencies: sprintf, printf +*/ +void showHashTableStatus( const ProbingHashType hashTable); + + +#endif // HASH_UTILITIES_H diff --git a/PA10-1115/Makefile b/PA10-1115/Makefile new file mode 100644 index 0000000..d9b05e1 --- /dev/null +++ b/PA10-1115/Makefile @@ -0,0 +1,43 @@ +CC = gcc -Wall +SOURCES = PA09_Main.c GeneralUtility.c HeapUtility.c StudentUtility.c Console_IO_Utility.c File_Input_Utility.c File_Output_Utility.c +OBJECTS = PA09_Main.o GeneralUtility.o HeapUtility.o StudentUtility.o Console_IO_Utility.o File_Input_Utility.o File_Output_Utility.o + +# Uses the template structure defined in the TypicalUtils folder + +all: PA09_Main + +PA09_Main: $(OBJECTS) + $(CC) $(OBJECTS) -o PA09_Main + +PA09_Main.o: PA09_Main.c + $(CC) -c PA09_Main.c -o PA09_Main.o + +GeneralUtility.o: GeneralUtility.c + $(CC) -c GeneralUtility.c -o GeneralUtility.o + +HeapUtility.o: HeapUtility.c + $(CC) -c HeapUtility.c -o HeapUtility.o + +StudentUtility.o: StudentUtility.c + $(CC) -c StudentUtility.c -o StudentUtility.o + +Console_IO_Utility.o: Console_IO_Utility.c + $(CC) -c Console_IO_Utility.c -o Console_IO_Utility.o + +File_Input_Utility.o: File_Input_Utility.c + $(CC) -c File_Input_Utility.c -o File_Input_Utility.o + +File_Output_Utility.o: File_Output_Utility.c + $(CC) -c File_Output_Utility.c -o File_Output_Utility.o + +clean: + rm -f $(OBJECTS) PA09_Main PA09_Main.out + +clean_objects: + rm -f $(OBJECTS) + +run: + ./PA09_Main + +run_win: + PA09_Main diff --git a/PA10-1115/PA10_Main.c b/PA10-1115/PA10_Main.c new file mode 100644 index 0000000..fdf1aac --- /dev/null +++ b/PA10-1115/PA10_Main.c @@ -0,0 +1,240 @@ +// header files +#include "File_Input_Utility.h" +#include "HashUtility.h" + +// constants +extern const int ITEM_NOT_FOUND; +extern const bool USED_NODE; +extern const bool UNUSED_NODE; + +// prototypes +void getQueryObject( StateDataType *returnedState, const char *stateName ); +ProbingHashType *uploadData( char *fileName, int tableSize, int probeType ); + +// main function +int main( int argc, char *argv[] ) + { + ProbingHashType *hashTest; + StateDataType toRemove, removed, toFind, found; + char toRemoveStr[ MAX_STR_LEN ], removedStr[ MAX_STR_LEN ]; + char toFindStr[ MAX_STR_LEN ], foundStr[ MAX_STR_LEN ]; + int primeTableSize = 67; // recommended to be prime number (or at least odd) + // and roughly 1.3x the size of the data set + + // title + printf( "\nHASH TABLE TEST PROGRAM\n" ); + printf( "=======================\n" ); + + hashTest = uploadData( "inData.csv", primeTableSize, QUADRATIC_PROBING ); + + // display array dump + displayHashTable( hashTest ); + + // show hash table status + showHashTableStatus( *hashTest ); + + printf( "\n\nFinding Selected States ----------------------------------\n" ); + + privateCopyString( toFindStr, "Arizona" ); + getQueryObject( &toFind, toFindStr ); + found = findItem( hashTest, toFind ); + stateDataToString( foundStr, found ); + printf( "Found: %s\n", foundStr ); + + privateCopyString( toFindStr, "Iowa" ); + getQueryObject( &toFind, toFindStr ); + found = findItem( hashTest, toFind ); + stateDataToString( foundStr, found ); + printf( "Found: %s\n", foundStr ); + + privateCopyString( toFindStr, "Minnesota" ); + getQueryObject( &toFind, toFindStr ); + found = findItem( hashTest, toFind ); + stateDataToString( foundStr, found ); + printf( "Found: %s\n", foundStr ); + + printf( "\n\nRemoving Selected States ----------------------------------\n" ); + + privateCopyString( toRemoveStr, "Texas" ); + getQueryObject( &toRemove, toRemoveStr ); + if( removeState( &removed, toRemove, *hashTest ) ) + { + stateDataToString( removedStr, removed ); + printf( "---Removed: %s\n", removedStr ); + } + else + { + printf( "---Failed to remove %s\n", toRemoveStr ); + } + + privateCopyString( toRemoveStr, "New Mexico" ); + getQueryObject( &toRemove, toRemoveStr ); + if( removeState( &removed, toRemove, *hashTest ) ) + { + stateDataToString( removedStr, removed ); + printf( "---Removed: %s\n", removedStr ); + } + else + { + printf( "---Failed to remove %s\n", toRemoveStr ); + } + + privateCopyString( toRemoveStr, "Washington" ); + getQueryObject( &toRemove, toRemoveStr ); + if( removeState( &removed, toRemove, *hashTest ) ) + { + stateDataToString( removedStr, removed ); + printf( "---Removed: %s\n", removedStr ); + } + else + { + printf( "---Failed to remove %s\n", toRemoveStr ); + } + + privateCopyString( toRemoveStr, "Maryland" ); + getQueryObject( &toRemove, toRemoveStr ); + if( removeState( &removed, toRemove, *hashTest ) ) + { + stateDataToString( removedStr, removed ); + printf( "---Removed: %s\n", removedStr ); + } + else + { + printf( "---Failed to remove %s\n", toRemoveStr ); + } + + privateCopyString( toRemoveStr, "Florida" ); + getQueryObject( &toRemove, toRemoveStr ); + if( removeState( &removed, toRemove, *hashTest ) ) + { + stateDataToString( removedStr, removed ); + printf( "---Removed: %s\n", removedStr ); + } + else + { + printf( "---Failed to remove %s\n", toRemoveStr ); + } + + privateCopyString( toRemoveStr, "Quebec" ); + getQueryObject( &toRemove, toRemoveStr ); + if( removeState( &removed, toRemove, *hashTest ) ) + { + stateDataToString( removedStr, removed ); + printf( "---Removed: %s\n", removedStr ); + } + else + { + printf( "---Failed to remove %s\n", toRemoveStr ); + } + + // display array dump + displayHashTable( hashTest ); + + // show hash table status + showHashTableStatus( *hashTest ); + + // end program + + // clear hash table + clearHashTable( hashTest ); + + // show program end + printf( "\nEnd Program\n" ); + + // return success + return 0; + } + + +void getQueryObject( StateDataType *returnedState, const char *stateName ) + { + setDataNodeFromData( returnedState, stateName, 0.0, 0.0, 0.0, 0.0 ); + } + + +/* +Name: getDataFromFile +Process: uploads data from file with unknown number of data sets, + has internal Verbose Boolean to display input operation +Function input/parameters: file name (char *) +Function output/parameters: none +Function output/returned: pointer to hash table (ProbingHashType *) +Device input/file: data from HD +Device output/monitor: none +Dependencies: initializeHashTable, openInputFile, readStringToDelimiterFromFile, + readDoubleFromFile, readCharacterFromFile, printf, + addItemFromData, closeInputFile, free +*/ +ProbingHashType *uploadData( char *fileName, int tableSize, int probeType ) + { + char stateNameStr[ MAX_STR_LEN ]; + double avgTemp, lowestTemp, highestTemp; + int index = 0; + bool verbose = true; // Set to true to verify data upload, false otherwise + ProbingHashType *tempHashPtr = initializeHashTable( tableSize, probeType ); + + if( openInputFile( fileName ) ) + { + if( verbose ) + { + printf( "\n ----- Verbose: Begin Loading Data From File\n" ); + } + + // get first state name + readStringToDelimiterFromFile( COMMA, stateNameStr ); + + while( !checkForEndOfInputFile() ) + { + avgTemp = readDoubleFromFile(); + + // ignores comma + readCharacterFromFile(); + + lowestTemp = readDoubleFromFile(); + + // ignores comma + readCharacterFromFile(); + + highestTemp = readDoubleFromFile(); + + if( verbose ) + { + printf( "State Name: %s | ", stateNameStr ); + + printf( "Average Temp: %5.2f | ", avgTemp ); + + printf( "Lowest Temp: %5.2f | ", lowestTemp ); + + printf( "Highest Temp: %5.2f\n", highestTemp ); + } + + // add to hash table + addItemFromData( tempHashPtr, stateNameStr, + avgTemp, lowestTemp, highestTemp ); + + // reprime - read next state name + readStringToDelimiterFromFile( COMMA, stateNameStr ); + + index++; + } + + if( verbose ) + { + printf( "\n ----- Verbose: Items found in file: %d\n", index ); + printf( " ----- Verbose: End Loading Data From File\n\n" ); + } + + closeInputFile(); + } + + // file not found + else + { + free( tempHashPtr ); + } + + return tempHashPtr; + } + + + diff --git a/PA10-1115/PA10_SampleRun.txt b/PA10-1115/PA10_SampleRun.txt new file mode 100644 index 0000000..2279938 --- /dev/null +++ b/PA10-1115/PA10_SampleRun.txt @@ -0,0 +1,399 @@ +HASH TABLE TEST PROGRAM +======================= + + ----- Verbose: Begin Loading Data From File +State Name: Massachusetts | Average Temp: 41.00 | Lowest Temp: -35.00 | Highest Temp: 107.00 + +Indices probed: 44 +Massachusetts, Avg: 41.00, Low: -35.00, High: 107.00, 44 -> 44 +State Name: Rhode Island | Average Temp: 50.10 | Lowest Temp: -25.00 | Highest Temp: 104.00 + +Indices probed: 61 +Rhode Island, Avg: 50.10, Low: -25.00, High: 104.00, 61 -> 61 +State Name: Wyoming | Average Temp: 42.00 | Lowest Temp: -66.00 | Highest Temp: 115.00 + +Indices probed: 9 +Wyoming, Avg: 42.00, Low: -66.00, High: 115.00, 9 -> 9 +State Name: New Mexico | Average Temp: 52.70 | Lowest Temp: -50.00 | Highest Temp: 122.00 + +Indices probed: 5 +New Mexico, Avg: 52.70, Low: -50.00, High: 122.00, 5 -> 5 +State Name: Tennessee | Average Temp: 57.60 | Lowest Temp: -32.00 | Highest Temp: 113.00 + +Indices probed: 0 +Tennessee, Avg: 57.60, Low: -32.00, High: 113.00, 0 -> 0 +State Name: South Dakota | Average Temp: 45.20 | Lowest Temp: -58.00 | Highest Temp: 120.00 + +Indices probed: 20 +South Dakota, Avg: 45.20, Low: -58.00, High: 120.00, 20 -> 20 +State Name: Indiana | Average Temp: 47.80 | Lowest Temp: -36.00 | Highest Temp: 116.00 + +Indices probed: 22 +Indiana, Avg: 47.80, Low: -36.00, High: 116.00, 22 -> 22 +State Name: Arkansas | Average Temp: 60.30 | Lowest Temp: -29.00 | Highest Temp: 120.00 + +Indices probed: 16 +Arkansas, Avg: 60.30, Low: -29.00, High: 120.00, 16 -> 16 +State Name: Kansas | Average Temp: 54.30 | Lowest Temp: -40.00 | Highest Temp: 121.00 + +Indices probed: 14 +Kansas, Avg: 54.30, Low: -40.00, High: 121.00, 14 -> 14 +State Name: Minnesota | Average Temp: 41.20 | Lowest Temp: -60.00 | Highest Temp: 114.00 + +Indices probed: 4 +Minnesota, Avg: 41.20, Low: -60.00, High: 114.00, 4 -> 4 +State Name: North Dakota | Average Temp: 40.40 | Lowest Temp: -60.00 | Highest Temp: 121.00 + +Indices probed: 12 +North Dakota, Avg: 40.40, Low: -60.00, High: 121.00, 12 -> 12 +State Name: Vermont | Average Temp: 42.90 | Lowest Temp: -50.00 | Highest Temp: 105.00 + +Indices probed: 10 +Vermont, Avg: 42.90, Low: -50.00, High: 105.00, 10 -> 10 +State Name: Oregon | Average Temp: 48.40 | Lowest Temp: -54.00 | Highest Temp: 119.00 + +Indices probed: 27 +Oregon, Avg: 48.40, Low: -54.00, High: 119.00, 27 -> 27 +State Name: West Virginia | Average Temp: 51.80 | Lowest Temp: -37.00 | Highest Temp: 112.00 + +Indices probed: 3 +West Virginia, Avg: 51.80, Low: -37.00, High: 112.00, 3 -> 3 +State Name: Montana | Average Temp: 42.70 | Lowest Temp: -70.00 | Highest Temp: 117.00 + +Indices probed: 48 +Montana, Avg: 42.70, Low: -70.00, High: 117.00, 48 -> 48 +State Name: Idaho | Average Temp: 51.80 | Lowest Temp: -60.00 | Highest Temp: 118.00 + +Indices probed: 55 +Idaho, Avg: 51.80, Low: -60.00, High: 118.00, 55 -> 55 +State Name: Nevada | Average Temp: 53.40 | Lowest Temp: -50.00 | Highest Temp: 125.00 + +Indices probed: 66 +Nevada, Avg: 53.40, Low: -50.00, High: 125.00, 66 -> 66 +State Name: Missouri | Average Temp: 63.40 | Lowest Temp: -40.00 | Highest Temp: 118.00 + +Indices probed: 55, 56 +Missouri, Avg: 63.40, Low: -40.00, High: 118.00, 55 -> 56 +State Name: Utah | Average Temp: 48.60 | Lowest Temp: -69.00 | Highest Temp: 117.00 + +Indices probed: 30 +Utah, Avg: 48.60, Low: -69.00, High: 117.00, 30 -> 30 +State Name: Hawaii | Average Temp: 70.00 | Lowest Temp: 12.00 | Highest Temp: 100.00 + +Indices probed: 64 +Hawaii, Avg: 70.00, Low: 12.00, High: 100.00, 64 -> 64 +State Name: South Carolina | Average Temp: 62.40 | Lowest Temp: -19.00 | Highest Temp: 111.00 + +Indices probed: 32 +South Carolina, Avg: 62.40, Low: -19.00, High: 111.00, 32 -> 32 +State Name: North Carolina | Average Temp: 59.00 | Lowest Temp: -34.00 | Highest Temp: 110.00 + +Indices probed: 24 +North Carolina, Avg: 59.00, Low: -34.00, High: 110.00, 24 -> 24 +State Name: Maine | Average Temp: 47.90 | Lowest Temp: -50.00 | Highest Temp: 105.00 + +Indices probed: 61, 62 +Maine, Avg: 47.90, Low: -50.00, High: 105.00, 61 -> 62 +State Name: Texas | Average Temp: 64.80 | Lowest Temp: -23.00 | Highest Temp: 120.00 + +Indices probed: 32, 33 +Texas, Avg: 64.80, Low: -23.00, High: 120.00, 32 -> 33 +State Name: Kentucky | Average Temp: 55.60 | Lowest Temp: -37.00 | Highest Temp: 114.00 + +Indices probed: 42 +Kentucky, Avg: 55.60, Low: -37.00, High: 114.00, 42 -> 42 +State Name: Colorado | Average Temp: 45.10 | Lowest Temp: -61.00 | Highest Temp: 118.00 + +Indices probed: 15 +Colorado, Avg: 45.10, Low: -61.00, High: 118.00, 15 -> 15 +State Name: Michigan | Average Temp: 44.40 | Lowest Temp: -51.00 | Highest Temp: 112.00 + +Indices probed: 63 +Michigan, Avg: 44.40, Low: -51.00, High: 112.00, 63 -> 63 +State Name: Ohio | Average Temp: 50.70 | Lowest Temp: -39.00 | Highest Temp: 113.00 + +Indices probed: 17 +Ohio, Avg: 50.70, Low: -39.00, High: 113.00, 17 -> 17 +State Name: Pennsylvania | Average Temp: 48.80 | Lowest Temp: -42.00 | Highest Temp: 111.00 + +Indices probed: 66, 0, 3, 8 +Pennsylvania, Avg: 48.80, Low: -42.00, High: 111.00, 66 -> 8 +State Name: Florida | Average Temp: 70.70 | Lowest Temp: -2.00 | Highest Temp: 109.00 + +Indices probed: 35 +Florida, Avg: 70.70, Low: -2.00, High: 109.00, 35 -> 35 +State Name: Louisiana | Average Temp: 66.40 | Lowest Temp: -16.00 | Highest Temp: 114.00 + +Indices probed: 62, 63, 66, 4, 11 +Louisiana, Avg: 66.40, Low: -16.00, High: 114.00, 62 -> 11 +State Name: Oklahoma | Average Temp: 59.60 | Lowest Temp: -27.00 | Highest Temp: 120.00 + +Indices probed: 8, 9, 12, 17, 24, 33, 44, 57 +Oklahoma, Avg: 59.60, Low: -27.00, High: 120.00, 8 -> 57 +State Name: Mississippi | Average Temp: 54.50 | Lowest Temp: -19.00 | Highest Temp: 115.00 + +Indices probed: 42, 43 +Mississippi, Avg: 54.50, Low: -19.00, High: 115.00, 42 -> 43 +State Name: New Jersey | Average Temp: 43.80 | Lowest Temp: -34.00 | Highest Temp: 110.00 + +Indices probed: 18 +New Jersey, Avg: 43.80, Low: -34.00, High: 110.00, 18 -> 18 +State Name: Iowa | Average Temp: 44.40 | Lowest Temp: -47.00 | Highest Temp: 118.00 + +Indices probed: 33, 34 +Iowa, Avg: 44.40, Low: -47.00, High: 118.00, 33 -> 34 +State Name: New York | Average Temp: 45.40 | Lowest Temp: -52.00 | Highest Temp: 108.00 + +Indices probed: 14, 15, 18, 23 +New York, Avg: 45.40, Low: -52.00, High: 108.00, 14 -> 23 +State Name: Virginia | Average Temp: 55.10 | Lowest Temp: -30.00 | Highest Temp: 110.00 + +Indices probed: 21 +Virginia, Avg: 55.10, Low: -30.00, High: 110.00, 21 -> 21 +State Name: Alabama | Average Temp: 26.60 | Lowest Temp: -27.00 | Highest Temp: 112.00 + +Indices probed: 1 +Alabama, Avg: 26.60, Low: -27.00, High: 112.00, 1 -> 1 +State Name: Delaware | Average Temp: 55.30 | Lowest Temp: -17.00 | Highest Temp: 110.00 + +Indices probed: 1, 2 +Delaware, Avg: 55.30, Low: -17.00, High: 110.00, 1 -> 2 +State Name: Wisconsin | Average Temp: 43.10 | Lowest Temp: -55.00 | Highest Temp: 114.00 + +Indices probed: 19 +Wisconsin, Avg: 43.10, Low: -55.00, High: 114.00, 19 -> 19 +State Name: New Hampshire | Average Temp: 49.90 | Lowest Temp: -47.00 | Highest Temp: 106.00 + +Indices probed: 53 +New Hampshire, Avg: 49.90, Low: -47.00, High: 106.00, 53 -> 53 +State Name: Illinois | Average Temp: 51.70 | Lowest Temp: -36.00 | Highest Temp: 117.00 + +Indices probed: 31 +Illinois, Avg: 51.70, Low: -36.00, High: 117.00, 31 -> 31 +State Name: Arizona | Average Temp: 60.40 | Lowest Temp: -40.00 | Highest Temp: 128.00 + +Indices probed: 54 +Arizona, Avg: 60.40, Low: -40.00, High: 128.00, 54 -> 54 +State Name: Maryland | Average Temp: 54.20 | Lowest Temp: -40.00 | Highest Temp: 109.00 + +Indices probed: 20, 21, 24, 29 +Maryland, Avg: 54.20, Low: -40.00, High: 109.00, 20 -> 29 +State Name: Nebraska | Average Temp: 48.80 | Lowest Temp: -47.00 | Highest Temp: 118.00 + +Indices probed: 3, 4, 7 +Nebraska, Avg: 48.80, Low: -47.00, High: 118.00, 3 -> 7 +State Name: California | Average Temp: 59.40 | Lowest Temp: -45.00 | Highest Temp: 134.00 + +Indices probed: 11, 12, 15, 20, 27, 36 +California, Avg: 59.40, Low: -45.00, High: 134.00, 11 -> 36 +State Name: Washington | Average Temp: 48.30 | Lowest Temp: -48.00 | Highest Temp: 118.00 + +Indices probed: 53, 54, 57, 62, 2, 11, 22, 35, 50 +Washington, Avg: 48.30, Low: -48.00, High: 118.00, 53 -> 50 +State Name: Georgia | Average Temp: 63.50 | Lowest Temp: -17.00 | Highest Temp: 112.00 + +Indices probed: 32, 33, 36, 41 +Georgia, Avg: 63.50, Low: -17.00, High: 112.00, 32 -> 41 +State Name: Connecticut | Average Temp: 49.00 | Lowest Temp: -32.00 | Highest Temp: 106.00 + +Indices probed: 12, 13 +Connecticut, Avg: 49.00, Low: -32.00, High: 106.00, 12 -> 13 +State Name: Alaska | Average Temp: 62.80 | Lowest Temp: -80.00 | Highest Temp: 100.00 + +Indices probed: 51 +Alaska, Avg: 62.80, Low: -80.00, High: 100.00, 51 -> 51 + + ----- Verbose: Items found in file: 50 + ----- Verbose: End Loading Data From File + + +HASH TABLE ARRAY DUMP: + 1) Tennessee, Avg: 57.60, Low: -32.00, High: 113.00 + 2) Alabama, Avg: 26.60, Low: -27.00, High: 112.00 + 3) Delaware, Avg: 55.30, Low: -17.00, High: 110.00 + 4) West Virginia, Avg: 51.80, Low: -37.00, High: 112.00 + 5) Minnesota, Avg: 41.20, Low: -60.00, High: 114.00 + 6) New Mexico, Avg: 52.70, Low: -50.00, High: 122.00 + 7) Unused + 8) Nebraska, Avg: 48.80, Low: -47.00, High: 118.00 + 9) Pennsylvania, Avg: 48.80, Low: -42.00, High: 111.00 + 10) Wyoming, Avg: 42.00, Low: -66.00, High: 115.00 + 11) Vermont, Avg: 42.90, Low: -50.00, High: 105.00 + 12) Louisiana, Avg: 66.40, Low: -16.00, High: 114.00 + 13) North Dakota, Avg: 40.40, Low: -60.00, High: 121.00 + 14) Connecticut, Avg: 49.00, Low: -32.00, High: 106.00 + 15) Kansas, Avg: 54.30, Low: -40.00, High: 121.00 + 16) Colorado, Avg: 45.10, Low: -61.00, High: 118.00 + 17) Arkansas, Avg: 60.30, Low: -29.00, High: 120.00 + 18) Ohio, Avg: 50.70, Low: -39.00, High: 113.00 + 19) New Jersey, Avg: 43.80, Low: -34.00, High: 110.00 + 20) Wisconsin, Avg: 43.10, Low: -55.00, High: 114.00 + 21) South Dakota, Avg: 45.20, Low: -58.00, High: 120.00 + 22) Virginia, Avg: 55.10, Low: -30.00, High: 110.00 + 23) Indiana, Avg: 47.80, Low: -36.00, High: 116.00 + 24) New York, Avg: 45.40, Low: -52.00, High: 108.00 + 25) North Carolina, Avg: 59.00, Low: -34.00, High: 110.00 + 26) Unused + 27) Unused + 28) Oregon, Avg: 48.40, Low: -54.00, High: 119.00 + 29) Unused + 30) Maryland, Avg: 54.20, Low: -40.00, High: 109.00 + 31) Utah, Avg: 48.60, Low: -69.00, High: 117.00 + 32) Illinois, Avg: 51.70, Low: -36.00, High: 117.00 + 33) South Carolina, Avg: 62.40, Low: -19.00, High: 111.00 + 34) Texas, Avg: 64.80, Low: -23.00, High: 120.00 + 35) Iowa, Avg: 44.40, Low: -47.00, High: 118.00 + 36) Florida, Avg: 70.70, Low: -2.00, High: 109.00 + 37) California, Avg: 59.40, Low: -45.00, High: 134.00 + 38) Unused + 39) Unused + 40) Unused + 41) Unused + 42) Georgia, Avg: 63.50, Low: -17.00, High: 112.00 + 43) Kentucky, Avg: 55.60, Low: -37.00, High: 114.00 + 44) Mississippi, Avg: 54.50, Low: -19.00, High: 115.00 + 45) Massachusetts, Avg: 41.00, Low: -35.00, High: 107.00 + 46) Unused + 47) Unused + 48) Unused + 49) Montana, Avg: 42.70, Low: -70.00, High: 117.00 + 50) Unused + 51) Washington, Avg: 48.30, Low: -48.00, High: 118.00 + 52) Alaska, Avg: 62.80, Low: -80.00, High: 100.00 + 53) Unused + 54) New Hampshire, Avg: 49.90, Low: -47.00, High: 106.00 + 55) Arizona, Avg: 60.40, Low: -40.00, High: 128.00 + 56) Idaho, Avg: 51.80, Low: -60.00, High: 118.00 + 57) Missouri, Avg: 63.40, Low: -40.00, High: 118.00 + 58) Oklahoma, Avg: 59.60, Low: -27.00, High: 120.00 + 59) Unused + 60) Unused + 61) Unused + 62) Rhode Island, Avg: 50.10, Low: -25.00, High: 104.00 + 63) Maine, Avg: 47.90, Low: -50.00, High: 105.00 + 64) Michigan, Avg: 44.40, Low: -51.00, High: 112.00 + 65) Hawaii, Avg: 70.00, Low: 12.00, High: 100.00 + 66) Unused + 67) Nevada, Avg: 53.40, Low: -50.00, High: 125.00 + + +Hash Table Status: DDDDDDUDDDDDDDDDDDDDDDDDDUUDUDDDDDDDDUUUUDDDDUUUDUDDUDDDDDUUUDDDDUD +D => Data, U => Unused + + Items in Hash Table: 50 + Minimum contiguous bins: 1 + Maximum contiguous bins: 18 + Number of empty bins: 17 + + +Finding Selected States ---------------------------------- + +Indices probed: 54 +Found: Arizona, Avg: 60.40, Low: -40.00, High: 128.00 + +Indices probed: 33, 34 +Found: Iowa, Avg: 44.40, Low: -47.00, High: 118.00 + +Indices probed: 4 +Found: Minnesota, Avg: 41.20, Low: -60.00, High: 114.00 + + +Removing Selected States ---------------------------------- + +Indices probed: 32, 33 +---Removed: Texas, Avg: 64.80, Low: -23.00, High: 120.00 + +Indices probed: 5 +---Removed: New Mexico, Avg: 52.70, Low: -50.00, High: 122.00 + +Indices probed: 53, 54, 57, 62, 2, 11, 22, 35, 50 +---Removed: Washington, Avg: 48.30, Low: -48.00, High: 118.00 + +Indices probed: 20, 21, 24, 29 +---Removed: Maryland, Avg: 54.20, Low: -40.00, High: 109.00 + +Indices probed: 35 +---Removed: Florida, Avg: 70.70, Low: -2.00, High: 109.00 + +Indices probed: 8, 9, 12, 17, 24, 33, 44, 57, 5, 22, 41, 62, 18, 43, 3, 32, 63, 29, 64, 34, 6, 47, 23, 1, 48, 30, 14, 0, 55, 45, 37, 31, 27, 25, 25, 27, 31, 37, 45, 55, 0, 14, 30, 48, 1, 23, 47, 6, 34, 64, 29, 63, 32, 3, 43, 18, 62, 41, 22, 5, 57, 44, 33, 24, 17, 12, 9, 8 +---Failed to remove Quebec + +HASH TABLE ARRAY DUMP: + 1) Tennessee, Avg: 57.60, Low: -32.00, High: 113.00 + 2) Alabama, Avg: 26.60, Low: -27.00, High: 112.00 + 3) Delaware, Avg: 55.30, Low: -17.00, High: 110.00 + 4) West Virginia, Avg: 51.80, Low: -37.00, High: 112.00 + 5) Minnesota, Avg: 41.20, Low: -60.00, High: 114.00 + 6) Unused + 7) Unused + 8) Nebraska, Avg: 48.80, Low: -47.00, High: 118.00 + 9) Pennsylvania, Avg: 48.80, Low: -42.00, High: 111.00 + 10) Wyoming, Avg: 42.00, Low: -66.00, High: 115.00 + 11) Vermont, Avg: 42.90, Low: -50.00, High: 105.00 + 12) Louisiana, Avg: 66.40, Low: -16.00, High: 114.00 + 13) North Dakota, Avg: 40.40, Low: -60.00, High: 121.00 + 14) Connecticut, Avg: 49.00, Low: -32.00, High: 106.00 + 15) Kansas, Avg: 54.30, Low: -40.00, High: 121.00 + 16) Colorado, Avg: 45.10, Low: -61.00, High: 118.00 + 17) Arkansas, Avg: 60.30, Low: -29.00, High: 120.00 + 18) Ohio, Avg: 50.70, Low: -39.00, High: 113.00 + 19) New Jersey, Avg: 43.80, Low: -34.00, High: 110.00 + 20) Wisconsin, Avg: 43.10, Low: -55.00, High: 114.00 + 21) South Dakota, Avg: 45.20, Low: -58.00, High: 120.00 + 22) Virginia, Avg: 55.10, Low: -30.00, High: 110.00 + 23) Indiana, Avg: 47.80, Low: -36.00, High: 116.00 + 24) New York, Avg: 45.40, Low: -52.00, High: 108.00 + 25) North Carolina, Avg: 59.00, Low: -34.00, High: 110.00 + 26) Unused + 27) Unused + 28) Oregon, Avg: 48.40, Low: -54.00, High: 119.00 + 29) Unused + 30) Unused + 31) Utah, Avg: 48.60, Low: -69.00, High: 117.00 + 32) Illinois, Avg: 51.70, Low: -36.00, High: 117.00 + 33) South Carolina, Avg: 62.40, Low: -19.00, High: 111.00 + 34) Unused + 35) Iowa, Avg: 44.40, Low: -47.00, High: 118.00 + 36) Unused + 37) California, Avg: 59.40, Low: -45.00, High: 134.00 + 38) Unused + 39) Unused + 40) Unused + 41) Unused + 42) Georgia, Avg: 63.50, Low: -17.00, High: 112.00 + 43) Kentucky, Avg: 55.60, Low: -37.00, High: 114.00 + 44) Mississippi, Avg: 54.50, Low: -19.00, High: 115.00 + 45) Massachusetts, Avg: 41.00, Low: -35.00, High: 107.00 + 46) Unused + 47) Unused + 48) Unused + 49) Montana, Avg: 42.70, Low: -70.00, High: 117.00 + 50) Unused + 51) Unused + 52) Alaska, Avg: 62.80, Low: -80.00, High: 100.00 + 53) Unused + 54) New Hampshire, Avg: 49.90, Low: -47.00, High: 106.00 + 55) Arizona, Avg: 60.40, Low: -40.00, High: 128.00 + 56) Idaho, Avg: 51.80, Low: -60.00, High: 118.00 + 57) Missouri, Avg: 63.40, Low: -40.00, High: 118.00 + 58) Oklahoma, Avg: 59.60, Low: -27.00, High: 120.00 + 59) Unused + 60) Unused + 61) Unused + 62) Rhode Island, Avg: 50.10, Low: -25.00, High: 104.00 + 63) Maine, Avg: 47.90, Low: -50.00, High: 105.00 + 64) Michigan, Avg: 44.40, Low: -51.00, High: 112.00 + 65) Hawaii, Avg: 70.00, Low: 12.00, High: 100.00 + 66) Unused + 67) Nevada, Avg: 53.40, Low: -50.00, High: 125.00 + + +Hash Table Status: DDDDDUUDDDDDDDDDDDDDDDDDDUUDUUDDDUDUDUUUUDDDDUUUDUUDUDDDDDUUUDDDDUD +D => Data, U => Unused + + Items in Hash Table: 45 + Minimum contiguous bins: 1 + Maximum contiguous bins: 18 + Number of empty bins: 22 + +End Program diff --git a/PA10-1115/StandardConstants.h b/PA10-1115/StandardConstants.h new file mode 100644 index 0000000..e536c24 --- /dev/null +++ b/PA10-1115/StandardConstants.h @@ -0,0 +1,73 @@ +// Preprocessor directives +#ifndef STANDARD_CONSTANTS_H +#define STANDARD_CONSTANTS_H + +// Include Boolean +#include + +// global constants + +// constant for end of c-string null character +#define CARRIAGE_RETURN_CHAR '\r' + +//constant for a COLON +#define COLON ':' + +//constant for a COMMA +#define COMMA ',' + +//Constant to print a dash +#define DASH '-' + +// highest printable character +#define HIGHEST_PRINTABLE_CHAR '~' + +// constant for huge string length +#define HUGE_STR_LEN 256 + +// lowest printable character +#define LOWEST_PRINTABLE_CHAR ' ' + +// constant for small string length +#define MIN_STR_LEN 32 + +// constant for maximum string length +#define MAX_STR_LEN 128 + +// constant for end of c-string null character +#define NEWLINE_CHAR '\n' + +// first non-printable above ASCII +#define DELETE_KEY 127 + +// constant for end of c-string null character +#define NULL_CHAR '\0' + +// columns found in grade sheet before grading columns +#define NUM_BASE_COLS 5 + +// constant for number of grading frequency bins +#define NUM_FREQUENCY_BINS 10 + +//Constant for printing a pipe +#define PIPE '|' + +//Constant for a period +#define PERIOD '.' + +//Constant for PRECISION, 2 digits +#define PRECISION_2 2 + +//Constant for PRECISION, 4 digits +#define PRECISION_4 4 + +// constant for space character +#define SPACE ' ' + +// constant for standard string length +#define STD_STR_LEN 64 + +// constant for smallest string length +#define TINY_STR_LEN 16 + +#endif // STANDARD_CONSTANTS diff --git a/PA10-1115/StateDataUtility.c b/PA10-1115/StateDataUtility.c new file mode 100644 index 0000000..5cf3041 --- /dev/null +++ b/PA10-1115/StateDataUtility.c @@ -0,0 +1,83 @@ +// header files +#include "StateDataUtility.h" + +/* Data Structures +typedef struct StateStruct + { + char name[ STD_STR_LEN ]; + + double averageTemp, lowestTemp, highestTemp; + + bool inUse; + } StateDataType; +Data Structures */ + +// function definitions + +/* +Name: setDataNodeFromData +Process: sets given values into a given StateDataType struct, + using individual struct data +Function input/parameters: provided name (const char *), + average, lowest, and highest temperatures (double), + and node in use state +Function output/parameters: updated state data pointer (StateDataType *) +Function output/returned: none +Device input/---: none +Device output/---: none +Dependencies: privateCopyString +*/ +void setDataNodeFromData( StateDataType *nodePtr, const char *name, + double avgTemp, double lowTemp, double highTemp, bool nodeState ) +{ + // no return, void. +} + +/* +Name: setDataNodeFromStruct +Process: sets given values into a given StateDataType struct, + using another data struct +Function input/parameters: provided state data source struct + (const StateDataType) +Function output/parameters: updated state data pointer (StateDataType *) +Function output/returned: none +Device input/---: none +Device output/---: none +Dependencies: setDataNodeFromData +*/ +void setDataNodeFromStruct( StateDataType *nodePtr, + const StateDataType source ) +{ + // no return, void. +} + +/* +Name: stateDataToString +Process: creates string from StateDataType data +Function input/parameters: provided state data (const StateDataType) +Function output/parameters: output string (char *) +Function output/returned: none +Device input/---: none +Device output/---: none +Dependencies: sprintf, or other options +*/ +void stateDataToString( char *outStr, const StateDataType state ) +{ + // no return, void. +} + +/* +Name: setEmptyDataNode +Process: sets given node values to string "---", zero values, + and Boolean in use variable to false +Function input/parameters: state data struct (StateDataType *) +Function output/parameters: updated state data struct (StateDataType *) +Function output/returned: none +Device input/---: none +Device output/---: none +Dependencies: privateCopyString +*/ +void setEmptyDataNode( StateDataType *node ) +{ + // no return, void. +} \ No newline at end of file diff --git a/PA10-1115/StateDataUtility.h b/PA10-1115/StateDataUtility.h new file mode 100644 index 0000000..1471179 --- /dev/null +++ b/PA10-1115/StateDataUtility.h @@ -0,0 +1,74 @@ +#ifndef DATA_UTILITIES_H +#define DATA_UTILITIES_H + +// header files +#include "StandardConstants.h" + +// data structures +typedef struct StateStruct + { + char name[ STD_STR_LEN ]; + + double averageTemp, lowestTemp, highestTemp; + + bool inUse; + } StateDataType; + +/* +Name: setDataNodeFromData +Process: sets given values into a given StateDataType struct, + using individual struct data +Function input/parameters: provided name (const char *), + average, lowest, and highest temperatures (double), + and node in use state +Function output/parameters: updated state data pointer (StateDataType *) +Function output/returned: none +Device input/---: none +Device output/---: none +Dependencies: privateCopyString +*/ +void setDataNodeFromData( StateDataType *nodePtr, const char *name, + double avgTemp, double lowTemp, double highTemp, bool nodeState ); + +/* +Name: setDataNodeFromStruct +Process: sets given values into a given StateDataType struct, + using another data struct +Function input/parameters: provided state data source struct + (const StateDataType) +Function output/parameters: updated state data pointer (StateDataType *) +Function output/returned: none +Device input/---: none +Device output/---: none +Dependencies: setDataNodeFromData +*/ +void setDataNodeFromStruct( StateDataType *nodePtr, + const StateDataType source ); + +/* +Name: stateDataToString +Process: creates string from StateDataType data +Function input/parameters: provided state data (const StateDataType) +Function output/parameters: output string (char *) +Function output/returned: none +Device input/---: none +Device output/---: none +Dependencies: sprintf, or other options +*/ +void stateDataToString( char *outStr, const StateDataType state ); + +/* +Name: setEmptyDataNode +Process: sets given node values to string "---", zero values, + and Boolean in use variable to false +Function input/parameters: state data struct (StateDataType *) +Function output/parameters: updated state data struct (StateDataType *) +Function output/returned: none +Device input/---: none +Device output/---: none +Dependencies: privateCopyString +*/ +void setEmptyDataNode( StateDataType *node ); + + +#endif // DATA_UTILITIES_H diff --git a/PA10-1115/inData.csv b/PA10-1115/inData.csv new file mode 100644 index 0000000..fc98752 --- /dev/null +++ b/PA10-1115/inData.csv @@ -0,0 +1,50 @@ +Massachusetts,41,-35,107 +Rhode Island,50.1,-25,104 +Wyoming,42,-66,115 +New Mexico,52.7,-50,122 +Tennessee,57.6,-32,113 +South Dakota,45.2,-58,120 +Indiana,47.8,-36,116 +Arkansas,60.3,-29,120 +Kansas,54.3,-40,121 +Minnesota,41.2,-60,114 +North Dakota,40.4,-60,121 +Vermont,42.9,-50,105 +Oregon,48.4,-54,119 +West Virginia,51.8,-37,112 +Montana,42.7,-70,117 +Idaho,51.8,-60,118 +Nevada,53.4,-50,125 +Missouri,63.4,-40,118 +Utah,48.6,-69,117 +Hawaii,70,12,100 +South Carolina,62.4,-19,111 +North Carolina,59,-34,110 +Maine,47.9,-50,105 +Texas,64.8,-23,120 +Kentucky,55.6,-37,114 +Colorado,45.1,-61,118 +Michigan,44.4,-51,112 +Ohio,50.7,-39,113 +Pennsylvania,48.8,-42,111 +Florida,70.7,-2,109 +Louisiana,66.4,-16,114 +Oklahoma,59.6,-27,120 +Mississippi,54.5,-19,115 +New Jersey,43.8,-34,110 +Iowa,44.4,-47,118 +New York,45.4,-52,108 +Virginia,55.1,-30,110 +Alabama,26.6,-27,112 +Delaware,55.3,-17,110 +Wisconsin,43.1,-55,114 +New Hampshire,49.9,-47,106 +Illinois,51.7,-36,117 +Arizona,60.4,-40,128 +Maryland,54.2,-40,109 +Nebraska,48.8,-47,118 +California,59.4,-45,134 +Washington,48.3,-48,118 +Georgia,63.5,-17,112 +Connecticut,49,-32,106 +Alaska,62.8,-80,100