Sorteador de Horóscopo

Aluno.jpg

Todos os dias milhões de pessoas acessam sites de portais para saber a sua previsão do horóscopo do dia. Você já imaginou fazer o seu próprio programa de Horóscopo? E você já sabe o seu signo do horóscopo Chinês?

 

Índice

  • 1 Versão 0 – Mostrar frase motivadora
    • 1.1 Primeiro Passo – Criação de Menu
    • 1.2 Segundo Passo – Mostrar menu
    • 1.3 Terceiro Passo – Obter signo do usuário
    • 1.4 Quarto Passo – Criar arquivos com frases místicas
    • 1.5 Quinto Passo – Configuração acesso aos arquivos
    • 1.6 Sexto Passo – Leitura das frases
    • 1.7 Sétimo Passo – Sorteio da Frase
    • 1.8 Interface do programa finalizado
  • 2 Versão 2: Usar a data de nascimento
    • 2.1 Primeiro Passo: Alterando o menu
    • 2.2 Segundo Passo: Alterando as condições
    • 2.3 Terceiro Passo: Repetindo o restante do código
  • 3 Versão 3: Horóscopo Chinês
    • 3.1 Primeiro Passo: Criando o menu de inicialização
    • 3.2 Segundo Passo: Criando um diretório
    • 3.3 Terceiro Passo: Comandos condicionais
    • 3.4 Quarto Passo: Repetindo o restante do código

 

Versão 0 – Mostrar frase motivadora

Na primeira versão do seu místico mostrador de Horóscopo você irá programar a interface básica de interação com o usuário para mostrar mensagens simples.

Primeiro Passo – Criação de Menu

Como primeiro passo, devemos criar um menu de opções para que o usuário possa optar por um dos doze signos existentes. Para isso, sugiro que crie uma função separada fora do código principal para que organize melhor seu programa.

  void imprimir_menu(){
 	printf("######## SORTEADOR DE FRASES DE SIGNOS ########\n");
  	printf("1.Áries\n");
  	printf("2.Touro\n");
  	printf("3.Gêmeos\n");
  	printf("4.Câncer\n");
  	printf("5.Leão\n");
  	printf("6.Virgem\n");
  	printf("7.Libra\n");
  	printf("8.Escorpião\n");
   	printf("9.Sagitário\n");
  	printf("10.Capricórnio\n");
  	printf("11.Aquário\n");
  	printf("12.Peixes\n");
  
  	printf("\nSelecione a opção do signo desejado: ");
 }

Para mostrar corretamente os acentos veja Gerador_de_lero-lero#Exibir_acentos_em_C.

Segundo Passo – Mostrar menu

