| | |
Please help me to convert a simple C++ program into an object-oriented one.
![]() |
•
•
Join Date: Dec 2007
Posts: 10
Reputation:
Solved Threads: 0
Hi all,
I’ve been given told to convert a standard C++ program into an object-oriented one, using the principals of polymorphism, encapsulation and inheritance. Our lecturer covered all three principals in one 45 minute slot. I’m completely stuck and would be grateful for any help.
The standard C++ program accepts data values and filter values from the user. It then multiplies these values together using a simple algorithm and prints the output to the screen. The standard program is shown below.
I haven’t made much of a start as I’m unsure how to allocate the classes. I’ve allocated one class to the TheFilter structure with its associated data and functions, and another to the TheData structure.
I hate to admit defeat, but I’ve never programmed using an object-oriented approach and I’ve only been studying C++ for a couple of months. Please help!
Thanks in advance.
Zeke
Standard C++ program follows:
I’ve been given told to convert a standard C++ program into an object-oriented one, using the principals of polymorphism, encapsulation and inheritance. Our lecturer covered all three principals in one 45 minute slot. I’m completely stuck and would be grateful for any help.
The standard C++ program accepts data values and filter values from the user. It then multiplies these values together using a simple algorithm and prints the output to the screen. The standard program is shown below.
I haven’t made much of a start as I’m unsure how to allocate the classes. I’ve allocated one class to the TheFilter structure with its associated data and functions, and another to the TheData structure.
I hate to admit defeat, but I’ve never programmed using an object-oriented approach and I’ve only been studying C++ for a couple of months. Please help!
Thanks in advance.
Zeke
Standard C++ program follows:
C++ Syntax (Toggle Plain Text)
// Purpose // A program to demonstrate the application of a simple digital filter // // Overview // A sequence of data items and digital filter values need to be entered by the // user. The application of the filter to the data involves a simple convolution // operation. The filtered data are stored separately. // // Example // before filtering: // data_in = [0 1 3 6 3 1 0] // filter = [-0.5 1 -0.5] // after filtering: // data_out = [-0.5 -0.5 3 -0.5 -0.5] // where // data_out[0]=data_in[0]*filter[0]+data_in[1]*filter[1]+data_in[2]*filter[2] // data_out[1]=data_in[1]*filter[0]+data_in[2]*filter[1]+data_in[3]*filter[2] // data_out[2]=data_in[2]*filter[0]+data_in[3]*filter[1]+data_in[4]*filter[2] // data_out[3]=data_in[3]*filter[0]+data_in[4]*filter[1]+data_in[5]*filter[2] // data_out[4]=data_in[4]*filter[0]+data_in[5]*filter[1]+data_in[6]*filter[2] // // The program checks the following // 1. The data and filter values must have been entered before the filter is // applied // 2. The filter is not applied if the number of filter values is greater than // the number of input data values // 3. The data and filter values must have been entered and the filter applied // before the filtered data can be displayed #include <iostream> using namespace std; // the data values and the filter struct TheFilter { double* Values; // the filter values unsigned long Length; // number of filter values bool Valid; // true if the filter values have been Valid by the user }; struct TheData { double* Values; // holds the data to be filtered unsigned long Length; // number of data values bool Valid; // true if the data values have been Valid by the user }; // function return values enum {OK,FILTER_TOO_LONG}; // function prototypes void EnterData(TheData&); void EnterFilter(TheFilter&); int ApplyFilter(TheFilter, TheData, TheData&); void DisplayData(TheFilter, TheData, TheData); // Control the principal operations of the program // Arguments: None // Returns: 0 on completion int main() { // define the filter and its initial values TheFilter Filter = {0,0,false}; // define the original data and its initial values TheData OriginalData = {0,0,false}; // define the filtered data and its initial values TheData FilteredData = {0,0,false}; char UserInput; // loop until the user wishes to exit while (1) { // show the menu of options cout << endl; cout << "Filter Menu" << endl; cout << "-----------" << endl; cout << "1. Enter data for filtering" << endl; cout << "2. Enter filter values" << endl; cout << "3. Apply filter" << endl; cout << "4. Display filtered data" << endl; cout << "5. Exit from the program" << endl << endl; // get the user's choice cout << "Enter your option: "; cin >> UserInput; cout << endl; // act on the user's input switch(UserInput) { case '1': EnterData(OriginalData); FilteredData.Valid = false; break; case '2': EnterFilter(Filter); FilteredData.Valid = false; break; case '3': if (Filter.Valid == true && OriginalData.Valid == true && FilteredData.Valid == false) { if (ApplyFilter(Filter,OriginalData,FilteredData) == FILTER_TOO_LONG) { cout << "The filter must not be longer than the data" << endl; } else { FilteredData.Valid = true; cout << "Filter applied" << endl; } } break; case '4': if (Filter.Valid == true && OriginalData.Valid == true && FilteredData.Valid == true) { DisplayData(Filter,OriginalData,FilteredData); } else { cout << "Data have not yet been filtered" << endl; } break; case '5': delete [] Filter.Values; delete [] OriginalData.Values; delete [] FilteredData.Values; return 0; break; default: cout << "Invalid entry" << endl << endl; break; } } } // Allow the user to enter the data to be filtered // Arguments: // (1) the structure containing the input data // Returns: nothing // void EnterData(TheData& GetData) { // initialize the data structure that holds the data to be filtered, including getting // the number of data values from the user delete [] GetData.Values; cout << "How many data values do you wish to enter: "; cin >> GetData.Length; GetData.Valid = true; // allocate memory to the data GetData.Values = new double[GetData.Length]; if (GetData.Values == 0) { cout << "Unable to allocate sufficient memory" << endl; exit(1); } // obtain all of the data values cout << endl; cout << "Enter the data values" << endl; cout << "---------------------" << endl; for (unsigned long CountData = 0; CountData < GetData.Length; CountData++) { cout << "Enter value " << CountData+1 << ": "; cin >> GetData.Values[CountData]; } } // Allow the user to enter the filter values // Arguments: // (1) the structure of the filter to be defined // Returns: nothing // void EnterFilter(TheFilter& GetFilter) { // initialize the data structure that holds the filter, including getting the number of // filter values from the user delete [] GetFilter.Values; cout << "How many data values do you wish to enter: "; cin >> GetFilter.Length; GetFilter.Valid = true; // allocate memory to the filter values GetFilter.Values = new double[GetFilter.Length]; if (GetFilter.Values == 0) { cout << "Unable to allocate sufficient memory" << endl; exit(1); } // obtain all of the filter values cout << endl; cout << "Enter the filter values" << endl; cout << "-----------------------" << endl; for (unsigned long CountData = 0; CountData < GetFilter.Length; CountData++) { cout << "Enter value " << CountData+1 << ": "; cin >> GetFilter.Values[CountData]; } } // Apply the filter to the input data and store in the filtered data structure // Arguments: // (1) the structure of the filter to be applied // (2) the structure containing the data to be filtered // (3) the structure to hold the filtered data // Returns: OK - if the filter is applied // FILTER_TOO_LONG - the filter is longer than the data // int ApplyFilter(TheFilter Filter, TheData DataIn, TheData& DataOut) { // return an error if the filter is longer than the data if (Filter.Length > DataIn.Length) return FILTER_TOO_LONG; // initialize the data structure that holds the filtered data delete [] DataOut.Values; DataOut.Length = DataIn.Length - Filter.Length + 1; // get memory for the filtered data DataOut.Values = new double[DataOut.Length]; if (DataOut.Values == 0) { cout << "Unable to allocate sufficient memory" << endl; exit(1); } // apply the filter to the data for (unsigned long CountData = 0; CountData < DataOut.Length; CountData++) { DataOut.Values[CountData] = 0.0; for (unsigned long CountFilter = 0; CountFilter<Filter.Length; CountFilter++) { DataOut.Values[CountData] += DataIn.Values[CountData+CountFilter] * Filter.Values[CountFilter]; } } return OK; } // Display input data, filter values and output data // Arguments: // (1) the structure of the filter to be applied // (2) the structure containing the data to be filtered // (3) the structure that holds the filtered data // Returns: nothing // void DisplayData(TheFilter Filter, TheData DataIn, TheData DataOut) { // display all of the input data values cout << endl; cout << "The input data values" << endl; cout << "---------------------" << endl; cout << "[ "; for (unsigned long CountData = 0; CountData < DataIn.Length; CountData++) { cout << DataIn.Values[CountData] << " "; } cout << "]" << endl; // display all of the filter values cout << endl; cout << "The filter values" << endl; cout << "-----------------" << endl; cout << "[ "; for (unsigned long CountData = 0; CountData < Filter.Length; CountData++) { cout << Filter.Values[CountData] << " "; } cout << "]" << endl; // display all of the data output values cout << endl; cout << "The data output values" << endl; cout << "----------------------" << endl; cout << "[ "; for (unsigned long CountData = 0; CountData < DataOut.Length; CountData++) { cout << DataOut.Values[CountData] << " "; } cout << "]" << endl; }
The difference between an procedural and an object-oriented approach is how you bind the data and the functions that do something to it together.
Right now you have a very good structure. You have structs that hold the data, and functions that operate on specific data.
What you need to do is turn those structs into classes, and make the procedures and functions that operate on the structs into member functions (or methods) of the class.
Keep in mind that the member functions should generally work only on its own data. So, for example, you have the functions EnterData() and EnterFilter(). The first would make a good method of your TheData class, and the second would make a good method in your TheFilter class.
Your DisplayData() function operates on a number of different structures, but not any of them at the same time. Each of your classes, then, should have a DisplayData() method, which only displays it's own data.
You will have to decide how to use the filter class and the data classes all together. You could:
You will still have to create three separate variables, but instead of assigning them initial (or default) values in main(), have the class constructor initialize the data.
Personally, I would also recommend that you use a vector instead of a newed array, but that is not essential to the assignment and you can save it for later (or not at all).
Hope this helps.
Right now you have a very good structure. You have structs that hold the data, and functions that operate on specific data.
What you need to do is turn those structs into classes, and make the procedures and functions that operate on the structs into member functions (or methods) of the class.
Keep in mind that the member functions should generally work only on its own data. So, for example, you have the functions EnterData() and EnterFilter(). The first would make a good method of your TheData class, and the second would make a good method in your TheFilter class.
Your DisplayData() function operates on a number of different structures, but not any of them at the same time. Each of your classes, then, should have a DisplayData() method, which only displays it's own data.
You will have to decide how to use the filter class and the data classes all together. You could:
- Make a method of the TheFilter class take a TheData object and return a new TheData object.
- Make a method of the TheData class take a TheFilter object and filter its own data.
- etc.
You will still have to create three separate variables, but instead of assigning them initial (or default) values in main(), have the class constructor initialize the data.
Personally, I would also recommend that you use a vector instead of a newed array, but that is not essential to the assignment and you can save it for later (or not at all).
Hope this helps.
•
•
Join Date: Dec 2007
Posts: 10
Reputation:
Solved Threads: 0
Duoas,
Thank you for your helpful reply!
It's such a relief that you've advised me to change the TheData and TheFilter structs to classes, as I had done this already - although I had no confidence that what I was doing was correct.
The areas that were really confusing me were the ApplyFilter() and the DisplayData() functions, and how to interface these with the TheFilter and TheData classes that I had assigned.
On your advice, I'll place separate DisplayData() member functions in the TheData and TheFilter class definitions. I can see your point about the different ways to implement the ApplyFilter() function.
Will you be available on the forum to help me further with this assignment, just in case any problems arise?
Once again, thanks so much for your help and your time.
Zeke
Thank you for your helpful reply!
It's such a relief that you've advised me to change the TheData and TheFilter structs to classes, as I had done this already - although I had no confidence that what I was doing was correct.
The areas that were really confusing me were the ApplyFilter() and the DisplayData() functions, and how to interface these with the TheFilter and TheData classes that I had assigned.
On your advice, I'll place separate DisplayData() member functions in the TheData and TheFilter class definitions. I can see your point about the different ways to implement the ApplyFilter() function.
Will you be available on the forum to help me further with this assignment, just in case any problems arise?
Once again, thanks so much for your help and your time.
Zeke
•
•
Join Date: Jul 2005
Posts: 1,671
Reputation:
Solved Threads: 261
zekester:
Here's some additional thoughts. If you find them useful, fine, if not, so be it.
Just so you know (I'm sure Duoas already does) there is no need to change the struct declarations into class declarations. In C++ the only distinction between classes and structs is that data members are declare with private access in classes and public access in structs. Some people still retain the feel of C style structs withing their programs by using structs in C++ only if the class doesn't contain member functions, but that isn't necessary.
If you are going to declare memory dynamically for a data member of a class, it is probably a good idea to have each class allocate and delete memory used rather than trying to do it within the program. This is frequently, though not always, done in the constructor and destructor respectively, in addition to the assignment and copy operators as needed. Of course, if you don't have to do your own memory handling, then don't.
To demonstrate inheritance in your program you could declare an abstract base class called Form (or some other name) which has the same data members as TheData and TheFilter with a pure virtual member function called displayData. The inherited classes could also hold unique member functions to do tasks unique to their existence. This may be a bit strained intellectually because TheData and TheFilter classes aren't related like Dogs and Cats are both Animals, but reality is frequently distorted for educational purposes. It's up to you, of course.
An additional twist, primarily for educational purposes again, might be to have a working class called FilterProgram which contains members from both of the original classes as needed, rather than declaring them from witin main(), and has all the menus, etc within it which can be called using appropriate member functions, etc. Doing it this way it is sometimes possible to write the program like this:
This type of program is called a driver program because it is really just a way to access the necessary header files, where all the work is actually done. One advantage of this style is that individual files are readily available for reuse in other programs as desired, rather than having to rewrite the classes, structs, etc in each program as the need arises. This style also provides additional experience writing modular (OOP?) programs by compartmentalizing everything with the class declarations, even if it isn't necessarily the most straightforward program to read (you end up pulling up the linked files one by one to find information about each of the included classes, etc, since it's not all in one spot to allow you to track through the information needed by scrolling up and down the screen without flipping from file to file).
Here's some additional thoughts. If you find them useful, fine, if not, so be it.
Just so you know (I'm sure Duoas already does) there is no need to change the struct declarations into class declarations. In C++ the only distinction between classes and structs is that data members are declare with private access in classes and public access in structs. Some people still retain the feel of C style structs withing their programs by using structs in C++ only if the class doesn't contain member functions, but that isn't necessary.
If you are going to declare memory dynamically for a data member of a class, it is probably a good idea to have each class allocate and delete memory used rather than trying to do it within the program. This is frequently, though not always, done in the constructor and destructor respectively, in addition to the assignment and copy operators as needed. Of course, if you don't have to do your own memory handling, then don't.
To demonstrate inheritance in your program you could declare an abstract base class called Form (or some other name) which has the same data members as TheData and TheFilter with a pure virtual member function called displayData. The inherited classes could also hold unique member functions to do tasks unique to their existence. This may be a bit strained intellectually because TheData and TheFilter classes aren't related like Dogs and Cats are both Animals, but reality is frequently distorted for educational purposes. It's up to you, of course.
An additional twist, primarily for educational purposes again, might be to have a working class called FilterProgram which contains members from both of the original classes as needed, rather than declaring them from witin main(), and has all the menus, etc within it which can be called using appropriate member functions, etc. Doing it this way it is sometimes possible to write the program like this:
C++ Syntax (Toggle Plain Text)
#include "FilterProgram" int main() { FilterProgram program; program.run(); }
Last edited by Lerner; Dec 31st, 2007 at 12:27 pm.
•
•
Join Date: Dec 2007
Posts: 10
Reputation:
Solved Threads: 0
Hi Lerner,
Thanks so much for your post!
The task stipulates explicitly that we have to use classes and that all data members must be private. I appreciate that this complicates the program unnecessarily but the lecturer is trying to test my grasp of classes rather than structs.
We briefly covered constructors and destructors, copy constructors, overloading operators, friend functions and the 'this' pointer, so I expect that we have to use all of these tools to achieve full marks.
We haven't covered abstract classes or virtual member functions but I can see the merit in your suggestion of creating a new class which is able to access data from TheData and TheFilter, and to manipulate that data using its own set of member functions, especially for the ApplyFilter() and DisplayData() functions (if my understanding is wrong, please correct me!).
Duoas suggested that I have separate DisplayData() functions in my TheData and TheFilter classes, and that I make the ApplyFilter() function a member function of either class. Which approach would be better?
Your "additional twist" is incredibly helpful as the task stipulates that the main function can create the first object only. I presume that this approach could be used to compartmentalise the code into separate functions as well?
Thanks once again. I'd be lost without the help I've received on this forum.
Zeke
Thanks so much for your post!
The task stipulates explicitly that we have to use classes and that all data members must be private. I appreciate that this complicates the program unnecessarily but the lecturer is trying to test my grasp of classes rather than structs.
We briefly covered constructors and destructors, copy constructors, overloading operators, friend functions and the 'this' pointer, so I expect that we have to use all of these tools to achieve full marks.
We haven't covered abstract classes or virtual member functions but I can see the merit in your suggestion of creating a new class which is able to access data from TheData and TheFilter, and to manipulate that data using its own set of member functions, especially for the ApplyFilter() and DisplayData() functions (if my understanding is wrong, please correct me!).
Duoas suggested that I have separate DisplayData() functions in my TheData and TheFilter classes, and that I make the ApplyFilter() function a member function of either class. Which approach would be better?
Your "additional twist" is incredibly helpful as the task stipulates that the main function can create the first object only. I presume that this approach could be used to compartmentalise the code into separate functions as well?
Thanks once again. I'd be lost without the help I've received on this forum.
Zeke
•
•
Join Date: Jul 2005
Posts: 1,671
Reputation:
Solved Threads: 261
The base class, what I called Form, doesn't have to be abstract if that's not something you've discussed. It could be a routine base class. The advantage of being abstract is that it couldn't be instantiated since that doesn't make any sense (but straining reality is common in examples used for teaching purposes, so that's not unexpected). Again, structs can have private members as well as public (or protected for that matter). Here's a skeletal version of the inheritance heirachy using structs to demonstrate my point.
Now both TheData and TheFilter objects will contain a double and a string which have private access and their own displayData() functions which have public access, just like you can have in a class. struct declarations are just like classes except in the default access of the members and the terms are often used interchangeably. If your instructor uses the term class in the narrow sense, then by all means declare each user defined type as a class. But you should know that in C++ there's nothing you can do with a class you can't do with a struct if you want. (NB, the code snippet above is far from an adequate type declaration. It was posted only as an example of how you'd use keywords in declaring a struct to get it to behave exactly as a class would.)
I think Duos' suggestions were right on target given as far as he went without knowing the full restrictions of the assignment, and I just made a lucky guess. If you have a class called FilterProgram, as I suggested as a possibility, then ApplyFilter() would seemingly fit best as member function of the FilterProgram class and not in either the TheData or TheFilter classes.
When you're done with the program all of the stand alone functions in the original post would end up as member functions of one class or another.
C++ Syntax (Toggle Plain Text)
struct Form { private: double age; string name; }; struct TheData : public Form { void displayData(); }; struct TheFilter : public Form { void displayData(); };
I think Duos' suggestions were right on target given as far as he went without knowing the full restrictions of the assignment, and I just made a lucky guess. If you have a class called FilterProgram, as I suggested as a possibility, then ApplyFilter() would seemingly fit best as member function of the FilterProgram class and not in either the TheData or TheFilter classes.
When you're done with the program all of the stand alone functions in the original post would end up as member functions of one class or another.
Last edited by Lerner; Dec 31st, 2007 at 3:21 pm.
I'm not sure I understand one part of your assignment. You stated that you are only allowed to directly instantiate one object. This makes little sense to me, as the program requires two objects to combine to produce a third.
(where '+' means 'apply the filter', of course).
This train of thought is validated by the fact that both the OrignalData and the Filter require user input.
While Lerner's suggestion about shared inheritance is good, given the actual structure of the classes, this is actually just a happy convenience. In reality, the filter and the data are only related because the filter modifies the data in some way. That is to say, the filter and the data are separate things, both conceptually and implementationally. (That one operates upon the other is not causal, just as their similarity in structure is not causal.)
In summation: how exactly does your professor expect you to create only one object at the start?
Thought 1:
Make FilterProgram a function, which takes as argument a TheData object (the one you create in main()), creates a TheFilter object, applies the filter, and returns to main() a filtered TheData object.
This of course will spread user I/O out between main() and FilterProgram()... (Indirectly, of course, as actual I/O should occur as you have it: in your member functions).
Thought 2:
(Is a really bad idea, so I won't share it.)
hmm...
(BTW. If my thinking has confused you on any specific point, just ask.)
FilteredData = OriginalData + Filter(where '+' means 'apply the filter', of course).
This train of thought is validated by the fact that both the OrignalData and the Filter require user input.
While Lerner's suggestion about shared inheritance is good, given the actual structure of the classes, this is actually just a happy convenience. In reality, the filter and the data are only related because the filter modifies the data in some way. That is to say, the filter and the data are separate things, both conceptually and implementationally. (That one operates upon the other is not causal, just as their similarity in structure is not causal.)
In summation: how exactly does your professor expect you to create only one object at the start?
Thought 1:
Make FilterProgram a function, which takes as argument a TheData object (the one you create in main()), creates a TheFilter object, applies the filter, and returns to main() a filtered TheData object.
This of course will spread user I/O out between main() and FilterProgram()... (Indirectly, of course, as actual I/O should occur as you have it: in your member functions).
Thought 2:
(Is a really bad idea, so I won't share it.)
hmm...(BTW. If my thinking has confused you on any specific point, just ask.)
•
•
Join Date: Jul 2005
Posts: 1,671
Reputation:
Solved Threads: 261
I totally agree with Duoas that the inheritance scenario I described is extremely contrived and the ONLY reason I would consider doing it would be to prove I could do inheritance and polymorphism in the program as presented.
I disagree with Duoas as to the flow of the program. With appropriate fleshing out of the repsective user defined types I think something like this would work fine, directly declaring just a single object in main():
I disagree with Duoas as to the flow of the program. With appropriate fleshing out of the repsective user defined types I think something like this would work fine, directly declaring just a single object in main():
C++ Syntax (Toggle Plain Text)
struct TheData { void EnterData(); void display(); }; struct TheFilter { void EnterFilter(); void display(); }; struct FilterProgram { TheData data; TheFilter filter; TheData filteredData; void run(); void applyFilter(); void displayFilteredData(); }; int main() { FilterProgram program; program.run(); }
Re: Please help me to convert a simple C++ program into an object-oriented one.
0
#10 Dec 31st, 2007
I think you missed my point.
First off, I expressed no disapproval of deriving TheData and TheFilter from a common ancestor. What I said was that they shouldn't be intimately familiar.
Secondly, I don't think you should be introducing new structures into the assignment. Particularly as the FilterProgram is, as you have suggested it, simply a stand-in for main(). The assignment could be just as easily, and more simply, written without it:
Your solution sidesteps the problem of instantiating a single object in a way the teacher will not accept! Remember, keep it simple, and don't shuffle creation of things off into another function just to avoid doing it in main(). Avoiding main() is not a good enough reason to do that.
My question remains valid: how are you to initialize both the data and filter objects before filtering? And how are you to display the filtered data when done?
If your program is to behave like the original:
I have several related ideas as to how I would do it, very simply, but I expect zekesteer to think about it and present his own thoughts before I suggest anything further. (One possibility is that the strict structure of the original menu is not part of the assignment, just the way that zekesteer implemented it the first time through?)
First off, I expressed no disapproval of deriving TheData and TheFilter from a common ancestor. What I said was that they shouldn't be intimately familiar.
Secondly, I don't think you should be introducing new structures into the assignment. Particularly as the FilterProgram is, as you have suggested it, simply a stand-in for main(). The assignment could be just as easily, and more simply, written without it:
C++ Syntax (Toggle Plain Text)
struct TheData {...}; struct TheFilter {...}; int main() { TheData data; TheFilter filter; TheData filteredData; ... }
My question remains valid: how are you to initialize both the data and filter objects before filtering? And how are you to display the filtered data when done?
If your program is to behave like the original:
- enter data
- enter filter
- apply filter to original data --> filtered data
- display original, filter, and filtered data.
- quit.
- how are the filter and the filtered data to be displayed alongside the original data?
- how are the second piece of primary data (which I presume would be the filter) and the secondary data (the filtered data) to be generated and stored?
I have several related ideas as to how I would do it, very simply, but I expect zekesteer to think about it and present his own thoughts before I suggest anything further. (One possibility is that the strict structure of the original menu is not part of the assignment, just the way that zekesteer implemented it the first time through?)
![]() |
Similar Threads
- memory management in wndows 2000 (Windows NT / 2000 / XP)
- ASP and SQL ? (MS SQL)
Other Threads in the C++ Forum
- Previous Thread: Problems in Address book programming
- Next Thread: C++ Help Tortoise and the Hare
| Thread Tools | Search this Thread |
ace_thread api array based binary bitmap borland c++ c/c++ calling char class classes code coding compile console conversion count delete delete-line deploy desktop developer directshow dll download dynamic dynamiccharacterarray email embedded encryption error file forms fstream function functions game givemetehcodez graph gui homeworkhelp homeworkhelper iamthwee ifstream information input int integer java lib linkedlist linker loop looping loops map math mathhomeworkhelp matrix memory multiple news node number numbertoword output parameter pointer problem program programming project python random read recursion reference reverse richedit rpg string strings temperature template test text text-file tree url variable vector video win32 windows winsock word wordfrequency wxwidgets






