AULA 9 - Programação 1 - Engenharia

De MediaWiki do Campus São José
Revisão de 16h22min de 12 de julho de 2021 por Eraldo (discussão | contribs) (Passando vetores como parâmetros)
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
Ir para: navegação, pesquisa

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;
  • implementar algoritmos simples usando vetores.

ARRAYS unidimensionais (vetores)

Um vetor pode ser visto como uma variável (uma caixa) dividida em partes menores (CAIXAS menores) acessadas por um índice (posição). Em termos mais técnicas cada elemento do vetor pode ser acessado através da indexação do vetor. Os elementos do vetor possuem um tipo único.

PRG1-vetor armario.png

Uma boa analogia é comparar o vetor com uma tabela de tamanho fixo onde em cada linha pode ser armazenado um elemento.

PRG1-tabela vetor.png

PROBLEMA: Ler 5 números inteiros para um vetor de inteiros (VET1). Computar um segundo vetor (VET2) que é o resultado da multiplicação do primeiro vetor por um escalar inteiro 5.

DADO DE ENTRADA: Os 5 números armazenados em VET1 (nome do vetor onde serão armazenados os dados)

DADO DE SAÍDA: VET2, o vetor onde serão armazenados os resultados da multiplicação de cada elemento VET1 por 5.

750px


Definindo e usando vetores no C

Um vetor pode ser facilmente definido no C da forma:

TipoVetor NomeDoVetor[dimensao];

O algoritmo do fluxograma da multiplicação de um vetor por 5 implementado anteriormente ficaria da seguinte forma em C:

#include <stdio.h>

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

  /* ler da entrada padrão e colocar dados no vetor 1. Multiplicar valor lido por 5 e colocar no vetor 2*/
  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:

main()
{
  float x[10]; /* vetor com 10 floats */
  int i;

  x[0] = 22.5; /* colocando a constante 22.5 na posição 0 do vetor */

  x[9] = x[0] + 2.5; /* operando com a posição zero e colocando resultado na posição 9 */

  printf("Entrar com o número na posição 5\n");
  scanf("%f",&x[5]);

  i=2;
  x[i*2]=x[i]*1.5;        /* usando uma expressão como índice */
  
  i=0;
  while (i<8) {        /* usando loop para acessar o vetor */
     x[i]=0.0;
     i++;
  }
  return 0;
}

NOTA: Um vetor de tamanho N, na Linguagem C, começa SEMPRE na posição 0 indo até a posição N-1

Exercício de Fixação

Implementar um programa C para ler 10 números inteiros para um vetor e imprimir o número de números acima da média.

OBS: Definir um contador, iniciado em zero. Ler os 10 números para um vetor e calcular a media. Fazer um segundo loop sobre o vetor testando cada item para verificar se é maior que a média. Incrementar o contador a cada item acima da média.

Este problema exige que os dados sejam armazenados previamente de forma que a média calculada possa posteriormente ser usada para a computação da quantidade de números que estão acima da média.

DADOS DE ENTRADA: 10 números a serem fornecidos.. DADOS DE SAÍDA: Quantidade de números acima da média.

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

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

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

   return 0;
}

