PR1022804 2024 1 AULA09

De MediaWiki do Campus São José
Revisão de 16h47min de 25 de março de 2024 por Douglas (discussão | contribs) (Criou página com '=Vetores e Matrizes em linguagem C= ;OBJETIVOS :O aluno deverá: :*Compreender o conceito de vetores; :*Definir e inicializar vetores do tipo int, float e double no C; :*P...')
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
Ir para navegação Ir para pesquisar

Vetores e Matrizes em linguagem C

OBJETIVOS
O aluno deverá:
  • Compreender o conceito de vetores;
  • Definir e inicializar vetores do tipo int, float e double no C;
  • Passar vetores como parâmetro sem usar o conceito de ponteiros;
  • Saber como utilizar vetores de char (string);
  • Definir e operar matrizes no C; e
  • Passar matrizes como parâmetros.


METODOLOGIA
A aula será expositiva e dialogada, utilizando apresentação de texto base na Internet, onde serão mostrados exemplos testados programas no microcomputador do laboratório de informática.


INTRODUÇÃO
O vetor é uma estrutura de dados indexada, que pode armazenar uma determinada quantidade de valores do mesmo tipo. Os dados armazenados em um vetor são chamados de itens do vetor. Para localizar a posição de um item em um vetor usamos um número inteiro denominado índice do vetor. Na linguagem C os vetores também são chamados de Arrays.

Arrays Unidimensionais (Vetores)

Um vetor pode ser visto como uma variável que pode ser indexada e onde em cada posição existe um elemento do vetor. Os elementos do vetor possuem um tipo único. Uma boa analogia é comparar o vetor com uma tabela de tamanho fixo onde em cada linha pode ser armazenado um elemento.

PROBLEMA
Ler 10 números inteiros para um vetor de inteiros. Computar um segundo vetor que é o resultado da multiplicação por um escalar inteiro 5.
DADO DE ENTRADA
Os 10 números armazenados em VET1
DADO DE SAÍDA
VET2, o vetor resultado da multiplicação de VET1 por 5.


ExplicacaoVetor1.jpg
EXEMPLO 1
Implementar um algoritmo (pseudo-código) para ler 10 números inteiros para um vetor e imprimir o número de números acima da média.
NOTE
Definir um contador, iniciado em zero. Calcular a média e fazer um loop sobre o vetor testando cada item para verificar se é maior que a média.
EXEMPLO 1 - Programa em C
#include <stdio.h>
 
void main()
{
	int i=0,am=0;
	int vet1[10];
	float media=0;

	for(i=0;i<10;i++) {
		printf("Entre com a nota %d => ",i+1);
		scanf("%d",&vet1[i]);
		media = media+vet1[i];
	}
	media = media/i;
	for( i=0;i<10;i++) {
		if (vet1[i]>media)
		   am++;
	}
	printf("Media=%0.1f. O número de notas acima da média é %d.\n",media,am);
}


EXEMPLO 2
Implementar um algoritmo (pseudo-código) para ler 10 números inteiros para um vetor e imprimir o maior e o menor número digitado.
NOTE
É possível implementar marcando a posição do vetor que possui o maior e o menor valor ou o próprio valor máximo e mínimo.
EXEMPLO 2 - Programa em C
#include <stdio.h>
 
void main()
{
	int i=0,am=0;
	int vet1[10];
	int max=0,min=0;
 
	for(i=0;i<10;i++) {
		printf("Entre com a nota %d => ",i+1);
		scanf("%d",&vet1[i]);
	}
	
	for( i=0;i<10;i++) {
		if (vet1[i]>vet1[max])
			max=i;
		if (vet1[i]<vet1[min])
			min=i;
	}
	printf("Menor número: %d. Maior número: %d.\n",vet1[min],vet1[max]);
}

Definindo e usando vetores no C

Um vetor pode ser facilmente definido no C da forma:

TipoVetor NomeDoVetor[dimensao];

O algoritmo do fluxograma implementado anteriormente ficaria da seguinte forma em C:

#include <stdio.h>

void main()
{
  int vet1[5],vet2[5];
  int i;

  for(i=0;i<5;i++) {
     printf("Entre com vet[%d] => ",i);
     scanf("%d",&vet1[i]);
     vet2[i]=vet1[i]*5;
  }
  /* para conferir- vamos imprimir o conteúdo de vet2 */
  for(i=0;i<5;i++)
     printf("vet2[%d] => %d\n",i,vet2[i]);
}

Vamos a um exemplo que mostra as possibilidades de acesso a um vetor:

#include <stdio.h>
 
