Week #14 Challenge: C++

  • (5 Pages)
  • +
  • 1
  • 2
  • 3
  • Last »

67 Replies - 27916 Views - Last Post: 13 October 2010 - 08:11 AM

#1 Core  Icon User is offline

  • using System.Linq;
  • member icon

Reputation: 773
  • View blog
  • Posts: 5,097
  • Joined: 08-December 08

Week #14 Challenge: C++

Post icon  Posted 05 April 2010 - 01:22 PM

Posted Image Week #14: C++

Prize Week: $25 Amazon Gift Card To A Random Person That Completes This Challenge!

Challenge submitted by NickDMax.

Posted Image

CHALLENGE:
Experience the C++ programming language.

INTRODUCE THE LANGUAGE/TECHNOLOGY:
In 1979 Bjarne Stroustrup began work on an extension of the C programming language called "C with classes" adding Simula-like OOP features to C. In 1983 this language became "C++" and its popularity quickly grew due in large part to its near compatibility with C. Programmers we able to easily adopt code from older C libraries while building new object oriented designs on top of them. Over the years many programmers have come to love C++ while other despise it intensely -- love it or hate it, C++ is one of the most important languages in modern computing.

This weeks challenge is to spend a little time with basic C++.

IDEAS:
  • An application that uses Windows API (if you are a Windows user)
  • A simple question->answer chat application (with predefined input options)
  • A quadratic equation solver
  • An application that draws a window (any OS - done in code, not form designer)
  • An application that can read/write text files


FREE COMPILERS/IDEs
[WIN] Microsoft Visual C++ Express -- Compiler and IDE
[WIN] MinGW (just the compiler)
[ALL] Code::Blocks -- Compiler and/or IDE

RESOURCES:
CPlusPlus.org -- Documents the standard libraries - plenty of examples.
CProgramming -- site dedicated to helping one learn C/C++
C++ FAQ LITE -- Questions and answers on the nature of C++ as a language.
DIC C/C++ Tutorials

HOW TO GET STARTED:
Simply download a compiler or/and a development environment. Since there is a wide variety of those, you will have to look for their specific documentation to compile a C/C++ application. Don't forget that we have C++ tutorials (listed in Resources) and a C/C++ forum (link below) where you can look for help. C++ is a language where the developer has to write a lot of code by himself/herself, if he/she is coming from a background where a specific coding framework is used. It could be a bit unusual and sometimes frustrating, but once you get a few programs running, you'll have an idea of how things work in the C++ world.


WHERE TO GO FOR HELP:
</Dream.In.Code> C/C++ Forum!

Is This A Good Question/Topic? 4
  • +

Replies To: Week #14 Challenge: C++

#2 demosthenes2k8  Icon User is offline

  • D.I.C Head

Reputation: 4
  • View blog
  • Posts: 93
  • Joined: 30-December 09

Re: Week #14 Challenge: C++

Posted 05 April 2010 - 01:45 PM

I made an open-source lisp-like interpreted language in C++, can I submit it?
Was This Post Helpful? 1
  • +
  • -

#3 phphell  Icon User is offline

  • New D.I.C Head

Reputation: 1
  • View blog
  • Posts: 14
  • Joined: 05-April 10

Re: Week #14 Challenge: C++

Posted 05 April 2010 - 02:48 PM

Hmm. I might try this one out. I am a php developer but have been wanting to try something like this. This is a great excuse to get started.
Was This Post Helpful? 1
  • +
  • -

#4 Core  Icon User is offline

  • using System.Linq;
  • member icon

Reputation: 773
  • View blog
  • Posts: 5,097
  • Joined: 08-December 08

Re: Week #14 Challenge: C++

Posted 05 April 2010 - 02:50 PM

demosthenes2k8 Yes, you sure can :)
Was This Post Helpful? 1
  • +
  • -

#5 ericr2427  Icon User is offline

  • D.I.C Regular
  • member icon

Reputation: 38
  • View blog
  • Posts: 376
  • Joined: 01-December 08

Re: Week #14 Challenge: C++

Posted 05 April 2010 - 03:28 PM

