Insight into something.
Assignment : |
|
Source Code : |
|
Compiled Executables : |
|
Documentation : |
|
Sample Test Files : |
//////////////////////////////////////////////////////////////////////////////// /// /// \file matchmaking.c /// \brief /// /// <br>Author(s): Nicholas Guthrie /// <br>Created: 2011-02-20 /// <br>Email: nickguthrie@knights.ucf.edu /// <br>Web: http://nickguthrie.com /// <br>Title: Matchmaking /// <br>Course: COP3502C Compute Science I /// <br> Class #: 16173 /// <br>Section #: 0001 /// /// THIS SOFTWARE IS PROVIDED BY THE NICHOLAS GUTHRIE''AS IS'' AND ANY EXPRESS /// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES /// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN /// NO EVENT SHALL UCF BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, /// EXEMPLARY,OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, /// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; /// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, /// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR /// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF /// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /// //////////////////////////////////////////////////////////////////////////////// //////////////////// // Includes // //////////////////// #include<stdio.h> #include<stdlib.h> #include<string.h> enum GENDER{ MALE = 0, FEMALE = 1 }; //////////////////// // Structures // //////////////////// struct People { char name[20]; ///< name of the person > int score[10]; ///< their index of scores > }; struct Event { int couples; ///< # of couples > struct People people[2][10]; int best_females[10]; int likeability; int templikeability; int tempbest_females[10]; }; ///////////////////////// // Function Prototypes // ///////////////////////// void RecursivePermute(struct Event * event, int posA); void Flop(struct Event *event, int first, int second); //////////////////// // Main // //////////////////// int main() { FILE *input, *output; int numevents, numcouples; int i, j, k, m; char * name; struct Event *event = (struct Event *)malloc(sizeof(struct Event)); int bestfemale; //////////////////// // Get Input // //////////////////// input = fopen ("input.txt", "r"); output = fopen("out.txt", "w"); //file open error checking if(input == NULL) { printf("File not Found, Press ENTER to exit\n"); getchar(); return 0; } fscanf(input, "%d", &numevents); // iterate for number of couples for(i = 0; i<numevents; i++) { // determine number of couples fscanf(input, "%d", &numcouples); event->couples = numcouples; event->likeability = 0; event->templikeability = 0; for(j = 0; j<10; j++) { event->tempbest_females[j] = j; } // store names into database for (j = 0; j < 2; j++) { for(k = 0; k < event->couples; k++) fscanf(input, "%s", event->people[j][k].name); } // store compatability socres in database for (j = 0; j < 2; j++) { for(k = 0; k < event->couples; k++) { for(m = 0; m < event->couples; m++) { fscanf(input, "%d", &event->people[j][k].score[m]); } } } ///////////////////// // Find Best Combo // ///////////////////// RecursivePermute(event, 0); fprintf(output, "Matching #%d: Maximum Score = %d.\n\n", i+1, event->likeability); for(j = 0; j < event->couples; j++) { bestfemale = event->best_females[j]; fprintf(output, "%s %s\n", event->people[MALE][j].name, event->people[FEMALE][bestfemale].name); } fprintf(output, "\n\n"); }//all events finished fclose(input); fclose(output); free(event); } //////////////////////////////////////////////////////////////////////////////// /// /// \brief recursively finds the best couples, operates on event /// /// \param[in] pointer to an event structure /// \param[in] initial position as an int /// /// \return void /// //////////////////////////////////////////////////////////////////////////////// void RecursivePermute(struct Event * event, int posA) { int i, j; int posB; //unique set if(posA == event->couples) { //iterate for all couples for(i = 0; i < event->couples; i++){ //secondary couples bcz each person has couples * opinions if (event->people[MALE][i].score[event->tempbest_females[i]] < event->people[FEMALE][event->tempbest_females[i]].score[i]) { event->templikeability += event->people[MALE][i].score[event->tempbest_females[i]]; } else { event->templikeability += event->people[FEMALE][event->tempbest_females[i]].score[i]; } } //compare current likeability to templikeability if(event->templikeability > event->likeability) { event->likeability = event->templikeability; for(i = 0; i < event->couples; i++) { event->best_females[i] = event->tempbest_females[i]; } } event->templikeability = 0; } else { for(posB=posA; posB < event->couples; posB++) { Flop(event, posA, posB); RecursivePermute(event, posA+1); Flop(event, posB, posA); } } } //////////////////////////////////////////////////////////////////////////////// /// /// \brief reverses two positions in an event /// /// \param[in] pointer to an event /// \param[in] position of first int to switch with second /// \param[in] position of second int to switch /// /// \return void /// //////////////////////////////////////////////////////////////////////////////// void Flop(struct Event *event, int first, int second) { int temp = event->tempbest_females[first]; event->tempbest_females[first] = event->tempbest_females[second]; event->tempbest_females[second] = temp; }