INF1018 - Software Básico

Aulas de Laboratório

Laboratório 1 - Aquecimento

Importante: no final da aula, salve seus programas em outro lugar.

  1. Compile e execute o seguinte programa:
    #include <ctype.h>
    #include <stdio.h>
    
    int string2num (char *s) {
      int a = 0;
      for (; *s; s++)
        a = a*10 + (*s - '0');
      return a;
    }
    
    
    int main (void) {
      printf("==> %d\n", string2num("234") + 1);
      printf("==> %d\n", string2num("1234"));
      printf("==> %d\n", string2num("4339") + string2num("1"));
      return 0;
    }
    
    Para compilá-lo, salve o programa em um arquivo aula1.c e execute o comando abaixo:
    gcc -Wall -o aula1 aula1.c
    Para executar o resultado, chame ./aula1. (A opção -Wall diz ao gcc para gerar warnings e o argumento -o aula1 o instrui a colocar o programa executável no arquivo aula1.)

    Procure entender como funciona a função string2num. (Mande imprimir o valor de a a cada iteração do for. O que está acontecendo? O que será o valor de (*s - '0') a cada iteração?)

  2. Modifique a função string2num do exercício anterior para converter strings contendo numerais escritos em qualquer base entre 2 e 10. A base em que o numeral está escrito deverá ser dada como um segundo parâmetro (do tipo int) para a função.

    Teste sua função com as chamadas abaixo:
      printf("%d\n", string2num("17", 8));
      printf("%d\n", string2num("777", 8));
      printf("%d\n", string2num("777", 10));
      printf("%d\n", string2num("777", 9));
    

  3. Modifique novamente a função string2num para aceitar bases maiores que 10. Nesse caso, precisamos de "dígitos" para os valores a partir de 10. É convencional usarmos as letras A-Z (e/ou a-z) para isso, com A representando o "dígito" 10 e assim por diante, até Z representando o "dígito" 35. (Qual a maior base que podemos usar com esse esquema?)

    Teste sua função com as chamadas abaixo:
      printf("%d\n", string2num("1a", 16));
      printf("%d\n", string2num("ff", 16));
      printf("%d\n", string2num("a09b", 16));
      printf("%d\n", string2num("ffff", 16));
      printf("%d\n", string2num("z09b", 36));
    
    (Dica: talvez as funções isdigit e isalpha possam ser úteis. Use o comando man para ver a sua descrição.)


  4. (Extra) Escreva a função inversa do ítem anterior, para converter um número para uma string. A função deve receber um ponteiro para um buffer onde escreverá o resultado, o número a ser convertido e a base para a conversão. Para simplificar, assuma que o buffer tem tamanho suficiente para guardar todo o resultado. (Essa simplificação é uma péssima prática de programação em C; depois pense em como corrigí-la.)