A simple quadratic equation solver. Checks for 0, 1, or 2 solutions before calculating.
#include <iostream>
#include <cmath>
using namespace std;
int main() {
    double a, b, c;
    cout << "Enter a: ";
    cin >> a;
    cout << "Enter b: ";
    cin >> b;
    cout << "Enter c: ";
    cin >> c;
    double discr;
    discr = pow(b, 2.0) - (4 * a * c);
    if (discr > 0) {
        double eq1, eq2;
        eq1 = ((-1 * B)/> + sqrt(discr))/(2 * a);
        eq2 = ((-1 * B)/> - sqrt(discr))/(2 * a);
        cout << "Solutions: {" << eq1 << ", " << eq2 << "}" << endl;
    }
    else if (discr == 0) {
        double sol;
        sol = (-1 * B)/> / (2 * a);
        cout << "Solution: " << sol << endl;
    }
    else {
        cout << "No solution" << endl;
    }
    return 0;
}



Also, I made a recipe database program a while ago, so I might as well post that. Some of the code is pretty terrible but I didn't feel like going out and finding an xml parser for C++, and it's not even valid xml, really. Oh well.

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <limits>
using namespace std;
const string filename = "recipes.xml";
class recipe {
public:
    void getInfo() {
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        getName();
        getIngredients();
        getSteps();
        printToFile();
    }
    void getName() {
        cout << "Recipe title: ";
        getline(cin, name);
    }
    void setName(string name) {
        this->name = name;
    }
    void getIngredients() {
        int choice = 2;
        do {
            string tmp;
            cout << "Enter ingredient: ";
            getline(cin, tmp);
            ingredients.push_back(tmp);
            cout << "1. Add another ingredient" << endl;
            cout << "2. Done adding ingredients" << endl;
            cout << "Choice: ";
            cin >> choice;
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
        } while (choice != 2);
    }
    void getSteps() {
        int choice = 2;
        do {
            string tmp;
            cout << "Enter step: ";
            getline(cin, tmp);
            steps.push_back(tmp);
            cout << "1. Add another step" << endl;
            cout << "2. Done adding steps" << endl;
            cout << "Choice: ";
            cin >> choice;
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
        } while (choice != 2);
    }
    void printToFile() {
        ofstream file(filename.c_str(), ios::app);
        file << "<recipe>" << endl;
        file << "<title>" << name << "</title>" << endl;
        if (ingredients.size() > 0) {
            file << "<ingredients>" << endl;
            for (int i = 0; i < ingredients.size(); i++) {
                file << "<ingredient>" << ingredients[i] << "</ingredient>" << endl;
            }
            file << "</ingredients>" << endl;
        }
        if (steps.size() > 0) {
            file << "<steps>" << endl;
            for (int i = 0; i < steps.size(); i++) {
                file << "<step>" << steps[i] << "</step>" << endl;
            }
            file << "</steps>" << endl;
        }
        file << "</recipe>" << endl;
    }
private:
    string name;
    vector<string> ingredients;
    vector<string> steps;
};
class db {
public:
    void runDB() {
        char choice;
        do {
            cout << "1. Browse recipes" << endl;
            cout << "2. Search for a recipe" << endl;
            cout << "3. Add a new recipe" << endl;
            cout << "4. Delete a recipe" << endl;
            cout << "5. Exit" << endl << endl;
            cout << "Choice: ";
            cin >> choice;
            switch(choice) {
                case '1':
                    browseRecipes(1);
                break;
                case '2':
                    searchRecipes();
                break;
                case '3':
                    addRecipe();
                break;
                case '4':
                    browseRecipes(2);
                break;
                case '5':
                break;
                default:
                    cout << "Invalid choice." << endl;
                break;
            }
        } while (choice != '5');
    }
    void browseRecipes(int param) {
        int counter = 1;
        ifstream file(filename.c_str());
        while (file.good()) {
            string tmp;
            getline(file, tmp);
            if (tmp.find("<recipe>") != string::npos) {
                string next;
                getline(file, next);
                cout << counter << ". " << getText(next) << endl;
                counter++;
            }
        }
        if (counter > 1) {
            if (param == 1) {
                viewRecipe();
            }
            else {
                delRecipe();
            }
        }
        else {
            cout << "There are no recipes stored at the moment." << endl;
        }
    }
    void viewRecipe() {
        int selection;
        cout << "Selection (0 to exit): ";
        cin >> selection;
        if (selection != 0) {
            int counter = 1;
            ifstream file(filename.c_str());
            while (file.good() && counter <= selection) {
                string tmp;
                getline(file, tmp);
                if (tmp.find("<recipe>") != string::npos) {
                    if (counter == selection) {
                        string next;
                        getline(file, next);
                        cout << endl << getText(next) << endl;
                        getline(file, next);
                        getline(file, next);
                        int ingredient = 1;
                        cout << "\nIngredients\n----------------\n";
                        while (next.find("</ingredients>") == string::npos) {
                            cout << ingredient << ". " << getText(next) << endl;
                            getline(file, next);
                            ingredient++;
                        }
                        getline(file, next);
                        getline(file, next);
                        int step = 1;
                        cout << "\nSteps\n----------------\n";
                        while (next.find("</steps>") == string::npos) {
                            cout << step << ". " << getText(next) << endl;
                            getline(file, next);
                            step++;
                        }
                        counter++;
                        cout << endl;
                    }
                    counter++;
                }
            }
        }
    }
    void searchRecipes() {
        string search;
        cout << "Search for: ";
        cin >> search;
        int counter = 1;
        ifstream file(filename.c_str());
        while (file.good()) {
            string tmp;
            getline(file, tmp);
            if (tmp.find("<title>") != string::npos && tmp.find(search) != string::npos) {
                cout << endl << counter << ". " << getText(tmp) << endl;
                string next;
                for (int i = 0; i < 3; i++) {
                    getline(file, next);
                }
                int ingredient = 1;
                cout << "\nIngredients\n----------------\n";
                while (next.find("</ingredients>") == string::npos) {
                    cout << ingredient << ". " << getText(next) << endl;
                    getline(file, next);
                    ingredient++;
                }
                getline(file, next);
                getline(file, next);
                int step = 1;
                cout << "\nSteps\n----------------\n";
                while (next.find("</steps>") == string::npos) {
                    cout << step << ". " << getText(next) << endl;
                    getline(file, next);
                    step++;
                }
                counter++;
                cout << endl;
            }
        }
    }
    void addRecipe() {
        recipe newRecipe;
        newRecipe.getInfo();
        cout << "Recipe successfully added." << endl;
    }
    void delRecipe() {
        int selection;
        cout << "Selection (0 to exit): ";
        cin >> selection;
        if (selection != 0) {
            int counter = 1;
            int line = 0, end;
            ifstream file(filename.c_str());
            while (file.good() && counter <= selection) {
                string tmp;
                getline(file, tmp);
                line++;
                if (tmp.find("<recipe>") != string::npos) {
                    counter++;
                }
            }
            end = line;
            while (1 == 1) {
                string tmp;
                getline(file, tmp);
                end++;
                if (tmp.find("</recipe>") != string::npos) {
                    break;
                }
            }
            vector<string> lines;
            file.seekg(0);
            counter = 1;
            while(file.good()) {
                string tmp;
                getline(file, tmp);
                if (counter < line || counter > end) {
                    lines.push_back(tmp);
                }
                counter++;
            }
            file.close();
            ofstream out(filename.c_str(), ios::trunc);
            for (int i = 0; i < lines.size(); i++) {
                out << lines[i] << endl;
            }
            out.close();
        }
    }
    string getText(string input) {
        int first = input.find(">") + 1;
        int len = input.rfind("<") - first;
        string text = input.substr(first, len);
        return text;
    }
};
int main() {
    db newdb;
    newdb.runDB();
}


