Como fazer um Letreiro em Linguagem C

Olá pessoal…

Hoje vou mostrar como fazer um Letreiro simples em Linguagem C, com uma String de 10 posições e programado para dar 3 voltas.


Primeiro para se fazer um letreiro, deve-se pensar na lógica de como irá funcionar o texto a ser impresso, para isso, no programa abaixo, além da variável que irá guardar o texto (palavra), também criei uma variável de cópia do conteúdo (copia), e através da definição do tamanho das strings (tamanho), é percorrido as voltas (volta_atual e voltas) e copiando o conteúdo da palavra para a copia, quando acaba, então é feito a cópia do começo da palavra para o fim da copia, posição por posição, até chegar no início da palavra. Por exemplo:

palavra: |daniel|

Primeira parte do programa (cópia normal):
copia: |aniel |
copia: |niel  |
copia: |iel   |
copia: |el    |
copia: |l     |
copia: |      |

Segunda parte do programa (do começo da palavra para o fim da cópia):
copia: |     d|
copia: |    da|
copia: |   dan|
copia: |  dani|
copia: | danie|
copia: |daniel|

Conforme o exemplo acima, com isso a volta fica alterando entre as duas partes do programa, criando o letreiro.

Abaixo um print do programa em execução.

Letreiro em Linguagem C

Letreiro em Linguagem C

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

//Se o sistema for Windows, a limpeza utiliza a funcao cls
#ifdef WIN32
  #define LIMPA_TELA system("cls");

//Se for Linux, utiliza a funcao clear par alimpeza da tela
#else
  #define LIMPA_TELA system("/usr/bin/clear");
#endif

//Espera 1 segundo
#define ESPERA sleep(1);

main(){
	int tamanho     = 9;
	int voltas      = 2;
	int volta_atual = 0;
	int atual       = 0;
	int auxiliar    = 0;
	int pos_copia   = 0;
	int posicao     = 0;
	int quantidade  = 0;
	int tipo        = 0;
	char palavra[tamanho+2];
	char copia[tamanho+2];
	
	//Zera a string
	for (atual=0;atual<=tamanho;atual++){
		palavra[atual] = ' ';
	}
	
	//Pega a string
	printf("Insira a string (maximo de %d caracteres): \n> ", tamanho+1);
	gets(palavra);
	
	//Pegando o tipo de impressao
	while (tipo != 1 && tipo != 2){
		printf("Deseja mostrar somente o letreiro (1=Sim; 2=Nao)?");
		scanf("%d", &tipo);
	}
	
	//Zera a string onde tiver o \0, deixando somente na última posicao
	for (atual=0;atual<=tamanho;atual++){
		if (palavra[atual] == '\0')
			palavra[atual] = ' ';
	}
	palavra[tamanho+1] = '|';
	palavra[tamanho+2] = '\0';
	
	//Limpando a tela e imprimindo a primeira vez
	LIMPA_TELA;
	if (tipo == 1)
		printf("%s", palavra);
	else
		printf("Original: ...%s...\nLetreiro: ...%s...\nVolta:    %d de %d", palavra, palavra, volta_atual+1, voltas+1);
	ESPERA;
	
	//Zera a copia
	for (atual=0;atual<=tamanho+1;atual++){
		copia[atual] = ' ';
	}
	palavra[tamanho+2] = '\0';
	
	//Percorre as voltas
	for (volta_atual=0; volta_atual<=voltas; volta_atual++){
		//Impressao normal
		for (posicao=0;posicao<tamanho+1;posicao++){
			auxiliar++;
			pos_copia = 0;
			
			//Percorre a string
			for (atual=auxiliar;atual<=tamanho+1;atual++){
				copia[pos_copia] = palavra[atual];
				pos_copia++;
			}
			
			//Seta o restante da copia como espaco em branco
			for (pos_copia=pos_copia;pos_copia<=tamanho+1;pos_copia++){
				copia[pos_copia] = ' ';
			}
			
			//Imprimindo Mensagem
			LIMPA_TELA;
			if (tipo == 1)
				printf("%s", copia);
			else
				printf("Original: ...%s...\nLetreiro: ...%s...\nVolta:    %d de %d", palavra, copia, volta_atual+1, voltas+1);
			ESPERA;
			
			//Se ja tiver atingido o maximo, zera o auxiliar
			if (auxiliar == tamanho+1)
				auxiliar = 0;
		}
		quantidade = 0;
		
		//Agora comeco do fim
		for (atual=0;atual<=tamanho+1;atual++){
			//Armazena o restante da copia excluindo a primeira posicao
			for (pos_copia=0;pos_copia<=tamanho;pos_copia++){
				copia[pos_copia] = copia[pos_copia+1];
			}
			
			//Define agora o caracter que sera copiado
			copia[tamanho+1] = palavra[quantidade];
			
			//Mostrando a mensagem
			LIMPA_TELA;
			if (tipo == 1)
				printf("%s", copia);
			else
				printf("Original: ...%s...\nLetreiro: ...%s...\nVolta:    %d de %d", palavra, copia, volta_atual+1, voltas+1);
			ESPERA;
			
			quantidade++;
		}
		
		//Zera a copia
		for (atual=0;atual<=tamanho+1;atual++){
			copia[atual] = ' ';
		}
		palavra[tamanho+2] = '\0';
	}
	
	printf("\n\nPrograma encerrado...\n\n");
}

Bom pessoal, por hoje é só.
Abraços e Até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

2 Responses

  1. Dan, mais uma vez parabenizo-te pela excelência do material postado. Se possível gostaria da sua autorização para reblogá-lo. Força e Honra!

Deixe uma resposta

Terminal de Informação