void main()
{
  float x[10]; /* vetor com 10 floats */
  int i;
  x[0] = 22.5; /* colocando 22.5 na posição 0 do vetor */
  x[9] = x[0] + 2.5;
  printf("Entrar com o número na posição 5\n");
  scanf("%f",&x[5]);
  i=2;
  x[i*2]=i*1.5;        /* usando uma expressão como índice */
 
  while (i<8) {        /* usando loop para acessar o vetor */
     x[i]=0.0;
     i++;
  }
  for(i=0;i<10;i++)
  	printf("\nValor de x[%d]=%0.1f",i,x[i]);
  	
}
NOTA
Vetores na Linguagem C começam SEMPRE na posição 0.


Iniciando vetores em C

Pode-se iniciar um vetor da forma:

#include <stdio.h>

void main()
{
  int x[10] = {2,4,7,-5,3,2,3,4,9,10};

  printf("%d\n", x[2]);
}


Passando vetores como parâmetros

Vetores não são copiados na passagem por parâmetro. Eles são passados sempre como referência. Veja o exemplo a seguir:

#include <stdio.h>

void ler_vet(int aux[5])
{
  int i;

  for (i=0;i<5;i++) {
     printf("aux[%d] <== ",i);
     scanf("%d",&aux[i]);
  } 
}

void main()
{
   int vet[5], i;

   ler_vet(vet);
   for (i=0;i<5;i++)
      printf("vet[%d]=%d\n",i,vet[i]);
}

Perceba como é realizada a declaração de parâmetros que são vetores. Observe no exemplo, que o vetor aux é na realidade o próprio vetor vet. Inicialmente dados são lidos para aux e depois vet é impresso.

Não é obrigatório definir o tamanho do vetor na declaração de parâmetros. Atenção! Na realidade o C não verifica o acesso indevido a um elemento fora do tamanho do vetor.



EXERCÍCIOS
1. Implementar um programa em C para ler 10 números reais (float) para um vetor. Usar o comando while.
Resposta
#include <stdio.h>

void main()
{
	float x[10];
	int i;

 	i=0;
 	while (i<10) {
		printf("Entre com x[%d] -> ", i);
		scanf("%f",&x[i]);
 		i++;
	}	
}
2. Modificar o exercício para computar a média dos 10 números que estão no vetor.
3. Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média.
Resposta
#include <stdio.h>
void main()
{
	float x[10];
	float soma = 0, media; 
	int i, cont;
 
	/* leitura do vetor */
 	i=0;
 	while (i<10) {
		printf("Entre com x[%d] -> ", i);
		scanf("%f",&x[i]);
		soma = soma + x[i];
 		i++;
	}	
   
	/* calculo da media */
	media = soma /10;

	/* computação de números acima da média */
	cont = 0;
 	i=0;
 	while (i<10) {
		if (x[i] > media) 
	           cont++;
		i++;
	}	
	printf ("Número de números acima da média = %d\n", cont);
}
4. Refazer os exercícios anteriores usando o comando for.
5. Considere um vetor global de floats chamado vetRnd de tamanho 100. Construa uma função que inicia este vetor com 100 números randômicos entre 1 e 6.
6. Sobre o exercício anterior, acrescente uma função para imprimir o número de 0s,1s,...6s do vetor.
7. Implementar uma função que recebe dois vetores de inteiros como parâmetro e o tamanho dos mesmos (suponha vetores de mesmo tamanho). A função deve retornar o número de elementos iguais comparados posição por posição. O esqueleto da função deve ser como:
Resposta
int compara_vetores(int ve1[],int vet2[], int tamanho)
{
  int num_elementos;

  return num_elementos;
}
Exemplo: Para os vetores x[]={1,1,3,4,5} e y[]={1,2,3,3,5} temos três elementos iguais (nas posições 0, 2 e 4).

Vetores do Tipo Char

Em aulas anteriores viu-se que um caracter pode ser representado por uma sequência de bits. Utilizando um código é possível definir o significado da sequência. Um código amplamente usado é o ASCII. Com 8 bits (7 no Ascii original) tem-se então a possibilidade de representar qualquer letra, número, ou símbolo (vírgula, ponto-e-vírgula etc). Note que um número representado em ASCII NÃO serve para realizar operações aritméticas. Trata-se de representação textual, por exemplo, um dígito de um número telefone.

Em síntese, uma variável do tipo caracter é tratada como um número inteiro e declarada com o tipo char, que na prática é um número inteiro de byte.

EXEMPLO
#include <stdio.h>
 