This post has been edited by ericr2427: 06 April 2010 - 07:25 AM

Was This Post Helpful? 3
  • +
  • -

#6 KYA  Icon User is offline

  • g++ jameson.cpp -o beverage
  • member icon

Reputation: 3089
  • View blog
  • Posts: 19,137
  • Joined: 14-September 07

Re: Week #14 Challenge: C++

Posted 05 April 2010 - 03:47 PM

Babylonian Square Root

Quote

Perhaps the first algorithm used for approximating sqrt S is known as the "Babylonian method", named after the Babylonians, or "Heron's method", named after the first-century Greek mathematician Hero of Alexandria who gave the first explicit description of the method. It can be derived from (but predates) Newton's method. This is a quadratically convergent algorithm, which means that the number of correct digits of the approximation roughly doubles with each iteration. It proceeds as follows:

1. Start with an arbitrary positive start value x0 (the closer to the root, the better).
2. Let xn+1 be the average of xn and S / xn (using the arithmetic mean to approximate the geometric mean).
3. Repeat steps 2 and 3, until the desired accuracy is achieved.


Posted Image

#include <iostream>
using namespace std;

int getNumDigits(double num){
	int digits = 0, counter = num;
	while (counter > 0){
		counter /= 10;
		digits++;
	}
	return digits;
}

