Функция отображения вопросов

Мне было поручено написать программу для отображения поля звездочек (*) на основе введенных пользователем данных. Я получил код для работы, но мой инструктор попросил включить их как минимум в две функции. Функция displaybanner не работает. getData запускается и просит пользователя ввести значения, но затем программа останавливается после ввода. Что, кажется, идет не так?

#include <iostream>

using namespace std;

void displaybanner(int numrows=0, int numcolums=0, int numfields=0);

void getData(int numrows=0, int numcolumns=0, int numfields=0);

const char c = '*';int main(void)
{
getData();
displaybanner();}

void getData(int numrows,int numcolumns,int numfields)
{

cout << "Welcome to the banner creation program!" << endl;

cout << "Enter the number of rows (1 - 5) --> ";
cin >> numrows;

if(numrows<1 || numrows>5){
cout << "Your entered value is outside the range!" << endl;
cout << "Program will now halt..." << endl;
exit(0);}cout << "Enter the number of columns (5 - 50) --> ";
cin >> numcolumns;

if(numcolumns<5 || numcolumns>50){
cout << "Your entered value is outside the range!" << endl;
cout << "Program will now halt..." << endl;
exit(0);
}

cout << "Enter the number of rows (3 - 10) --> ";
cin >> numfields;

if(numfields<3 || numrows>10){
cout << "Your entered value is outside the range!" << endl;
cout << "Program will now halt..." << endl;
exit(0);
}

}

void displaybanner(int numfields, int numrows, int numcolumns)
{
for (int i = 0; i < numfields; i++) {
for (int j = 0; j < numrows; j++) {
for (int k = 0; k < numcolumns; k++) {
cout << c;
}
cout << endl;
}
cout << endl << endl << endl;
}
}

0

Решение

Это не работает, потому что вы изменяете только временные / локальные значения внутри своих функций. Чтобы это исправить, вы должны передать свои параметры по ссылке (используя указатель или ссылку).

Самый простой способ, вероятно, будет использовать ссылки, например, менять

void getData(int numfields, int numrows, int numcolumns)

в

void getData(int &numfields, int &numrows, int &numcolumns)

Это обеспечит сохранение всех изменений, которые вы внесли в эти параметры, даже при возврате в вызывающую функцию. Обратите внимание, что вы не можете использовать параметры по умолчанию, но вам нужно делать это только там, где вы хотите вернуть значения через параметры.

Ваша основная функция должна выглядеть так:

int main(void)
{
int fields, rows, cols;
getData(fields, rows, cols);
displaybanner(fields, rows, cols);
}
2

Другие решения

Аргументы по умолчанию для displaybanner все нули:

void displaybanner(int numrows = 0, int numcolums = 0, int numfields = 0);

И поскольку вы вызываете эту функцию в главном модуле без каких-либо аргументов, последовательность циклов не будет выполняться (поскольку индексные переменные равны 0, а их пределы равны 0). Чтобы это сработало, передайте аргументы displaybanner или сделать его аргументы по умолчанию больше 0.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector