|
//file: COOL002.cpp //Author: AOU //Date 09/03/2004 //////////////////////////////////////////////////////// // Assignment 01, Date Assigned 9/3/2004, Due: 9/10/2004 //////////////////////////////////////////////////////// /* As discussed in the class, implement the search function that finds the occurrence of a value x in a list of sorted values and returns the first position of the value and the number of times it occurs. Submit the printed form of the following: (1) Detailed Description: (2) Two Example: (3) Detailed Algorithm: (4) Code: (5) Output from 20 Test Cases: void COOL::search(int x, int &p, int &c) { //Code to be replaced p=1; c=3; } Sample output: COOL[19] = [-9999 0 1 1 2 3 5 5 5 6 7 7 7 7 7 8 9 9 9 10 9999 ] Searching for 7 Found 5 copies of 7 starting at position 10 In other words, 7 was found at positions 10 11 12 13 14 COOL[18] = [-9999 1 2 2 4 5 5 6 6 7 7 7 8 8 9 9 10 10 10 9999 ] Searching for 4 Found 1 copies of 4 starting at position 4 In other words, 4 was found at positions 4 COOL[7] = [-9999 0 0 5 5 5 6 7 9999 ] Searching for 4 Found 0 copies of 4 starting at position -1 In other words, 4 was found at positions COOL[5] = [-9999 0 1 3 6 10 9999 ] Searching for 0 Found 1 copies of 0 starting at position 1 In other words, 0 was found at positions 1 */ //////////////////////////////////////////////////////// //////////////////////////////////////////////////////// //////////////////////////////////////////////////////// // includes //////////////////////////////////////////////////////// #include <iostream.h> #include <math.h> #include <stdlib.h> #include <time.h> //////////////////////////////////////////////////////// // constants //////////////////////////////////////////////////////// int const MAX_SIZE = 20+2; int const INFINITY = 9999; int const TEST_COUNT = 20; int const MAX_VALUE = 10; /* Description: Example: Algorithm: */ //Problem: // List of values (duplicates allowed) kept in order // with several operations: // initialize, insert, delete, modify, search, ... //Example: // {}, {50}, {25,50}, {25,36,50}, {25,36,50,76}, // {25,36,50,76} //Algorithms: //////////////////////////////////////////////////////// // class COOL //////////////////////////////////////////////////////// class COOL { private: int a[MAX_SIZE]; int n; public: COOL(void); bool insert(int x); void display(void); bool isSorted(void); COOL(int m); int search(int x); void search(int x, int &p, int &c); }; //////////////////////////////////////////////////////// // test function prototypes //////////////////////////////////////////////////////// void test_initialize(void); void test_constructor(void); void test_search(void); void test_search2(void); //////////////////////////////////////////////////////// // main //////////////////////////////////////////////////////// void main(void) { //srand(time(NULL)); //test_initialize(); //test_constructor(); //test_search(); test_search2(); } //////////////////////////////////////////////////////// // void COOL::search(int x, int &p, int &c) //////////////////////////////////////////////////////// /* Description: searches for copies of x in the list, in p returns the position, in c returns the number of copies of x starting at p. Example: [-99, 12, 24, 24, 24, 45, 50, 60, 75, 99], 24 => 2, 3 => at positions 2, 3, 4 Algorithm: */ void COOL::search(int x, int &p, int &c) { //Code to be replaced p=1; c=3; } //////////////////////////////////////////////////////// // void test_search2(void) //////////////////////////////////////////////////////// void test_search2(void) { for (int i=1; i<=TEST_COUNT; i++) { int m = rand()%MAX_SIZE; COOL myList(m); myList.display(); int x = rand()%(MAX_VALUE +1); cout << "Searching for " << x << endl; int p, c; myList.search(x, p, c); cout << "Found " << c << " copies of " << x << " starting at position " << p << endl; cout << "In other words, " << x << " was found at positions "; for (int j=p; j<=p+c-1; j++) cout << j << ' '; cout << endl << endl; } } //////////////////////////////////////////////////////// // int COOL::search(int x) //////////////////////////////////////////////////////// /* Description: searches for the first value x in the list and returns the position if found else returns -1 Example: [-99, 12, 24, 45, 50, 60, 75, 99], 24 => 2 [-99, 12, 24, 45, 50, 60, 75, 99], 25 => -1 Algorithm: for i=1 to n-2 if x = a[i] then return i if x < a[i] then exit loop end for return -1 */ int COOL::search(int x) { for (int i=1; i<=n-2; i++) { if (x == a[i]) return i; if (x < a[i]) break; } return -1; } //////////////////////////////////////////////////////// // void test_search(void) //////////////////////////////////////////////////////// void test_search(void) { for (int i=1; i<=TEST_COUNT; i++) { int m = rand()%MAX_SIZE; COOL myList(m); myList.display(); int x = rand()%(MAX_VALUE +1); cout << "Searching for " << x << endl; cout << "Found at " << myList.search(x) << endl; } } //////////////////////////////////////////////////////// // COOL::COOL(int m) //////////////////////////////////////////////////////// //create a list with m values COOL::COOL(int m) { n = 2; a[0] = -INFINITY; a[1] = +INFINITY; for (int i=2; i<=MAX_SIZE-1; i++) a[i] = 0; for (i=1; i<=m; i++) { int x = rand()%(MAX_VALUE+1); insert(x); } } //////////////////////////////////////////////////////// // void test_constructor(void) //////////////////////////////////////////////////////// void test_constructor(void) { for (int i=1; i<=TEST_COUNT; i++) { int m = rand()%MAX_SIZE; COOL myList(m); cout << "After COOL myList(" << m << ");\n"; myList.display();// display(myArray, m); } } //////////////////////////////////////////////////////// // bool COOL::isSorted(void) //////////////////////////////////////////////////////// // bool isSorted(int a[], int n) /* Description: checks if the list is in order Example: Algorithm: */ bool COOL::isSorted(void) { for (int i=0; i<=n-2; i++) if (a[i] > a[i+1]) return false; return true; } //////////////////////////////////////////////////////// // void test_initialize(void) //////////////////////////////////////////////////////// void test_initialize(void) { COOL myList; for (int i=1; i<=TEST_COUNT/TEST_COUNT; i++) { //myList.initialize(); //initialize(myArray, m); myList.display();// display(myArray, m); int j, x; for (j=1; j<=TEST_COUNT; j++) { x = rand()%(MAX_VALUE+1); myList.insert(x); //insert(myArray, m, x); myList.display(); //display(myArray, m); if (myList.isSorted()) //(isSorted(myArray, m)) cout << "List is in order\n"; else cout << "List is NOT in order\n"; } } } //////////////////////////////////////////////////////// // COOL::COOL(void) //////////////////////////////////////////////////////// /* Description: Initializes the list of values by setting n=0, and a[0..MAX_SIZE-1] = 0; Algorithm: n = 2 a[0] = -INFINITY for i=1 to MAX_SIZE-2 a[i] = 0; a[MAX_SIZE-1] = +INFINITY */ COOL::COOL(void) { n = 2; a[0] = -INFINITY; a[1] = +INFINITY; for (int i=2; i<=MAX_SIZE-1; i++) a[i] = 0; } //////////////////////////////////////////////////////// // bool COOL::insert(int x) //////////////////////////////////////////////////////// /* Description: inserts x into the list and maintains the order Example: {}, {50}, {25,50}, {25,36,50}, {25,36,50,76}, {25,36,50,76} Algorithm0: Case0: list is full Case1: x goes to empty list x Case3: x > all the values in the list x Case2: x < all the values in the list Case4: x goes between two values and handle duplicates Algorithm1: m = n s1: if (x >= a[m-1]) then a[m] = x n++ exit function else a[m] = a[m-1] m-- goto s1 Algorithm2: m = n while x < a[m-1]) a[m] = a[m-1] m-- wend a[m] = x n++ */ bool COOL::insert(int x) { if (n >= MAX_SIZE) return false; int m = n; while (x < a[m-1]) { a[m] = a[m-1]; m--; } a[m] = x; n++; return true; } //////////////////////////////////////////////////////// // void COOL::display(void) //////////////////////////////////////////////////////// /* Description: Algorithm: */ void COOL::display(void) { cout << "COOL[" << n-2 << "] = ["; for (int i=0; i<=n-1; i++) cout << a[i] << ' '; cout << "]\n"; } |