Mudanças entre as edições de "PRG122804 2019 1 AULA10"
(Criou página com ' ----- link=PRG122804_2019_1_AULA09 link=PRG122804_2019_1#Aulas link=PRG122804_2019_1_AULA11') |
|||
Linha 1: | Linha 1: | ||
+ | =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: | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #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]; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ;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.<syntaxhighlight lang=c> | ||
+ | #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; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | #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> | ||
+ | #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]); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | =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: | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #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); | ||
+ | |||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | '''OBSERVE''' que matrizes são sempre passadas como referência. | ||
+ | |||
+ | ;Exercícios Parte 1: | ||
+ | |||
+ | 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|Resposta}} | ||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | |||
+ | |||
+ | float media_soma_mat(int aA[][3],int aB[][3]) | ||
+ | { | ||
+ | int i,j; | ||
+ | int soma_ac=0; | ||
+ | /*int cC[2][3];*/ | ||
+ | |||
+ | for(i=0;i<2;i++){ | ||
+ | for(j=0;j<3;j++) { | ||
+ | /*cC[i][j] = aA[i][j] + aB[i][j];*/ | ||
+ | soma_ac = soma_ac +aA[i][j] + aB[i][j]; | ||
+ | } | ||
+ | } | ||
+ | return (soma_ac/6.0); | ||
+ | } | ||
+ | |||
+ | void main() | ||
+ | { | ||
+ | int mA[2][3]={ | ||
+ | 11,12,13, | ||
+ | 21,22,23}, | ||
+ | mB[2][3]={ | ||
+ | 1,2,3, | ||
+ | 1,2,3}; | ||
+ | float media; | ||
+ | |||
+ | media = media_soma_mat(mA,mB); | ||
+ | |||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | {{collapse bottom}} | ||
+ | |||
+ | 2. Implementar uma programa para calcular o determinante de uma matriz 3x3 (de reais) a ser fornecida pelo teclado.<br> | ||
+ | 3. Implementar um programa para ler duas matrizes (''matA'' e ''matB'') e multiplicá-las, colocando o resultado em uma matriz matC.<br> | ||
+ | 4. Vamos implementar um jogo similar a batalha naval da seguinte forma.<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> | ||
+ | :4.2. Crie um contador global de tiros iniciado com 0.<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> | ||
+ | :4.4. Ao final do jogo é mostrado o nome do jogador, o número de tiros dados e a pontuação obtida.<br> | ||
+ | {{collapse top|Resposta}} | ||
+ | <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; | ||
+ | } | ||
+ | |||
+ | } | ||
+ | --> | ||
+ | {{collapse bottom}} | ||
+ | |||
+ | =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]); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Note a forma como é realizada a inicialização da matriz. | ||
+ | |||
+ | ;Exercícios Parte 2 | ||
+ | |||
+ | 1. Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima. | ||
+ | {{collapse top|Reposta}} | ||
+ | <syntaxhighlight lang=c> | ||
+ | #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"); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | {{collapse bottom}} | ||
+ | 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> | ||
+ | 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> | ||
+ | 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> | ||
+ | 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> | ||
+ | |||
+ | {{collapse top|Exercício MEGASENA}} | ||
+ | <syntaxhighlight lang=c> | ||
+ | #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(); | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | {{collapse bottom}} | ||
+ | |||
+ | |||
----- | ----- |
Edição das 15h02min de 10 de abril de 2019
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ícios Parte 1
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.
Resposta |
---|
#include <stdio.h>
float media_soma_mat(int aA[][3],int aB[][3])
{
int i,j;
int soma_ac=0;
/*int cC[2][3];*/
for(i=0;i<2;i++){
for(j=0;j<3;j++) {
/*cC[i][j] = aA[i][j] + aB[i][j];*/
soma_ac = soma_ac +aA[i][j] + aB[i][j];
}
}
return (soma_ac/6.0);
}
void main()
{
int mA[2][3]={
11,12,13,
21,22,23},
mB[2][3]={
1,2,3,
1,2,3};
float media;
media = media_soma_mat(mA,mB);
}
|
2. Implementar uma programa para calcular o determinante de uma matriz 3x3 (de reais) a ser fornecida pelo teclado.
3. Implementar um programa para ler duas matrizes (matA e matB) e multiplicá-las, colocando o resultado em uma matriz matC.
4. Vamos implementar um jogo similar a batalha naval da seguinte forma.
- 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.
- 4.2. Crie um contador global de tiros iniciado com 0.
- 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).
- 4.4. Ao final do jogo é mostrado o nome do jogador, o número de tiros dados e a pontuação obtida.
Resposta |
---|
/*
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 Parte 2
1. Implementar um programa para "abrir uma porta" para um usuário que se encontra na tabela acima.
Reposta |
---|
#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");
}
|
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.
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.
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();
}
|