Print ascii table

Hi!
I am stuck here with printing an ascii table from decimal.
My code (and comments for doubt) is:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<iostream>
#include<iomanip> //for setw() 
using namespace std;

int main()
{
	cout << " Decimal to ascii for numbers 32 to 255 are: " << endl << endl; 
	int row = 0, col = 0;
	for (row = 32; row <= 63; row++) // Loop for number of rows
	{
		for (col = 1; col <= 10; col++) // loop for number of columns
		{
			cout << setw(5) << row*col << right << setw(4) <<static_cast<char>(row*col);
			if (row*col >= 255) break; // Iwant to print from  32 to 255. That is why i wanted it to end at 255
		}
		cout << endl; // change row
	}
return 0;
}


Part of my output

Decimal to ascii for numbers 32 to 255 are:

   32       64   @   96   `  128   Ç  160   á  192   └  224   α  256
   33   !   66   B   99   c  132   ä  165   Ñ  198   ╞  231   τ  264
   34   "   68   D  102   f  136   ê  170   ¬  204   ╠  238   ε  272   
   35   #   70   F  105   i  140   î  175   »  210   ╥  245   ⌡  280   <
   36   $   72   H  108   l  144   É  180   ┤  216   ╪  252   ⁿ  288
   37   %   74   J  111   o  148   ö  185   ╣  222   ▐  259   
   38   &   76   L  114   r  152   ÿ  190   ╛  228   Σ  266

   39   '   78   N  117   u  156   £  195   ├  234   Ω  273   
   40   (   80   P  120   x  160   á  200   ╚  240   ≡  280   <

My output is not what i expect. I expect the second row to start with 64,65,66 ... but it prints only the even numbers.
Secondly, i want the output to end at 255.
Help
Thanks in anvance
Last edited on
I expect the second row to start with 64,65,66 ... but it prints only the even numbers.

32*2 = 64
33*2 = 66
34*2 = 68
You get even numbers because you multiply by an even number.

I suggest you use addition instead.
The second column is
32+32 = 64
33+32 = 65
34+32 = 66
The third column is
32+64 = 96
33+64 = 97
34+64 = 98

Secondly, i want the output to end at 255.
Use seven columns and that should be taken care of
The seventh column is
32+192 = 224
33+192 = 225
34+192 = 226
...
63+192 = 255
Last edited on
hey! are you restricted on c++ or allowed to do in c
Thanks Chervil for taking a look at my problem.
I forgot to mension that i tried using addition instead and i got something quite different.

Implementing your suggestion with addition and 7 columns gives
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<iostream>
#include<iomanip> //for setw() 
using namespace std;

int main()
{
	cout << " Decimal to ascii for numbers 32 to 255 are: " << endl << endl; 
	int row = 0, col = 0;
	for (row = 31; row < 63; row++) // Loop for number of rows
	{
		for (col = 1; col <= 7; col++) // loop for number of columns
		{
			cout << setw(5) << row+col << right << setw(4) <<static_cast<char>(row+col);
			if (row+col >= 255) break; // Iwant to print from  32 to 255. That is why i wanted it to end at 255
		}
		cout << endl; // change row
	}
	return 0;
}


32       33   !   34   "   35   #   36   $   37   %   38   &
   33   !   34   "   35   #   36   $   37   %   38   &   39   '
   34   "   35   #   36   $   37   %   38   &   39   '   40   (
   35   #   36   $   37   %   38   &   39   '   40   (   41   )
   36   $   37   %   38   &   39   '   40   (   41   )   42   *
   37   %   38   &   39   '   40   (   41   )   42   *   43   +
   38   &   39   '   40   (   41   )   42   *   43   +   44   ,
   39   '   40   (   41   )   42   *   43   +   44   ,   45   -
   40   (   41   )   42   *   43   +   44   ,   45   -   46   .
   41   )   42   *   43   +   44   ,   45   -   46   .   47   /
   42   *   43   +   44   ,   45   -   46   .   47   /   48   0
   43   +   44   ,   45   -   46   .   47   /   48   0   49   1
   44   ,   45   -   46   .   47   /   48   0   49   1   50   2
   45   -   46   .   47   /   48   0   49   1   50   2   51   3
   46   .   47   /   48   0   49   1   50   2   51   3   52   4
   47   /   48   0   49   1   50   2   51   3   52   4   53   5
   48   0   49   1   50   2   51   3   52   4   53   5   54   6
   49   1   50   2   51   3   52   4   53   5   54   6   55   7
   50   2   51   3   52   4   53   5   54   6   55   7   56   8
   51   3   52   4   53   5   54   6   55   7   56   8   57   9
   52   4   53   5   54   6   55   7   56   8   57   9   58   :
   53   5   54   6   55   7   56   8   57   9   58   :   59   ;
   54   6   55   7   56   8   57   9   58   :   59   ;   60   <
   55   7   56   8   57   9   58   :   59   ;   60   <   61   =
   56   8   57   9   58   :   59   ;   60   <   61   =   62   >
   57   9   58   :   59   ;   60   <   61   =   62   >   63   ?
   58   :   59   ;   60   <   61   =   62   >   63   ?   64   @
   59   ;   60   <   61   =   62   >   63   ?   64   @   65   A
   60   <   61   =   62   >   63   ?   64   @   65   A   66   B
   61   =   62   >   63   ?   64   @   65   A   66   B   67   C
   62   >   63   ?   64   @   65   A   66   B   67   C   68   D
   63   ?   64   @   65   A   66   B   67   C   68   D   69   E


Creepy output.

@ Sajeel, yess i am restricted on C++ as it is the language we are using (at least for now).
Implementing your suggestion with addition and 7 columns gives
1
2
3
4
    for (row = 31; row < 63; row++)
    {
        for (col = 1; col <= 7; col++)
        {

That is sort of what I meant. But I had in mind that col would start at 0 and go up in steps of 32, rather than start at 1 and go up in steps of 1.
1
2
3
4
    for (int row = 32; row <= 63; row++) 
    {
        for (int col = 0; col < 224; col += 32)
        {



Or an alternative ... there are many possible variations
1
2
3
4
5
6
7
8
9
    for (int row = 32; row < 64; row++) 
    {
        for (int col = 0; col < 7; col++) 
        {
            int num = row + col*32; 
            cout << setw(5) << num << setw(4) << static_cast<char>(num);
        }
        cout << endl;
    }
Hello Chervil,
Many thanks for your help. I don't know how i can thank you but you saved me from serious headache.

I am encouraged to continue my journey into the software arena with people like you out there whom one can always get help when stuck.

I tried both options and i chosed
1
2
3
4
for (int row = 32; row < 64; row++) // Loop for number of rows
	{
		for (int col = 0; col < 224; col += 32) //  Col starts at 0 and go up in steps of 32. 
		{


as it was easier for me to understand.

But... can you explain to me how you reasoned with the second alternative?

I think i still lack that ability to think like a programmer (yet) and i wish to reach there as soon as it can be possible. I chose programming because i love it and i want to do it well!

Thanks again senior Chervil!
Last edited on
closed account (E0p9LyTq)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream>
#include<iomanip>

int main()
{
   std::cout << " Decimal to ascii for numbers 32 to 255 are:\n\n";

   int col = 1;

   for (int asc_char = 32; asc_char < 256; asc_char++)
   {
      std::cout << std::setw(6) << asc_char << std::setw(3) << static_cast<char>(asc_char);

      col++;
      if (col > 7)
      {
         col = 1;
         std::cout << "\n"; // start new row
      }
   }
   std::cout << "\n";
}


 Decimal to ascii for numbers 32 to 255 are:

    32       33  !    34  "    35  #    36  $    37  %    38  &
    39  '    40  (    41  )    42  *    43  +    44  ,    45  -
    46  .    47  /    48  0    49  1    50  2    51  3    52  4
    53  5    54  6    55  7    56  8    57  9    58  :    59  ;
    60  <    61  =    62  >    63  ?    64  @    65  A    66  B
    67  C    68  D    69  E    70  F    71  G    72  H    73  I
    74  J    75  K    76  L    77  M    78  N    79  O    80  P
    81  Q    82  R    83  S    84  T    85  U    86  V    87  W
    88  X    89  Y    90  Z    91  [    92  \    93  ]    94  ^
    95  _    96  `    97  a    98  b    99  c   100  d   101  e
   102  f   103  g   104  h   105  i   106  j   107  k   108  l
   109  m   110  n   111  o   112  p   113  q   114  r   115  s
   116  t   117  u   118  v   119  w   120  x   121  y   122  z
   123  {   124  |   125  }   126  ~   127     128  Ç   129  ü
   130  é   131  â   132  ä   133  à   134  å   135  ç   136  ê
   137  ë   138  è   139  ï   140  î   141  ì   142  Ä   143  Å
   144  É   145  æ   146  Æ   147  ô   148  ö   149  ò   150  û
   151  ù   152  ÿ   153  Ö   154  Ü   155  ¢   156  £   157  ¥
   158  ₧   159  ƒ   160  á   161  í   162  ó   163  ú   164  ñ
   165  Ñ   166  ª   167  º   168  ¿   169  ⌐   170  ¬   171  ½
   172  ¼   173  ¡   174  «   175  »   176  ░   177  ▒   178  ▓
   179  │   180  ┤   181  ╡   182  ╢   183  ╖   184  ╕   185  ╣
   186  ║   187  ╗   188  ╝   189  ╜   190  ╛   191  ┐   192  └
   193  ┴   194  ┬   195  ├   196  ─   197  ┼   198  ╞   199  ╟
   200  ╚   201  ╔   202  ╩   203  ╦   204  ╠   205  ═   206  ╬
   207  ╧   208  ╨   209  ╤   210  ╥   211  ╙   212  ╘   213  ╒
   214  ╓   215  ╫   216  ╪   217  ┘   218  ┌   219  █   220  ▄
   221  ▌   222  ▐   223  ▀   224  α   225  ß   226  Γ   227  π
   228  Σ   229  σ   230  µ   231  τ   232  Φ   233  Θ   234  Ω
   235  δ   236  ∞   237  φ   238  ε   239  ∩   240  ≡   241  ±
   242  ≥   243  ≤   244  ⌠   245  ⌡   246  ÷   247  ≈   248  °
   249  ∙   250  ·   251  √   252  ⁿ   253  ²   254  ■   255   


