From 802cf4aba8b49b0fad8f6f7bf670a8a1768257f8 Mon Sep 17 00:00:00 2001 From: cdez Date: Sun, 10 Sep 2023 16:52:23 -0700 Subject: [PATCH] Finished most of the Supporting Functions +- StateUtilities.c ++ outDebug (release for UNIX of incomplete program) --- PA02-0913/StateUtilities.c | 236 +++++++++++++++++++++++++++++++-- PA02-0913/build/Debug/outDebug | Bin 83968 -> 89992 bytes 2 files changed, 222 insertions(+), 14 deletions(-) diff --git a/PA02-0913/StateUtilities.c b/PA02-0913/StateUtilities.c index 0234d21..f7ace2c 100644 --- a/PA02-0913/StateUtilities.c +++ b/PA02-0913/StateUtilities.c @@ -7,6 +7,8 @@ const int GROWTH_BLOCK_SIZE = 10; // missing constants from assignment file const int ITEM_BLOCK_SIZE = 6; const int MAJORITY_BLOCK_SIZE = 10; +const char EQUALS = '='; +const char PLUS = '+'; // functions @@ -33,12 +35,21 @@ bool addElementFromData( StateDataType *stateArr, int *size, int capacity, double stateGrowth, char politicalMajority ) { // check to see if the size will go over the capacity - // put in the data to the array - // array[*size] = parameter - // string is a little different. - // use strcpy(array[*size].name, stateName) - // increment size (*size = *size + 1) - // return true + if(*size <= capacity) + { + // put in the data to the array + // array[*size] = parameter + stateArr[*size].population = statePop; + stateArr[*size].growth = stateGrowth; + stateArr[*size].majority = politicalMajority; + // string is a little different. + // use strcpy(array[*size].name, stateName) + strcpy(stateArr[*size].name, stateName); + // increment size (*size = *size + 1) + *size = *size + 1; + // return true + return true; + } // otherwise, return false. return false; } @@ -77,6 +88,7 @@ Dependencies: as needed, including free StateDataType *clearStateArray( StateDataType *array ) { // use free to deallocate the array + free(array); return NULL; } @@ -98,7 +110,7 @@ void copyArray( StateDataType *dest, const StateDataType *src, int srcSize ) // no return, void } -/* COMPLETE +/* Name: createStateArray Process: dynamically allocates array memory Function input/parameters: initial capacity (int) @@ -111,10 +123,12 @@ Dependencies: as needed, including function malloc and keyword sizeof StateDataType *createStateArray( int initialCapacity ) { // define variables (integer, StateDataType) + StateDataType *stateArray; // use malloc to dynamically allocate the array, // use the initialCapacity as the size to multiply by. + stateArray = malloc(sizeof(StateDataType) * initialCapacity); // return the pointer to the array. - return NULL; + return stateArray; } /* @@ -131,8 +145,12 @@ Dependencies: as needed, including strcpy void deepCopy( StateDataType *dest, const StateDataType src ) { // *dest.population = src.population (for each piece) + dest->population = src.population; + dest->growth = src.growth; + dest->majority = src.majority; // strcpy for the string // strcpy(*dest.name, src.name) + strcpy(dest->name, src.name); // no return, void } @@ -151,6 +169,122 @@ Dependencies: as needed */ void displayData( const StateDataType *array, int size, const char *subTitle ) { + int countStates; + // iterate through array to size, check if zero. + if(size != 0) + { + // create a table + // print PIPE character + printCharacter(PIPE); + // print ITEM justified center + printStringJustified("Item", ITEM_BLOCK_SIZE, "CENTER"); + // print PIPE character + printCharacter(PIPE); + // print STATE NAME justified center + printStringJustified("State Name", NAME_BLOCK_SIZE, "CENTER"); + // print PIPE character + printCharacter(PIPE); + // print POPULATION justified center + printStringJustified("Population", POPULATION_BLOCK_SIZE, "CENTER"); + // print PIPE character + printCharacter(PIPE); + // print GROWTH justified center + printStringJustified("Growth", GROWTH_BLOCK_SIZE, "CENTER"); + // print PIPE character + printCharacter(PIPE); + // print MAJORITY justified center + printStringJustified("Majority", MAJORITY_BLOCK_SIZE, "CENTER"); + // print PIPE character + printCharacter(PIPE); + // print new line + printEndline(); + // printing the top border piece + // print PIPE character + printCharacter(PIPE); + // print amount of = for ITEM + printCharacters(ITEM_BLOCK_SIZE, EQUALS); + // print PLUS (needs constant) character + printCharacter(PLUS); + // print amount of = for STATE NAME + printCharacters(NAME_BLOCK_SIZE, EQUALS); + // print PLUS character + printCharacter(PLUS); + // print amount of = for POPULATION + printCharacters(POPULATION_BLOCK_SIZE, EQUALS); + // print PLUS character + printCharacter(PLUS); + // print amount of = for GROWTH + printCharacters(GROWTH_BLOCK_SIZE, EQUALS); + // print PLUS character + printCharacter(PLUS); + // print amount of = for MAJORITY + printCharacters(MAJORITY_BLOCK_SIZE, EQUALS); + // print PIPE character + printCharacter(PIPE); + // print new line + printEndline(); + for(countStates = 0; countStates < size; countStates++) + { + // use the constants to format the table + // print PIPE character + printCharacter(PIPE); + // print item justified right (size) + printIntegerJustified(countStates + 1, ITEM_BLOCK_SIZE, "RIGHT"); + // print PIPE character + printCharacter(PIPE); + // print state name justified left + printStringJustified(array[countStates].name, NAME_BLOCK_SIZE, "LEFT"); + // print PIPE character + printCharacter(PIPE); + // print population justified right + printIntegerJustified(array[countStates].population, POPULATION_BLOCK_SIZE, "RIGHT"); + // print PIPE character + printCharacter(PIPE); + // print growth justified right, need a % sign too. (requires some math trickery to make work) + printDoubleJustified(array[countStates].growth, PRECISION_2, GROWTH_BLOCK_SIZE - 2, "RIGHT"); + printCharacter('%'); + printCharacter(SPACE); + // print PIPE character + printCharacter(PIPE); + // print majority justified center, also requires some math trickery to make work + printCharacters((MAJORITY_BLOCK_SIZE - 1) / 2, SPACE); + printCharacter(array[countStates].majority); + printCharacters((MAJORITY_BLOCK_SIZE - 1) / 2, SPACE); + // print PIPE character + printCharacter(PIPE); + // print endline + printEndline(); + // printing for the spacer lines + // print PIPE character + printCharacter(PIPE); + // print amount of DASH for item + printCharacters(ITEM_BLOCK_SIZE, DASH); + // print PLUS character + printCharacter(PLUS); + // print amount of DASH for state name + printCharacters(NAME_BLOCK_SIZE, DASH); + // print PLUS character + printCharacter(PLUS); + // print amount of DASH for population + printCharacters(POPULATION_BLOCK_SIZE, DASH); + // print PLUS character + printCharacter(PLUS); + // print amount of DASH for growth + printCharacters(GROWTH_BLOCK_SIZE, DASH); + // print PLUS character + printCharacter(PLUS); + // print amount of DASH for majority + printCharacters(MAJORITY_BLOCK_SIZE, DASH); + // print PIPE character + printCharacter(PIPE); + } + } + else + { + //print out "Data no found - Display aborted". + printString("Data not found - Display aborted"); + printEndline(); + } // no return, void } @@ -172,8 +306,12 @@ Dependencies: as needed bool findStateByName( StateDataType *foundElement, const StateDataType *array, int size, const StateDataType searchValue ) { - // - return NULL; + // iterate through array + // check to see if the state name is found (use searchValue) + // copy the element out of the array, put in foundElement + // return true + // otherwise, return false + return false; } /* @@ -195,7 +333,12 @@ Dependencies: as needed bool removeStateByName( StateDataType *removedElement, StateDataType *array, int *size, const StateDataType searchVal ) { - // + // iterate through array + // use the findStateByName to search + // remove the element by copying the next element into last slot until end + // reduce the size by one + // return true + // otherwise, return false return NULL; } @@ -211,8 +354,11 @@ Dependencies: as needed */ void runBubbleSortByName( StateDataType *array, int size ) { + // start iterator at size - 2? + // iterate through iterator + // check the current index vs the next one. + // if current > next, swap. // no return, void - // bubble sort the data by name of state } /* @@ -259,6 +405,13 @@ Dependencies: none */ void setEmptyElementData( StateDataType *element ) { + // set the element's name to "" + strcpy(element->name, ""); + // set the element's population and growth to 0 + element->population = 0; + element->growth = 0.0; + // set the element's majority to 'x' + element->majority = 'x'; // no return, void } @@ -275,6 +428,12 @@ Dependencies: as needed */ void showTitle() { + // use console io utilities to display the string + printString("Data Management with N-Squared Sorting"); + // use console io utilities to display 38 '=' + printCharacters(38, '='); + // print an endline + printEndline(); // no return, void } @@ -317,6 +476,55 @@ Dependencies: as needed int uploadStateData( StateDataType *StateDataArray, int capacity, const char *fileName ) { - // - return 0; + // setup a counter and other variables + int stateCount = 0; + StateDataType *stateUpload; + bool fileOpenCheck; + char *currentString; + int populationUpload; + double growthUpload; + char majorityUpload; + // initialize the stateUpload with empty data + setEmptyElementData(stateUpload); + // open file + fileOpenCheck = openInputFile(fileName); + if(fileOpenCheck) + { + // read in the four strings/starting line (use readStringToLineEndFromFile) + readStringToLineEndFromFile(currentString); + while(!checkForEndOfInputFile()) + { + // repeat these steps: (use readStringToDelimiterFromFile) + // read in the state name, store + readStringToDelimiterFromFile(COMMA, currentString); + strcpy(stateUpload->name, currentString); + // read in the population, store (cast from string to int) + readStringToDelimiterFromFile(COMMA, currentString); + // find a way to cast string to int, sscanf might work best. + sscanf(currentString, "%d", &populationUpload); + stateUpload->population = populationUpload; + // read in the growth, store (cast from string to double) + readStringToDelimiterFromFile(COMMA, currentString); + // find a way to cast string to double, using sscanf. + sscanf(currentString, "%lf", &growthUpload); + stateUpload->growth = growthUpload; + // read in the majority, store + readStringToDelimiterFromFile(COMMA, currentString); + // get the first character of currentString + majorityUpload = currentString[0]; + stateUpload->majority = majorityUpload; + // use the addElementFromData function to add the data to array + addElementFromData(StateDataArray, &stateCount, capacity, stateUpload->name, stateUpload->population, stateUpload->growth, stateUpload->majority); + // increment counter + stateCount = stateCount + 1; + // do until end of the file is reached. + } + } + else + { + // error out + printf("\nThe file you referenced either does not exist, or inadequate file permissions to access.\n"); + } + // return counter + return stateCount; } \ No newline at end of file diff --git a/PA02-0913/build/Debug/outDebug b/PA02-0913/build/Debug/outDebug index ec674b2b8c6dfb173191dc3490d5c8b7519431dd..5dd1725734eb9755cce6e18d0a8c708a1b7e47a5 100755 GIT binary patch delta 15914 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 fy?+`GFz{PHRM$89YB>v`%VTu?cB0)fn