Um desafio com vectores... ...para implementação em linguagem C Luis Borges Gouveia [email_address]
Era uma vez...  Um pacote de açucar!
Problema Retirado de um pacote de açucar da RAR... (Out/08) Considere a seguinte tabela:   Complete esta tabela de forma a que a soma em coluna, linha e diagonal seja 15.
Linhas, colunas, diagonais 6 1 8 5 2 4
Resolução Passo 1: necessário saber quais os algarismos não colocados.  estão em falta, o 3, 7 e o 9. Criar uma lista com estes valores.  Passo 2:  verificar quais as linhas com um só elemento em falta e o seu valor.  é a terceira linha e o valor da soma dos elementos existentes é 6.  Passo 3: para cada avaliação anterior subtrair a 15, o valor encontrado. neste caso 6, obtendo-se o valor 9 (15-6). Retira-se da lista o valor 9.  Repetir passo 2 e 3 considerando as colunas, tomando a primeira coluna:  o valor encontrado é 8, sendo que subtraído a 15, obtêm-se 7. Retira-se este valor da lista.  A coluna em falta é a terceira (lembrar que o algarismo 9 foi colocado quando se analisaram as linhas).  o valor da soma é 12 que, subtraído a 15, coincide com o valor em falta (3).  Passo 4: verificar que cada coluna e linha tem como soma dos seus elementos o valor 15.  efectuada na passagem inicial por linhas e colunas, respectivamente.  Passo 5: última verificação de soma 15 é realizada nas diagonais.
As variáveis... e inicialização #include <stdio.h> #include <stdlib.h>  main(){  int matriz[3][3];  // matriz de inteiros 3x3 p/ os 9 alg   int linha, coluna, indice, soma;  // ind. de posição   int algarismos[10];   int val_falta=0;      /* inicializar a zero o vector de algarismos */   for (indice=0; indice < 11; indice++)  algarismos[indice]=0;    
Inicializar a matriz com 9 elementos /* Colocar os valores do problema inicial */   /* Os valores podem ser algarismo 1 a 9  */   /* O zero (0) significa sem valor */   matriz[0][0] = 6;   matriz[0][1] = 1;   matriz[0][2] = 8;   matriz[1][0] = 0;   matriz[1][1] = 5;   matriz[1][2] = 0;   matriz[2][0] = 2;   matriz[2][1] = 0;   matriz[2][2] = 4; Ou forma? int matriz[3][3] = { 6, 8, 1, 0, 5, 0, 2, 0, 4 };
Entrada de dados pelo utilizador /* alternativamente, pedir valores ao utilizador */  printf(&quot;\nCarregamento de valores da matriz inicial\n&quot;);  for (linha = 0; linha < 3; linha++) {   printf(&quot;Linha : %d \n&quot;, linha + 1); for (coluna = 0; coluna < 3; coluna++) {   printf(&quot;\tc: %d ::&quot;, coluna+1);   scanf(&quot;%d&quot;, &matriz[linha][coluna]);;   }   printf(&quot;\n&quot;);   }
Contar valores em falta /* visualizar conteudos da matriz e contar valores em falta */   printf(&quot;\n\nMatriz de valores\n&quot;);   for (linha = 0; linha < 3; linha++) {   for (coluna = 0; coluna < 3; coluna++) {   printf(&quot; : %d : &quot;, matriz[linha][coluna]);   if (matriz[linha][coluna] == 0) val_falta++;   algarismos[matriz[linha][coluna]] = matriz[linha][coluna];   }   printf(&quot;\n&quot;); }
Verificar as linhas /* verificar as linhas */   for (linha = 0; linha < 3; linha++) {   soma = 0;   val_falta = 0;   for (coluna = 0; coluna < 3; coluna++) {   if (matriz[linha][coluna] == 0) val_falta++;   soma += matriz[linha][coluna];   }   printf(&quot;\n Linha: %d  Soma: %d  Faltas %d &quot;, linha+1, soma,val_falta);   if (val_falta == 1) {   printf(&quot;Algarismo a colocar: %d&quot;, 15 - soma);   for (coluna = 0; coluna < 3; coluna++) { if (matriz[linha][coluna] == 0) {   matriz[linha][coluna] = 15 - soma;  algarismos[15 - soma] = 15 - soma; }  } }  }  printf(&quot;\n&quot;);
Verificar colunas /* verificar as colunas */  for (coluna = 0; coluna < 3; coluna++) {  soma = 0; val_falta = 0; for (linha = 0; linha < 3; linha++) { if (matriz[linha][coluna] == 0) val_falta++;  soma += matriz[linha][coluna];    } printf(&quot;\n Coluna: %d  Soma: %d  Faltas %d &quot;, coluna+1,  soma,val_falta); if (val_falta == 1) {  printf(&quot;Algarismo a colocar: %d&quot;, 15 - soma);   for (linha = 0; linha < 3; linha++) { if (matriz[linha][coluna] == 0) {   matriz[linha][coluna] = 15 - soma; algarismos[15 - soma] = 15 - soma; } } }  }
Verificar diagonais /* Verificar diagonais */   // diagonal principal   soma = 0;   for (linha = 0; linha < 3; linha++)   for (coluna = 0; coluna < 3; coluna++)   if (linha == coluna) soma += matriz[linha][coluna];    printf(&quot;\n\n Diagonal principal: %d &quot;, soma);   if (soma == 15) printf(&quot;OK!&quot;);      // segunda diagonal   soma = 0;   for (linha = 0; linha < 3; linha++)   soma += matriz[linha][2-linha];      printf(&quot;\n Segunda diagonal: %d &quot;, soma);   if (soma == 15) printf(&quot;OK!\n&quot;);
Apresentar a matriz completa /* visualizar conteudos da matriz resolvida printf(&quot;\nMatriz resolvida\n&quot;); for (linha = 0; linha < 3; linha++) {   for (coluna = 0; coluna < 3; coluna++)   printf(&quot; : %d : &quot;, matriz[linha][coluna]);   printf(&quot;\n&quot;); } printf(&quot;\n\n”); } 
Comentários O programa proposto funciona bem, se os valores introduzidos foram correctos, isto é:  se tratarem de algarismos não repetidos e  respeitarem aqueles que são colocados, a regra da soma igual a quinze.
Testar o programa Teste o programa para a seguinte tabela: Quais são os resultados obtidos?
Questões Quais são os valores mínimos a introduzir para que o programa funcione?  Uma melhoria interessante do programa, seria a geração de todas as combinações possíveis de tabelas que utilizam os nove algarismos com as propriedades indicadas.

1 exercicio de vectores em C

  • 1.
    Um desafio comvectores... ...para implementação em linguagem C Luis Borges Gouveia [email_address]
  • 2.
    Era uma vez... Um pacote de açucar!
  • 3.
    Problema Retirado deum pacote de açucar da RAR... (Out/08) Considere a seguinte tabela:   Complete esta tabela de forma a que a soma em coluna, linha e diagonal seja 15.
  • 4.
  • 5.
    Resolução Passo 1:necessário saber quais os algarismos não colocados. estão em falta, o 3, 7 e o 9. Criar uma lista com estes valores. Passo 2: verificar quais as linhas com um só elemento em falta e o seu valor. é a terceira linha e o valor da soma dos elementos existentes é 6. Passo 3: para cada avaliação anterior subtrair a 15, o valor encontrado. neste caso 6, obtendo-se o valor 9 (15-6). Retira-se da lista o valor 9. Repetir passo 2 e 3 considerando as colunas, tomando a primeira coluna: o valor encontrado é 8, sendo que subtraído a 15, obtêm-se 7. Retira-se este valor da lista. A coluna em falta é a terceira (lembrar que o algarismo 9 foi colocado quando se analisaram as linhas). o valor da soma é 12 que, subtraído a 15, coincide com o valor em falta (3). Passo 4: verificar que cada coluna e linha tem como soma dos seus elementos o valor 15. efectuada na passagem inicial por linhas e colunas, respectivamente. Passo 5: última verificação de soma 15 é realizada nas diagonais.
  • 6.
    As variáveis... einicialização #include <stdio.h> #include <stdlib.h>  main(){ int matriz[3][3]; // matriz de inteiros 3x3 p/ os 9 alg int linha, coluna, indice, soma; // ind. de posição int algarismos[10]; int val_falta=0;   /* inicializar a zero o vector de algarismos */ for (indice=0; indice < 11; indice++) algarismos[indice]=0;  
  • 7.
    Inicializar a matrizcom 9 elementos /* Colocar os valores do problema inicial */ /* Os valores podem ser algarismo 1 a 9 */ /* O zero (0) significa sem valor */ matriz[0][0] = 6; matriz[0][1] = 1; matriz[0][2] = 8; matriz[1][0] = 0; matriz[1][1] = 5; matriz[1][2] = 0; matriz[2][0] = 2; matriz[2][1] = 0; matriz[2][2] = 4; Ou forma? int matriz[3][3] = { 6, 8, 1, 0, 5, 0, 2, 0, 4 };
  • 8.
    Entrada de dadospelo utilizador /* alternativamente, pedir valores ao utilizador */ printf(&quot;\nCarregamento de valores da matriz inicial\n&quot;); for (linha = 0; linha < 3; linha++) { printf(&quot;Linha : %d \n&quot;, linha + 1); for (coluna = 0; coluna < 3; coluna++) { printf(&quot;\tc: %d ::&quot;, coluna+1); scanf(&quot;%d&quot;, &matriz[linha][coluna]);; } printf(&quot;\n&quot;); }
  • 9.
    Contar valores emfalta /* visualizar conteudos da matriz e contar valores em falta */ printf(&quot;\n\nMatriz de valores\n&quot;); for (linha = 0; linha < 3; linha++) { for (coluna = 0; coluna < 3; coluna++) { printf(&quot; : %d : &quot;, matriz[linha][coluna]); if (matriz[linha][coluna] == 0) val_falta++; algarismos[matriz[linha][coluna]] = matriz[linha][coluna]; } printf(&quot;\n&quot;); }
  • 10.
    Verificar as linhas/* verificar as linhas */ for (linha = 0; linha < 3; linha++) { soma = 0; val_falta = 0; for (coluna = 0; coluna < 3; coluna++) { if (matriz[linha][coluna] == 0) val_falta++; soma += matriz[linha][coluna]; } printf(&quot;\n Linha: %d Soma: %d Faltas %d &quot;, linha+1, soma,val_falta); if (val_falta == 1) { printf(&quot;Algarismo a colocar: %d&quot;, 15 - soma); for (coluna = 0; coluna < 3; coluna++) { if (matriz[linha][coluna] == 0) { matriz[linha][coluna] = 15 - soma; algarismos[15 - soma] = 15 - soma; } } } } printf(&quot;\n&quot;);
  • 11.
    Verificar colunas /*verificar as colunas */ for (coluna = 0; coluna < 3; coluna++) { soma = 0; val_falta = 0; for (linha = 0; linha < 3; linha++) { if (matriz[linha][coluna] == 0) val_falta++; soma += matriz[linha][coluna]; } printf(&quot;\n Coluna: %d Soma: %d Faltas %d &quot;, coluna+1, soma,val_falta); if (val_falta == 1) { printf(&quot;Algarismo a colocar: %d&quot;, 15 - soma); for (linha = 0; linha < 3; linha++) { if (matriz[linha][coluna] == 0) { matriz[linha][coluna] = 15 - soma; algarismos[15 - soma] = 15 - soma; } } } }
  • 12.
    Verificar diagonais /*Verificar diagonais */ // diagonal principal soma = 0; for (linha = 0; linha < 3; linha++) for (coluna = 0; coluna < 3; coluna++) if (linha == coluna) soma += matriz[linha][coluna];   printf(&quot;\n\n Diagonal principal: %d &quot;, soma); if (soma == 15) printf(&quot;OK!&quot;);   // segunda diagonal soma = 0; for (linha = 0; linha < 3; linha++) soma += matriz[linha][2-linha];   printf(&quot;\n Segunda diagonal: %d &quot;, soma); if (soma == 15) printf(&quot;OK!\n&quot;);
  • 13.
    Apresentar a matrizcompleta /* visualizar conteudos da matriz resolvida printf(&quot;\nMatriz resolvida\n&quot;); for (linha = 0; linha < 3; linha++) { for (coluna = 0; coluna < 3; coluna++) printf(&quot; : %d : &quot;, matriz[linha][coluna]); printf(&quot;\n&quot;); } printf(&quot;\n\n”); } 
  • 14.
    Comentários O programaproposto funciona bem, se os valores introduzidos foram correctos, isto é: se tratarem de algarismos não repetidos e respeitarem aqueles que são colocados, a regra da soma igual a quinze.
  • 15.
    Testar o programaTeste o programa para a seguinte tabela: Quais são os resultados obtidos?
  • 16.
    Questões Quais sãoos valores mínimos a introduzir para que o programa funcione? Uma melhoria interessante do programa, seria a geração de todas as combinações possíveis de tabelas que utilizam os nove algarismos com as propriedades indicadas.