Mudanças entre as edições de "Programação 1 - Engenharia - Arrays Multidimensionais"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 529: Linha 529:
 
Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.
 
Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.
 
</li>
 
</li>
<!--
+
 
 
{{collapse top | Solução - Exercício 01}} <syntaxhighlight lang=c>
 
{{collapse top | Solução - Exercício 01}} <syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
Linha 576: Linha 576:
 
</syntaxhighlight>
 
</syntaxhighlight>
 
{{collapse bottom}}
 
{{collapse bottom}}
-->
+
 
  
 
<li>
 
<li>
Linha 582: Linha 582:
 
</li>
 
</li>
  
<!--
+
 
 
{{collapse top | Solução - Exercício 02}} <syntaxhighlight lang=c>
 
{{collapse top | Solução - Exercício 02}} <syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
Linha 645: Linha 645:
 
</syntaxhighlight>
 
</syntaxhighlight>
 
{{collapse bottom}}
 
{{collapse bottom}}
-->
+
 
 
<li>Implementar uma modificação do exercício anterior que permite ao programa ficar em loop até que se entre com userID igual a "fim".</li>
 
<li>Implementar uma modificação do exercício anterior que permite ao programa ficar em loop até que se entre com userID igual a "fim".</li>
<!--
+
 
 
{{collapse top | Solução - Exercício 03}} <syntaxhighlight lang=c>
 
{{collapse top | Solução - Exercício 03}} <syntaxhighlight lang=c>
 
//Autor : Victor Cesconetto De Pieri
 
//Autor : Victor Cesconetto De Pieri
Linha 715: Linha 715:
 
</syntaxhighlight>
 
</syntaxhighlight>
 
{{collapse bottom}}
 
{{collapse bottom}}
-->
+
 
 
<li>No exercício anterior, acrescente uma tabela de contadores que permite armazenar o número de tentativas seguidas de um usuário, no caso de erro de senha. Se o número de tentativas for maior que 3 a porta não deverá mais ser aberta para o usuário (usuário bloqueado).</li>
 
<li>No exercício anterior, acrescente uma tabela de contadores que permite armazenar o número de tentativas seguidas de um usuário, no caso de erro de senha. Se o número de tentativas for maior que 3 a porta não deverá mais ser aberta para o usuário (usuário bloqueado).</li>
<!--
+
 
 
{{collapse top |Solução - Exercício 04}}
 
{{collapse top |Solução - Exercício 04}}
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
Linha 800: Linha 800:
 
</syntaxhighlight>
 
</syntaxhighlight>
 
{{collapse bottom}}
 
