Mudanças entre as edições de "Programação 1 - Engenharia - Arrays Multidimensionais"
Linha 727: | Linha 727: | ||
{{collapse top |Solução - Exercício 04}} | {{collapse top |Solução - Exercício 04}} | ||
+ | <!-- | ||
<syntaxhighlight lang=c> | <syntaxhighlight lang=c> | ||
//Autor: Victor Cesconetto De Pieri | //Autor: Victor Cesconetto De Pieri | ||
Linha 807: | Linha 808: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | --> | ||
{{collapse bottom}} | {{collapse bottom}} | ||
Linha 812: | Linha 814: | ||
{{collapse top |Solução - Exercício 05}} | {{collapse top |Solução - Exercício 05}} | ||
+ | <!-- | ||
<syntaxhighlight lang=c> | <syntaxhighlight lang=c> | ||
//Autor: Victor Cesconetto De Pieri | //Autor: Victor Cesconetto De Pieri | ||
Linha 913: | Linha 916: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | --> | ||
{{collapse bottom}} | {{collapse bottom}} | ||
6. Implementar um gerador de apostas para megasena. O programa deve armazenar 10 sugestões de jogos a serem armazenados em uma matriz. | 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:<syntaxhighlight lang=c> | + | Os números devem ser armazenados em ordem crescente. Sugestão: criar uma matriz global: |
+ | <syntaxhighlight lang=c> | ||
int matriz_megasena[10][6]; | int matriz_megasena[10][6]; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | {{collapse top |Solução - | + | {{collapse top |Solução - Exercício 06}} |
+ | <!-- | ||
<syntaxhighlight lang=c> | <syntaxhighlight lang=c> | ||
//Autor:Victor Cesconetto De Pieri | //Autor:Victor Cesconetto De Pieri | ||
Linha 1 001: | Linha 1 007: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | --> | ||
{{collapse bottom}} | {{collapse bottom}} | ||
7. Melhorar o exercício anterior para evitar que dois jogos sejam iguais. | 7. Melhorar o exercício anterior para evitar que dois jogos sejam iguais. | ||
− | {{collapse top |Solução - | + | {{collapse top |Solução - Exercício 07}} |
+ | <!-- | ||
<syntaxhighlight lang=c> | <syntaxhighlight lang=c> | ||
#include <stdio.h> | #include <stdio.h> | ||
Linha 1 112: | Linha 1 120: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | --> | ||
{{collapse bottom}} | {{collapse bottom}} | ||
8. Melhorar o exercício anterior para evitar que uma aposta tenha dois números na mesma dezena. | 8. Melhorar o exercício anterior para evitar que uma aposta tenha dois números na mesma dezena. | ||
− | {{collapse top |Solução - | + | {{collapse top |Solução - Exercício 08}} |
+ | <!-- | ||
<syntaxhighlight lang=c> | <syntaxhighlight lang=c> | ||
//Autor: Victor Cesconetto De Pieri | //Autor: Victor Cesconetto De Pieri | ||
Linha 1 197: | Linha 1 207: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | --> | ||
{{collapse bottom}} | {{collapse bottom}} | ||
9. Melhorar o exercício anterior para evitar que uma mesma aposta tenha números consecutivos. | 9. Melhorar o exercício anterior para evitar que uma mesma aposta tenha números consecutivos. | ||
− | {{collapse top |Solução - | + | |
+ | {{collapse top |Solução - Exercício 09}} | ||
+ | <!-- | ||
<syntaxhighlight lang=c> | <syntaxhighlight lang=c> | ||
//Autor:Victor Cesconetto De Pieri | //Autor:Victor Cesconetto De Pieri | ||
Linha 1 282: | Linha 1 295: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
+ | --> | ||
{{collapse bottom}} | {{collapse bottom}} | ||
10. Melhorar o exercício anterior colocando um switch para o usuário colocar as opções acima. | 10. Melhorar o exercício anterior colocando um switch para o usuário colocar as opções acima. |
Edição das 15h43min de 8 de outubro 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 média -
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 preenchimento Matriz
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ícios
- 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 - Exercício 03 -
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úmero de 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 - Exercício 01 |
---|
Solução - Exercício 02 |
---|
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.
- 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, acrescente 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 desbloquedo e o sistema volta a perguntar por um userID.
Solução - Exercício 01 |
---|
Solução - Exercício 02 |
---|
Solução - Exercício 03 |
---|
Solução - Exercício 04 |
---|
Solução - Exercício 05 |
---|
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 - Exercício 06 |
---|
7. Melhorar o exercício anterior para evitar que dois jogos sejam iguais.
Solução - Exercício 07 |
---|
8. Melhorar o exercício anterior para evitar que uma aposta tenha dois números na mesma dezena.
Solução - Exercício 08 |
---|
9. Melhorar o exercício anterior para evitar que uma mesma aposta tenha números consecutivos.
Solução - Exercício 09 |
---|
10. Melhorar o exercício anterior colocando um switch para o usuário colocar as opções acima.