MAC2166 - Introdução à Computação

07/07/2014 - Aula 23

Exercícios de Revisão para a Prova 3

Linguagem C - Problema de Revisão 1

Escreva a função arredonda, que recebe como parâmetro um número real e devolve um número inteiro que corresponde ao seu arredondamento.

Solução

In []:
int arredonda(float num) {
    num += 0.5;
    return (int)num;
}

int main(){
    float teste1 = 0.01, teste2 = 0.44, teste3 = 0.50, teste4 =  0.51, teste5 = 0.99, teste6 = 1.00;

    printf("%f arredondado => %d\n", teste1, arredonda(teste1));
    printf("%f arredondado => %d\n", teste2, arredonda(teste2));
    printf("%f arredondado => %d\n", teste3, arredonda(teste3));
    printf("%f arredondado => %d\n", teste4, arredonda(teste4));
    printf("%f arredondado => %d\n", teste5, arredonda(teste5));
    printf("%f arredondado => %d\n", teste6, arredonda(teste6));
}

Linguagem C - Problema de Revisão 2

Em estatística, a moda de um conjunto de valores é o valor que aparece mais frequentemente. Escreva um programa que lê do teclado um conjunto de números inteiros, onde cada número está no intervalo entre 0 e 10, e devolve a moda desse conjunto. Se múltiplas modas existirem, qualquer uma delas pode ser escolhida.


#### Solução 1 (só pode ser usada porque cada número do conjunto está num intervalo pequeno de valores)

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

int main(){
    int freqs[11], i, n, num, moda;

    /* o vetor frequencia tem 11 posicoes: 1 para cada
       um dos valores entre 0 e 10.
       Cada posicao guarda a frequencia do numero
       correspondente. A principio, todos tem 0 como
       frequencia. */
    for (i = 0; i <= 11; i++)
        freqs[i] = 0;

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

    for (i = 1; i <= n; i++) {
        /* Le um numero, incrementando sua frequencia */
        printf("Digite o %d-esimo elemsento: ", i);
        scanf("%d", &num);
        freqs[num]++;
    }

    moda = 0;

    /* Procura o numero com a maior frequencia */
    for ( num = 1; num <= 11; num++) {
        if (freqs[num] > freqs[moda])
            moda = num;
    }

    printf("A moda dos valores e': %d", moda);

    return 0;
}

Solução 2

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

void ordenacao_por_selecao(int n, int v[MAX]);

int main(){
    int vet[MAX], i, n, moda, cont_moda, cont;

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

    /* Le os numeros do conjunto e armazena-os num vetor */
    for (i = 1; i <= n; i++) {
        printf("Digite o %d-esimo elemento: ", i);
        scanf("%d", &vet[i-1]);
    }

    /* ordena o vetor; depois da ordenacao, os numeros 
       iguais aparecerao em sequencia */
    ordenacao_por_selecao(n,vet);

    cont_moda = 0;
    moda = -1;
    cont = 0;
    for (i = 0; i < n; i++) {
        cont++;
        if (i == n-1 || vet[i] != vet[i+1]){
            /* quando um bloco de numeros iguais termina */
            if (cont > cont_moda) {
                cont_moda = cont;
                moda = vet[i];
            }
            cont = 0;
        }
    }

    printf("A moda dos valores e': %d", moda);

    return 0;
}

void ordenacao_por_selecao(int n, int v[MAX]){
    int i, j, x, min;

    for (i = 0; i < n; i++){
        min = i;
        for (j = i+1; j < n; j++)
            if (v[j] < v[min])
                min = j;
        x = v[i];
        v[i] = v[min];
        v[min] = x;
    }
}

Linguagem C - Problema de Revisão 3

  1. Faça uma função com protótipo

void somabit (int b1, int b2, int *vaium, int *soma);

que recebe três bits (inteiros 0 ou 1) b1, b2 e *vaium e retorna um bit soma representando a soma dos três e o novo um bit "vai-um" em *vaium.

  1. Escreva um programa que lê dois números em binário e calcula um número em binário que é a soma dos dois números dados. Utilize a função acima.

Solução

In []:
#include <stdio.h>

void somabit (int b1, int b2, int *vaium, int *soma) {
  *soma  = (b1 + b2 + *vaium) % 2;
  *vaium = (b1 + b2 + *vaium) / 2;
}

