Mudanças entre as edições de "AULA 13 - Programação 1 - Graduação"

De MediaWiki do Campus São José
Ir para: navegação, pesquisa
(Matrizes de caracteres e vetores de strings)
Linha 1: Linha 1:
===Objetivos===
+
==Objetivos==
  
*Definindo matrizes no C
+
*Definindo matrizes no C;
*Operações com matrizes e passagem de parâmetros tipo matriz
+
*Operações com matrizes e passagem de parâmetros tipo matriz;
*Matrizes com caracteres
+
*Matrizes com caracteres.
*Exercícios
 
  
===Como definir e operar com matrizes no C===
+
 
 +
==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.
 
De forma similar ao vetor, basta definir a matriz usando colchetes para indicar a dimensão da variável.
Linha 33: Linha 33:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Exercício
+
;Exercício
  
 
#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.
 
#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.
Linha 90: Linha 90:
 
    
 
    
  
===Passando matrizes como parâmetro===
+
==Passando matrizes como parâmetro==
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
Linha 120: Linha 120:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
OBSERVE que matrizes são sempre passadas como referência.
+
'''OBSERVE''' que matrizes são sempre passadas como referência.
  
 
Exercício
 
Exercício
Linha 165: Linha 165:
 
##Crie um contador global de tiros iniciado com 0.
 
##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).
 
##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.
+
##Ao final do jogo é mostrado o nome do jogador, o número de tiros dados e a pontuação obtida.
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
Linha 332: Linha 332:
  
  
===Matrizes de caracteres e vetores de strings===
+
==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
 
Um vetor de strings pode ser construído usando matrizes de ''char''. Cada string será armazenada em uma linha do vetor. Exemplo
Linha 408: Linha 408:
 
#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.
 
#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
+
;Exercício MEGASENA
  
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>

Edição das 09h51min de 7 de abril de 2015

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ício
  1. 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.
  2. 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;
    }
    
  3. 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

#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.
  1. Implementar uma programa para calcular o determinante de uma matriz 3x3 (de reais) a ser fornecida pelo teclado.
  2. Implementar um programa para ler duas matrizes (matA e matB) e multiplicá-las, colocando o resultado em uma matriz matC.
  3. Vamos implementar um jogo similar a batalha naval da seguinte forma.
    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.
    2. Crie um contador global de tiros iniciado com 0.
    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. Ao final do jogo é mostrado o nome do jogador, o número de 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

  1. 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");   
    }
    
  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();
}



<< Aula 13 <>