Dentro do código principal, use a função criada no passo anterior para que possa imprimir o menu na tela:

  int main() {
 	imprimir_menu();

Horos_1

Terceiro Passo – Obter signo do usuário

Neste passo você vai fazer o seu programa ler qual signo a pessoa escolheu e guardar esse dado em uma variável:

   char entrada[10] = "";
   gets(entrada);
       
   int signo = atoi(entrada);
       
   while ( (signo > 12) || (signo < 1) ){
       printf("\nEssa opção que você escolheu não existe. Tente novamente.\n");
       imprimir_menu();
       gets(entrada);
       signo = atoi(entrada);
   }

Esse laço while vai pedir repetidamente que o usuário escolha uma opção que está no menu de opções.

Se a execução do programa sair do laço while quer dizer que o signo escolhido é válido e podemos usar essa informação para mostrar a mensagem.

Quarto Passo – Criar arquivos com frases místicas

As mensagens místicas do Horóscopo estarão guardadas em arquivos. Crie um arquivo do tipo texto com extensão “.txt” para cada um dos signos. É importante que o nome dos arquivos siga um padrão, para que possa utilizar a mesma forma de escrita quando for ler os mesmos. Por exemplo, use nos nomes dos arquivos apenas letras minúsculas sem acentos.

Coloque os arquivos textos em uma pasta “Signos” dentro do C: de seu computador.

 

Horos_2

Horos_3
Aqui é necessáro ter em mente que nao poderá haver quebra nas linhas, ou seja, cada uma das mensagens será digitada até seu fim sem que use algum tipo de quebra de linha, para que possamos ler e sortear linha por linha no decorrer do código.

Horos 4.jpg

Quinto Passo – Configuração acesso aos arquivos

Criaremos agora duas variáveis do tipo char para armazenar informações do caminho do diretório a ser seguido.

Na variável diretório_arquivo, iremos atribuir o endereço onde se localiza nossa pasta “Signos”.

A variável nome arquivo será utilizada no “switch case” logo abaixo, sendo que nela irá conter o nome do arquivo .txt a ser lido, dependendo de qual opção do menu o usuário escolher.

   char nome_arquivo[50];
   char diretorio_arquivo[200] = "C:\\Signos\\";

Use um “switch case” para atribuir o nome do arquivo da opção do signo desejado à variável nome_arquivo.

  switch (Signo) {
  		case 1:
  			sprintf(nome_arquivo, "aries.txt");
  			break;
  		case 2:
  			sprintf(nome_arquivo, "touro.txt");
  			break;
  		case 3:
  			sprintf(nome_arquivo, "gemeos.txt");
  			break;
  		case 4:
  			sprintf(nome_arquivo, "cancer.txt");
      			break;
  		...
               

Aqui um exemplo de como será feito para completar o diretório para que seja acessado o caminho certo dependendo da escolha do usuário.

Por exemplo:

   char CaminhoCompleto[250] = "";
   sprintf(caminho_completo, "%s%s", diretorio_arquivo, nome_arquivo);
   FILE *txt;
   txt = fopen(caminho_completo, "r");

Após essas etapas teremos “C:\\Signos” na variável “diretorio_arquivo”, “libra.txt” na variável “nome_arquivo” e “C:\\Signos\\libra.txt” em “caminho_completo”.

Sexto Passo – Leitura das frases

Neste passo colocaremos o conteúdo dos arquivos com frases de signos em variáveis. Como as frases estarão armazenadas em um arquivo precisamos saber quantas frases existem em cada arquivo e colocá-las em um vetor de linhas.

   char *linhas[100];
   char buffer[1000] = "";
   int count = 0;
 

Aqui faremos a contagem do número de linhas do arquivo escolhido. É importante que seja feito desse modo já que dependemos do número de linhas exatas do arquivo quando formos sorteá-las.

   while (! feof(txt) ) {
   	if( fgets(buffer, 1000, txt) != NULL) {
              // reserva nova região de memória com cópia de conteúdo no buffer
 	      linhas[count] = strdup(buffer);
 	      count++;
   	}
   }
 
   fclose(txt);

Esse vetor “linhas” será usado no passo a seguir para o sorteio de frases.

Sétimo Passo – Sorteio da Frase

Agora, por último, realizaremos o sorteio das frases obtidas dentro do arquivo referente ao signo do usuário:

   /* srand prepara o programa para começar o sorteio de números aleatórios */
   srand(time(NULL)); // incluir a biblioteca windows.h para usar a função time
   
   if(count > 0) {
 		int numero_sortido = rand() % count; // sorteia número de 0 a count-1
 		fputs(linhas[numero_sortido], stdout);
   }
 

Interface do programa finalizado

Aqui podemos ver como irá ficar a primeira versão do Sorteador de Horóscopo quando finalizado.

Horos_5

Versão 2: Usar a data de nascimento

Para utilizarmos a data de nascimento como parâmetro de busca do signo será necessário alterarmos apenas algumas pequenas partes do código, veja só:

Primeiro Passo: Alterando o menu

Realizaremos uma alteração básica no menu, não mais precisaremos de criar a função imprime_menu como feito na versão anterior; dessa vez, apenas pediremos ao usuário para entrar com o mês e o dia de nascimento em questão e salvar em uma variável criada pelo programador.

É importante que seja na ordem mês/dia, pois assim será possível utilizar as datas em forma crescente e compará-las quando utilizadas nos comandos condicionais.

Veja no exemplo:

  int signo;
  printf("## BEM VINDO -- O SEU ASCENDENTE ESTÁ EM DESTAQUE ##\nDigite sua data de nascimento (Mês/Dia) \n");
  scanf("%d",&signo);

Segundo Passo: Alterando as condições

Na versão anterior, utilizamos um (switch case) para verificar a opção selecionada pelo usuário como parâmetro de entrada para selecionarmos qual arquivo iremos abrir.

Não poderemos utilizar essa função nessa versão, mas utilizaremos o comando de condição (if) em seu lugar, já que utilizaremos parâmetros de comparação das datas para selecionarmos o signo em questão.

   char nome_arquivo[50];
   char diretorio_arquivo[200] = "C:\\Signos\\";
   if(signo>=121&&signo<=219){
           sprintf(nome_arquivo, "capricornio.txt");
           printf("CAPRICÓRNIO\n");}
   if(signo>=220&&signo<=320){
           sprintf(nome_arquivo, "peixes.txt");
           printf("PEIXES\n");}
   if(signo>=321&&signo<=420){
           sprintf(nome_arquivo, "aries.txt");
           printf("ÁRIES\n");}
   if(signo>=421&&signo<=521){
           sprintf(nome_arquivo, "touro.txt");
           printf("TOURO\n");}
   if(signo>=522&&signo<=621){
           sprintf(nome_arquivo, "gemeos.txt");
           printf("GÊMEOS\n");}
   if(signo>=622&&signo<=723){
           sprintf(nome_arquivo, "cancer.txt");
           printf("CÂNCER\n");}
   if(signo>=724&&signo<=823){
           sprintf(nome_arquivo, "leao.txt");
           printf("LEÃO\n");}
   if(signo>=824&&signo<=923){
           sprintf(nome_arquivo, "virgem.txt");
           printf("VIRGEM\n");}
   if(signo>=924&&signo<=1023){
           sprintf(nome_arquivo, "libra.txt");
           printf("LIBRA\n");}
   if(signo>=1024&&signo<=1122){
           sprintf(nome_arquivo, "escorpiao.txt");
           printf("ESCORPIÃO");}
    if(signo>=1123&&signo<=1221){
           sprintf(nome_arquivo, "capricornio.txt");
           printf("CAPRICÓRNIO");}

Terceiro Passo: Repetindo o restante do código

Como dito anteriormente, para essa versão teríamos apenas que mudar os parâmetros de entrada, então a partir dessa etapa, é só continuar seguindo o quinto passo da versão anterior, tendo vista que paramos na parte que se criamos a variável caminho completo.

Versão 3: Horóscopo Chinês

Nesta versão, utilizaremos como parâmetro de entrada o ano de nascimento da pessoa, e através dele, selecionaremos arquivos pré-criados pelo programador e imprimiremos na tela o signo chinês e uma mensagem correspondente ao horoscopo da mesma.

Primeiro Passo: Criando o menu de inicialização

Dessa vez, faremos um menu onde o usuário entrará com á data do seu nascimento no formado dd/mm/aaaa. Criaremos então, uma string de caracteres para a variável data onde armazenaremos a data completa, e criaremos outras três para separarmos e armazenarmos o dia, mês e ano.

  char data[11] = {};
  char dia[3] = {};
  char mes[3] = {};
  char ano[5] = {};

Agora pediremos ao usuário para entrar com sua data de nascimento. Armazenaremos a data no formato dd/mm/aaaa, e em seguida iremos armazenar o conteúdo das strings “dia”, “mes” e “ano” através do conteúdo da string “data”. Lembre-se de que o usuário estará digitando também o caractere “/” entre o dia, mês e ano do seu nascimento, então fique atento a qual posição da string você estará trabalhando.

  printf("###### BEM VINDO AO HORÓSCOPO CHINÊS ######   \n Digite seu dd/mm/aaaa de nascimento: \n");
  gets(data);
  sprintf(dia, "%c%c", data[0], data[1]);
  sprintf(mes, "%c%c", data[3], data[4]);
  sprintf(ano, "%c%c%c%c", data[6], data[7], data[8], data[9]);

Segundo Passo: Criando um diretório

Assim como na versão anterior, criaremos uma pasta dentro do C: do seu computador e iremos nomeá-la de Signoschines. Dentro da mesma, iremos criar um arquivo de extensão “.txt” para cada um dos signos chinês. Os signos do Horoscopo Chinês são: Rato, Boi, Tigre, Coelho, Dragão, Serpente, Cavalo, Carneiro, Macaco, Galo, Cão e Porco.

TODO imagens signos

   char nome_arquivo[50];
   char diretório_arquivo[200] = "C:\\Signoschines\\";

Terceiro Passo: Comandos condicionais

Para saber qual ano corresponde a cada um dos signos dos zodíaco chinês, teremos que utilizar como parâmetro o resto da seguinte divisão:

  ((ano - 4)/12)

Então, em seu código você terá de armazenar esse resto, obtido usando o operador %, em uma variável que será utilizada como parâmetro para descobrirmos qual signo corresponde a aquele ano. Teremos:

  int ano_chines = ((atoi(ano)-4)%12);

Agora, utilizaremos os restos correspondentes em um “switch case” para que assim possamos fazer a relação entre o algoritimo e o arquivo correspondente ao signo que será aberto.

       printf(" SEU SIGNO CHINÊS É: ");
       switch ( ano_chines ){
       case 0 :
  		sprintf(nome_arquivo, "rato.txt");
  		printf(*** RATO ***\n");
       break;
       case 1 :
   		sprintf(nome_arquivo, "boi.txt");
    		printf("*** BOI ***\n");
   	break;
       case 2 :
          	sprintf(nome_arquivo, "tigre.txt");
  	 	printf("*** TIGRE ***\n");
  	break;
       case 3 :
       	sprintf(nome_arquivo, "coelho.txt");
  	    	printf("*** COELHO ***\n");
  	break;
       case 4 :
  		sprintf(nome_arquivo, "dragao.txt");
  		printf("*** DRAGÃO ***\n");
   	break;
      case 5 :
   		sprintf(NomeArquivo, "serpente.txt");
   		printf("*** SERPENTE ***\n");
   	break;
      case 6 :
       		sprintf(NomeArquivo, "cavalo.txt");
   		printf("*** CAVALO ***\n");
   	break;
      case 7 :
   		sprintf(NomeArquivo, "carneiro.txt");
   		printf("*** CARNEIRO ***\n");
   	break;
      case 8 :
   		sprintf(NomeArquivo, "macaco.txt");
   		printf("*** MACACO ***\n");
   	break;
      case 9 :
  		sprintf(NomeArquivo, "galo.txt");
   		printf("*** GALO ***\n");
   	break;
      case 10 :
    		sprintf(NomeArquivo, "cao.txt");
   	   	printf("*** CAO ***\n");
   	break;
      case 11 :
   		sprintf(nome_arquivo, "porco.txt");
   		printf("*** PORCO ***\n");
   	break;
   	}

Para cada caso será adicionado uma string do signo correspondente ao valor da variável “ano_chinês” junto a variável “nome_arquivo”, que será utilizada como parâmetro para completar o diretório que deve ser seguido pela variável “caminho completo” que será criado logo em seguida.

Quarto Passo: Repetindo o restante do código

A partir desse passo, iremos prosseguir do quinto passo da versão 0 feito acima, partindo do processo da criação da variável “caminho_completo”.

Sabemos que tudo que havia de diferente entre essa versão e as outras eram os arquivos, que teriam de ser criados com nomes diferentes, e dos parâmetros usados nos comandos condicionais, que nesse caso foram o ano de nascimento da pessoa.