/*
	nextVal = [initial] arbitary value (closer to root is the better)
	nextVal = (1/2)*(nextVal + number/nextVal)
	repeat for the number of digits (but low digit numbers require additional iterations so +10
*/
double babylonSqrt(double num){
	double value = 0, temp = 0;
        //picked 10 arbitrarily, 5 is also enough for the below example
	int digits = getNumDigits(num) + 10; //more iterations = more precision 
	temp = num/2; //arbitrary value, close = less iterations
	//certainly can be optimized, just for quick display purposes
	for(int i = 0; i < digits; i++){
		temp = (0.5)*(temp+(num/temp));
	}
	return temp;
}

/*Output: 
2 3 4 5 6 7 8 9 10 11 12
3.16228 7.4162 8.18535 9.43398 10.247
*/
int main(){
	//for easy display
	int perfectSquares[] = {4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144};
	int nonPerfectSquares[] = {10, 55, 67, 89, 105};

	for(int i = 0; i < 11; i++){
		cout << babylonSqrt(perfectSquares[i]) << " ";
	}
	cout << endl;

	for(int i = 0; i < 5; i++){
		cout << babylonSqrt(nonPerfectSquares[i]) << " ";
	}
	cout << endl;
	return 0;
}


Was This Post Helpful? 3
  • +
  • -

#7 demosthenes2k8  Icon User is offline

  • D.I.C Head

Reputation: 4
  • View blog
  • Posts: 93
  • Joined: 30-December 09

Re: Week #14 Challenge: C++

Posted 05 April 2010 - 04:58 PM

Alright, my code's located at http://oratr.googlecode.com/
When I get home, I'll upload a .zip of the code to this post, but I can't right now.
You can get it right now with Mercurial
Was This Post Helpful? 2
  • +
  • -

#8 bodom658  Icon User is offline

  • Villiage Idiom
  • member icon

Reputation: 113
  • View blog
  • Posts: 1,123
  • Joined: 22-February 08

Re: Week #14 Challenge: C++

Posted 05 April 2010 - 05:31 PM

Here's my contribution, a Complex number class. Has operator overloading, reference variables, friend functions, and the like. Missing exception handling, but oh well.

#include<iostream>

using std::ostream;
using std::cout;
using std::endl;

class Complex {
        double real;
        double imag;

public:
        Complex(double r, double i);
        double getReal();
        double getImag();

        friend Complex operator + (Complex& a, Complex& B)/>;
        friend Complex operator - (Complex& a, Complex& B)/>;
        friend Complex operator * (Complex& a, Complex& B)/>;
        friend Complex operator / (Complex& a, Complex& B)/>;
        friend ostream& operator << (ostream& out, Complex a);
};

// Methods
Complex::Complex(double r, double i) : real(r), imag(i) {}
double Complex::getReal() { return real; }
double Complex::getImag() { return imag; }

// Friends
Complex operator + (Complex& a, Complex& B)/> {
        return Complex(a.getReal() + b.getReal(),
                        a.getImag() + b.getImag());
}

Complex operator - (Complex& a, Complex& B)/> {
        return Complex(a.getReal() - b.getReal(),
                        a.getImag() - b.getImag());
}

Complex operator * (Complex& a, Complex& B)/> {
        return Complex(a.getReal()*b.getReal()-a.getImag()*b.getImag(),
                        a.getReal()*b.getImag()+a.getImag()*b.getReal());
}

Complex operator / (Complex& a, Complex& B)/> {
        double coeff = (1.0/(b.getReal()*b.getReal() + b.getImag()*b.getImag()));
        return Complex(coeff*(a.getReal()*b.getReal() + a.getImag()*b.getImag()),
                coeff*(a.getImag()*b.getReal() - a.getReal()*b.getImag()));
}

