p03Books02
Home ] Up ]

 

//p03books02
//author
//date 07/06/2001
//date 07/05/2001

// Project #2
//
// add function sortBubbleByTitle (learn and use strcmp)
// add function shuffle
// at least 10 records
//
/*
do the following five times

   Populate books with 10 random records
   display with message "Original"
   sortBubbleByTitle
   display with message "Sorted by Title"
   shuffle 
   display with message "After shuffling"

*/

//include files
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>


//constants
const int TITLE_LEN = 30;
const int AUTHOR_LEN = 30;


const char *testTitles[] = 
  {
  "C++ with Pizza Flavor", "Java Learn Now", "COBOL How To Forget",
  "FORTRAN 77", "DB2: An Introduction", "XML In 24 Hours",
  "UNIX"
  };

const int MAX_TITLES = sizeof(testTitles)/sizeof(testTitles[0]);

const char *testAuthors[] = 
  {
  "John", "Adam", "Sumeer", "Natalie", "David", "Rustin"
  };

const int MAX_AUTHORS = sizeof(testAuthors)/sizeof(testAuthors[0]);

const int testYears[] = {1977, 1988, 1989, 1991, 2000, 2001};

const int MAX_YEARS = sizeof(testYears)/sizeof(testYears[0]);



//BookType struct definition
struct BookType
  {
  char title[TITLE_LEN+1];
  char author[AUTHOR_LEN+1];
  int year;
  };


void display(BookType b);
void initialize(BookType &b, char t[], char a[], int y);
void input(BookType &b);
void copy(BookType &b1, BookType b2);
void display(BookType books[], int n);
void displayRev(BookType books[], int n);
void sortBubbleByYear(BookType books[], int n);
void populate(BookType books[], int n);   //07/06/2001
void swap(BookType &b1, BookType &b2);


//main function
void main(void)
  {
  /*
  BookType b1, b2;
  initialize(b1, "C++ The Hard Way", "Fowler", 2002);
  display(b1);
  copy(b2, b1);
  display(b2);
  */
  srand(time(NULL));

  BookType books[10];
  populate(books, 5);
  display(books, 5);
  cout << "After sort\n";
  sortBubbleByYear(books, 5);
  display(books, 5);
  }


//function to populate array books[] with n records
void populate(BookType books[], int n)   //07/06/2001
  {
  for (int i=0; i<n; i++)
    {
    //get a random title
    strcpy(books[i].title, testTitles[rand()%MAX_TITLES]);
    //get a random author
    strcpy(books[i].author, testAuthors[rand()%MAX_AUTHORS]);
    //get a random year
    books[i].year = testYears[rand()%MAX_YEARS];
    }
  }


//function to display the contents of BookType variable
void display(BookType b)
  {
  cout << "Title:  " << b.title << endl;
  cout << "Author: " << b.author << endl;
  cout << "Year:   " << b.year << endl;
  }


//function to display the contents of BookType array
void display(BookType books[], int n)
  {
  for (int i=0; i<=n-1; i++)
    display(books[i]);
    /*
    {
    cout << "Title:  " << books[i].title << endl;
    cout << "Author: " << books[i].author << endl;
    cout << "Year:   " << books[i].year << endl;
    }
    */
  }


//function to display the contents of BookType array
void displayRev(BookType books[], int n)
  {
  for (int i=n-1; i>=0; i--)
    display(books[i]);
  }


//function to initialize the contents of BookType variable
void initialize(BookType &b, char t[], char a[], int y)
  {
  strcpy(b.title, t);
  strcpy(b.author, a);
  b.year = y;
  }


//function to input the contents of BookType variable
void input(BookType &b)
  {
  cout << "Title:  "; cin >> b.title;
  cout << "Author: "; cin >> b.author;
  cout << "Year:   "; cin >> b.year;
  }


//function to copy b2 to b1
void copy(BookType &b1, BookType b2)
  {
  strcpy(b1.author, b2.author);
  strcpy(b1.title, b2.title);
  b1.year = b2.year;
  }


//function to sort array books by title
  /*
  do the following
    sorted = true
    complete a pass (set sorted = false if swap took place)
    until sorted


  do the following
    sorted = true
    for i=0 to n-2 do the following
      if books[i] > books[i+1] then
        swap books[i], books[i+1]
        sorted = false
        end if
      end for
    until sorted

  */
void sortBubbleByYear(BookType books[], int n)
  {
  bool sorted;
  int i;
  
  do 
    {
    sorted = true;
    for (i=0; i<=n-2; i++)
      {
      if (books[i].year > books[i+1].year) 
        {
        // swap books[i], books[i+1]
        swap(books[i], books[i+1]);
        sorted = false;
        }
      }
    }
    //incorrect while (sorted);
    while (!sorted); //correct
  }


void swap(BookType &b1, BookType &b2)
  {
  BookType temp;
  copy(temp, b1);
  copy(b1, b2);
  copy(b2, temp);
  }