int main() {
  int m, n, qm, qn, vaium, dig, resp, pot;

  printf("Digite m e n: ");
  scanf("%d %d", &m, &n);

  vaium = 0;
  resp  = 0;
  pot = 1;
  qm = m;
  qn = n;

  while (qm!=0 || qn!=0) {
    somabit(qm%10, qn%10, &vaium, &dig);
    qm = qm/10;
    qn = qn/10;
    resp = resp + pot*dig;
    pot = pot * 10;
  }

  resp = resp + pot * vaium;
  printf("%d + %d = %d \n", m, n, resp);

  return 0;
}

Linguagem C - Problema de Revisão 4

Implemente a função

void substring(char s1[MAX], int p1, int p2, char s2[MAX]),

que devolve em s2 a substring de s1 que começa na posição p1 e termina na posição p2.

A sua função deve aplicar as seguintes regras:

Solução

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

void substring(char s1[MAX], int p1, int p2, char s2[MAX]) {
    int i,j;

    if (p1 < 0)
        p1 = 0;

    i = j = 0;

    while (i < p1) {
        /* se o fim da string s1 aparece antes da posicao p1,
           devolve em s2 uma string vazia */
        if (s1[i] == '\0') {
            s2[j] = '\0';
            return;
        }

        i++;
    }

    /* copia a substring para s2 */
    while (i <= p2 && s1[i] != '\0') {
        s2[j] = s1[i];
        i++;
        j++;
    }
    s2[j] = '\0';
}

Linguagem C - Problema de Revisão 5

  1. Escreva uma função que recebe como parâmetros:

e ordena entre as linhas k e p da matriz A segundo a coluna c.

Exemplo: n=6, m=3, c=1, k=0, p=4

  1. Dadas n datas em uma matriz datasnx3 , onde a primeira coluna corresponde ao dia, a segunda ao mês e a terceira ao ano, coloque essas datas em ordem cronológica crescente, usando a função acima.

Obs.: Esse problema corresponde ao Exercício 11 da lista com Funções - Parte III.


Solução

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

void troca_linhas(int m, int linha1[MAX], int linha2[MAX]);
void ordena_submatriz(int n, int m, int A[MAX][MAX], int c, int k, int p);

int main(){
    int n, i, j, datas[MAX][MAX];

    printf("Digite o numero de datas a se ordenar: ");
    scanf("%d", &n);

    /* Le as n datas */
    for ( i = 1; i <= n; i++){
        printf("Digite o dia, mes e ano da %da. data: ", i);
        scanf("%d%d%d", &datas[i-1][0], &datas[i-1][1], &datas[i-1][2]);
    }

    /* Primeiro ordena todas as datas pelo ano */
    ordena_submatriz(n, 3, datas, 2, 0, n-1);

    /* Para as datas num mesmo ano, ordena por mes */
    i = 0;
    for (j = 0; j < n; j++) {
        if (j == n-1 || datas[j][2] != datas[j+1][2]) {
            /* i e j e' sao a primeira e ultima linha de um bloco
               de linhas com um mesmo valor para ano */
            ordena_submatriz(n,3,datas,1,i,j);
            i = j + 1;
        }
    }

    /* Para as datas num mesmo mes e ano, ordena por dia */
    i = 0;
    for (j = 0; j < n; j++) {
        if (j == n-1 || datas[j][1] != datas[j+1][1] || datas[j][2] != datas[j+1][2]) {
            /* i e j e' sao a primeira e ultima linha de um bloco
               de linhas com um mesmo valor para mes e ano */
            ordena_submatriz(n,3,datas,0,i,j);
            i = j + 1;
        }
    }

    printf("\nAs datas ordenadas ficam: \n");
    for (i = 0; i < n; i++)
        printf("%d/%d/%d\n", datas[i][0],datas[i][1],datas[i][2]);
    return 0;
}


/* Funcao que recebe um duas linhas com m elementos,
   e troca o conteudo delas.                         */
void troca_linhas(int m, int linha1[MAX], int linha2[MAX]) {
    int temp, i;

    for (i = 0; i < m; i++){
        temp = linha1[i];
        linha1[i] = linha2[i];
        linha2[i] = temp;
    }
}

/* Funcao que ordena as linhas de k a p da matriz A de acordo
   com os valores da coluna c */
void ordena_submatriz(int n, int m, int A[MAX][MAX], int c, int k, int p) {
    int menor, i;

    /* faz uma ordenacao por selecao */
    for (; k <= p; k++){
        menor = k;
        for (i = k+1; i <= p; i++) {
            if (A[i][c] < A[menor][c])
                menor = i;
        }
        troca_linhas(m,A[k],A[menor]);
    }
}

Referências e outros materiais para estudo