void main ()
{
  char x='A',y=65,w=0x41,z; /* três formas de representar a mesma coisa */

  printf("Digite um caracter: ");
  scanf("%c",&z);
  printf("Caracter lido = %c\n",z);
  printf("Caracter lido = %d\n",z);
  printf("Caracter lido = %x\n",z);
  if (z==x)
      printf("Iguais 1\n");
  if (z==y)
      printf("Iguais 2\n");
  if (z==w)
      printf("Iguais 3\n");
}

Armazenamento de cadeias de caracteres em vetores

Uma cadeia de caracteres ou string nada mais é que uma sequência de caracteres ASCII. Para mantermos coerência com a linguagem C, vamos assumir que uma string bem comportada termina com um zero (0, não o caracter '0' que é o número 48 decimal em ASCII). Em inglês chama-se "string NULL terminated". Em algumas bibliografias e referências pode-se encontrar também: '\0'.

Exemplo: A string "IFSC" armazenada em um vetor CADEIA, na memória de um computador, teria a seguinte implementação:

ExplicacaoString1.jpg

Assumi-se que cada caracter é armazenado em um byte. Uma string terminada em 0 facilita o seu processamento pois se pode facilmente detectar o seu final. Note no exemplo acima, que a string está armazenada em um vetor CADEIA cujo tamanho excede ao da string. Os bytes que se seguem ao zero podem ser considerados lixo.

Processando cadeias de caracteres

Sabendo como uma string é armazenada na memória de um computador torna-se fácil processá-la. Por exemplo, vamos ver um algoritmo para contar o número de caracteres de uma string lida pelo teclado para dentro de um vetor CADEIA.


FluxogramaContadorCaracteresCadeia.jpg



EXERCÍCIOS
1. Colocar o procedimento acima na forma de um subprograma (função) que recebe como parâmetro o vetor e retorna um número inteiro correspondente ao tamanho da cadeia.
2. Elaborar um fluxograma para computador o número de ocorrências do caracter 'b' em uma string lida pelo teclado. Apresentá-lo na forma de um subprograma que retorna o número de ocorrências.
3. Estude a tabela ASCII e elabore um fluxograma para capitalizar todos os caracteres minusculos de uma string lida pelo teclado. Apresentá-lo como subprograma.

Função gets()

Esta função é utilizada em substituição ao scanf().

FORMA GERAL
char s[ ];
gets(s);

O usuário entra com uma string, que será armazenada no vetor char s[]. A função gets() não é segura, por quê? Simplesmente porque com gets() pode ocorrer um estouro da quantidade de posições que foi especificada na string. Veja o exemplo abaixo:

#include <stdio.h>
void main()
{
    char buffer[10];
    printf("Entre com o seu nome: ");
    gets(buffer);
    printf("O nome é: %s\n", buffer);
}

Se o usuário digitar como entrada:

Douglas de Souza

Ou seja, digitar um total de 16 caracteres: 17 posições (incluindo o '\0' ) serão utilizadas para armazenar a string. Como a string buffer[10] só tem 10 caracteres, os 7 caracteres adicionais serão colocados na área de memória subsequente, escrevendo em uma região de memória que não está reservada para string. Este efeito é conhecido como "estouro de buffer" e pode causar problemas imprevisíveis. Uma forma de se evitar este problema é usar a função fgets().

Vetor de Char ou String

É possível definir vetores do tipo char. Tais vetores permitem definir cadeias de caracteres. Para marcar um final de cadeia usa-se o número '\0' (NULL),

EXEMPLO
Fazer um programa para computar o número de caracteres de uma cadeia (string) lida pelo teclado.Use o comando while.
#include <stdio.h>
void main ()
{
   char alfa[50];

   int i=0;

   printf ("Entre com a cadeia: ");
   gets(alfa);
   while(alfa[i]!=0)
	i++;
   printf ("\nNumero de caracteres em %s = %d \n", alfa, i);
}



