Problemas usando vetores

Problema 1:

Dados n > 0 números inteiros, imprimi-los na ordem inversa a da leitura.
#include <stdio.h>
#define LIM 500

int main(){
  int n,i;
  int vet[LIM];

  printf("Entre com n: ");
  scanf("%d", &n);
  printf("Entre com %d elementos: ",n);
  for(i = 0; i < n; i++){
    scanf("%d", &vet[i]);
  }
  printf("Ordem inversa: ");
  for(i = n-1; i >= 0; i--){
    printf("%d ",vet[i]);
  }
  printf("\n");
  return 0;
}
  

Problema 2:

Dado um vetor com n > 0 números inteiros, inverter a ordem dos seus elementos no vetor.

Solução 1:

Nessa primeira solução, utilizamos um vetor auxiliar tmp para armazenar os dados invertidos e, somente depois, copiamos os dados invertidos para o vetor original.

#include <stdio.h>
#define LIM 500

int main(){
  int n,i,j;
  int vet[LIM], tmp[LIM];

  /*Leitura dos dados do vetor:*/
  printf("Entre com n: ");
  scanf("%d", &n);
  printf("Entre com %d elementos: ",n);
  for(i = 0; i < n; i++)
    scanf("%d", &vet[i]);

  /*Invertendo os dados no vetor:*/
  j = 0;
  for(i = n-1; i >= 0; i--){
    tmp[j] = vet[i];
    j++;
  }
  for(i = 0; i < n; i++)
    vet[i] = tmp[i];

  /*Imprimindo o vetor invertido:*/
  for(i = 0; i < n; i++)
    printf("%d ",vet[i]);
  printf("\n");
  return 0;
}
  

Solução 2:

Uma segunda solução mais econômica que utiliza uma única variável auxiliar, ao invés de um vetor auxiliar.

#include <stdio.h>
#define LIM 500

int main(){
  int n,i,j,tmp;
  int vet[LIM];

  /*Leitura dos dados do vetor:*/
  printf("Entre com n: ");
  scanf("%d", &n);
  printf("Entre com %d elementos: ",n);
  for(i = 0; i < n; i++)
    scanf("%d", &vet[i]);

  /*Invertendo os dados no vetor:*/  
  j = n-1;
  for(i = 0; i < n/2; i++){
    tmp = vet[i];
    vet[i] = vet[j];
    vet[j] = tmp;
    j--;
  }

  /*Imprimindo o vetor invertido:*/  
  for(i = 0; i < n; i++)
    printf("%d ",vet[i]);
  printf("\n");
  return 0;
}
  

Problema 3:

Faça um programa que lê dois vetores ordenados (ordem crescente), com m > 0 e n > 0 elementos respectivamente, e gera um terceiro vetor ordenado contendo todos os elementos das duas sequências originais sem repetição.
#include <stdio.h>
#define LIM 500

int main(){
    int m,n,i,j,k;
    int v1[LIM],v2[LIM],v3[LIM];

    printf("Entre com m: ");
    scanf("%d", &m);
    printf("Entre com %d elementos: ", m);
    for(i = 0; i < m; i++){
        scanf("%d", &v1[i]);
    }
    printf("Entre com n: ");
    scanf("%d", &n);
    printf("Entre com %d elementos: ", n);
    for(j = 0; j < n; j++){
        scanf("%d", &v2[j]);
    }
    k = i = j = 0;
    while(i < m && j < n){
        if(v1[i] < v2[j]){
            v3[k] = v1[i];
            k++;
            i++;
        }
        else if(v1[i] > v2[j]){
            v3[k] = v2[j];
            k++;
            j++;
        }
        else{ /* v1[i] == v2[j] */
            v3[k] = v1[i];
            k++;
            i++;
            j++;
        }
    }
    while(i < m){
        v3[k] = v1[i];
        k++;
        i++;
    }
    while(j < n){
        v3[k] = v2[j];
        k++;
        j++;
    }
    printf("Novo vetor: ");
    for(i = 0; i < k; i++){
        printf("%d ",v3[i]);
    }
    printf("\n");
    return 0;
}
  

Problema 4:

Dados n > 0 lançamentos de uma roleta (números entre 0 e 36), calcular a frequência de cada número.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(){
  int n,i,num;
  int frequencia[37];
  
  srand(time(NULL));
  
  for(i=0; i < 37; i++)
    frequencia[i] = 0;
  
  printf("Entre com n: ");
  scanf("%d", &n);
  
  for(i = 0; i < n; i++){
    num = rand()%37;
    frequencia[num]++;
  }
  for(i = 0; i < 37; i++)
    printf("Frequencia %d = %d\n",i, frequencia[i]);
  return 0;
}
  

Problema 5:

Dada uma sequência de n > 0 números reais, imprimi-los eliminando as repetições.

Solução 1:

Nessa primeira solução, utilizamos um vetor auxiliar repetidos.

#include <stdio.h>
#define LIM 100

int main(){
    float vet[LIM];
    int repetidos[LIM];
    int n, i, j;

    printf("Entre com n: ");
    scanf("%d", &n);
    printf("Entre com %d números reais: ",n);
    for(i = 0; i < n; i++){
        scanf("%f", &vet[i]);
        repetidos[i] = 0;
    }
    for(i = 0; i < n; i++){
        if(repetidos[i] == 0){
            for(j = i+1; j < n; j++){
                if(vet[i] == vet[j])
                    repetidos[j] = 1;
            }
        }
    }
    printf("Sem repetições: ");
    for(i = 0; i < n; i++){
        if(repetidos[i] == 0)
            printf("%.2f ",vet[i]);
    }
    printf("\n");
    return 0;
}
  

Solução 2:

Uma segunda solução mais econômica que utiliza uma única variável auxiliar (indicador de passagem), ao invés de um vetor auxiliar.

#include <stdio.h>
#define LIM 100

int main(){
    float vet[LIM];
    int n, i, j;
    int repetido; /* indicador de passagem */

    printf("Entre com n: ");
    scanf("%d", &n);
    printf("Entre com %d números: ", n);
    for(i = 0; i < n; i++){
        scanf("%f", &vet[i]);
    }
    printf("Sem repetições: ");
    for(i = 0; i < n; i++){
        repetido = 0;
        for(j = i-1; j >= 0; j--){
            if(vet[i] == vet[j])
                repetido = 1;
        }
        if(repetido == 0)
            printf("%.2f ", vet[i]);
    }
    printf("\n");
    return 0;
}