Mudanças entre as edições de "Programação 1 - Engenharia - Arrays Multidimensionais"
Linha 403: | Linha 403: | ||
</ol> | </ol> | ||
− | |||
{{collapse top|Solução - Função Tiro()}} | {{collapse top|Solução - Função Tiro()}} | ||
<syntaxhighlight lang=c> | <syntaxhighlight lang=c> | ||
− | int Tiro() | + | //Autor: Victor Cesconetto De Pieri |
− | + | ||
− | for (;;) | + | 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() | + | main() { |
− | { | ||
int situacao; | int situacao; | ||
− | + | ||
+ | printf("Digite seu nome:\n"); | ||
+ | scanf("%s", & nome); | ||
ZerarMatriz(); | ZerarMatriz(); | ||
PosicionarNavios(); | PosicionarNavios(); | ||
− | + | ImprimeMatrizEscondida(); | |
− | + | ||
− | + | situacao = Tiro();//aqui executa a funcao tiro e retorna o valor que corresponde as açoes no switch case abaixo | |
− | + | ||
switch (situacao) { | 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=== | ===Matrizes de caracteres e vetores de strings=== |
Edição das 14h46min de 29 de março 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
-
Implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.
solução #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; }
-
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 #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ício
- 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.
- Implementar uma programa para calcular o determinante de uma matriz 3x3 (de reais) a ser fornecida pelo teclado.
- 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]); } }
-
Vamos implementar um jogo similar a batalha naval da seguinte forma.
- 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.
- Crie um contador global de tiros iniciado com 0.
- 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).
- 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 - 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);
}
|
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);
}
|
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
<syntaxhighlight lang=c>
#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.
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".
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).
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.
int matriz_megasena[10][6];
7. Melhorar o exercício anterior para evitar que dois jogos sejam iguais.
8. Melhorar o exercício anterior para evitar que uma aposta tenha dois números na mesma dezena.
9. Melhorar o exercício anterior para evitar que uma mesma aposta tenha números consecutivos.
10. Melhorar o exercício anterior colocando um switch para o usuário colocar as opções acima. |