ostream& operator << (ostream& out, Complex a) {
        if(a.getImag() > 0)
                out << a.getReal() << "+j" << a.getImag();
        else if (a.getImag() == 0)
                out << a.getReal();
        else
                out << a.getReal() << "-j" << a.getImag();
        return out;
}

// Main Function
int main(int argc, char** argv) {
        // Create two numbers
        Complex A(3.0, 4.0);
        Complex B(4.0, 5.0);

        // Test operations:
        cout << (A + B)/> << endl;
        cout << (A - B)/> << endl;
        cout << (A * B)/> << endl;
        cout << (A / B)/> << endl;
        return 0;
}


This post has been edited by bodom658: 05 April 2010 - 05:32 PM

Was This Post Helpful? 3
  • +
  • -

#9 adgarci  Icon User is offline

  • D.I.C Head

Reputation: 5
  • View blog
  • Posts: 96
  • Joined: 26-August 09

Re: Week #14 Challenge: C++

Posted 05 April 2010 - 06:52 PM

When I look at all the sample code, it looks like Python and C# (both based from C, and well C++ is C) but then, it's very alien, and by the way, Mac users can use XCode to make console apps, just New File > Applications > Command Line > IMPORTANT!!! Do not just click return, go to the small area above the description, and change the type to C++. A hello world is made, but before running, APPLE KEY + Shift + R Build and run from the debugger window you summoned, rather than it running, then not showing the output.

This post has been edited by adgarci: 05 April 2010 - 06:59 PM

Was This Post Helpful? 0
  • +
  • -

#10 Raynes  Icon User is offline

  • D.I.C Lover
  • member icon

Reputation: 610
  • View blog
  • Posts: 2,815
  • Joined: 05-January 09

Re: Week #14 Challenge: C++

Posted 05 April 2010 - 07:38 PM

For those of you more dynamically inclined, like myself, here is a cute little C++ REPL I found: http://www.artificia.../wiki/IGCC/IGCC

Works nicely.

I'm going to write a pangram checker. :D

EDIT: Not to imply that only dynamically typed language can have REPLs. Haskell has an amazing static type system, and still has an REPL.

This post has been edited by Raynes: 05 April 2010 - 07:40 PM

Was This Post Helpful? 2
  • +
  • -

#11 Skaggles  Icon User is offline

  • THE PEN IS MIGHTIER
  • member icon





Reputation: 251
  • View blog
  • Posts: 640
  • Joined: 01-March 09

Re: Week #14 Challenge: C++

Posted 05 April 2010 - 07:51 PM

I'm working on my submission, but I got all week. I'm trying not to rush myself on this one.
Was This Post Helpful? 0
  • +
  • -

#12 phphell  Icon User is offline

  • New D.I.C Head

Reputation: 1
  • View blog
  • Posts: 14
  • Joined: 05-April 10

Re: Week #14 Challenge: C++

Posted 05 April 2010 - 07:59 PM

I tried the first tutorial and I am already lost, lol. Any good resources for php developers to convert thinking to programming in C++?
Was This Post Helpful? 0
  • +
  • -

#13 sarmanu  Icon User is offline

  • D.I.C Lover
  • member icon

Reputation: 965
  • View blog
  • Posts: 2,362
  • Joined: 04-December 09

Re: Week #14 Challenge: C++

Posted 05 April 2010 - 11:43 PM

*
POPULAR

There's a simple application which counts the number of words, letters, lines, delimiters and spaces, from a text file:
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>

static const std::string delims = ",<>?;:[]{}@|#$()+-.";

bool isdelim(const char ch)
{
	return (delims.find(ch) != std::string::npos);
}

size_t number_of_delims(const std::string &line)
{
	size_t delims = 0;
	for (size_t i = 0; i < line.size(); i++)
		if (isdelim(line[i]))
			delims++;

	return delims;
}

std::string no_delims(const std::string &line)
{
	std::string result = line;
	for (size_t i = 0; i < line.size(); i++)
	{
		if (isdelim(line[i]))
		{
			result.erase(i, 1);
			result.insert(i, " ");
		}
	}

	return result;
}