EXERCÍCIOS
1. Implementar um programa que computa o número de caracteres 'a' de uma string lida pelo teclado.
Solução
#include <stdio.h>
void main ()
{
   char alfa[50];
   int cont;
   int i=0;

   printf ("Entre com a cadeia: ");
   gets(alfa);

   cont=0;
   while(alfa[i]!=0){
        if (alfa[i]=='a')
            cont++;
	i++;
   }
   printf ("\nNumero de caracteres a em %s = %d \n", alfa, cont);
}
2. Implementar um programa que computa o número de ocorrências das subcadeias "ab" de uma string lida pelo teclado.
Solução
#include <stdio.h>
void main ()
{
   char alfa[50];
   int cont;
   int i=0;

   printf ("Entre com a cadeia: ");
   gets(alfa);

   cont=0;
   while(alfa[i]!=0){
        if (alfa[i]=='a' && alfa[i+1]=='b') {
            cont++;
            i++; /* avançar uma posição */
        }
	i++;
   }
   printf ("\nNumero de subcadeias ab em %s = %d \n", alfa, cont);
}
3. Implementar um programa que substitui todos os 'o' de uma cadeia por 'O.
Solução
#include <stdio.h>
void main ()
{
   char alfa[50];
   int cont;
   int i=0;

   printf ("Entre com a cadeia: ");
   gets(alfa);

   cont=0;
   while(alfa[i]!=0){
        if (alfa[i]=='o')
            alfa[i]='O';
	i++;
   }
   printf ("\nNova cadeia -> %s\n", alfa);
}
4. Implementar um programa que lê duas cadeias e conta o número de caracteres iguais ocupando a mesma posição. Exemplo: suponha as cadeias "casa" e "amora". Não existem caracteres iguais na mesma posição. Já as cadeias "casa" e "cada" possuem três caracteres iguais na mesma posição.
Solução
#include <stdio.h>
void main ()
{
   char alfa[50], beta[50];
   int cont;
   int i=0;
 
   printf ("Entre com a cadeia:\n");
   gets(alfa);

   printf ("Entre com a cadeia:\n");
   gets(beta);
    
   cont=0;
   while(alfa[i]!=0 && beta[i]!=0){
        if (alfa[i]==beta[i])
            cont++;
	i++;
   }
   printf ("\nNumero de caracteres iguai em %s e %s na mesma posicao é %d \n", alfa, beta, cont);
}
a) Modificar o exercício anterior para que os caracteres não iguais sejam intercambiados (mas continue respeitando os finais das cadeias). Exemplo: "casa" e "malagueta" deve resultar em "mala" e "casagueta"
b) Implementar um programa que lê duas cadeias e imprime uma mensagem caso as cadeias seja iguais.
5. Ler um vetor de 10 números inteiros e colocar em ordem crescente.
Solução 5
#include <stdio.h>
 
void mostra_vet(int vet_aux[],int tam,int tipo) // tipo=0 vertical \n tipo=1 horizontal \t
{
  int i;
 
  if(tipo==0)
	printf("\n"); // vai deixar uma linha em branco só no tipo que quero.
  for(i=0;i<tam;i++)
    if(tipo==0)
      	printf("\n%d",vet_aux[i]);
    else
	printf("\t%d",vet_aux[i]);
  printf("\n");
}

void main()
{
  int i,j,num,vet_num[10];
  printf("\nDigite os números:\n");
  for(i=0;i<10;i++){
      scanf("%d",&num);
      vet_num[i]=num;
  }
  for(j=0;j<9;j++){		// varre os (10-1) vetores - o ultimo ele não tem que comparar
          for(i=0;i<(9-j);i++){ // depois da primeira passagem o ultimo elemento já é o maior...
              if(vet_num[i]>vet_num[i+1]){ 
                num=vet_num[i];
                vet_num[i]=vet_num[i+1];
                vet_num[i+1]=num;
              }
	      mostra_vet(vet_num,10,1); // mostra tipo=1 horizontal
          }
  }
  mostra_vet(vet_num,10,0); // mostrta tipo=0 verrtical
   
}
6. Ler um vetor de char e imprimir ao contrário os caracteres lidos. Exemplo: Marrocos >> socorraM
Solução 6
#include <stdio.h>

int tam_string(char texto[])
{
   int i=0;
   while(texto[i]!=0) 
	i++;
   return i;
}

