C++ Student Seeks Serendipity

A place for employers, project leaders etc to post if they are looking for people to assist with an Ogre-based project. Please only post in this area if you have a _serious_ project proposition for which you already have something to show for.
User avatar
falchiongpx
Gnoblar
Posts: 16
Joined: Sun May 05, 2013 5:30 am

C++ Student Seeks Serendipity

Post by falchiongpx »

I'm a computer science student down here in Texas. I've just completed my first two courses in C++ programming where I learned all the lovely details about recursion, deep copy, linked lists (circular, doubly so, and regular old linked), as well as stacks and queues. If anyone would send a problem my way, I'd like to have a go at it.

Hopefully I can do some good for your open-source project, and I need something to do for the summer semester till I can get into courses that can teach me about binary trees, and other goodies. So far the classes have had me creating algorithms that are just all text and manipulating simple data-structures.... invoice systems and compare-two-words to see if they're anagrams. I need some good old fashioned beefsteak, so send me your problems, help me along the path of learning, and I'll put my learned skills to good use.

No Spam Please
email: falchion-gpx@hotmail.com

-Charlie

Sample code from last problem assignment... prefix to postfix problem.

main

Code: Select all

//   Charles Gene Allensworth.
//   Date: 4-30-2013.
//   For: Chapter 18, Program CPP18_1_10
//   Saved as: CPP18_1_10.cpp

// Note: I performed research on wikipedia for help with the algorythm.
//       while I did not copy anyone's code, I studied what currently exists.

#include <iostream>  
#include <iomanip>
#include <fstream>
#include "mystack.h"
 
using namespace std;

int getOperandValue(char operand);// determines order of operation

void inFixToPostFix(string& postFixString, char& ch, int opVAL, int topVAL, stackType<char>& charStack, ifstream& inFILE );// processes and outputs infix equasions to postfix equasions.

int main()
{

    char ch;// the charactor to analise
    stackType<char> operandStack(100); // creates a stack for the character to be analized and compared.
    ifstream infile;// infile stream
    ofstream outfile;// outfile stream
  
    string output;
  
    int opVal = 0, topVal = 0;
  
    infile.open("inFixData.txt");

    if (!infile)
    {
        cout << "Cannot open the input file. "
             << "Program terminates!" << endl;
        return 1;
    }

    outfile.open("postFixData.txt");

    infile >> ch;// get the next character from file
    while (infile)// end of file check for reading the file
    {
    opVal = getOperandValue(ch);// gets the operand presidence
    
    if(!operandStack.isEmptyStack())// finds the presidence of the operator on top of the stack...
         topVal = getOperandValue(operandStack.top()); 

    inFixToPostFix(output, ch, opVal, topVal, operandStack, infile);// process data recursively


    } //end while 

    infile.close();
    outfile.close();

    system("pause");
    return 0;

} //end main

int getOperandValue(char operand)
{
    int value;
    
    switch (operand)
    {
//               case ')':
//                  value = 1;
               case '+': 
                   value = 2; 
                   break;
               case '-': 
                   value = 2;
                   break;
               case '*': 
                   value = 3;
                   break;
               case '/': 
                   value = 3;
//               case '(':
//                   value = 4;                   
                   break;
    }
    return value;
}

