Matsu
Matsu

Reputation: 333

Print letters in lower triangle in C

I spent hours in printing a lower triangle in C. However, I just cannot figure out how to solve this same question with array.

Below is one of the solution I found on net:

int main(void)
{
    char ch='A';
    int i,j;
    for(i=1;i<7;i++)               
        {
        for(j=0;j<i;j++)            
            printf("%c",ch++);      
        printf("\n");
        }
    return 0;
}

Below is how I try to do the same thing:

#define SIZE 8
int main(void){
  char Alphabet[SIZE];
  int i, j;
  for (i = 0, j = 'A'; i < SIZE, j < 'A' + SIZE; i++, j++){
    Alphabet[i] = j;
  }

  for (i = 0; i <= 7; i++){
    for (j = 0; j <= i; j++){
      printf("%c", Alphabet[j+i]);
    }
    printf("\n");
  }
  return 0;
}

The result of the code above is :

A
BC
CDE
DEFG
EFGHI
FGHIJK
GHIJKLM
HIJKLMNO

What should I revise if I want to print as follow:

A
BC
DEF
GHIJ
KLMNO
PQRSTU

Thank you.

Upvotes: 0

Views: 268

Answers (3)

H.S.
H.S.

Reputation: 12679

Keep a track of elements printed from the Alphabet array so far and in the inner loop start printing from next element onward. You can do:

#include <stdio.h>

#define SIZE 26

int main(void) {
    char Alphabet[SIZE];

    for (int i = 0; i < SIZE; i++) {
        Alphabet[i] = 'A' + i;
    }

    // Or simply have the Alphabet array initialized like this
    // char Alphabet[SIZE] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    int k = 0;
    for (int i = 0; i < 6; i++) {
        for (int j = 0; j <= i && k < SIZE; j++) {
            printf("%c", Alphabet[k++]);
        }
        printf("\n");
    }

    return 0;
}

Output:

# ./a.out
A
BC
DEF
GHIJ
KLMNO
PQRSTU

EDIT:

In the comments, a fellow SO contributor said that the above approach is same as the one OP already found as a solution and OP might be looking for approach of calculating the Alphabet array index using i and j only and without use of variable keeping track of array index. Below is the program which does not use any extra variable to keep the track of Alphabet array index to print characters in inner loop and calculating the index using i and j:

#include <stdio.h>

#define SIZE 26
#define ARRLOC(x) ((x * ((x + 1) / 2)) + ((x % 2 == 0) ? (x / 2) : 0))

int main(void) {
    char Alphabet[SIZE];

    for (int i = 0; i < SIZE; i++){
        Alphabet[i] = 'A' + i;
    }

    // Or simply have the Alphabet array declared like this
    // char Alphabet[SIZE] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    for (int i = 0; i < 6; i++){
        for (int j = 0; j <= i && (ARRLOC(i) + j) < SIZE; j++){
            printf("%c", Alphabet[ARRLOC(i) + j]);
        }
        printf("\n");
    }
    return 0;
}

Output:

# ./a.out
A
BC
DEF
GHIJ
KLMNO
PQRSTU

Upvotes: 1

Rasmus S&#248;borg
Rasmus S&#248;borg

Reputation: 3695

If you want an 8 by 8 pyramid, you won't have enough characters to do it using the alphabet (requires 36), so I made the alphabet repeat itself (u could also make it go to numeric instead?)

#define SIZE 8

int area(int size);

int main(void){
  char Alphabet[area(SIZE)];
  int i, j;
  for (i = 0, j = 'A'; i < area(SIZE); i++, j++){
    if (j > 'Z') j = 'A';
    Alphabet[i] = j;
  }

  int idx=0;
  for (i = 0; i < SIZE; i++){
    for (j = 0; j <= i; j++){
      printf("%c", Alphabet[idx++]);
    }
    printf("\n");
  }
  return 0;
}

int area(int size) {
    if (size==1) return 1;
    return size + area(size - 1);
}

Upvotes: 0

Adrian Mole
Adrian Mole

Reputation: 51845

You can just have a third 'index' variable that keeps track of which letter to output across both loops (I've called this k in the code below). Also, you need to make your Alphabet array bigger (26 seems like a reasonable number); then, if that k variable gets past 'Z', we can simply loop back to 'A' using the modulo operator (%):

#include <stdio.h>

#define SIZE 26
int main(void)
{
    char Alphabet[SIZE];
    int i, j, k;
    for (i = 0; i < SIZE; i++) Alphabet[i] = 'A' + i;

    int k = 0;
    for (i = 0; i <= 7; i++) {
        for (j = 0; j <= i; j++) {
            printf("%c", Alphabet[k % 26]); // If past the end, loop back with the "%" operator
            ++k;
        }
        printf("\n");
    }
    return 0;
}

Or we can make the code a little more 'succinct' (though perhaps less clear) by initializing the k variable at the start of the outer loop and incrementing at the end of the inner loop:

    for (k = i = 0; i <= 7; i++) { // Initialize "k" here ...
        for (j = 0; j <= i; j++, k++) { // .. but increment it here!
            printf("%c", Alphabet[k % 26]); // If past the end, loop back with the "%" operator
        }
        printf("\n");
    }

Upvotes: 0

Related Questions