Ir ao conteúdo

Posts recomendados

Postado

<>

Olá gente bom dia, tive que desenvolver um código que colocando uma letra do alfabeto ter como resposta fornecer um triângulo da seguinte forma:

Exemplo:

 

Entrada: D

 

Saída: 

...A...
..ABA..
.ABCBA.
ABCDCBA

 

Conseguir chegar nesse código, porém não estou conseguindo imprimir os pontos do lado direito do triângulo, minha saída está dessa forma: 

 

...A
..ABA
.ABCBA
ABCDCBA

 

Agradeço desde já

 

#include<stdio.h>
#include<stdbool.h>
main() {
  int q, i, e, x;
  char letra;
  int num;
  printf("Digite uma letra do alfabeto entre 'A'e 'Z'. \n");
  scanf("%c", & letra); // lê a letra
  
  num = letra - 64; // transforma a letra em numero de 0 a 26

  if (num < 27) { // verifica se é uma letra de A a Z não conta minuscula
    for (q = 0; q < num; q++) { // laço de repetição quedefine a quantidade de linhas do triangulo
      i = q;
      int ponto;
      bool temPonto = true;

      for (e = 65; e < 66 + i; e++) { // imprime do lado esquerdo em ordem crescente
        ponto = num - (q + 1);
        if (temPonto && e == 65) {
          temPonto = false;
          for (x = 0; x < ponto; x++) {
            printf(" .");
          }
        }
        printf("%c", e);
      }
      for (x = 64 + i; x > 64; x--) { // imprime do lado direito em ordem decrescente
        printf("%c", x);
      }
      printf("\n"); // quebra a linha
    }
  } else {
    printf("Valor inválido.");
  }
}

  • Obrigado 1
Postado

@carolineandresa Seria bom você colocar o enunciado, porque se for só para fazer um triangulo com as letras há varias formas de fazer.

Exemplo

#include <stdio.h>
#include <ctype.h>

const char sinal = '_';

int main(void)
{
    unsigned short 
        q_pontos = 0,
        q_linhas = 0,
        q_letras = 0,
        pontos,
        linhas,
        letras;

    char letra = 0;

    /* Lẽ um caractere entre A a Z do úsuario */
    do {
        printf("Digite uma letra de A a Z\n");
        scanf("%c%*c", &letra);
        if (toupper(letra) < 'A' || toupper(letra) > 'Z') {
            printf("O caractere %c não e valido!\n", letra);
        }
    } while (toupper(letra) < 'A' || toupper(letra) > 'Z');

    q_pontos = q_linhas = (toupper(letra)-'A')+1;
    q_letras = 1;
    for (linhas = 0; linhas < q_linhas; linhas++) {
        /* Mostra os pontos */
        for (pontos = 0; pontos < q_pontos; pontos++) {
            putchar(sinal);
        }
        /* Mostra as letras em ordem normal */
        for (letras = 'A'; letras < (q_letras+'A'); letras++) {
            printf("%c", letras);
        }
        /* Mostra as letras em ordem reversa se a quantidade de letras for maior que 1*/
        if (q_letras > 1) {
            for (letras = (q_letras+'A')-2; letras >= 'A'; letras--) {
                printf("%c", letras);
            }
        }
        /* Mostra os pontos */
        for (pontos = 0; pontos < q_pontos; pontos++) {
            putchar(sinal);
        }

        /* Salta uma linha */
        putchar('\n');

        q_pontos--;
        q_letras++;
    }
    return(0);
}

 

  • Obrigado 1
Postado

Você pode usar algumas variáves de controle para testar se a coluna está no intervalo para colocar as letras ou os pontos,

 

#include <stdio.h>
#include <ctype.h>

int main(void){
    char letra;
    int N;
    
    printf("Letra entre A e B: ");
    scanf("%c", &letra);
    
    if(!isalpha(letra)){
        puts("Valor invalido");
        return 1;
    }
    N = toupper(letra) - 'A';

    for(int b = N, a = 0; b >= 0; b -= 1, a += 2){   
        int proxima = 0;
        for(int coluna = 0; coluna <= N * 2; coluna += 1){ 
            if(coluna < b || coluna > b + a){
                putchar('.');
            }else{
                putchar('A'+ proxima);
                if(coluna < N){
                    proxima += 1;
                }else{
                    proxima -= 1;
                }
            }
        }
       putchar('\n');
    }
    return 0;
}

 

  • Obrigado 1
Postado

 

 

 

Escreva em torno dos dados.

 

Achei muito complicado o programa como está agora. E frágil. Vou deixar uns palpites e exemplos

 

 Considere o tal triângulo:

  • se a letra for D como no exemplo:
    ...A...
    ..ABA..
    .ABCBA.
    ABCDCBA
    

    Mas se fosse A?

 

A

 

  • Quantas linhas tem o triângulo? entre 1 e 26 inclusive, já que são as letras.
  • E as colunas? Se tem uma linha só está fácil: 1 coluna. Mas no exemplo se vê que para D são 7 colunas, ABCDCBA. E dá pra perceber que o número de colunas é o dobro do número de linhas, menos 1, porque a única letra que não se repete é a do meio.
    E o número é sempre ímpar, claro. Porque isso importa? Porque se espera que o triângulo fique alinhado na margem esquerda como acima... Então ajuda saber a posição da letra central, o "bico" do triângulo. E essa posição é metade do número de colunas, como fica óbvio no desenho. Isso quer dizer que para desenhar o tal triângulo se usa um loop para as linhas, cujo número é conhecido. Para cada linha um loop desenha as colunas, e o número é conhecido. E a posição das letras é alinhada em relação ao centro, cuja posição também é conhecida.
  • Sabendo disso ANTES de escrever o programa, porque esses são os dados, dá pra escrever o programa, em qualquer linguagem. No caso aqui, em C

