Home > OS >  I have to do a program that do a square in c with incremental letter
I have to do a program that do a square in c with incremental letter

Time:10-20

Hello and thank you for coming here.

I have to do a program that will draw a number of square choosed by the user with incremental letter. For example, if the user choose 4 square, it will return :

DDDDDDD

DCCCCCD

DCBBBCD

DCBABCD

DCBBBCD

DCCCCCD

DDDDDDD

At the time being, my code look like this ;


#include <iostream>
using namespace std;

int main()
{
 int size;
 int nbsquareletter;
     cout << " How many square ?" << endl;
      cin >> nbsquareletter;
      size = nbsquareletter * 2 - 1;
 char squareletter = 'a';
     for (int row = 1; row <= size;   row)
      {
          for (int col = 0; col <= size;   col)
          {

            if (row < col) {
              cout << (char)(squareletter   row - 1) << " ";
            }
            else if (row > col)
            {
              cout << (char)(squareletter   col) << " ";
            }

              /*
              cout << col << " ";
              cout << row << " ";
              */




          }
          cout << endl;
      }
  }


If you have any ideas to help me, don't hesitate, I'm struggling. it's been 3.5 hours. Thanks you for reading and have a good day !

CodePudding user response:

Try to keep things simple. If you start write code before you have a clear idea of how to solve it you will end up with convoluted code. It will have bugs and fixing them will make the code even less simple.

Some simple considerartions:

  • The letter at position (i,j) is determined by the "distance" from the center. The distance is max(abs(i - i_0), abs(j - j_0).

  • The center is at (i,j) = (size-1,size-1) when we start to count at upper left corner (0,0).

  • The letters can be picked from an array std::string letters = "ABCDEFG...".

  • i and j are in the range [0,2*size-1)

Just writing this (and nothing more) down in code results in this:

#include <iostream>
#include <string>

void print_square(int size){
    std::string letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int i_0 = size-1;
    int j_0 = size-1;
    for (int i=0;i< 2*size-1;  i){
        for (int j=0;j< 2*size-1;  j) {
            int index = std::max(std::abs(i-i_0),std::abs(j-j_0));
            std::cout << letters[index]; 
        }
        std::cout << "\n";
    }
}


int main() {
    print_square(4);
}

Which produces output

DDDDDDD
DCCCCCD
DCBBBCD
DCBABCD
DCBBBCD
DCCCCCD
DDDDDDD

Your code cannot print the right output, because when row == col there is no output, and it misses the diagonal. I didnt look further than that.

CodePudding user response:

Instead of fixing bugs in your code I decided to suggest you my own solution. Maybe some other answers will be related to bugs in your code.

On piece of paper I figured out 4 different formulas for 4 parts of a drawn picture, formulas computing what letter to take inside English alphabet. Afterwards I take this letter from array with alphabet.

Try it online!

#include <iostream>

int main() {
    int n = 0;
    std::cin >> n;
    char const letters[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    for (int i = 0; i < 2 * n - 1;   i) {
        for (int j = 0; j < 2 * n - 1;   j)
            std::cout << letters[
                i <= j && i   j <  2 * n - 1 ? n - i - 1 :
                i <= j && i   j >= 2 * n - 1 ? j - n   1 :
                i >  j && i   j <  2 * n - 1 ? n - j - 1 :
                i >  j && i   j >= 2 * n - 1 ? i - n   1 : 25
            ];
        std::cout << std::endl;
    }
}

Input:

7

Output:


GGGGGGGGGGGGG
GFFFFFFFFFFFG
GFEEEEEEEEEFG
GFEDDDDDDDEFG
GFEDCCCCCDEFG
GFEDCBBBCDEFG
GFEDCBABCDEFG
GFEDCBBBCDEFG
GFEDCCCCCDEFG
GFEDDDDDDDEFG
GFEEEEEEEEEFG
GFFFFFFFFFFFG
GGGGGGGGGGGGG

CodePudding user response:

Let's define some functions, to make the recurrence relation obvious.

std::vector<std::string> WrapInLetter(char letter, std::vector<std::string> lines)
{
    for (auto & line : lines)
    {
        line.insert(line.begin(), letter);
        line.insert(line.end(), letter);
    }

    std::size_t size = (lines.size() * 2)   1;
    std::string edge(size, letter); // A string formed of size copies of letter
    lines.insert(lines.begin(), edge);
    lines.insert(lines.end(), edge);

    return lines;
}

std::vector<std::string> SquareLetter(char letter)
{
    if (letter == 'A') return { "A" };
    return WrapInLetter(letter, SquareLetter(letter - 1));
}

Now main just has to call that function and loop over the result.

int main()
{
    std::cout << "How many square ?" << std::endl;
    int size;
    std::cin >> size;
    for (auto line : SquareLetter('A'   size - 1))
    {
        std::cout << line << std::endl;
    }
}
  •  Tags:  
  • c
  • Related