Mudanças entre as edições de "Programação 1 - Engenharia - Arrays Multidimensionais"
Ir para navegação
Ir para pesquisar
Linha 135: | Linha 135: | ||
Exercício | Exercício | ||
+ | <ol> | ||
+ | <li> | ||
+ | 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. | ||
+ | </li> | ||
+ | <li>Implementar uma programa para calcular o determinante de uma matriz 3x3 (de reais) a ser fornecida pelo teclado. | ||
+ | </li> | ||
+ | <li>Implementar um programa para ler duas matrizes (''matA'' e ''matB'') e multiplicá-las, colocando o resultado em uma matriz matC. | ||
+ | </li> | ||
+ | <li> | ||
− | # | + | #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. | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | /* | ||
+ | Batalha Naval | ||
+ | Versão Turma PRG2014-1-IFSC | ||
+ | */ | ||
+ | |||
+ | #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("| %d ",ZonaDeGuerra[linha][j]); | ||
+ | } | ||
+ | printf("|\n"); | ||
+ | printf(" +---+---+---+---+---+---+---+---+---+---+\n"); | ||
+ | } | ||
+ | |||
+ | |||
+ | void ImprimeMatriz() | ||
+ | { | ||
+ | int i; | ||
+ | |||
+ | printf(" +---+---+---+---+---+---+---+---+---+---+\n"); | ||
+ | for(i=0;i<TAM_MAT;i++) | ||
+ | ImprimeLinha(i); | ||
+ | } | ||
+ | |||
+ | int Tiro() | ||
+ | { | ||
+ | } | ||
+ | |||
+ | main() | ||
+ | { | ||
+ | ZerarMatriz(); | ||
+ | PosicionarNavios(); | ||
+ | ImprimeMatriz(); | ||
+ | do { | ||
+ | situacao = Tiro(); | ||
+ | while (situacao!=0); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | <!-- | ||
+ | int Tiro() | ||
+ | { | ||
+ | for (;;) { | ||
+ | printf("Entre com a linha: "); | ||
+ | scanf ("%d", &linha); | ||
+ | printf("Entre com a coluna: "); | ||
+ | scanf ("%d", &coluna); | ||
+ | |||
+ | } | ||
+ | |||
+ | main() | ||
+ | { | ||
+ | int situacao; | ||
+ | |||
+ | ZerarMatriz(); | ||
+ | PosicionarNavios(); | ||
+ | ImprimeMatriz(); | ||
+ | do { | ||
+ | situacao = Tiro(); | ||
+ | while (situacao!=0); | ||
+ | |||
+ | switch (situacao) { | ||
+ | case 1: printf("%s: Você acertou todos os navios\n", nome); | ||
+ | printf("Sua pontuação é %d\n", pontuacao_final); | ||
+ | break; | ||
+ | case 2: printf("%s: Você atingiu o limite máximo de tiros\n", nome); | ||
+ | break; | ||
+ | default: printf("Algum problema ocorreu...\n"); | ||
+ | break; | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </li> | ||
+ | </ol> | ||
+ | |||
+ | #<!-- <syntaxhighlight lang=c> | ||
#include <stdio.h> | #include <stdio.h> | ||
Linha 171: | Linha 350: | ||
--> | --> | ||
− | |||
− | |||
#Vamos implementar um jogo similar a batalha naval da seguinte forma. | #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 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. | ||
Linha 341: | Linha 518: | ||
} | } | ||
--> | --> | ||
− | |||
− | |||
===Matrizes de caracteres e vetores de strings=== | ===Matrizes de caracteres e vetores de strings=== |
Edição das 07h24min de 2 de dezembro de 2015
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>
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;
for(i=0;i<2;i++){
for(j=0;j<3;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>
void somar_mat(int aA[][3],int aB[][3], int cC[][3])
{
int i,j;
for(i=0;i<2;i++){
for(j=0;j<3;j++) {
cC[i][j] = aA[i][j] + aB[i][j];
}
}
}
void main()
{
int mA[2][3]={ 11,12,13,
21,22,23},
mB[2][3]={1,2,3,
1,2,3},
mC[2][3];
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.
-
- 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.
/* Batalha Naval Versão Turma PRG2014-1-IFSC */ #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("| %d ",ZonaDeGuerra[linha][j]); } printf("|\n"); printf(" +---+---+---+---+---+---+---+---+---+---+\n"); } void ImprimeMatriz() { int i; printf(" +---+---+---+---+---+---+---+---+---+---+\n"); for(i=0;i<TAM_MAT;i++) ImprimeLinha(i); } int Tiro() { } main() { ZerarMatriz(); PosicionarNavios(); ImprimeMatriz(); do { situacao = Tiro(); while (situacao!=0); }
- 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.
/* Batalha Naval Versão Turma PRG2014-1-IFSC */ #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("| %d ",ZonaDeGuerra[linha][j]); } printf("|\n"); printf(" +---+---+---+---+---+---+---+---+---+---+\n"); } void ImprimeMatriz() { int i; printf(" +---+---+---+---+---+---+---+---+---+---+\n"); for(i=0;i<TAM_MAT;i++) ImprimeLinha(i); } int Tiro() { } main() { ZerarMatriz(); PosicionarNavios(); ImprimeMatriz(); 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
- Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.
#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"); }
- 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.
- Implementar uma modificação do exercício anterior que permite ao programa ficar em loop até que se entre com userID igual a "fim".
- 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).
- 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.
Exercício MEGASENA
#include <stdio.h> #include <stdlib.h> #include <time.h> #define NUM_JOGOS 8 #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) { int i=0; for (i=0;i<limite;i++) { if (vetor[i]==numero) return 1; } return 0; } void ordenar_vetor(int vetor[NUMS_MEGA]) { } void imprimir_matriz() { 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) { 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)); matriz_jogos[num_jogo][i]=num_al; } } main() { int i; srand ( time(NULL) ); for (i=0;i<NUM_JOGOS;i++) gerar_jogo(i); imprimir_matriz(); }
- Vamos implementar um jogo similar a batalha naval da seguinte forma.