{{collapse bottom}}
-->
+
 
 
<li>No exercício anterior, acrescente a figura do administrador (armazenado separadamente como user "admin" e senha "12345". Ao logar o administrador será questionado por um usuário a ser desbloqueado. O administrador entra com o usuário a ser desbloquedo e o sistema volta a perguntar por um userID.</li>
 
<li>No exercício anterior, acrescente a figura do administrador (armazenado separadamente como user "admin" e senha "12345". Ao logar o administrador será questionado por um usuário a ser desbloqueado. O administrador entra com o usuário a ser desbloquedo e o sistema volta a perguntar por um userID.</li>
<!--
+
 
 
{{collapse top |Solução - Exercício 05}}
 
{{collapse top |Solução - Exercício 05}}
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
Linha 906: Linha 906:
 
</syntaxhighlight>
 
</syntaxhighlight>
 
{{collapse bottom}}
 
{{collapse bottom}}
-->
+
 
  
 
6. Implementar um gerador de apostas para megasena. O programa deve armazenar 10 sugestões de jogos a serem armazenados em uma matriz.  
 
6. Implementar um gerador de apostas para megasena. O programa deve armazenar 10 sugestões de jogos a serem armazenados em uma matriz.  

Edição das 16h54min de 25 de abril de 2019

Objetivos

  • Definindo matrizes no C
  • Operações com matrizes e passagem de parâmetros tipo matriz
  • Matrizes com caracteres
  • Exercícios

Como definir e operar com matrizes no C

De forma similar ao vetor, basta definir a matriz usando colchetes para indicar a dimensão da variável.

Exemplo: Definir duas matrizes 2x3 já inicializadas e computar a soma das mesmas:

#include <stdio.h>

#define MAX_LIN 2
#define MAX_COL 3

void main()
{
  int mA[MAX_LIN][MAX_COL]={ 11,12,13,
                             21,22,23},
      mB[MAX_LIN][MAX_COL]={1,2,3,
                            1,2,3},
      mC[MAX_LIN][MAX_COL];
  int i,j;

  for(i=0;i<MAX_LIN;i++){
     for(j=0;j<MAX_COL;j++) {
        mC[i][j] = mA[i][j] + mB[i][j];
     }
  }
  
}

Exercício

  1. Implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.
    solução média
    #include <stdio.h>
    
    void main()
    {
      int mA[2][3]={ 11,12,13,
                     21,22,23},
          mB[2][3]={1,2,3,
                    1,2,3},
          mC[2][3];
      int i,j, soma_ac=0;
      float media;
    
      for(i=0;i<2;i++){
         for(j=0;j<3;j++) {
            mC[i][j] = mA[i][j] + mB[i][j];
            soma_ac = soma_ac + mC[i][j];
         }
      }
      media = (soma_ac/6.0);
      printf("O valor da media eh: %.2f\n", media);
    }
    
  2. Implementar um programa para ler uma matriz quadrada NxN pelo teclado e armazená-la em uma matriz matA. Defina matA com um tamanho máximo matA[N_MAX][N_MAX].
    solução preenchimento Matriz
    #include <stdio.h>
    
    #define N_MAX 50
     
    void main()
    {
      int mA[N_MAX][N_MAX];
      int i,j,dimN;
      
      /*  Entrada da dimensão   */
      printf("Entre com a dimensao\n");
      scanf ("%d",&dimN);
      
      /*      Entrada de dados  */  
      for (i=0;i<dimN;i++) {
        for (j=0;j<dimN;j++) {
           printf("Entre com  mA[%d][%d]\n",i,j);
           scanf("%d",&mA[i][j]);  
        }
      }
      
      /* impressao dos dados lidos */
      for (i=0;i<dimN;i++) {
        for (j=0;j<dimN;j++) {
           printf("=>  mA[%d][%d] => %d\n",i,j,mA[i][j]);  
        }
      }  
    }
    

Passando matrizes como parâmetro

#include <stdio.h>

#define TAM_LIN 2
#define TAM_COL 3

void somar_mat(int aA[TAM_LIN][TAM_COL],int aB[TAM_LIN][TAM_COL], int cC[TAM_LIN][TAM_COL])
{
  int i,j;

  for(i=0;i<TAM_LIN;i++){
     for(j=0;j<TAM_COL;j++) {
        cC[i][j] = aA[i][j] + aB[i][j];
     }
  }
}

void main()
{
  int mA[TAM_LIN][TAM_COL]={ 11,12,13,
                             21,22,23},
      mB[TAM_LIN][TAM_COL]={1,2,3,
                            1,2,3},
      mC[TAM_LIN][TAM_COL];

 somar_mat(mA,mB,mC);
  
}
OBSERVE que matrizes são sempre passadas como referência.

Exercícios

  1. Fazer uma função que recebe duas matrizes 2x3 como parâmetros e retorna a média entre todos elementos da matriz soma destas matrizes.
  2. Implementar uma programa para calcular o determinante de uma matriz 3x3 (de reais) a ser fornecida pelo teclado.
  3. Implementar um programa para ler duas matrizes (matA e matB) e multiplicá-las, colocando o resultado em uma matriz matC. Assumir dimensões de matA e matB de 2x3 e 3x4 respectivamente.
  4. Vamos implementar um jogo similar a batalha naval da seguinte forma.
      1. Crie uma matriz de inteiros global chamada ZonaDeGuerra com 10x10 posições (iniciada com 0). Construa uma função para gerar randomicamente a posição de 1 porta-aviões (colocando 1 na sua posição), 5 fragatas (número 2) e 5 submarinos (número 3). Assuma que a cada casa onde o inimigo alvejar será somado 10 ao número da casa.
      2. Crie um contador global de tiros iniciado com 0.
      3. Crie uma função de tiro. Esta função deve ler a posição de tiro, verificar se a casa ainda não foi alvejada. Se alvejada pergunta novamente a posição. Se a posição for válida e tiver um navio então o usuário ganha pontos da seguinte forma: 10 para o porta aviões, 5 para o submarino e 3 para fragata. A função deve retornar 0 se o jogo continua, 1 se o usuário atingiu todos os navios ou 2 se o usuário teve um número máximo de tiros ultrapassado (assumir 30 tiros).
      4. Ao final do jogo é mostrado o nome do jogador, o número de tiros dados e a pontuação obtida.
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    /**********************************/
    /***** DEFINIÇÕES DESTE MÓDULO  ****/
    /**********************************/
     
    #define TAM_MAT 10
    #define MAX_TIROS 30
    #define MAX_NOME 30
     
    /**********************************/
    /***** VARIÁVEIS GLOBAIS **********/
    /**********************************/
     
    int ZonaDeGuerra[TAM_MAT][TAM_MAT];/* Matriz do espaço de batalha */
    int ContadorTiros=0;
    int PontuacaoFinal;    			   /* acumula a pontuação do jogador */
    char nome[MAX_NOME];
    int x_sorteado;
    int y_sorteado;
     
     
    /***********************************/
    /****  FUNÇÕES DESTE MÓDULO ********/
    /***********************************/
     
    /***** FUNÇÕES DE INICIALIZAÇÃO ****/
     
    void ZerarMatriz()
    {
      int i,j;
     
      for (i=0;i<TAM_MAT;i++)
      	for(j=0;j<TAM_MAT;j++)
      		ZonaDeGuerra[i][j]=0;
    }
     
    void SortearCasa()
    {
       do {
       	/* generate secret number: */
            x_sorteado = rand() % TAM_MAT;
            y_sorteado = rand() % TAM_MAT;
       } while (ZonaDeGuerra[x_sorteado][y_sorteado]!=0);
     
    }
     
    PosicionarFragatas()
    { 
      int i;
      for(i=0;i<5;i++){
          SortearCasa();
          ZonaDeGuerra[x_sorteado][y_sorteado]=2; 	 	 
      }
    }
     
    PosicionarSubmarinos()
    { 
      int i;
      for(i=0;i<5;i++){
         SortearCasa();
         ZonaDeGuerra[x_sorteado][y_sorteado]=3; 	 	 
      }
    }
     
    void PosicionarPortaAvioes()
    {
      SortearCasa();
      ZonaDeGuerra[x_sorteado][y_sorteado]=1;
    }
     
    void PosicionarNavios()
    {
      /* initialize random seed: */
      srand ( time(NULL) );
     
      PosicionarPortaAvioes();
      PosicionarFragatas();
      PosicionarSubmarinos(); 
    }
     
    /*** FUNÇÕES DE IMPRESSÃO NA TELA **/
     
    void ImprimeLinha(int linha)
    {
      int j;
     
      printf("     ");    
      for(j=0;j<TAM_MAT;j++) {
        printf("| %2d ",ZonaDeGuerra[linha][j]); 
      }
      printf("|\n");
      printf("     +----+----+----+----+----+----+----+----+----+----+\n");
    }
    
    void ImprimeLinhaEscondida(int linha)
    {
      int j;
     
      printf("     ");    
      for(j=0;j<TAM_MAT;j++) {
        if (ZonaDeGuerra[linha][j]>=0 &&  ZonaDeGuerra[linha][j]<=3)
             printf("| -- "); 
        else 
             printf("| %2d ",ZonaDeGuerra[linha][j]);
      }
      printf("|\n");
      printf("     +----+----+----+----+----+----+----+----+----+----+\n");
    }
     
    void ImprimeMatrizTudo()
    {
      int i;
     
      printf("     +----+----+----+----+----+----+----+----+----+----+\n");
      for(i=0;i<TAM_MAT;i++)
      	ImprimeLinha(i);
    }
     
    void ImprimeMatrizEscondida()
    {
      int i;
     
      printf("     +----+----+----+----+----+----+----+----+----+----+\n");
      for(i=0;i<TAM_MAT;i++)
      	ImprimeLinhaEscondida(i);
    }
     
     
    int Tiro()
    {
         /* usar um switch */
    }
     
    main()
    {
      int situacao;
      ZerarMatriz();
      PosicionarNavios();
      ImprimeMatrizEscondida();
      do {
         situacao = Tiro();
      } while (situacao==0);
    }
    

Matrizes de caracteres e vetores de strings

Um vetor de strings pode ser construído usando matrizes de char. Cada string será armazenada em uma linha do vetor. Exemplo

#include <stdio.h>

main()
{
  char TabelaUsuarios[4][10] = {
         "joao",
         "maria",
         "jose",
         "lara",
                                };
  int i;

  for (i=0;i<4;i++)
       printf("%s\n",&TabelaUsuarios[i][0]);
}
Note a forma como é realizada a inicialização da matriz.

Exercícios

  1. Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.
  2. Solução - Exercício 01
    #include <stdio.h>
    
    char tabelaUsuarios[4][10] = {
             "joao",
             "maria",
             "josefina",
             "lara",
    };
    
    int str_cmp(char str1[],char str2[])
    {
      int i=0;
     
      while(str1[i]!=0 && str2[i]!=0) {
         if (str1[i]!=str2[i])
            break; 
         i++;
      }
      if(str1[i]==0 && str2[i]==0) 
         return 0;
      else
         return 1;
      
    }
            
    main()
    {
    
      int i;
      char nome[10];
     
      printf("Entre com seu USERID\n");
      scanf("%s", nome);
      for (i=0;i<4;i++) {
           if (str_cmp(nome,&tabelaUsuarios[i][0])==0) {
           		break;
           }
      }
      if (i==4)
      	  printf("Usuário não existente!\n"); 
      else
          printf("abrir a porta\n");   
    }
    


  3. Implementar uma tabela adicional com senhas dos usuários. O acesso deve ser concedido somente se o usuário for validado e a senha. Defina as tabelas como variáveis globais.
  4. Solução - Exercício 02
    #include <stdio.h>
     
    char tabelaUsuarios[4][10] = {
             "joao",
             "maria",
             "josefina",
             "lara",
    };
    
    char tabelaSenhas[4][10] = {
             "joao123",
             "maria123",
             "josef123",
             "lara123",
    };
     
    
    int str_cmp(char str1[],char str2[])
    {
      int i=0;
     
      while(str1[i]!=0 && str2[i]!=0) {
         if (str1[i]!=str2[i])
            break; 
         i++;
      }
      if(str1[i]==0 && str2[i]==0) 
         return 0;
      else
         return 1;
     
    }
     
    main()
    {
     
      int i;
      char nome[10];
      char senha[10];
     
      printf("Entre com seu USERID\n");
      scanf("%s", nome);
      for (i=0;i<4;i++) {
           if (str_cmp(nome,&tabelaUsuarios[i][0])==0) {
           		break;
           }
      }
      if (i==4)
      	  printf("Usuário não existente!\n"); 
      else {
          /* inserir código aqui !!! */
          printf("Entre com a senha de %s\n", nome);
          scanf("%s", senha);     
          if (str_cmp(senha,&tabelaSenhas[i][0])==0) {
               printf("abrir a porta\n");    
          } else 
               printf("Senha de %s incorreta\n", nome);
      }   
    }
    
  5. Implementar uma modificação do exercício anterior que permite ao programa ficar em loop até que se entre com userID igual a "fim".
  6. Solução - Exercício 03
    //Autor : Victor Cesconetto De Pieri
    
    #include <stdio.h>
    
      char tabelaUsuarios[4][10] = {
        "joao",
        "maria",
        "josefina",
        "lara",
      };
    
    char tabelaSenhas[4][10] = {
      "joao123",
      "maria123",
      "josef123",
      "lara123",
    };
    
    int str_cmp(char str1[], char str2[]) {
      int i = 0;
    
      while (str1[i] != 0 && str2[i] != 0) {
        if (str1[i] != str2[i])
          break;
        i++;
      }
      if (str1[i] == 0 && str2[i] == 0)
        return 0;
      else
        return 1;
    
    }
    
    main() {
    
      int i;
      char nome[10];
      char senha[10];
    
      for (;;) { //'for' ou loop infinito
        printf("Entre com seu USERID\n");
        scanf("%s", nome);
        if (str_cmp(nome, "fim") == 0) { //verifica se digitou "fim" no userID
          printf("\nVoce digitou 'fim', adeus!!\n");
          break; //sai do loop infinito e encerra o programa	
        }
        for (i = 0; i < 4; i++) {
          if (str_cmp(nome, & tabelaUsuarios[i][0]) == 0) {
            break;
          }
        }
        if (i == 4)
          printf("Usuário não existente!\n");
        else {
          printf("Entre com a senha de %s\n", nome);
          scanf("%s", senha);
          if (str_cmp(senha, & tabelaSenhas[i][0]) == 0) {
            printf("abrir a porta\n");
          } else
            printf("Senha de %s incorreta\n", nome);
        }
      }
    
    }
    
  7. No exercício anterior, acrescente uma tabela de contadores que permite armazenar o número de tentativas seguidas de um usuário, no caso de erro de senha. Se o número de tentativas for maior que 3 a porta não deverá mais ser aberta para o usuário (usuário bloqueado).
  8. Solução - Exercício 04
    //Autor: Victor Cesconetto De Pieri
    
    #include <stdio.h>
    
      char tabelaUsuarios[4][10] = {
        "joao",
        "maria",
        "josefina",
        "lara",
      };
    
    char tabelaSenhas[4][10] = {
      "joao123",
      "maria123",
      "josef123",
      "lara123",
    };
    
    char tabelaContadores[4][1] = {
      0,
      0,
      0,
      0
    };
    
    int str_cmp(char str1[], char str2[]) {
      int i = 0;
    
      while (str1[i] != 0 && str2[i] != 0) {
        if (str1[i] != str2[i])
          break;
        i++;
      }
      if (str1[i] == 0 && str2[i] == 0)
        return 0;
      else
        return 1;
    
    }
    
    main() {
    
      int i;
      char nome[10];
      char senha[10];
    
      for (;;) { //'for' ou loop infinito
        printf("Entre com seu USERID\n");
        scanf("%s", nome);
        if (str_cmp(nome, "fim") == 0) { //verifica se digitou "fim" no userID
          printf("\nVoce digitou 'fim', adeus!!\n");
          break; //sai do loop infinito e encerra o programa	
        }
    
        for (i = 0; i < 4; i++) {
          if (str_cmp(nome, & tabelaUsuarios[i][0]) == 0) {
            break;
          }
        }
    
        if (i == 4) //verifica se o usuario ja excedeu as 3 tentativas
          printf("Usuário não existente\n");
        else {
          printf("Entre com a senha de %s\n", nome);
          scanf("%s", senha);
          if (str_cmp(senha, & tabelaSenhas[i][0]) == 0 && tabelaContadores[i][0] < 3) { //verifica se o usuario não esta bloqueado e a senha esta correta
            printf("abrir a porta\n");
          } else if (tabelaContadores[i][0] < 3) { //se o usuario nao está bloqueado mas a senha esta incorreta acrescenta 1 nos contadores
            tabelaContadores[i][0]++;
            printf("Contagem: %d\n", tabelaContadores[i][0]);
            printf("Senha de %s incorreta\n", nome);
          } else { //se esgotaram as tentativas do usuario
            printf("Usuario Bloqueado!!\n");
          }
        }
      }
    
    }
    
  9. No exercício anterior, acrescente a figura do administrador (armazenado separadamente como user "admin" e senha "12345". Ao logar o administrador será questionado por um usuário a ser desbloqueado. O administrador entra com o usuário a ser desbloquedo e o sistema volta a perguntar por um userID.
  10. Solução - Exercício 05
    //Autor: Victor Cesconetto De Pieri
    
    #include <stdio.h>
    
    char tabelaUsuarios[4][10] = {
        "joao",
        "maria",
        "josefina",
        "lara",
      };
    
    char tabelaSenhas[4][10] = {
      "joao123",
      "maria123",
      "josef123",
      "lara123",
    };
    
    char tabelaContadores[4][1] = {
      0,
      0,
      0,
      0
    };
    
    int str_cmp(char str1[], char str2[]) {
      int i = 0;
    
      while (str1[i] != 0 && str2[i] != 0) {
        if (str1[i] != str2[i])
          break;
        i++;
      }
      if (str1[i] == 0 && str2[i] == 0)
        return 0;
      else
        return 1;
    
    }
    
    main() {
    
      int i;
      char nome[10];
      char senha[10];
    
      for (;;) { //'for' ou loop infinito
        printf("Entre com seu USERID\n");
        scanf("%s", nome);
        if (str_cmp(nome, "fim") == 0) { //verifica se digitou "fim" no userID
          printf("\nVoce digitou 'fim', adeus!!\n");
          break; //sai do loop infinito e encerra o programa	
        } else if (str_cmp(nome, "admin") == 0) { //verifica se o tratamento de usuario será para admin ou usuario
    	  //tratamento para admin abaixo
          printf("Entre com a senha do administrador:\n");
          scanf("%s", senha);
          if (str_cmp(senha, "12345") == 0) {
            printf("Entre com o nome do usuario a ser desbloqueado\n");
            scanf("%s", nome);
            for (i = 0; i < 4; i++) {
              if (str_cmp(nome, & tabelaUsuarios[i][0]) == 0) {
                break;
              }
            }
            if (i == 4) //verifica se o usuario ja excedeu as 3 tentativas
              printf("Usuário não existente\n");
            else {
              tabelaContadores[i][0] = 0;//reseta a tabela de contagem do usuario solicitado 
              printf("Usuario %s desbloqueado\n", nome);
            }
          } else {
            printf("Senha incorreta!\n");
          }
        } else { //tratamento para usuario abaixo
    
          for (i = 0; i < 4; i++) {
            if (str_cmp(nome, & tabelaUsuarios[i][0]) == 0) {
              break;
            }
          }
    
          if (i == 4) //verifica se o usuario ja excedeu as 3 tentativas
            printf("Usuário não existente\n");
          else {
            printf("Entre com a senha de %s\n", nome);
            scanf("%s", senha);
            if (str_cmp(senha, & tabelaSenhas[i][0]) == 0 && tabelaContadores[i][0] < 3) {
              printf("abrir a porta\n");
            } else if (tabelaContadores[i][0] < 3) {
              tabelaContadores[i][0]++;
              printf("Contagem: %d\n", tabelaContadores[i][0]);
              printf("Senha de %s incorreta\n", nome);
            } else {
              printf("Usuario Bloqueado!!\n");
            }
          }
        }
      }
    }
    


    6. Implementar um gerador de apostas para megasena. O programa deve armazenar 10 sugestões de jogos a serem armazenados em uma matriz.

    Os números devem ser armazenados em ordem crescente. Sugestão: criar uma matriz global:
      int matriz_megasena[10][6];
    
    Solução - Exercicio 06
    //Autor:Victor Cesconetto De Pieri
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define NUM_JOGOS 10
    # define NUMS_MEGA 6
    
    int matriz_jogos[NUM_JOGOS][NUMS_MEGA];
    
    int gerar_num_al() {
      return (rand() % 60 + 1);
    }
    
    int testar_num(int numero, int vetor[NUMS_MEGA], int limite) //testa o numero a ser colocado no vetor do jogo
    {
      int i = 0;
      for (i = 0; i < limite; i++) {
        if (vetor[i] == numero) //testa se o numero anterior é igual ao proximo sorteado, se sim, retorna 1 se nao retorna 0
          return 1;
      }
      return 0;
    }
    
    void ordenar_vetor(int vetor[NUMS_MEGA]) // ordena o vetor do jogo em ordem crescente
    {
      int i, j;
      int aux = 0;
      for (i = 0; i < NUMS_MEGA; i++) {
        for (j = 0; j < NUMS_MEGA; j++) {
          if (vetor[i] < vetor[j]) {
            aux = vetor[i];
            vetor[i] = vetor[j];
            vetor[j] = aux;
          }
        }
      }
    
    }
    
    void imprimir_matriz() //imprime a matriz dos jogos
    {
      int i, j;
    
      for (i = 0; i < NUM_JOGOS; i++) {
        for (j = 0; j < NUMS_MEGA; j++)
          printf("%d ", matriz_jogos[i][j]);
        printf("\n");
      }
    
    }
    
    int gerar_jogo(int num_jogo) //gera o jogo numero por numero
    {
      int i, num_al;
    
      matriz_jogos[num_jogo][0] = gerar_num_al();
      for (i = 1; i < 6; i++) {
        do {
          num_al = gerar_num_al();
        } while (testar_num(num_al, matriz_jogos[num_jogo], i)); //faz o teste se retorna 1 continua o sorteio ate aparecer um numero diferente do anterior
        matriz_jogos[num_jogo][i] = num_al;
    
      }
    
    }
    
    main() {
      int i;
    
      srand(time(NULL)); //pega o numero randomico usando como seed o relogio
    
      for (i = 0; i < NUM_JOGOS; i++) {
        gerar_jogo(i);
        ordenar_vetor(matriz_jogos[i]);
      }
      imprimir_matriz();
    }
    

    7. Melhorar o exercício anterior para evitar que dois jogos sejam iguais.

    Solução - Exercicio 07
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    #define NUM_JOGOS 10
    # define NUMS_MEGA 6
     
    int matriz_jogos[NUM_JOGOS][NUMS_MEGA];
     
    int gerar_num_al() {
      return (rand() % 60 + 1);
    }
     
    int testar_num(int numero, int vetor[NUMS_MEGA], int limite) //testa o numero a ser colocado no vetor do jogo
    {
      int i = 0;
      for (i = 0; i < limite; i++) {
        if (vetor[i] == numero) //testa se o numero anterior é igual ao proximo sorteado, se sim, retorna 1 se nao retorna 0
          return 1;
      }
      return 0;
    }
    
    
    int testar_jogo_igual() {
    
      int i, j;
      int contador = 0;
    
      for (i = 0; i < NUM_JOGOS; i++) {
        for (j = 0; j < NUMS_MEGA; j++) {
          if (matriz_jogos[i][j] == matriz_jogos[i + 1][j]) {
            if (contador < 6) {
              contador++;
            } else {
              printf("tem jogo igual");
              return 1;
              break;
            }
    
          }
        }
      }
    
    }
     
    void ordenar_vetor(int vetor[NUMS_MEGA]) // ordena o vetor do jogo em ordem crescente
    {
      int i, j;
      int aux = 0;
      for (i = 0; i < NUMS_MEGA; i++) {
        for (j = 0; j < NUMS_MEGA; j++) {
          if (vetor[i] < vetor[j]) {
            aux = vetor[i];
            vetor[i] = vetor[j];
            vetor[j] = aux;
          }
        }
      }
     
    }
     
    void imprimir_matriz() //imprime a matriz dos jogos
    {
      int i, j;
     
      for (i = 0; i < NUM_JOGOS; i++) {
        for (j = 0; j < NUMS_MEGA; j++)
          printf("%d ", matriz_jogos[i][j]);
        printf("\n");
      }
     
    }
     
    int gerar_jogo(int num_jogo) //gera o jogo numero por numero
    {
      int i, num_al;
     
      matriz_jogos[num_jogo][0] = gerar_num_al();
      for (i = 1; i < 6; i++) {
        do {
          num_al = gerar_num_al();
        } while (testar_num(num_al, matriz_jogos[num_jogo], i)); //faz o teste se retorna 1 continua o sorteio ate aparecer um numero diferente do anterior
        matriz_jogos[num_jogo][i] = num_al;
     
      }
     
    }
     
    main() {
      int i,mac;
     
      srand(time(NULL)); //pega o numero randomico usando como seed o relogio
     
      for (i = 0; i < NUM_JOGOS; i++) {
        gerar_jogo(i);
        ordenar_vetor(matriz_jogos[i]);
    	
      }
      mac = testar_jogo_igual();	
      printf("%d\n",mac);
      imprimir_matriz();
      
    }
    

    8. Melhorar o exercício anterior para evitar que uma aposta tenha dois números na mesma dezena.

    Solução - Exercicio 08
    //Autor: Victor Cesconetto De Pieri
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define NUM_JOGOS 10
    #define NUMS_MEGA 6
    
    int matriz_jogos[NUM_JOGOS][NUMS_MEGA];
    
    int gerar_num_al() {
      return (rand() % 60 + 1);
    }
    
    int testar_num(int numero, int vetor[NUMS_MEGA], int limite) //testa o numero a ser colocado no vetor do jogo
    {
      int i = 0;
      for (i = 0; i < limite; i++) {
        if (vetor[i] == numero || (vetor[i] / 10) == (numero / 10)) //testa se o numero anterior é igual ou existe dezena igual ao proximo sorteado, se sim, retorna 1 se nao retorna 0
          return 1;
      }
      return 0;
    }
    
    void ordenar_vetor(int vetor[NUMS_MEGA]) // ordena o vetor do jogo em ordem crescente
    {
      int i, j;
      int aux = 0;
      for (i = 0; i < NUMS_MEGA; i++) {
        for (j = 0; j < NUMS_MEGA; j++) {
          if (vetor[i] < vetor[j]) {
            aux = vetor[i];
            vetor[i] = vetor[j];
            vetor[j] = aux;
          }
        }
      }
    
    }
    
    void imprimir_matriz() //imprime a matriz dos jogos
    {
      int i, j;
    
      for (i = 0; i < NUM_JOGOS; i++) {
        for (j = 0; j < NUMS_MEGA; j++)
          printf("%d ", matriz_jogos[i][j]);
        printf("\n");
      }
    
    }
    
    int gerar_jogo(int num_jogo) //gera o jogo numero por numero
    {
      int i, num_al;
    
      matriz_jogos[num_jogo][0] = gerar_num_al();
      for (i = 1; i < 6; i++) {
        do {
          num_al = gerar_num_al();
        } while (testar_num(num_al, matriz_jogos[num_jogo], i)); //faz o teste se retorna 1 continua o sorteio ate aparecer um numero diferente do anterior
        matriz_jogos[num_jogo][i] = num_al;
    
      }
    
    }
    
    main() {
      int i;
    
      srand(time(NULL)); //pega o numero randomico usando como seed o relogio
    
      for (i = 0; i < NUM_JOGOS; i++) {
        gerar_jogo(i);
        ordenar_vetor(matriz_jogos[i]);
      }
      imprimir_matriz();
    }
    

    9. Melhorar o exercício anterior para evitar que uma mesma aposta tenha números consecutivos.

    Solução - Exercicio 09
    //Autor:Victor Cesconetto De Pieri
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define NUM_JOGOS 10
    #define NUMS_MEGA 6
    
    int matriz_jogos[NUM_JOGOS][NUMS_MEGA];
    
    int gerar_num_al() {
      return (rand() % 60 + 1);
    }
    
    int testar_num(int numero, int vetor[NUMS_MEGA], int limite) //testa o numero a ser colocado no vetor do jogo
    {
      int i = 0;
      for (i = 0; i < limite; i++) {
        if (vetor[i] == numero || vetor[i] == (numero+1) || vetor[i] == (numero-1) ) //testa se o numero anterior é igual ou consecutivo ao proximo sorteado, se sim, retorna 1 se nao retorna 0
          return 1;
      }
      return 0;
    }
    
    void ordenar_vetor(int vetor[NUMS_MEGA]) // ordena o vetor do jogo em ordem crescente
    {
      int i, j;
      int aux = 0;
      for (i = 0; i < NUMS_MEGA; i++) {
        for (j = 0; j < NUMS_MEGA; j++) {
          if (vetor[i] < vetor[j]) {
            aux = vetor[i];
            vetor[i] = vetor[j];
            vetor[j] = aux;
          }
        }
      }
    
    }
    
    void imprimir_matriz() //imprime a matriz dos jogos
    {
      int i, j;
    
      for (i = 0; i < NUM_JOGOS; i++) {
        for (j = 0; j < NUMS_MEGA; j++)
          printf("%d ", matriz_jogos[i][j]);
        printf("\n");
      }
    
    }
    
    int gerar_jogo(int num_jogo) //gera o jogo numero por numero
    {
      int i, num_al;
    
      matriz_jogos[num_jogo][0] = gerar_num_al();
      for (i = 1; i < 6; i++) {
        do {
          num_al = gerar_num_al();
        } while (testar_num(num_al, matriz_jogos[num_jogo], i)); //faz o teste se retorna 1 continua o sorteio ate aparecer um numero diferente do anterior
        matriz_jogos[num_jogo][i] = num_al;
    
      }
    
    }
    
    main() {
      int i;
    
      srand(time(NULL)); //pega o numero randomico usando como seed o relogio
    
      for (i = 0; i < NUM_JOGOS; i++) {
        gerar_jogo(i);
        ordenar_vetor(matriz_jogos[i]);
      }
      imprimir_matriz();
    }
    

    10. Melhorar o exercício anterior colocando um switch para o usuário colocar as opções acima.