size_t number_of_words(const std::string &line)
{
	std::string Line = no_delims(line);
	std::stringstream sstr(Line);
	std::string token;

	size_t nwords = 0;
	while (sstr >> token)
		nwords++;

	return nwords;
}

size_t number_of_letters(const std::string &line)
{
	size_t nl = 0;
	for (size_t i = 0; i < line.length(); i++)
		if (isalpha(line[i]))
			nl++;

	return nl;
}

size_t number_of_spaces(const std::string &line)
{
	if (line.find(' ') == std::string::npos)
		return 0;

	size_t spaces = 0;
	for (size_t i = 0; i < line.length(); i++)
		if (isspace(line[i]))
			spaces++;

	return spaces;
}

int main()
{
	std::string file_name;
	std::cout << "Enter the name of the file: ";
	std::cin >> file_name;

	std::ifstream file;
	file.open(file_name.c_str());

	if (!file)
	{
		std::cout << "The file does not exist!" << std::endl;
		std::cin.ignore();
		std::cin.get();
		exit(EXIT_FAILURE);
	}

	size_t nwords = 0, nletters = 0, nlines = 0, nsep = 0, nspaces = 0;
	std::string line;
	while (std::getline(file, line))
	{
		nlines++;
		nsep += number_of_delims(line);
		nspaces += number_of_spaces(line);
		nletters += number_of_letters(line);
		nwords += number_of_words(line);
	}

	std::cout << file_name << " report:\n\n";
	std::cout << "Number of words: " << nwords << "\n";
	std::cout << "Number of letters: " << nletters << "\n";
	std::cout << "Number of lines: " << nlines << "\n";
	std::cout << "Number of delimiters: " << nsep << "\n";
	std::cout << "Number of spaces: " << nspaces << "\n\n";

	file.close();
	std::cin.ignore();
	std::cin.get();
	return 0;
}


This post has been edited by sarmanu: 06 April 2010 - 07:08 AM

Was This Post Helpful? 5
  • +
  • -

#14 Huzi94  Icon User is offline

  • D.I.C Head
  • member icon

Reputation: 14
  • View blog
  • Posts: 119
  • Joined: 14-November 09

Re: Week #14 Challenge: C++

Posted 06 April 2010 - 02:33 AM

Here is my quadratic equation solver. Please report any mistakes in my coding.
#include <iostream>
#include <cmath>
using namespace std;

double ans1 (double a, double b, double c) {
  if(a==0 || b==0 || c==0) {
    return false;
  }
  else
  return(-(b)+sqrt(pow(b,2)-4*a*c))/(2*a);
}
double ans2 (double a, double b, double c) {
  if(a==0 || b==0 || c==0) {
    return false;
  }
  else
  return(-(b)-sqrt(pow(b,2)-4*a*c))/(2*a);
}

int main(int argc, char *argv[])
{
    double a,b,c;
    cout << "Quadratic Solver\nBy Huzi94\n" << endl;
    cout << "Enter values" << endl;
    cout << "a: ";
    cin >> a;
    cout << "b: ";
    cin >> b;
    cout << "c: ";
    cin >> c;
    cin.get();
    cout << endl;
    cout << ans1(a,b,c) << endl;
    cout << "OR" << endl;
    cout << ans2(a,b,c) << endl;
    cin.get();
    return 0;  
}


Was This Post Helpful? 1
  • +
  • -

#15 Huzi94  Icon User is offline

  • D.I.C Head
  • member icon

Reputation: 14
  • View blog
  • Posts: 119
  • Joined: 14-November 09

Re: Week #14 Challenge: C++

Posted 06 April 2010 - 02:57 AM

This is my simple gtk application that draws a window in linux[Ubuntu 9.10].
#include <gtk/gtk.h>

int main( int   argc,
          char *argv[] )
{
    GtkWidget *window;
    
    gtk_init (&argc, &argv);
    
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title (GTK_WINDOW (window), "Hello world");
    gtk_widget_show  (window);
    
    gtk_main ();
    
    return 0;
}

This post has been edited by Huzi94: 06 April 2010 - 02:58 AM

Was This Post Helpful? 2
  • +
  • -

  • (5 Pages)
  • +
  • 1
  • 2
  • 3
  • Last »