Note como é realizada a declaração de parâmetros que são vetores. Observe no exemplo, que o vetor aux, durante a execução da função ler_vet é 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. 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.
    Solução - Exercício 01
    //Autor: Victor Cesconetto De Pieri
    
    #include <stdio.h>
    
    main()
    {
    	float x[10];
    	int i;
    
     	i=0;
     	while (i<10) {//while varre da posicao 0 a posicao 9 do vetor
    		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. Solução - Exercício 02
    //Autor: Victor Cesconetto De Pieri
    
    #include <stdio.h>
     
     
    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;
            printf("media: %f\n",media);
    }
    
  4. Modificar o exercício anterior para computar a quantidade de números do vetor que estão acima da média.
    Solução - Exercício 03
    //Autor: Victor Cesconetto De Pieri
    
    #include <stdio.h>
    
    
    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);
    }
    
  5. Refazer os exercícios anteriores usando o comando 'for'.
  6. Solução - Exercício 04
    #include <stdio.h>
    //exercicio01 
    main()
    {
    	float x[10];
    	int i;
     
     	
     	for (i=0;i<10;i++) {//while varre da posicao 0 a posicao 9 do vetor
    		printf("Entre com x[%d] -> ", i);
    		scanf("%f",&x[i]);
     	}	
    }
    
    //exercicio 02
    
    #include <stdio.h>
     
     
    main()
    {
    	float x[10];
    	float soma = 0, media; 
    	int i, cont;
     
    	/* leitura do vetor */
     	for(i=0;i<10;i++) {
    		printf("Entre com x[%d] -> ", i);
    		scanf("%f",&x[i]);
    		soma = soma + x[i];
     	}	
     
    	/* calculo da media */
    	media = soma /10;
        printf("media %f\n",media)
    }
    
    //exercicio 03
    
    
    #include <stdio.h>
     
     
    main()
    {
    	float x[10];
    	float soma = 0, media; 
    	int i, cont;
     
    	/* leitura do vetor */
     	
     	for(i=0;i<10;i++) {
    		printf("Entre com x[%d] -> ", i);
    		scanf("%f",&x[i]);
    		soma = soma + x[i];
     	}	
     
    	/* calculo da media */
    	media = soma /10;
     
    	/* computação de números acima da média */
    	cont = 0;
     	for(i=0;i<10;i++) {
    		if (x[i] > media) 
    	           cont++;
    	}	
    	printf ("Número de números acima da média = %d\n", cont);
    }
    
  7. Refazer o exercício anterior criando uma função onde o vetor é passado como parâmetro e o número de elementos maiores que a média é retornado. Considere o vetor de tamanho 10.
    Solução - Exercício 05
    //Autor: Victor Cesconetto De Pieri
    
    #include <stdio.h>
    
    int num_acima_media(float x[10])
    {
    
        float soma = 0, media;
        int i, cont;
    
        /* leitura do vetor */
        for (i=0;i<10;i++) {
            soma = soma + x[i];
    
        }
    
        /* calculo da media */
        media = soma /10;
    
        /* computação de números acima da média */
        cont = 0;
        for (i=0;i<10;i++) {
            if (x[i] > media)
                cont++;
        }
        return cont;
    }
    
    int main()
    {
        float vet[10];
        int i, nums;
    
        /* leitura do vetor */
        for (i=0;i<10;i++) {
            printf("Entre com vet[%d] -> ", i);
            scanf("%f",&vet[i]);
    
        }
    
        nums=num_acima_media(vet);
        printf("Números lidos em vet que estão acima da média = %d\n", nums);
    }
    
  8. Considere um vetor global de int chamado vetRnd de tamanho 100. Construa uma função que inicia este vetor com 100 números randômicos entre 1 e 6.
  9. Solução - Exercício 06
    //Autor: Victor Cesconetto De Pieri
    
    #include <stdio.h>
     
    #define TAM 100
     
    int vetRnd[TAM];
     
    void gerar_randomico()
    {
          int count[6]={0,0,0,0,0,0}, i;
     
          srand ( time(NULL) );
     
          for (i=0;i<TAM;i++) {
              vetRnd[i] = rand() % 6 + 1;
              printf("%d ", vetRnd[i]); 
              count[vetRnd[i]-1]++;
          }
          
    }
     
    main()
    {
          gerar_randomico();
    }
    
  10. Sobre o exercício anterior, acrescente uma função para imprimir o número de 1s,...6s do vetor.
    Solução - Exercício 07
    //Autor: Victor Cesconetto De Pieri
    
    #include <stdio.h>
    
    #define TAM 100
    
    int vetRnd[TAM];
     
    void gerar_randomico()
    {
          int count[6]={0,0,0,0,0,0}, i;
     
          srand ( time(NULL) );
     
          for (i=0;i<TAM;i++) {
              vetRnd[i] = rand() % 6 + 1;
              printf("%d ", vetRnd[i]); 
              count[vetRnd[i]-1]++;
          }
          printf("\n");
          for(i=0;i<6;i++)
              printf("Quantidade de %d é %d\n", i+1, count[i]);
     
    }
    
    main()
    {
          gerar_randomico();
    }
    
  11. 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: int compara_vetores(int vet1[],int vet2[], int tamanho) { int num_elementos; return num_elementos; } </syntaxhighlight> 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).
    Solução - Exercício 08
    #include<stdio.h>
    
    int compara_vetores(int vet1[],int vet2[], int tamanho)
    {
      int num_elementos;
      int i, j;
     	for(i=0;i<tamanho;i++){
    		for(j=0;j<tamanho;j++){
    			if(vet1[i]==vet2[j]){
    				num_elementos++;
    				break;//quando acha o primeiro elemento igual, passa para o próximo
    			}
    		}
        }	
      return num_elementos;
    }
    
    main(){
    
    int num_elementos,tam;
    int i;
    
    printf("Digite o tamanho dos dois vetores:\n");
    scanf("%d",&tam);
    
    int x[tam],y[tam];
    
    	for(i=0;i<tam;i++){
    		printf("Entre com x[%d] -> ", i);
    		scanf("%d",&x[i]);	
    		
    	}
    	for(i=0;i<tam;i++){
    		printf("Entre com y[%d] -> ", i);
    		scanf("%d",&y[i]);	
    	}
    
    num_elementos = compara_vetores(x,y,tam);
    printf("Há %d elementos iguais\n",num_elementos);
    
    
    }
    

DESAFIOS

  1. Faça um uma função C para computar e retornar o desvio padrão de uma população representada por um vetor de reais. Dois parâmetros serão passados: o vetor e o tamanho do vetor. Usar:
    (extraído da wikipedia [1])
    (extraído da wikipedia [2])
    SUGESTÃO: computar primeiramente a média OBS: Notar que o desvio padrão acima é de uma população. O desvio padrão de uma amostrausa a divisão por . Uma discussão para a dsiciplina da estatística. Para resolução deste exercício deve-se usar uma função de raiz quadrada (ver https://en.cppreference.com/w/c/numeric/math/sqrt)