void main()
{
   char alfa[50],beta[50];
   int tam,i;
 
   printf ("Entre com a cadeia : ");
   gets(alfa);
   tam=tam_string(alfa);	// pega o tamanho da cadeia de caracteres
   for(i=0;i<tam;i++)		// percorre o vetor até o tamanho
	beta[i]=alfa[tam-i-1];  // como começa de 0 eu preciso fazer (tam-i-1), ou seja, o primeiro é o ultimo
   beta[i]=0;			// preciso definir o final do vetor porque não vai até o ultimo que '\0'
   printf ("\nPrimeira cadeia: %s. Nova cadeia: %s\n", alfa, beta);
}
7. Ler um vetor de char e trocar de minúsculas para maiúsculas. Exemplo: douglas de souza >> DOUGLAS DE SOUZA
Solução 7
#include <stdio.h>
void main ()
{
   char alfa[50];
   int i=0;
 
   printf ("Entre com a cadeia em letras minúsculas: ");
   gets(alfa);
 
   while(alfa[i]!=0){
        if (alfa[i]!=32)		// na tabela ASCII 32 é o espaço em branco ' '.
            alfa[i]=alfa[i]-32; 	// na tabela ASCII maiúscula estão separadas de minúscula por 32.
	i++;
   }
   printf ("\nNova cadeia em maiúsculas: %s\n", alfa);
}
a) Modificar o programa para que ele faça também, palavras com iniciais maiúsculas. Exemplo: douglas de souza >> Douglas De Souza.
b) Modifique o programa para que ele reconheça as ligações como: de, da, dos, e,... do nome e desconsidere. Exemplo: maria da silva >> Maria da Silva.
Solução 7.a.b (contribuição do aluno: Pablo Fidelis Dias)
#include <stdio.h>
void main ()
{
   char alfa[50];
   int i=0;
 
   printf ("Entre com a cadeia em letras minúsculas: ");
   gets(alfa);
 
   alfa [0]=alfa[i]-32;

   while(alfa[i]!=0){
        if (alfa[i]==32){
            if (!(alfa[i+1]=='d' && (alfa[i+3]==32 || alfa[i+4]==32)))
                alfa[i+1]=alfa[i+1]-32; 
        }
        i++;
   }
   printf ("\nNome: %s\n", alfa);
}


8. O cálculo do juro composto é dado pela seguinte equação:
Onde PV é o valor presente, n o número de períodos de aplicação, i a taxa de juros e FV o valor futuro. Elabore um programa para computar o valor futuro para uma quantia aplicada de 10000 reais, dada uma taxa e o número de anos em que o valor é aplicado.
9. Refazer o exercício anterior armazenando o valor futuro de cada ano em uma posição de um vetor valores_futuros[]. Na posição 0 armazene o valor presente.
10. Gerar um vetor de 6 posições de inteiros e preenchê-lo com 6 números randômicos correspondentes a um jogo da megasena.
Solução 10
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main(void)
{
    int i;
    printf("intervalo da rand: [0,%d]\n", RAND_MAX); // para megasena é de 1 a 60
 
    for(i=0;i<6;i++) 
        printf("Numero %d: %d\n",i, rand());  // tem que ajustar para 59+1
 
}
11. Fazer uma função adendo ao exercício anterior para ordenar o vetor gerado.
12. Adicionar uma interface para o exercício anterior para que um usuário possa entrar com 6 números de um jogo e o sistema conferir se o jogador ganhou ou não.
13. Implementar um sistema de controle de senha que permite abrir a porta para um usuário específico (userID) com uma senha específica.

Arranjos Multidimensionais (Arrays)

Os Arrays Multidimensionais, também chamados de matrizes, são estruturas de dados que possuem duas ou mais dimensões. Em resumo, temos que um Array que contém uma única dimensão (vetor) funciona internamente como um Array multidimensional. A diferença está na quantidade de índices que cada elemento da nossa estrutura terá como identificador (veremos mais tarde).

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
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.
Solução
#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].
Solução
#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 os exemplos a seguir:

EXEMPLO 1
#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.

EXEMPLO 2
#include <stdio.h>

void somar_mat(int m1[][3],int m2[][3], int m3[][3]);
void imprimir_mat(int mat[][3]);

void main()
{
  int mA[2][3]={ 11,12,13,
                 21,22,23},
      mB[2][3]={1,2,3,
                1,2,3},
      mC[2][3]={4,5,6,
                7,8,9 },
      mR[2][3];
  int i,j;
 somar_mat(mA,mB,mR); // somar matrix A com B
 imprimir_mat(mR);
 somar_mat(mB,mC,mR);
 imprimir_mat(mR);
 somar_mat(mA,mC,mR);
 imprimir_mat(mR);
}

void somar_mat(int m1[][3],int m2[][3], int m3[][3])
{
  int i,j;

  for(i=0;i<2;i++){
     for(j=0;j<3;j++) {
        m3[i][j] = m1[i][j] + m2[i][j];
     }
  }
}

void imprimir_mat(int mat[][3]){
  int i,j;
  for(i=0;i<2;i++){
     for(j=0;j<3;j++) {
        printf("%d\t",mat[i][j]);
     }
     printf("\n");
  }
  printf("\n");
}



EXERCÍCIOS
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.
a) 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.
b) Crie um contador global de tiros iniciado com 0.
c) 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).
d) 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()
{
}

void 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>

void 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.

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)
  
}
        
void 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;
  }
}

void main()
{
  int i;
 
  srand ( time(NULL) );
        
  for (i=0;i<NUM_JOGOS;i++)
      gerar_jogo(i);
  imprimir_matriz();
}




Icone voltar.png Icone menu.png Icone prox.png