Programação 1 - Engenharia - Arrays Multidimensionais

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar

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.
  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].

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ício

  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. Solução - Exercicio 01
    //Autor: Victor Cesconetto De Pieri
    
    #include <stdio.h>
    
    #define DIM_1 2
    #define DIM_2 3
     
    void main()
    {
      int mA[DIM_1][DIM_2]={ 10,20,30,
                     30,20,10},
          mB[DIM_1][DIM_2]={1,2,3,
                    3,2,1},
          mSoma[DIM_1][DIM_2];
      int i,j, soma=0;
      float media;
     
      for(i=0;i<DIM_1;i++){
         for(j=0;j<DIM_2;j++) {
            mSoma[i][j] = mA[i][j] + mB[i][j];
            soma = soma + mSoma[i][j];
         }
      }
      media = soma/(DIM_1 * DIM_2);
      printf("Media : %f\n",media);
    }
    
  3. Implementar uma programa para calcular o determinante de uma matriz 3x3 (de reais) a ser fornecida pelo teclado.
  4. Solução - Exercicio 02
    //Autor: Victor Cesconetto De Pieri
     
    #include <stdio.h>
     
    #define DIM_1 3
    #define DIM_2 3
     
    void main()
    {
    
      float mA[DIM_1][DIM_2];
      int i,j;
      float detA,diagPrin,diagSec;
    
      for(i=0;i<DIM_1;i++){
    	 for(j=0;j<DIM_2;j++){
      		printf("Digite o valor mA[%d][%d] da matriz: \n",i,j);
    		scanf("%f",&mA[i][j]);
    	 }
      }
      //formula para calcular o determinante 3x3
      diagPrin = (mA[0][0]*mA[1][1]*mA[2][2]) + (mA[0][1]*mA[1][2]*mA[2][0]) + (mA[0][2]*mA[1][0]*mA[2][1]);
     
      diagSec = (mA[2][0]*mA[1][1]*mA[0][2]) + (mA[2][1]*mA[1][2]*mA[0][0]) + (mA[2][2]*mA[1][0]*mA[0][1]);
    
      detA = diagPrin - diagSec;
      printf("Determinante : %f\n",detA);
    }
    
  5. 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.
    Solução - Exercicio 03
    #include <stdio.h>
    
    #define DIM_1 2
    #define DIM_2 3
    #define DIM_3 4
    
    main()
    {
      int matA[DIM_1][DIM_2]={{2,5,7},
                              {4,7,5}
                             },
          matB[DIM_2][DIM_3]={{7,5,6,4},
                              {4,6,4,3},
                              {9,2,2,1}
                              },
          matR[DIM_1][DIM_3] ={
                               {0,0,0,0},
                               {0,0,0,0}
                              },
          i,j,k;
    
    
      for (i=0;i<DIM_1;i++) 
         for (j=0;j<DIM_3;j++) {
            for (k=0;k<DIM_2;k++)
                 matR[i][j]=matR[i][j]+matA[i][k]*matB[k][j];
            printf("MatR[%d][%d] => %d \n", i, j,  matR[i][j]);
         }
                   
    }
    
  6. 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úmerode 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);
    }
    
Solução - Função Tiro()
//Autor: Victor Cesconetto De Pieri

int Tiro() {
  int linha, nao, coluna;
  int i, j;
  for (;;) {
    if (NumeroNavios <= 0) {
      printf("Não existem navios para acertar !\n");
      return 1;
      break;
    } else {
      printf("ATENÇÃO : linhas e colunas vao de 0 a 9\n");
      printf("Entre com a linha: ");
      scanf("%d", & linha);
      printf("Entre com a coluna: ");
      scanf("%d", & coluna);
      if (ZonaDeGuerra[linha][coluna] == 9) { //verifica se ja foi atirado na coordenada passada pelo teclado
        printf("Ja foi atirado nessa coordenada, tente novamente!\n");
      } else {
        if (ContadorTiros < 30) { //verifica se o jogador ja atirou o numero maximo de vezes
          ContadorTiros++;
        } else {
          return 2;
          break;
        }
        if (ZonaDeGuerra[linha][coluna] == 0) {
          ZonaDeGuerra[linha][coluna] = 9; //coloca-se um numero para informar que ja foi atirado nessa posicao
          printf("Não há navios nessa posicao ou ja foram derrubados, voce errou !\n");
        } else {
          switch (ZonaDeGuerra[linha][coluna]) {
          case 1:
            printf("Voce acertou !\n", nome);
            ZonaDeGuerra[linha][coluna] = 9; //coloca-se um numero para informar que ja foi atirado nessa posicao
            PontuacaoFinal = PontuacaoFinal + 10;
            NumeroNavios--;
            break;
          case 2:
            printf("Voce acertou !\n", nome);
            ZonaDeGuerra[linha][coluna] = 9; //coloca-se um numero para informar que ja foi atirado nessa posicao
            PontuacaoFinal = PontuacaoFinal + 3;
            NumeroNavios--;
            break;
          case 3:
            printf("Voce acertou !\n", nome);
            ZonaDeGuerra[linha][coluna] = 9; //coloca-se um numero para informar que ja foi atirado nessa posicao
            PontuacaoFinal = PontuacaoFinal + 5;
            NumeroNavios--;
            break;
          }
        }
      }
    }
  }
}

main() {
  int situacao;

  printf("Digite seu nome:\n");
  scanf("%s", & nome);
  ZerarMatriz();
  PosicionarNavios();
  ImprimeMatrizEscondida();

  situacao = Tiro();//aqui executa a funcao tiro e retorna o valor que corresponde as açoes no switch case abaixo

  
  switch (situacao) {
  case 1:
    printf("%s: Você acertou todos os navios\n", nome);
    printf("Sua pontuação é %d\n", PontuacaoFinal);
    break;
  case 2:
    printf("%s: Você atingiu o limite máximo de tiros\n", nome);
    break;
  default:
    printf("Algo deu errado", PontuacaoFinal);
    break;
  }

}


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.

Solução - Exercicio 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");   
}

2. 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.

Solução - Exercicio 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);
  }   
}

3. Implementar uma modificação do exercício anterior que permite ao programa ficar em loop até que se entre com userID igual a "fim".

Solução - Exercicio 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);
    }
  }

}

4. 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).

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");
      }
    }
  }

}

5. No exercício anterior, acrecente 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 desbloquado e o sistema volta a perguntar por um userID.

Solução - Exercicio 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.