void inFixToPostFix(string& postFixString, char& ch, int opVAL, int topVAL, stackType<char>& charStack, ifstream& inFILE )
{

    int subParenth = subParenth;
    
    switch (ch) // checks for operands, and paranthasese, and acts accordingly.
    {

          case '(':
                    charStack.push(ch);
//                    cout << charStack.top() << "...( found...";

               break;

          case ')':
               
               while(!charStack.isEmptyStack())
               {
//                    cout << charStack.top() << endl;
                    if(charStack.top() == '(')
                    {
//                         cout << "...popping (...";
                         charStack.pop();// pop and discard from stack
                    }
                    else
                    {
                    postFixString = postFixString + charStack.top();//output the operand and pop
                    charStack.pop();//pop the stack
                    }
               }// end while
               
               break;                          
               
          case '+': 

              if(opVAL >= topVAL)
                   charStack.push(ch);
              else
              {
                   if(!charStack.isEmptyStack())
                   {
                        while(!charStack.isEmptyStack())
                        {
                              postFixString = postFixString + charStack.top();
                              charStack.pop();
                        }// end while
                              
                        charStack.push(ch);
                              
                   }// end if
              }// end else
                    
              break;
          case '-': 

               if(opVAL >= topVAL)
                   charStack.push(ch);
               else
               {
                   if(!charStack.isEmptyStack())
                   {
                        while(!charStack.isEmptyStack())
                        {
                              postFixString = postFixString + charStack.top();
                              charStack.pop();
                        }// end while
                              
                        charStack.push(ch);
                              
                    }// end if
               }// end else
                    
               break;
          case '*': // no exponant symbol '^' so don't bother with more.
              
              if(opVAL >= topVAL)
                   charStack.push(ch);
              else
              {
                   if(!charStack.isEmptyStack())
                   {
                        while(!charStack.isEmptyStack())
                        {
                              postFixString = postFixString + charStack.top();
                              charStack.pop();
                        }// end while
                              
                        charStack.push(ch);
                              
                   }// end if
              }// end else
                                
               break;
          case '/': 

              if(opVAL >= topVAL)
                   charStack.push(ch);
              else
              {
                   if(!charStack.isEmptyStack())
                   {
                        while(!charStack.isEmptyStack())
                        {
                              postFixString = postFixString + charStack.top();
                              charStack.pop();
                        }// end while
                              
                        charStack.push(ch);
                              
                   }// end if
              }// end else

               break;
          case ';':// nothing to bother with
               postFixString = postFixString;
               break;
          default:// add token to output... in this case, a string
               postFixString = postFixString + ch;
     }// end switch
        
     if(ch == ';')
     {
        cout << postFixString;// outputs output
        while(!charStack.isEmptyStack())// outputs stack
        {
             cout << charStack.top();
             charStack.pop();
        }
        charStack.initializeStack();// resets stack (just in case)
        postFixString = "";// resets output
        topVAL = 0;// resets top val
        cout << endl;// outputs endl for next equasion.

     }// end ; check

     inFILE >> ch;
         
}
mystack.h

Code: Select all

//Header file: myStack.h

#ifndef H_StackType
#define H_StackType
 
#include <iostream>
#include <cassert>

#include "stackADT.h"

using namespace std;

template <class Type>
class stackType: public stackADT<Type>
{
public:
    const stackType<Type>& operator=(const stackType<Type>&); 
      //Overload the assignment operator.

    void initializeStack();
      //Function to initialize the stack to an empty state.
      //Postcondition: stackTop = 0

    bool isEmptyStack() const;
      //Function to determine whether the stack is empty.
      //Postcondition: Returns true if the stack is empty,
      //               otherwise returns false.

    bool isFullStack() const;
      //Function to determine whether the stack is full.
      //Postcondition: Returns true if the stack is full,
      //               otherwise returns false.

    void push(const Type& newItem);
      //Function to add newItem to the stack.
      //Precondition: The stack exists and is not full.
      //Postcondition: The stack is changed and newItem 
      //               is added to the top of the stack.

    Type top() const;
      //Function to return the top element of the stack.
      //Precondition: The stack exists and is not empty.
      //Postcondition: If the stack is empty, the program 
      //               terminates; otherwise, the top element
      //               of the stack is returned.

    void pop();
      //Function to remove the top element of the stack.
      //Precondition: The stack exists and is not empty.
      //Postcondition: The stack is changed and the top 
      //               element is removed from the stack.

    stackType(int stackSize = 100); 
      //constructor
      //Create an array of the size stackSize to hold 
      //the stack elements. The default stack size is 100.
      //Postcondition: The variable list contains the base
      //               address of the array, stackTop = 0, and  
      //               maxStackSize = stackSize.

    stackType(const stackType<Type>& otherStack); 
      //copy constructor

    ~stackType(); 
      //destructor
      //Remove all the elements from the stack.
      //Postcondition: The array (list) holding the stack 
      //               elements is deleted.

private:
    int maxStackSize; //variable to store the maximum stack size
    int stackTop;     //variable to point to the top of the stack
    Type *list;       //pointer to the array that holds the
                      //stack elements

    void copyStack(const stackType<Type>& otherStack); 
      //Function to make a copy of otherStack.
      //Postcondition: A copy of otherStack is created and
      //               assigned to this stack.
};


template <class Type>
void stackType<Type>::initializeStack()
{
    stackTop = 0;
}//end initializeStack

template <class Type>
bool stackType<Type>::isEmptyStack() const
{
    return(stackTop == 0);
}//end isEmptyStack