Note: ASCII character 127 shows up fine in the console window, the columns line up properly. It is an unprintable character here at cplusplus.
Last edited on
closed account (E0p9LyTq)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<iostream>
#include<iomanip>

int main()
{
   std::cout << " Decimal to ascii for numbers 32 to 255 are:\n\n";

   for (int asc_char = 32; asc_char  < 256; asc_char += 7)
   {
      for (int col_num = 0; col_num < 7; col_num++)
      {
         int output = asc_char + col_num;
         std::cout << std::setw(6) << output << std::setw(3) << static_cast<char>(output);
      }
      std::cout << "\n";
   }
   std::cout << "\n";
}


Output same as above.
But... can you explain to me how you reasoned with the second alternative?

Let's put them here together:
1
2
3
4
5
6
7
8
9
    for (int row = 32; row < 64; row++) 
    {
        for (int col = 0; col < 224; col += 32)
        {
            int num = row + col;
            cout << setw(5) << num << setw(4) << static_cast<char>(num);
        }
        cout << endl; 
    }


1
2
3
4
5
6
7
8
9
    for (int row = 32; row < 64; row++) 
    {
        for (int col = 0; col < 7; col++) 
        {
            int num = row + col*32; 
            cout << setw(5) << num << setw(4) << static_cast<char>(num);
        }
        cout << endl;
    }


