Kai
Kai

Reputation: 13

How to print a diamond pattern with alternating characters in C?

I'm trying to write a C program that prints a diamond-shaped pattern where the side length (measured in @ symbols) is provided by the user. The program should follow these rules:

The maximum side length is 20, and the minimum is 1. The pattern alternates between @, ., and o following a specific sequence. For example, for different lengths, outputs should be this ones:

Length 1 @:

@

Length 2 @'s:

 @
@.@
 @

Length 5 @'s:

    @
   @.@
  @.o.@
 @.o.o.@
@[email protected].@
 @.o.o.@
  @.o.@
   @.@
    @

Length 6 @'s:

     @
    @.@
   @.o.@
  @.o.o.@
 @[email protected].@
@.o.@[email protected].@
 @[email protected].@
  @.o.o.@
   @.o.@
    @.@
     @

This is what I've got for now:

#include <stdio.h>

int main(){

  int length;
  int counter;

  printf("¿Length of the rhombus?: ");
  scanf("%d", &length);

  if(length > 20 || length < 1){
    printf("The length must be at least 1 and maximum 20.");
    return 1;
  }

  else if(length == 1){
    printf("@");
    return 0;
  }

  else{

    /*-- Create as many lines as "length" value --*/
    for(int i = 1; i <= length; i++){

      /* Upper left triangle */
      /* -------------------------------------------------------- */
      /* Create enough blank spaces before the character sequence */
      for(int j = 1; j <= length-i; j++){
        printf(" ");
      }

      /* Create the sequence "@.o.@" */
      counter = 0;
      for(int j = 1; j <= i; j++){

        if(counter % 4 == 0){
          printf("@");
          }

        else if(counter % 4 == 1){
          printf(".");
          }

        else if(counter % 4 == 2){
          printf("o");
          }

        else{
          printf(".");
          }

        counter++;
      }

      /* -------------------------------------------------------- */

      /* Upper right triangle*/
      /* -------------------------------------------------------- */

        //I don't know what to do here

      /* -------------------------------------------------------- */

    printf("\n");
    }

  }
}

What could I add to build the right part of the rhombus? (And I would appreciate any suggestions to improve my way of reasoning for future problems)

This is what i get with length = 10,

         @
        @.
       @.o
      @.o.
     @.o.@
    @.o.@.
   @[email protected]
  @[email protected].
 @[email protected].@
@[email protected].@.

And what I what I don't know, is what should I add to the code now to get this:

         @
        @.@
       @.o.@
      @.o.o.@
     @[email protected].@
    @.o.@[email protected].@
   @[email protected][email protected].@
  @[email protected][email protected].@
 @[email protected][email protected][email protected].@
@[email protected].@[email protected][email protected].@

Upvotes: 1

Views: 89

Answers (1)

Lajos Arpad
Lajos Arpad

Reputation: 76943

Let's marry the two together. Assuming we already have a length variable, this is how you can proceed:

int i, j, limit = 0;
//rows
for (i = 0; i <= 2 * length; i++) {
    char alternating[] = {'.', 'o'};
    int alternatingIndex = 0;
    //columns
    for (j = 0; j <= 2 * length; j++) {
        //out of bounds
        if ((j < length - limit) || (j > length + limit)) printf(" ");
        //on bounds
        else if ((j == length - limit) || (j == length + limit)) printf("@");
        //alternating characters
        else {
            //display current character
            printf("%c", alternating[alternatingIndex]);
            //alternate to the next, since 1 - 0 = 1 and 1 - 1 = 0
            alternatingIndex = 1 - alternatingIndex;
        }
    }
    //moving limit to the right direction
    limit += ((i < length) ? 1 : -1) * 1;
    //newline
    printf("\n");
}    

Comments are in-between the lines. I'm not sure what is the criteria to display @ at non-bound positions, so I ignored that part until I get further clarification. So, with length being 10, this is what we see:

          @          
         @.@         
        @.o.@        
       @.o.o.@       
      @.o.o.o.@      
     @.o.o.o.o.@     
    @.o.o.o.o.o.@    
   @.o.o.o.o.o.o.@   
  @.o.o.o.o.o.o.o.@  
 @.o.o.o.o.o.o.o.o.@ 
@.o.o.o.o.o.o.o.o.o.@
 @.o.o.o.o.o.o.o.o.@ 
  @.o.o.o.o.o.o.o.@  
   @.o.o.o.o.o.o.@   
    @.o.o.o.o.o.@    
     @.o.o.o.o.@     
      @.o.o.o.@      
       @.o.o.@       
        @.o.@        
         @.@         
          @  

If from this you can figure out where else the @ is to be displayed, let me know in the comments. If you do not manage to implement it, then specify it in plain words.

EDIT

Applied the change for alternation:

int i, j, limit = 0, length = 10;
//rows
for (i = 0; i <= 2 * length; i++) {
    char alternating[] = {'.', 'o', '.', '@'};
    int alternatingIndex = 0;
    //columns
    for (j = 0; j <= 2 * length; j++) {
        //out of bounds
        if ((j < length - limit) || (j > length + limit)) printf(" ");
        //on bounds
        else if ((j == length - limit) || (j == length + limit)) printf("@");
        //alternating characters
        else {
            //display current character
            printf("%c", alternating[alternatingIndex]);
            //alternate to the next (+ 1) or previous (+ 3)
            alternatingIndex = (alternatingIndex + ((j < length) ? 1 : 3)) % 4;
        }
    }
    //moving limit to the right direction
    limit += ((i < length) ? 1 : -1) * 1;
    //newline
    printf("\n");
}

Upvotes: 1

Related Questions