Sobre o código
 

main() {
    int q, i, e, x;
    char letra;
    int num;
    printf("Digite uma letra do alfabeto entre 'A'e 'Z'. \n");
    scanf("%c", &letra); // lê a letra

    num = letra - 64; // transforma a letra em numero de 0 a 26

    if (num < 27) { // verifica se é uma letra de A a Z não conta minuscula
        for (q = 0; q < num; q++) { // laço de repetição quedefine a quantidade de linhas do triangulo

// ...
  • main() retorna um int. Seu compilador deve ter reclamado.
  • declare uma variável por linha. e inicialize todas.
  • não precisa "transformar" uma letra em número. C vai aceitar ler o valor em um int
  • numa pergunta para o usuário não mude de linha antes de ler. Deixe o cursor na mesma linha
  • TESTE sempre o retorno de scanf(). É ingênuo seguir sem testar
  • se você tem uma condição definitiva para encerrar o programa teste antes e retorne. Nunca desloque TODO o programa para a direita. É muito ruim de ler e não acrescenta nada.
  • não use acentos em comentários. Podem não sair em qualquer tela
  • use nomes mais expressivos. q,i,e x? 
  • Não precisa de dois loops para controlar as letras.
  • declare as variáveis de controle do loop DENTRO do loop.

EXEMPLO

 

#include <stdio.h>
#include <string.h>

int main(void)
{
    char grade[52] = { 0 };
    const char l_padrao = 'D'; // letra padrão
    char linha[20];
    char limite = 0;
    printf("Letra entre 'A' e 'Z':  ");
    if (fgets(linha, sizeof(linha), stdin) != NULL)
    {
        limite = linha[0]; // a primeira letra
        if ((limite < 'A') || (limite > 'Z')) limite = l_padrao;
    }
    else
        limite = l_padrao;

    int linhas = limite - 'A' + 1;
    int colunas = linhas + linhas - 1;
    for (int l = 0, centro = colunas/2; l < linhas; l += 1)
    {
        memset(grade, '.', colunas);
        char letra = 'A';
        int col = l + l + 1;
        for (int c = 0; c < col; c += 1)
        {
            int p = centro - l + c;
            grade[p] = letra;
            letra += 1 - 2 * (p > centro - 1);;
        }
        puts(grade);
    }
    return 0;
};  // main()

 

 

Esse loop é suficiente para mostrar uma linha toda.
 

        for (int c = 0; c < col; c += 1)
        {
            int p = centro - l + c;
            grade[p] = letra;
            letra += 1 - 2 * (p > centro - 1);;
        }


E não precisa de um if para testar se está do lado direito do centro, então é mais fácil de ler. E mais rápido.

 

E o programa tem uma única chamada de função para a saída, usando puts() que é MUITO mais rápido que printf, ainda mais se chamar para imprimir uma letra por vez...  E outra chamada para cada pontinho...

 

Saída para ' Z' 

 

.........................A.........................
........................ABA........................
.......................ABCBA.......................
......................ABCDCBA......................
.....................ABCDEDCBA.....................
....................ABCDEFEDCBA....................
...................ABCDEFGFEDCBA...................
..................ABCDEFGHGFEDCBA..................
.................ABCDEFGHIHGFEDCBA.................
................ABCDEFGHIJIHGFEDCBA................
...............ABCDEFGHIJKJIHGFEDCBA...............
..............ABCDEFGHIJKLKJIHGFEDCBA..............
.............ABCDEFGHIJKLMLKJIHGFEDCBA.............
............ABCDEFGHIJKLMNMLKJIHGFEDCBA............
...........ABCDEFGHIJKLMNONMLKJIHGFEDCBA...........
..........ABCDEFGHIJKLMNOPONMLKJIHGFEDCBA..........
.........ABCDEFGHIJKLMNOPQPONMLKJIHGFEDCBA.........
........ABCDEFGHIJKLMNOPQRQPONMLKJIHGFEDCBA........
.......ABCDEFGHIJKLMNOPQRSRQPONMLKJIHGFEDCBA.......
......ABCDEFGHIJKLMNOPQRSTSRQPONMLKJIHGFEDCBA......
.....ABCDEFGHIJKLMNOPQRSTUTSRQPONMLKJIHGFEDCBA.....
....ABCDEFGHIJKLMNOPQRSTUVUTSRQPONMLKJIHGFEDCBA....
...ABCDEFGHIJKLMNOPQRSTUVWVUTSRQPONMLKJIHGFEDCBA...
..ABCDEFGHIJKLMNOPQRSTUVWXWVUTSRQPONMLKJIHGFEDCBA..
.ABCDEFGHIJKLMNOPQRSTUVWXYXWVUTSRQPONMLKJIHGFEDCBA.
ABCDEFGHIJKLMNOPQRSTUVWXYZYXWVUTSRQPONMLKJIHGFEDCBA

 

  • Curtir 1
  • Obrigado 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!