Mudanças entre as edições de "PRG122804 2018 1 AULA10"
Ir para navegação
Ir para pesquisar
Linha 124: | Linha 124: | ||
Exercício | Exercício | ||
− | + | 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.<!-- | |
+ | {{collapse top|Programa em C}} | ||
+ | <syntaxhighlight lang=c> | ||
#include <stdio.h> | #include <stdio.h> | ||
Linha 157: | Linha 159: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | {{collapse bottom}} | |
+ | |||
1. Implementar uma programa para calcular o determinante de uma matriz 3x3 (de reais) a ser fornecida pelo teclado. | 1. Implementar uma programa para calcular o determinante de uma matriz 3x3 (de reais) a ser fornecida pelo teclado. |
Edição das 14h23min de 2 de maio de 2018
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 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ícios
- 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.
- implementar um programa para calcular a média de todos elementos da matriz C do exemplo acima.
#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].
#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
Como matrizes também são vetores, a mesma característica da passagem de parâmetros é considerada. Observe o exemplo a seguir:
#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
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.
|}
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; // Perceba que retorna "0" quando as strings forem iguais else return 1; // e "1" quando forem diferentes (tomem cuidado com o entendimento) } 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();
}