MAC2166 - Introdução à Computação

09/06/2014 - Aula 18

Linguagem C - Problema 7

Dados dois números naturais m e n e duas sequências ordenadas com m > 0 e n > 0 números inteiros, obter uma única sequência ordenada contendo todos os elementos das sequências originais sem repetição.

Sugestão: Imagine uma situação real, por exemplo, dois fichários de uma biblioteca.

Obs.: Esse problema é o exercício 8 da lista de exercícios sobre vetores.

Solução

In []:
#include <stdio.h>
#define MAX 1000

int main(){
    int seq1[MAX], seq2[MAX], seq_ordenada[MAX];
    int m, n, num, i, j, k;

    printf("Digite o numero de elementos da primeira sequencia: ");
    scanf("%d", &m);

    for (i = 0; i < m; i++){
        printf("Digite o %do. numero da primeira sequencia: ", i+1);
        scanf("%d", &num);
        seq1[i] = num;
    }

    printf("Digite o numero de elementos da segunda sequencia: ");
    scanf("%d", &n);

    for (i = 0; i < n; i++){
        printf("Digite o %do. numero da segunda sequencia: ", i+1);
        scanf("%d", &num);
        seq2[i] = num;
    }

    j = i = k = 0;
    while (i < m && j < n) {
        if (seq1[i] < seq2[j]) {
            num = seq1[i];
            i++;
        }
        else {
            num = seq2[j];
            j++;
        }

        if (k == 0 || seq_ordenada[k-1] != num){
            seq_ordenada[k] = num;
            k++;
        }
    }

    while (i < m) {
        seq_ordenada[k] = seq1[i];
        i++;
        k++;
    }

    while (j < n) {
        seq_ordenada[k] = seq2[j];
        j++;
        k++;
    }

    printf("A sequencia final ordenada eh: \n");
    for (i = 0; i < k; i++)
            printf("%d   ", seq_ordenada[i]);
    printf("\n");

    return 0;
}

Linguagem C - Problema 8

  1. Escreva uma função com protótipo

int acha (float V[MAX], int n, float x);

que devolve a posição em que o real x ocorre no vetor V ou devolve -1 se x não aparece no vetor. O número de elementos do vetor é n.


Solução 1

In []:
int acha(float V[MAX], int n, float x){
    int i = 0;

    while (i < n && V[i] != x)
        i++;

    if (i != n)
        return i;
    
    return -1;
}

Solução 2 (com sentinela)

In []:
int acha(float V[MAX], int n, float x){
    int i = 0;

    V[n] = x;     	/* sentinela */
    while (V[i] != x)
        i++;

    if (i != n)
        return i;
    else
        return -1;
}
  1. Escreva uma função com protótipo

int insere (float V[MAX], int n, float x);

que insere x na última posição do vetor V e retorna o novo valor de n.


#### Solução

In []:
int insere (float V[MAX], int n, float x){
    V[n] = x;
    return n+1;
}
  1. Dada uma sequência de n números reais, imprimi-la eliminando as repetições.


Solução

In []:
#include <stdio.h>
#define MAX 1000

int acha1 (float V[MAX], int n, float x);
int acha2 (float V[MAX], int n, float x);
int insere (float V[MAX], int n, float x);

int main(){
    float seq[MAX], num;
    int n, i, k = 0;

    printf("Digite o numero de elementos da sequencia: ");
    scanf("%d", &n);

    for (i = 0; i < n; i++){
        printf("Digite o %do. numero da sequencia: ", i+1);
        scanf("%f", &num);
        if (acha1(seq,k,num) == -1)
            k = insere(seq,k,num);
    }

    printf("\nA sequencia sem repeticoes eh: \n");
    for (i = 0; i < k; i++)
        printf("%f   ", seq[i]);

    printf("\n");

    return 0;

}

Linguagem C - Problema Extra 1

  1. Escreva uma função que recebe um inteiro positivo k e um vetor com os k+1 coeficientes reais de um polinômio de grau k, e outro real x, e devolva o valor do polinômio no ponto x. Considere que o coeficiente de xi está guardado na posição i do vetor.

  2. Usando a função anterior, escreva um programa que leia dois inteiros k e n, os k+1 coeficientes de um polinômio de grau k, e outros n números reais, e imprima o valor do polinômio para cada um desses n números.


#### Solução

In []:
#include <stdio.h>
#define MAX 100

float valor_polinomio(int k, float a[MAX], float x);

int main() {
    float coeficientes[MAX], x;
    int k, n, i;

    printf("Digite o grau do polimônio p: ");
    scanf("%d", &k);

    printf("Digite os coeficientes do polimônio p: \n");
    for (i = 0; i <= k; i++){
        printf("Digite o coeficiente de x^%d: ", i);
        scanf("%f", &coeficientes[i]);
    }

    printf("Digite a quantidade de valores: ");
    scanf("%d", &n);
    for (i = 0; i < n; i++){
        printf("Digite um valor de x: ");
        scanf("%f", &x);
        printf("p(%f) = %f\n\n", x, valor_polinomio(k,coeficientes,x));
    }

    return 0;
}

float valor_polinomio(int k, float a[MAX], float x){
    float soma = 0, potx = 1;
    int i;

    for (i = 0; i <= k; i++){
        soma += a[i] * potx;
        potx *= x;
    }

    return soma;
}

Linguagem C - Problema Extra 2

  1. Escreva uma função que recebe como parâmetro um inteiro não-negativo k e um vetor p com os k+1 coeficientes reais de um polinômio de grau k e altera k e p de modo que eles passem a armazenar o grau e os coeficientes da derivada do polinômio de entrada.

  2. Escreva um programa que leia um inteiro não-negativo k, os k+1 coeficientes de um polinômio real p0 de grau k, três reais x0, x1 e x2 e calcule p0(x0), p1(x1) e p2(x2), onde p1 e p2 são respectivamente a primeira e a segunda derivada do polinômio p0. Use a função do item (a) e a função do item (a) do Problema Extra 1.


#### Solução

In []:
#include <stdio.h>
#define MAX 100

float valor_polinomio(int k, float a[MAX], float x);
int derivada(int n, float a[MAX]);

int main() {
    float coeficientes[MAX], x0, x1, x2;
    int k, i;

    printf("Digite o grau do polimônio p: ");
    scanf("%d", &k);

    printf("Digite os coeficientes do polimônio p: \n");
    for (i = 0; i <= k; i++){
        printf("Digite o coeficiente de x^%d: ", i);
        scanf("%f", &coeficientes[i]);
    }

    printf("Digite tres numeros reais: ");
    scanf("%f %f %f", &x0, &x1, &x2);

    printf("p0(%f) = %f\n\n", x0, valor_polinomio(k,coeficientes,x0));

    k = derivada(k,coeficientes);
    printf("p1(%f) = %f\n\n", x1, valor_polinomio(k,coeficientes,x1));

    k = derivada(k,coeficientes);
    printf("p2(%f) = %f\n\n", x2, valor_polinomio(k,coeficientes,x2));

    return 0;
}

float valor_polinomio(int k, float a[MAX], float x){
    float soma = 0, potx = 1;
    int i;

    for (i = 0; i <= k; i++){
        soma += a[i] * potx;
        potx *= x;
    }

    return soma;
}

int derivada(int n, float a[MAX]){
    int i;

    for (i = 0; i < n; i++)
        a[i] = (i+1) * a[i+1];

    return n-1;
}

Tópicos vistos na Aula 18

Referências e outros materiais para estudo