Форматирование строк на основе других переменных

#c

#c

Вопрос:

Работаем над назначением для класса, который запрашивает у нас входные данные, так что мы создаем «загон» на основе чисел из входных данных. Мне просто невыносимо трудно пытаться правильно расставить интервалы на основе другой переменной. Загон должен выглядеть примерно так:

 |==|==|==|
:        :
-        -
:        :
|==|==|==|
  

Моя проблема заключается в пустом пространстве в центре (которое должно основываться на длине верха / низа). Setw() работает в некоторой степени, но опять же, просто приводит в бешенство. Вот остальная часть того, что у меня есть до сих пор: `

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

main () {

    int theloop,nsfp,ewfp,count,nsfp2,ewfp2,nsfpw,count2;
    char choice;
    theloop = 0;

    while (theloop < 1) {

        do { 
            cout << "How many North/South Fence posts? ";
            cin >> nsfp;
            if (nsfp < 2)
            cout << "Value must be at least 2, please try againn";
            else if (nsfp > 10)
                nsfp = 10;
        } while (nsfp < 2);

        do { 
            cout << "How many East/West Fence posts? ";
            cin >> ewfp;
            if (ewfp < 2)
                cout << "Value must be at least 2, please try againn";
            else if (ewfp > 10)
                nsfp = 10;
        } while (ewfp < 2);

        for (count = 1; count <= nsfp; count  ) {
            cout << "|";
            nsfp2 = nsfp - 1;
            for (count = 1; count <= nsfp2; count  ) {
                cout << "==|";
                nsfpw = count;
            }
        }

        for (count = 1; count < ewfp; count  ) {
            cout << "n:" << " " << ":" << endl;
            ewfp2 = ewfp;
            for (count = 1; count < ewfp2; count  ){
                cout << "-" << setw(nsfpw) << "-" << "n:" << ":" << endl;
            }   
        }

        cout << "n" << nsfp << endl;
        cout << ewfp;
        theloop = 1;
    }
}
  

Комментарии:

1. Вы должны иметь возможность создать переменную spacing, которая в вашем примере содержит 8 пробелов. Таким образом, вы можете просто записать это между строками. Если вы не уверены, как узнать, что это 8, попробуйте вручную нарисовать несколько загонов, подсчитать и выполнить математические вычисления, чтобы выяснить взаимосвязи. Обратите внимание, что из-за того, что это домашнее задание, я замалчиваю другие ваши проблемы и сосредотачиваюсь на той, которую вы задали.

2. Совет. Если вам нужен «блок пробелов», вы всегда можете использовать std::string , например std::string space_block(number_of_spaces, ' ');

Ответ №1:

Возможно, то, что вы ищете, это. Количество пробелов оказывается равным

3 * nsfp — 4;

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

main () {

    int theloop,nsfp,ewfp,count,nsfp2,ewfp2,nsfpw,count2;
    char choice;
    theloop = 0;

    while (theloop < 1) {

    do { 
    cout << "How many North/South Fence posts? ";
    cin >> nsfp;
    if (nsfp < 2)
        cout << "Value must be at least 2, please try againn";
    else if (nsfp > 10)
        nsfp = 10;
    } while (nsfp < 2);

    do { 
    cout << "How many East/West Fence posts? ";
    cin >> ewfp;
    if (ewfp < 2)
        cout << "Value must be at least 2, please try againn";
    else if (ewfp > 10)
        nsfp = 10;
    } while (ewfp < 2);

    for (count = 1; count <= nsfp; count  ) {
        cout << "|";
        nsfp2 = nsfp - 1;
        for (count = 1; count <= nsfp2; count  ) {
            cout << "==|";
            nsfpw = count;
        }
    }
    cout << "n";
    int spaces = 3 * nsfp - 4;
    for (count = 1; count < ewfp; count  ) {
        cout << ":";
        for (int i = 0; i < spaces; i  ) {
            cout << " ";
        }
        cout << ":n-";
        ewfp2 = ewfp;
        for (int i = 0; i < spaces; i  ){
            cout << " ";
        }
        cout << "-n";   
    }
    for (count = 1; count <= nsfp; count  ) {
        cout << "|";
        nsfp2 = nsfp - 1;
        for (count = 1; count <= nsfp2; count  ) {
            cout << "==|";
            nsfpw = count;
        }
    }

    cout << "n" << nsfp << endl;
    cout << ewfp;
    theloop = 1;
    }
}
  

Более чистый способ сделать это:

 #include <iostream>
#include <iomanip>
#include <string>
using namespace std;

main () {

    int theloop,nsfp,ewfp,count,nsfp2,ewfp2,nsfpw,count2;
    char choice;
    theloop = 0;

    while (theloop < 1) {

    do { 
    cout << "How many North/South Fence posts? ";
    cin >> nsfp;
    if (nsfp < 2)
        cout << "Value must be at least 2, please try againn";
    else if (nsfp > 10)
        nsfp = 10;
    } while (nsfp < 2);

    do { 
    cout << "How many East/West Fence posts? ";
    cin >> ewfp;
    if (ewfp < 2)
        cout << "Value must be at least 2, please try againn";
    else if (ewfp > 10)
        nsfp = 10;
    } while (ewfp < 2);

    for (count = 1; count <= nsfp; count  ) {
        cout << "|";
        nsfp2 = nsfp - 1;
        for (count = 1; count <= nsfp2; count  ) {
            cout << "==|";
            nsfpw = count;
        }
    }
    cout << "n";
    string spaces(3 * nsfp - 4, ' ');
    for (count = 1; count < ewfp; count  ) {
        cout << ":" << spaces << ":n";
        cout << "-" << spaces << "-n";
    }
    for (count = 1; count <= nsfp; count  ) {
        cout << "|";
        nsfp2 = nsfp - 1;
        for (count = 1; count <= nsfp2; count  ) {
            cout << "==|";
            nsfpw = count;
        }
    }

    cout << "n" << nsfp << endl;
    cout << ewfp;
    theloop = 1;
    }
}
  

Комментарии:

1. Это очень похоже на выполнение чьей-то домашней работы за них!

2. Я хотел бы спросить, как вы получили этот ответ для интервала. Это действительно правильно, я просто не понимаю, как вы туда попали

3. @ChrisU Просто посчитайте количество пробелов. 3 пробела на забор, за исключением последнего. 1 пробел для последнего забора меньше 2 пробелов для символов в строке. итак, 3 * (n-1) 1 -2 = 3 * n — 4

4. @user3286661 Ой, теперь я понимаю, спасибо! Мне действительно нужно больше спать, прежде чем я попытаюсь это сделать, lol.