template <class Type>
bool stackType<Type>::isFullStack() const
{
    return(stackTop == maxStackSize);
} //end isFullStack

template <class Type>
void stackType<Type>::push(const Type& newItem)
{
    if (!isFullStack())
    {
        list[stackTop] = newItem;   //add newItem to the 
                                    //top of the stack
        stackTop++; //increment stackTop
    }
    else
        cout << "Cannot add to a full stack." << endl;
}//end push

template <class Type>
Type stackType<Type>::top() const
{
    assert(stackTop != 0);          //if stack is empty, 
                                    //terminate the program
    return list[stackTop - 1];      //return the element of the
                                    //stack indicated by 
                                    //stackTop - 1
}//end top

template <class Type>
void stackType<Type>::pop()
{
    if (!isEmptyStack())
        stackTop--;                 //decrement stackTop 
    else
        cout << "Cannot remove from an empty stack." << endl;
}//end pop

template <class Type>
stackType<Type>::stackType(int stackSize) 
{
    if (stackSize <= 0)
    {
        cout << "Size of the array to hold the stack must "
             << "be positive." << endl;
        cout << "Creating an array of size 100." << endl;

        maxStackSize = 100;
    }
    else
        maxStackSize = stackSize;   //set the stack size to 
                                    //the value specified by
                                    //the parameter stackSize

    stackTop = 0;                   //set stackTop to 0
    list = new Type[maxStackSize];  //create the array to
                                    //hold the stack elements
}//end constructor

template <class Type>
stackType<Type>::~stackType() //destructor
{
    delete [] list; //deallocate the memory occupied 
                    //by the array
}//end destructor

template <class Type>
void stackType<Type>::copyStack(const stackType<Type>& otherStack)
{ 
    delete [] list;				   
    maxStackSize = otherStack.maxStackSize;		   
    stackTop = otherStack.stackTop;			   
	  
    list = new Type[maxStackSize];		   			   

        //copy otherStack into this stack
    for (int j = 0; j < stackTop; j++)  
        list[j] = otherStack.list[j];
} //end copyStack


template <class Type>
stackType<Type>::stackType(const stackType<Type>& otherStack)
{
    list = NULL;

    copyStack(otherStack);
}//end copy constructor

template <class Type>
const stackType<Type>& stackType<Type>::operator=
   					(const stackType<Type>& otherStack)
{ 
    if (this != &otherStack) //avoid self-copy
        copyStack(otherStack);

    return *this; 
} //end operator=         

#endif
stack ADT by D.S. Malik from his example code... why reinvent the wheel?... well to make it less squeaky///

Code: Select all

//Header file: stackADT.h

#ifndef H_StackADT
#define H_StackADT
  
template <class Type>
class stackADT 
{
public:
    virtual void initializeStack() = 0;
       //Method to initialize the stack to an empty state.
       //Postcondition: Stack is empty

    virtual bool isEmptyStack() const = 0;
      //Function to determine whether the stack is empty.
      //Postcondition: Returns true if the stack is empty,
      //               otherwise returns false.

    virtual bool isFullStack() const = 0;
      //Function to determine whether the stack is full.
      //Postcondition: Returns true if the stack is full,
      //               otherwise returns false.

    virtual void push(const Type& newItem) = 0;
      //Function to add newItem to the stack.
      //Precondition: The stack exists and is not full.
      //Postcondition: The stack is changed and newItem 
      //               is added to the top of the stack.

    virtual Type top() const = 0;
      //Function to return the top element of the stack.
      //Precondition: The stack exists and is not empty.
      //Postcondition: If the stack is empty, the program 
      //               terminates; otherwise, the top element
      //               of the stack is returned.

    virtual void pop() = 0;
      //Function to remove the top element of the stack.
      //Precondition: The stack exists and is not empty.
      //Postcondition: The stack is changed and the top 
      //               element is removed from the stack.
};
        
#endif
User avatar
saejox
Goblin
Posts: 260
Joined: Tue Oct 25, 2011 1:07 am
x 36

Re: C++ Student Seeks Serendipity

Post by saejox »

Good luck!

Btw, your code does not handle errors. Don't they cut points for that?
Nimet - Advanced Ogre3D Mesh/dotScene Viewer
asPEEK - Remote Angelscript debugger with html interface
ogreHTML - HTML5 user interfaces in Ogre
User avatar
falchiongpx
Gnoblar
Posts: 16
Joined: Sun May 05, 2013 5:30 am

Re: C++ Student Seeks Serendipity

Post by falchiongpx »

I don't know, the teacher never said anything.

I COULD put things in try-catch blocks to handle crazy overloaded entries but the teacher put us on a enormous problem-solving schedule and cut the homework in half when he realized how time consuming the homework was. 10 hours of work turned into 40 due to compounding re-do this problem that led to re-do-this-problem to re-do-this problem... I would probably want to implement some try-catches and invalid-entry if-else loops if I were to submit the above code to a potential employer. For now, I'm looking to use the tools that I've learned to wield.

I'm still going to go about refining my code and want to implement a linked-list class that will automatically sort nodes without bumping up the memory requirements by a third. I cooked up a binary-sort algorithm on the fstream load so that will probably be my next non-school project. I could go with arrays for sort unordered to ordered when the data is loaded but I have a hunch that an array takes up more memory than a linked list of the same size. I could be wrong about arrays being larger than linked lists, but I don't know.

-Charlie
bstone
OGRE Expert User
OGRE Expert User
Posts: 1920
Joined: Sun Feb 19, 2012 9:24 pm
Location: Russia
x 201

Re: C++ Student Seeks Serendipity

Post by bstone »

falchiongpx wrote:I have a hunch that an array takes up more memory than a linked list of the same size. I could be wrong about arrays being larger than linked lists, but I don't know.
How come you don't know that? If you know how to add numbers then it should be a no-brainer.
bstone
OGRE Expert User
OGRE Expert User
Posts: 1920
Joined: Sun Feb 19, 2012 9:24 pm
Location: Russia
x 201

Re: C++ Student Seeks Serendipity

Post by bstone »

And here's a couple places where you could pick some useful and real-life tasks from for this open-source project:

1) [GSoC 2013] Topic Proposals from Ogre3D Dev Team - but filter out those that have been submitted by others.

2) Ogre 2.0 Roadmap.
User avatar
falchiongpx
Gnoblar
Posts: 16
Joined: Sun May 05, 2013 5:30 am

Re: C++ Student Seeks Serendipity

Post by falchiongpx »

bstone wrote:
falchiongpx wrote:I have a hunch that an array takes up more memory than a linked list of the same size. I could be wrong about arrays being larger than linked lists, but I don't know.
How come you don't know that? If you know how to add numbers then it should be a no-brainer.
Probably context is needed to understand your reply and to test for trolling.

I'm a new student who's just finishing their first semester at college. I once was asked by a programmer who had is own business why the heak I didn't know what a binary tree was and why couldn't I implement it. According to the veteran programmer, binary trees are so basic! This is the same line of logic used by people who in wonder why doesn't a 1 year old lacks the knowledge or coordination to to read books, or drive the family sedan.

Simply stated. I have a long road ahead of me and I'm a few miles down that path.

I also understand that the use of arrays and linked-lists are optionally preferable dependent upon the situation in which either option is used and how much foreknowledge a programmer has about the data before the code is written. My original line of thinking is to question if a one-dimensional array took up more memory as compared to a single front-back node in a linked list. I still need further reading and cross referencing to know for sure.
bstone
OGRE Expert User
OGRE Expert User
Posts: 1920
Joined: Sun Feb 19, 2012 9:24 pm
Location: Russia
x 201

Re: C++ Student Seeks Serendipity

Post by bstone »

All right then. First, establish the context and draw your conclusion. Second, dedicate your summer to learning the difference between the linked lists and arrays. That will be a big step along your path of learning.
User avatar
falchiongpx
Gnoblar
Posts: 16
Joined: Sun May 05, 2013 5:30 am

Re: C++ Student Seeks Serendipity

Post by falchiongpx »

Thank you for the suggestion, but I already comprehend the difference. It is one of the requirements for my course that I do.

A useful link for greater understanding.
http://geekexplains.blogspot.com/2008/0 ... s-and.html

struct node
{
int element;// data
struct node * link;// link
};

Pretty straight forward... a single memory location and byte usage dependent on data type.

int myArray[1];

An address location, and well... yet again... byte usage dependent on data type... I read on how arrays elements are faster to access. Nodes in a linked list do not run out of room, but take more steps to access the data.

Does one cook with butter or does one use olive oil?
What are you cooking and how do you want it to taste?