MAC2166 - Introdução à Computação

02/06/2014 - Aula 16

Linguagem C - Referências

Esqueleto de um programa em C com várias funções

In []:
#include <stdio.h>

/* prototipos de funcoes */

int main()
{
  /* declaracao de variaveis */

  /* lista de comandos */

  return 0;   /* comandos terminam com ; */
}             /* blocos de comandos entre { }  */

/* demais funcoes */

Linguagem C - Problema 1

Escreva um programa em C que leia um número inteiro positivo n e calcula o fatorial de n.

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

Solução 1 (Usando um laço com while)

In []:
#include <stdio.h>    /* Biblioteca que contém funções de manipulação de entrada e saida de dados */

int main() {
    int n;
    int i = 1;
    int fat = 1;
    printf("Digite n: ");
    scanf("%d", &n);
    while (i <= n) {
        fat *= i;
        i++;
    }
    printf("fat(%d) = %d\n", n, fat);
    return 0;
}

Solução 2 (Usando um laço com for)

In []:
#include <stdio.h>    /* Biblioteca que contem funcoes de manipulacao de entrada e saida de dados */
int main() {
    int n, i;
    int fat = 1;
    printf("Digite n: ");
    scanf("%d", &n);
    for (i = 1; i <= n; i++)
        fat *= i;
    printf("fat(%d) = %d\n", n, fat);
    return 0;
}

Solução 3 (Criando uma função para o fatorial)

In []:
#include <stdio.h>    /* Biblioteca que contem funcoes de manipulação de
                         entrada e saida de dados */
int fat(int n);

int main() {
    int n, f;
    printf("Digite n: ");
    scanf ("%d", &n);
    f = fat(n);
    printf("fat(%d) = %d\n", n, f);
    return 0;
}

int fat(int n) {
    int i, resultado = 1;
    for (i = 1; i<=n; i++)
        resultado *= i;
    return resultado;
}

Comentários sobre o problema

Esse problema envolvendo números inteiros mostra uma das limitações do C em comparação ao Python: valores inteiros em C são armazenados usando uma quantidade fixa de bits, por essa razão, eles são capazes de representar uma faixa limitada de valores. Já em Python3, um número inteiro pode ser tão grande quanto o espaço que está disponível para armazená-lo na memória.

Geralmente, um valor do tipo int em C ocupa 32 bits; com essa quantidade de bits, é possível representar a faixa de valores de −2.147.483.648 a 2.147.483.647. Entretanto, a quantidade de bits usada para armazenar um inteiro na linguagem C pode variar de computador para computador. Em um computador em que um número inteiro é representado com 32 bits, o programa acima não forneceria valores de fatorial corretos para qualquer n >= 13 (já que fatorial(12) = 479.001.600 < 2.147.483.647, mas fatorial(13) = 6.227.020.800 > 2.147.483.647).

Para saber mais detalhes sobre a representação de números inteiros no computador, você pode consultar essa página na Wikipédia.

Linguagem C - Problema 2

Na figura abaixo, no plano cartesiano, a região sombreada não inclui as linhas de bordo. Note que o eixo y cai bem no meio da figura, e usamos o lado do quadrado para indicar as ordenadas correspondentes.

Escreva um programa em C que lê as coordenadas cartesianas (x, y) de um ponto (ambas do tipo float) e imprime entro se esse ponto está na região, e fora caso contrário.

face

Obs.: Esse problema foi a Questão 1 da Prova 1 de 2014 das outras turmas de MAC2166.

Exemplos:

Digite x: 10         Digite x: -3         Digite x: 0
Digite y: 5          Digite y: 5          Digite y: 3.14149
fora                 fora                 dentro
Digite x: -3         Digite x: -3         Digite x: 2
Digite y: -1         Digite y: 5.5        Digite y: 4.444
fora                 fora                 fora
Digite x: -3         Digite x: -3         Digite x: 2.718 
Digite y: 2          Digite y: 6          Digite y: 5.774
fora                 fora                 dentro
Digite x: -3         Digite x: -2         Digite x: 3.14
Digite y: 2.3        Digite y: 0.5        Digite y: 6.02
dentro               dentro               fora
Digite x: -3         Digite x: -1         Digite x: 5
Digite y: 4          Digite y: 1.5        Digite y: 8
fora                 fora                 fora 

Solução

In []:
#include <stdio.h>

#define TRUE  1
#define FALSE 0

int main() {
    float x, y;
    int dentro;

    printf("Digite x: ");
    scanf("%f", &x);
    printf("Digite y: ");
    scanf("%f", &y);

    /* suponha que (x,y) esta dentro */
    dentro = TRUE;

    if (x <= -5 || 5 <= x || y <= 0 || 8 <= y)
        /* aqui sabemos que (x,y) esta fora da face */
        dentro = FALSE;
    else
        if (-3 <= x && x <=  3 && 1 <= y && y <= 2)
            /* aqui sabemos que (x,y) esta na boca */
            dentro = FALSE;
        else
            if (-4 <= x && x <= -1 && 4 <= y && y <= 7) {
                /* aqui sabemos que (x,y) esta no olho esquerdo */
                dentro = FALSE;
                if (-3 < x && x < -2 && 5 < y && y < 6)
                    /* aqui sabemos que na verdade (x,y) esta na iris esquerda */
                    dentro = TRUE;
            }
            else
                if (1 <= x && x <= 4 && 4 <= y && y <= 7) {
                    /* aqui sabemos que (x,y) esta no olho direito */
                    dentro = FALSE;
                    if (2 < x && x < 3 && 5 < y && y < 6)
                        /* aqui sabemos que na verdade (x,y) esta na iris direita */
                        dentro = TRUE;
                }

    if (dentro)
        printf("dentro\n");
    else
        printf("fora\n");

    return 0;
}

Tópicos vistos na aula 16

Referências e outros materiais para estudo