In both cases I used a temporary variable int num. The reason for that is to avoid doing the same calculation in two (or more) different places. It's not a big issue, but if for some reason it needs to be changed, then only one place needs to be changed, which reduces one possible cause of errors.

The only differences now are in these two lines:
1
2
3
        for (int col = 0; col < 224; col += 32)
        {
            int num = row + col;
and
1
2
3
        for (int col = 0; col < 7; col++) 
        {
            int num = row + col*32; 

Here, what it amounts to is the difference between doing multiplication, or doing repeated addition.

For example 3*32 = 96, that's the
same as 32+32+32 = 96.

And really, that's all there is to it, I think. I prefer the second version because it's more apparent that there will be seven columns, whereas the first requires a calculation 224/32 to figure out that there will be seven columns.

Other than that, I think seeing these things is partly due to lots of practice, and may be as much to do with an interest in numbers and maths as it is to do with programming.
closed account (E0p9LyTq)
Using the ability to instantiate and change the value of more than one variable in a for loop:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<iostream>
#include<iomanip>

int main()
{
   const unsigned min_char = 32;
   const unsigned max_char = 255;
   const unsigned max_col  = 7;
   
   std::cout << " Decimal to ASCII for numbers " << min_char << " to " << max_char << " are:\n\n";

   for (unsigned asc_char = min_char, col_num = 1; asc_char <= max_char; asc_char++, col_num++)
   {
      if (col_num > max_col)
      {
         col_num = 1;
         std::cout << "\n"; // start new row
      }

      std::cout << std::setw(6) << asc_char << std::setw(3) << static_cast<char>(asc_char);
   }
   std::cout << "\n";
}
Thanks
FurryGuy wrote:
Using the ability to instantiate and change the value of more than one variable in a for loop:
for giving another look at the problem. It is rewarding to read from different points of view. However, my lecturer discourage these "smart solutions" (as he calls it, at least for this beginning). Your output gives the same result but in a different format as i had wished.

Your first alternative
FurryGuy wrote:
Note: ASCII character 127 shows up fine in the console window, the columns line up properly. It is an unprintable character here at cplusplus.
is however simpler to implement but i want the output to be something like this (this is just part)


        Decimal to ascii table for numbers 32 to 255
        ============================================

   32      64  @   96  `  128  Ç  160  á  192  └  224  α
   33  !   65  A   97  a  129  ü  161  í  193  ┴  225  ß
   34  "   66  B   98  b  130  é  162  ó  194  ┬  226  Γ
   35  #   67  C   99  c  131  â  163  ú  195  ├  227  π
   36  $   68  D  100  d  132  ä  164  ñ  196  ─  228  Σ
   37  %   69  E  101  e  133  à  165  Ñ  197  ┼  229  σ
   38  &   70  F  102  f  134  å  166  ª  198  ╞  230  µ
   39  '   71  G  103  g  135  ç  167  º  199  ╟  231  τ
   40  (   72  H  104  h  136  ê  168  ¿  200  ╚  232  Φ


I will stick with Chervil's solution as it is more understandable (to me). Yes
Chervil wrote:
I prefer the second version because it's more apparent that there will be seven columns, whereas the first requires a calculation 224/32 to figure out that there will be seven columns.
Now i understand the logic better. I will adopt that instead.

Thanks guys for your input and time. Problem is SOLVED.
Last edited on
closed account (E0p9LyTq)
@blongho,

I earlier provided two other code examples, take a look at those if you haven't already.
Sorry
FurryGuy wrote:
I earlier provided two other code examples, take a look at those if you haven't already.

Honestly, i saw them after my post. As you can see, i have edited the post.

I am honestly sorry for the negligence and non-acknowledgement of your contribution.
Last edited on
Topic archived. No new replies allowed.