Initialize PA10, STUB Functions

++ PA10 Files
++ Makefile for PA10
This commit is contained in:
Charles Descamps 2023-11-10 14:34:28 -07:00
parent d9e90f6501
commit 91ce50b189
17 changed files with 4154 additions and 0 deletions

View file

@ -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 );
}

View file

@ -0,0 +1,289 @@
// Preprocessor directive
#ifndef CONSOLE_IO_UTILITY_H
#define CONSOLE_IO_UTILITY_H
//Header Files
#include <stdbool.h>
#include <stdio.h>
#include <string.h>
#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

View file

@ -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 <stdlib.h> //////////////////////////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 );
}

View file

@ -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 <stdbool.h>
#include <stdio.h>
#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

View file

@ -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;
}

View file

@ -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 <stdbool.h>
#include <stdio.h>
#include <string.h>
#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

View file

@ -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;
}

View file

@ -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

209
PA10-1115/HashUtility.c Normal file
View file

@ -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 <D>ata values and <U>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.
}

186
PA10-1115/HashUtility.h Normal file
View file

@ -0,0 +1,186 @@
#ifndef HASH_UTILITIES_H
#define HASH_UTILITIES_H
// header files
#include "StandardConstants.h"
#include "GeneralUtility.h"
#include "StateDataUtility.h"
#include <stdio.h>
#include <stdlib.h>
// 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 <D>ata values and <U>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

43
PA10-1115/Makefile Normal file
View file

@ -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

240
PA10-1115/PA10_Main.c Normal file
View file

@ -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;
}

View file

@ -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

View file

@ -0,0 +1,73 @@
// Preprocessor directives
#ifndef STANDARD_CONSTANTS_H
#define STANDARD_CONSTANTS_H
// Include Boolean
#include <stdbool.h>
// 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

View file

@ -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.
}

View file

@ -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

50
PA10-1115/inData.csv Normal file
View file

@ -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
1 Massachusetts 41 -35 107
2 Rhode Island 50.1 -25 104
3 Wyoming 42 -66 115
4 New Mexico 52.7 -50 122
5 Tennessee 57.6 -32 113
6 South Dakota 45.2 -58 120
7 Indiana 47.8 -36 116
8 Arkansas 60.3 -29 120
9 Kansas 54.3 -40 121
10 Minnesota 41.2 -60 114
11 North Dakota 40.4 -60 121
12 Vermont 42.9 -50 105
13 Oregon 48.4 -54 119
14 West Virginia 51.8 -37 112
15 Montana 42.7 -70 117
16 Idaho 51.8 -60 118
17 Nevada 53.4 -50 125
18 Missouri 63.4 -40 118
19 Utah 48.6 -69 117
20 Hawaii 70 12 100
21 South Carolina 62.4 -19 111
22 North Carolina 59 -34 110
23 Maine 47.9 -50 105
24 Texas 64.8 -23 120
25 Kentucky 55.6 -37 114
26 Colorado 45.1 -61 118
27 Michigan 44.4 -51 112
28 Ohio 50.7 -39 113
29 Pennsylvania 48.8 -42 111
30 Florida 70.7 -2 109
31 Louisiana 66.4 -16 114
32 Oklahoma 59.6 -27 120
33 Mississippi 54.5 -19 115
34 New Jersey 43.8 -34 110
35 Iowa 44.4 -47 118
36 New York 45.4 -52 108
37 Virginia 55.1 -30 110
38 Alabama 26.6 -27 112
39 Delaware 55.3 -17 110
40 Wisconsin 43.1 -55 114
41 New Hampshire 49.9 -47 106
42 Illinois 51.7 -36 117
43 Arizona 60.4 -40 128
44 Maryland 54.2 -40 109
45 Nebraska 48.8 -47 118
46 California 59.4 -45 134
47 Washington 48.3 -48 118
48 Georgia 63.5 -17 112
49 Connecticut 49 -32 106
50 Alaska 62.8 -80 100