AULA 9 - Programação 1 - Engenharia

De MediaWiki do Campus São José
Revisão de 08h40min de 26 de setembro de 2019 por 127.0.0.1 (discussão) (ARRAYS unidimensionais (vetores))
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;

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

Exercício

Implementar um algoritmo 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. Calcular a media e fazer um loop sobre o vetor testando cada item para verificar se é maior que a média.

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>

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++;
  }
}

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

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

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

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

Note 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. 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++) {
    		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++;
    	}	
    	return cont;
    }
    
    main()
    { 
    	float vet[10];
    	int nums;
    
    	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);
    
    
    }
    
    |}