https://wiki.sj.ifsc.edu.br/index.php?title=PRG122804_2019_2_AULA10&feed=atom&action=historyPRG122804 2019 2 AULA10 - Histórico de revisão2024-03-29T08:05:31ZHistórico de revisões para esta página neste wikiMediaWiki 1.35.9https://wiki.sj.ifsc.edu.br/index.php?title=PRG122804_2019_2_AULA10&diff=160787&oldid=prevDouglas: Criou página com '=Objetivos= *Definindo matrizes no C. *Operações com matrizes e passagem de parâmetros tipo matriz. *Matrizes com caracteres. =Como definir e operar com matrizes no C= De f...'2019-08-28T20:45:37Z<p>Criou página com '=Objetivos= *Definindo matrizes no C. *Operações com matrizes e passagem de parâmetros tipo matriz. *Matrizes com caracteres. =Como definir e operar com matrizes no C= De f...'</p>
<p><b>Página nova</b></p><div>=Objetivos=<br />
<br />
*Definindo matrizes no C.<br />
*Operações com matrizes e passagem de parâmetros tipo matriz.<br />
*Matrizes com caracteres.<br />
<br />
=Como definir e operar com matrizes no C=<br />
<br />
De forma similar ao vetor, basta definir a matriz usando colchetes para indicar a dimensão da variável.<br />
<br />
Exemplo: Definir duas matrizes 2x3 já inicializadas e computar a soma das mesmas:<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
}<br />
}<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
;Exercícios<br />
<br />
#Modificar este exercício para que a função receba um parâmetro adicional do tipo inteiro. A função deve retornar a média de todos os valores da matriz soma que estão acima do valor passado como parâmetro.<br />
#implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
int i,j, soma_ac=0;<br />
float media;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
mC[i][j] = mA[i][j] + mB[i][j];<br />
soma_ac = soma_ac + mC[i][j];<br />
}<br />
}<br />
media = soma_ac/6.0;<br />
}<br />
</syntaxhighlight><br />
#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].<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
#define N_MAX 50<br />
<br />
void main()<br />
{<br />
int mA[N_MAX][N_MAX];<br />
int i,j,dimN;<br />
<br />
/* Entrada da dimensão */<br />
printf("Entre com a dimensao\n");<br />
scanf ("%d",&dimN);<br />
<br />
/* Entrada de dados */ <br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("Entre com mA[%d][%d]\n",i,j);<br />
scanf("%d",&mA[i][j]); <br />
}<br />
}<br />
<br />
/* impressao dos dados lidos */<br />
for (i=0;i<dimN;i++) {<br />
for (j=0;j<dimN;j++) {<br />
printf("=> mA[%d][%d] => %d\n",i,j,mA[i][j]); <br />
}<br />
} <br />
}<br />
</syntaxhighlight><br />
<br />
=Passando matrizes como parâmetro=<br />
<br />
Como matrizes também são vetores, a mesma característica da passagem de parâmetros é considerada. Observe os exemplos a seguir:<br />
<br />
;Exemplo 1<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void somar_mat(int aA[][3],int aB[][3], int cC[][3])<br />
{<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
cC[i][j] = aA[i][j] + aB[i][j];<br />
}<br />
}<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3];<br />
<br />
somar_mat(mA,mB,mC);<br />
<br />
}<br />
</syntaxhighlight><br />
<br />
'''OBSERVE''' que matrizes são sempre passadas como referência.<br />
<br />
;Exemplo 2<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
void somar_mat(int m1[][3],int m2[][3], int m3[][3]);<br />
void imprimir_mat(int mat[][3]);<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ 11,12,13,<br />
21,22,23},<br />
mB[2][3]={1,2,3,<br />
1,2,3},<br />
mC[2][3]={4,5,6,<br />
7,8,9 },<br />
mR[2][3];<br />
int i,j;<br />
somar_mat(mA,mB,mR); // somar matrix A com B<br />
imprimir_mat(mR);<br />
somar_mat(mB,mC,mR);<br />
imprimir_mat(mR);<br />
somar_mat(mA,mC,mR);<br />
imprimir_mat(mR);<br />
}<br />
<br />
void somar_mat(int m1[][3],int m2[][3], int m3[][3])<br />
{<br />
int i,j;<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
m3[i][j] = m1[i][j] + m2[i][j];<br />
}<br />
}<br />
}<br />
<br />
void imprimir_mat(int mat[][3]){<br />
int i,j;<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
printf("%d\t",mat[i][j]);<br />
}<br />
printf("\n");<br />
}<br />
printf("\n");<br />
}<br />
<br />
<br />
</syntaxhighlight><br />
<br />
;Exercícios Parte 1:<br />
<br />
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.<br />
<br />
{{collapse top|Resposta}}<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
<br />
float media_soma_mat(int aA[][3],int aB[][3])<br />
{<br />
int i,j;<br />
int soma_ac=0;<br />
/*int cC[2][3];*/<br />
<br />
for(i=0;i<2;i++){<br />
for(j=0;j<3;j++) {<br />
/*cC[i][j] = aA[i][j] + aB[i][j];*/<br />
soma_ac = soma_ac +aA[i][j] + aB[i][j];<br />
}<br />
}<br />
return (soma_ac/6.0);<br />
}<br />
<br />
void main()<br />
{<br />
int mA[2][3]={ <br />
11,12,13,<br />
21,22,23},<br />
mB[2][3]={<br />
1,2,3,<br />
1,2,3};<br />
float media;<br />
<br />
media = media_soma_mat(mA,mB);<br />
<br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
2. Implementar uma programa para calcular o determinante de uma matriz 3x3 (de reais) a ser fornecida pelo teclado.<br><br />
3. Implementar um programa para ler duas matrizes (''matA'' e ''matB'') e multiplicá-las, colocando o resultado em uma matriz matC.<br><br />
4. Vamos implementar um jogo similar a batalha naval da seguinte forma.<br> <br />
:4.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.<br><br />
:4.2. Crie um contador global de tiros iniciado com 0.<br><br />
:4.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).<br><br />
:4.4. Ao final do jogo é mostrado o nome do jogador, o número de tiros dados e a pontuação obtida.<br><br />
{{collapse top|Resposta}}<br />
<syntaxhighlight lang=c><br />
/*<br />
Batalha Naval<br />
Versão Turma PRG2014-1-IFSC<br />
*/<br />
<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <time.h><br />
<br />
/**********************************/<br />
/***** DEFINIÇÕES DESTE MÓDULO ****/<br />
/**********************************/<br />
<br />
#define TAM_MAT 10<br />
#define MAX_TIROS 30<br />
#define MAX_NOME 30<br />
<br />
/**********************************/<br />
/***** VARIÁVEIS GLOBAIS **********/<br />
/**********************************/<br />
<br />
int ZonaDeGuerra[TAM_MAT][TAM_MAT];/* Matriz do espaço de batalha */<br />
int ContadorTiros=0;<br />
int PontuacaoFinal; /* acumula a pontuação do jogador */<br />
char nome[MAX_NOME];<br />
int x_sorteado;<br />
int y_sorteado;<br />
<br />
<br />
/***********************************/<br />
/**** FUNÇÕES DESTE MÓDULO ********/<br />
/***********************************/<br />
<br />
/***** FUNÇÕES DE INICIALIZAÇÃO ****/<br />
<br />
void ZerarMatriz()<br />
{<br />
int i,j;<br />
<br />
for (i=0;i<TAM_MAT;i++)<br />
for(j=0;j<TAM_MAT;j++)<br />
ZonaDeGuerra[i][j]=0;<br />
}<br />
<br />
void SortearCasa()<br />
{<br />
do {<br />
/* generate secret number: */<br />
x_sorteado = rand() % TAM_MAT;<br />
y_sorteado = rand() % TAM_MAT;<br />
} while (ZonaDeGuerra[x_sorteado][y_sorteado]!=0);<br />
<br />
}<br />
<br />
PosicionarFragatas()<br />
{ <br />
int i;<br />
for(i=0;i<5;i++){<br />
SortearCasa();<br />
ZonaDeGuerra[x_sorteado][y_sorteado]=2; <br />
}<br />
}<br />
<br />
PosicionarSubmarinos()<br />
{ <br />
int i;<br />
for(i=0;i<5;i++){<br />
SortearCasa();<br />
ZonaDeGuerra[x_sorteado][y_sorteado]=3; <br />
}<br />
}<br />
<br />
void PosicionarPortaAvioes()<br />
{<br />
SortearCasa();<br />
ZonaDeGuerra[x_sorteado][y_sorteado]=1;<br />
}<br />
<br />
void PosicionarNavios()<br />
{<br />
/* initialize random seed: */<br />
srand ( time(NULL) );<br />
<br />
PosicionarPortaAvioes();<br />
PosicionarFragatas();<br />
PosicionarSubmarinos(); <br />
}<br />
<br />
/*** FUNÇÕES DE IMPRESSÃO NA TELA **/<br />
<br />
void ImprimeLinha(int linha)<br />
{<br />
int j;<br />
<br />
printf(" "); <br />
for(j=0;j<TAM_MAT;j++) {<br />
printf("| %d ",ZonaDeGuerra[linha][j]); <br />
}<br />
printf("|\n");<br />
printf(" +---+---+---+---+---+---+---+---+---+---+\n");<br />
}<br />
<br />
<br />
void ImprimeMatriz()<br />
{<br />
int i;<br />
<br />
printf(" +---+---+---+---+---+---+---+---+---+---+\n");<br />
for(i=0;i<TAM_MAT;i++)<br />
ImprimeLinha(i);<br />
}<br />
<br />
int Tiro()<br />
{<br />
}<br />
<br />
main()<br />
{<br />
ZerarMatriz();<br />
PosicionarNavios();<br />
ImprimeMatriz();<br />
do {<br />
situacao = Tiro();<br />
while (situacao!=0);<br />
}<br />
</syntaxhighlight><br />
<br />
<!--<br />
int Tiro()<br />
{<br />
for (;;) {<br />
printf("Entre com a linha: ");<br />
scanf ("%d", &linha);<br />
printf("Entre com a coluna: ");<br />
scanf ("%d", &coluna);<br />
<br />
}<br />
<br />
main()<br />
{<br />
int situacao;<br />
<br />
ZerarMatriz();<br />
PosicionarNavios();<br />
ImprimeMatriz();<br />
do {<br />
situacao = Tiro();<br />
while (situacao!=0);<br />
<br />
switch (situacao) {<br />
case 1: printf("%s: Você acertou todos os navios\n", nome);<br />
printf("Sua pontuação é %d\n", pontuacao_final);<br />
break;<br />
case 2: printf("%s: Você atingiu o limite máximo de tiros\n", nome); <br />
break;<br />
default: printf("Algum problema ocorreu...\n");<br />
break; <br />
}<br />
<br />
}<br />
--><br />
{{collapse bottom}}<br />
<br />
=Matrizes de caracteres e vetores de strings=<br />
<br />
Um vetor de strings pode ser construído usando matrizes de ''char''. Cada string será armazenada em uma linha do vetor. <br />
<br />
;Exemplo<br />
<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
main()<br />
{<br />
char TabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"jose",<br />
"lara",<br />
};<br />
int i;<br />
<br />
for (i=0;i<4;i++)<br />
printf("%s\n",&TabelaUsuarios[i][0]);<br />
}<br />
</syntaxhighlight><br />
<br />
Note a forma como é realizada a inicialização da matriz.<br />
<br />
;Exercícios Parte 2<br />
<br />
1. Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.<br />
{{collapse top|Reposta}}<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
<br />
char tabelaUsuarios[4][10] = {<br />
"joao",<br />
"maria",<br />
"josefina",<br />
"lara",<br />
};<br />
<br />
int str_cmp(char str1[],char str2[])<br />
{<br />
int i=0;<br />
<br />
while(str1[i]!=0 && str2[i]!=0) {<br />
if (str1[i]!=str2[i])<br />
break; <br />
i++;<br />
}<br />
if(str1[i]==0 && str2[i]==0) <br />
return 0; // Perceba que retorna "0" quando as strings forem iguais<br />
else<br />
return 1; // e "1" quando forem diferentes (tomem cuidado com o entendimento)<br />
<br />
}<br />
<br />
main()<br />
{<br />
<br />
int i;<br />
char nome[10];<br />
<br />
printf("Entre com seu USERID\n");<br />
scanf("%s", nome);<br />
for (i=0;i<4;i++) {<br />
if (str_cmp(nome,&tabelaUsuarios[i][0])==0) {<br />
break;<br />
}<br />
}<br />
if (i==4)<br />
printf("Usuário não existente!\n"); <br />
else<br />
printf("abrir a porta\n"); <br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
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.<br><br />
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".<br><br />
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).<br><br />
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.<br><br />
<br />
{{collapse top|Exercício MEGASENA}}<br />
<syntaxhighlight lang=c><br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <time.h><br />
<br />
#define NUM_JOGOS 8<br />
#define NUMS_MEGA 6<br />
<br />
int matriz_jogos[NUM_JOGOS][NUMS_MEGA];<br />
<br />
int gerar_num_al()<br />
{<br />
return (rand()%60 + 1);<br />
}<br />
<br />
int testar_num(int numero, int vetor[NUMS_MEGA], int limite)<br />
{<br />
int i=0;<br />
for (i=0;i<limite;i++) {<br />
if (vetor[i]==numero)<br />
return 1;<br />
}<br />
return 0;<br />
}<br />
<br />
void ordenar_vetor(int vetor[NUMS_MEGA])<br />
{<br />
<br />
}<br />
<br />
void imprimir_matriz()<br />
{<br />
int i,j;<br />
<br />
for(i=0;i<NUM_JOGOS;i++) {<br />
for(j=0;j<NUMS_MEGA;j++)<br />
printf("%d ", matriz_jogos[i][j]);<br />
printf("\n");<br />
}<br />
<br />
}<br />
<br />
int gerar_jogo(int num_jogo)<br />
{<br />
int i, num_al;<br />
<br />
matriz_jogos[num_jogo][0] = gerar_num_al();<br />
for(i=1;i<6;i++) { <br />
do {<br />
num_al = gerar_num_al();<br />
} while(testar_num(num_al, matriz_jogos[num_jogo],i));<br />
matriz_jogos[num_jogo][i]=num_al;<br />
}<br />
}<br />
<br />
main()<br />
{<br />
int i;<br />
<br />
srand ( time(NULL) );<br />
<br />
for (i=0;i<NUM_JOGOS;i++)<br />
gerar_jogo(i);<br />
imprimir_matriz();<br />
}<br />
</syntaxhighlight><br />
{{collapse bottom}}<br />
<br />
<br />
<br />
-----<br />
[[Imagem:icone_voltar.png|link=PRG122804_2019_2_AULA09]]<br />
[[Imagem:icone_menu.png|link=PRG122804_2019_2#Aulas]]<br />
[[Imagem:icone_prox.png|link=PRG122804_2019_2_AULA11]]</div>Douglas