-1
#include <iostream>
#include <cassert>
using namespace std;

//constants:
const int MIN_HEIGHT = 3;
const int MIN_WIDTH = 3;
const int MAX_HEIGHT = 20;
const int MAX_WIDTH = 60;
const char H = 'h';
const char W = 'w';
const char B = 'b';
const char F = 'f';
const char Q = 'q';

//prototypes:
void drawRectangle(int row, int col, char border, char fill);
void displayChoices();
char getChoice(char h, char w, char b, char f, char q);

int main()
{

    char border, fill, choice; 

    cout << endl << "Welcome! \n"; 
    drawRectangle (10,10, '#','*');

    cout << endl << "Choose from the following: \n";
    displayChoices();
    getChoice(H, W, B, F, Q);
    //drawRectangle();//not sure how to get the changed value from getChoice
    //if height is changed, update height. If width is changed, update width of rect.
    //if border is changed, update rectangle border. If fill is changed, update rectangle fill

}

//draws rectangle
void drawRectangle(int row, int col, char border, char fill)
{
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            if ((i == 0) || (i == (row - 1)) || (j == 0) || (j == (col - 1))) {
                cout << border;
            }
            else {
                cout << fill;
            }
        }
        cout << endl;
    }
}

//diplays users choices between height, width
//border and quit
void displayChoices()
{
    cout << "h) Change the height.\n";
    cout << "w) Change the width.\n";
    cout << "b) Change the border character.\n";
    cout << "f) Change the fill character.\n";
    cout << "q) Quit program.\n";   
}

//takes users choice and asks for the new value or character 
char getChoice(char h, char w, char b, char f, char q) {
    char choice, newBorder, newFill;
    int newHeight, newWidth, count = 0;

    cin >> choice;

    while ((choice != h && choice != w && choice != b && choice != f && choice != q)) {
        cout << "Not a valid choice. Choose again.\n";
        cin >> choice;
    }

        if (choice == q)
            return 0;

        else if (choice == h) {
            cout << "Enter new height between " << MIN_HEIGHT << " and " << MAX_HEIGHT << ": \n";
            cin >> newHeight;
            while ((newHeight < MIN_HEIGHT) || (newHeight > MAX_HEIGHT)) {

                cout << "That number is not in range. Try again.\n";
                cout << "Enter a number between " << MIN_HEIGHT
                    << " and " << MAX_HEIGHT << ": ";
                cin >> newHeight;

            } return newHeight;
        }
        else if (choice == w) {
            cout << "Enter new width  between " << MIN_WIDTH << " and " << MAX_WIDTH << ": \n";
            cin >> newWidth;
            while ((newWidth < MIN_WIDTH) || (newWidth > MAX_WIDTH)) {

                cout << "That number is not in range. Try again.\n";
                cout << "Enter a number between " << MIN_WIDTH
                    << " and " << MAX_WIDTH << ": ";
                cin >> newWidth;

            } return newWidth;
        }
        else if (choice == b) {
            cout << "Enter new border character: \n";
            cin >> newBorder;
            return newBorder;
        }
        else if (choice == f) {
            cout << "Enter new fill character: \n";
            cin >> newFill;
            return newFill;

        }

    }

I am trying to create an application to draw a rectangle where the height, width, border, and fill of the rectangle can be changed by the user (one at a time). I am having trouble understanding how to access/save the user's input (change to the rectangle) and drawing the new rectangle with the updated value. I am just now learning C++ so my code may not even be the right way to approach this problem. Any help or guidance is appreciated.

Quentin
  • 62,093
  • 7
  • 131
  • 191
shatown
  • 19
  • 5
  • 1
    `const char H = 'h';` is like writing `const int one_hundred_seventeen = 117;` (it’s a bit weird) – Dietrich Epp Sep 04 '17 at 04:34
  • 1
    Sounds like you could benefit from reading one of [these C++ books](https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). – Ron Sep 04 '17 at 05:29

1 Answers1

0

I would certainly first advice you to try some smaller programs if you are new to defining functions in C++.

The type you defined as the return type of function getChoice(char, char, char, char, char) is char, but all return values in the function (except newBorder) is of type int, which is inappropriate.

In fact, judging from the name of your function "getChoice", the function should only return the "choice" of the user instead of going further, and further instructions should be done elsewhere.

When the user enters 'q', the return 0 statement in getChoice would not cause the main function to quit but instead only cause the getChoice function to return an int value of 0.

I also consider a switch-case statement better than all the if-else statements when judging the user's choice.

In the following code that I wrote based on your program, further instructions are executed inside the main function.

#include <iostream>
#include <cassert>
using namespace std;

//constants:
const int MIN_HEIGHT = 3;
const int MIN_WIDTH = 3;
const int MAX_HEIGHT = 20;
const int MAX_WIDTH = 60;
const char H = 'h';
const char W = 'w';
const char B = 'b';
const char F = 'f';
const char Q = 'q';

//prototypes:
void drawRectangle(int row, int col, char border, char fill);
void displayChoices();
char getChoice(char h, char w, char b, char f, char q);

int main()
{

    char border = '#', fill = '*', choice;
    int newHeight = 0;
    int newWidth = 0;
    char newBorder = (char)0;
    char newFill = (char)0;
    int height = 10, width = 10;
    cout << endl << "Welcome! \n";
    while (true)
    {
        drawRectangle(height, width, border, fill);

        cout << endl << "Choose from the following: \n";
        displayChoices();
        choice = getChoice(H, W, B, F, Q);
        //if height is changed, update height. If width is changed, update width of rect.
        //if border is changed, update rectangle border. If fill is changed, update rectangle fill
        switch (choice)
        {
        case Q:
                return 0;

        case H:
                cout << "Enter new height between " << MIN_HEIGHT << " and " << MAX_HEIGHT << ": \n";
                cin >> newHeight;
                while ((newHeight < MIN_HEIGHT) || (newHeight > MAX_HEIGHT)) {

                    cout << "That number is not in range. Try again.\n";
                    cout << "Enter a number between " << MIN_HEIGHT
                        << " and " << MAX_HEIGHT << ": ";
                    cin >> newHeight;

                }
                height = newHeight;
                break;

        case W:
                cout << "Enter new width  between " << MIN_WIDTH << " and " << MAX_WIDTH << ": \n";
                cin >> newWidth;
                while ((newWidth < MIN_WIDTH) || (newWidth > MAX_WIDTH)) {

                    cout << "That number is not in range. Try again.\n";
                    cout << "Enter a number between " << MIN_WIDTH
                        << " and " << MAX_WIDTH << ": ";
                    cin >> newWidth;

                } 
                width = newWidth;
                break;
        case B:
                cout << "Enter new border character: \n";
                cin >> newBorder;
                border = newBorder;
                break;
        case F:
                cout << "Enter new fill character: \n";
                cin >> newFill;
                fill = newFill;
                break;
        }
    }
    return 0;
}

//draws rectangle
void drawRectangle(int row, int col, char border, char fill)
{
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            if ((i == 0) || (i == (row - 1)) || (j == 0) || (j == (col - 1))) {
                cout << border;
            }
            else {
                cout << fill;
            }
        }
        cout << endl;
    }
}

//diplays users choices between height, width
//border and quit
void displayChoices()
{
    cout << "h) Change the height.\n";
    cout << "w) Change the width.\n";
    cout << "b) Change the border character.\n";
    cout << "f) Change the fill character.\n";
    cout << "q) Quit program.\n";
}

//takes users choice and asks for the new value or character 
char getChoice(char h, char w, char b, char f, char q) {
    char choice, newBorder, newFill;
    int newHeight, newWidth, count = 0;

    cin >> choice;

    while ((choice != h && choice != w && choice != b && choice != f && choice != q)) {
        cout << "Not a valid choice. Choose again.\n";
        cin >> choice;
    }
    return choice;


}

It is also actually a bad practice to use the 'using namespace std;' statement, but it can reduce a lot of trouble for beginners so you don't need to care about that now. Just keep in mind you should get rid of it after some time.

leyanpan
  • 433
  • 2
  • 9