Baixe o app para aproveitar ainda mais
Prévia do material em texto
INSTITUTO DE INFORMÁTICA - UFG SOFTWARE BÁSICO Configuração do Repositórios 1) Antes de começar o laboratório, lembre-se de clonar o repositório do Github: $ git clone -b <branch> https://github.com/brunoos/swb-2019-2 O seu branch é formado por “b” + matrícula, por exemplo, exemplo “b2010000000”. Vide a wiki no Github em caso de dúvida. 2) Configure sua identidade: $ git config --global user. name “Seu nome” $ git config --global user. email “user@domain.com.br” 3) Crie o diretório “lab-02” dentro de “swb-2019-2” e faça o exercício em “lab-02”... 4) Quando terminar (o exercício ou a aula), selecione (adicione) os arquivo para o commit, assumindo que você esteja no diretório “lab-02”: $ git add <arquivo> <arquivo> <arquivo> ... Faça o commit das alterações: $ git commit Envie as mudanças para o Github: $ git push Laboratório 02 Inteiros não Negativos 1. A função abaixo faz um “dump” de uma região de memória: #include <stdio.h> void dump(void *addr, int n) { unsigned char *p = addr; while (n--) { printf("%p - %02x\n", p, *p); p++; } } Esse dump mostra uma sequência de posições de memória, exibindo, para cada posição, o seu endereço e o seu conteúdo (em hexadecimal). O parâmetro “addr” é o endereço inicial a ser mostrado, e “n” é o número de bytes. Um exemplo de uso da função dump é dado abaixo, mostrando como um inteiro é armazenado na memória: int main() { int i = 10000; dump(&i, sizeof(i)); return 0; } Faça as seguintes atividades: (a) Crie um arquivo em C contendo as funções dump e main. Compile e execute o programa. Explique detalhadamente o resultado desse programa. Experimente, se necessário, outros valores para “i”. (b) Aplique a mesma técnica para ver como um long é armazenado. (c) Aplique a mesma técnica para ver como um short é armazenado. (d) Aplique a mesma técnica para ver como um char é armazenado. Lembre-se que uma variável do tipo char armazena um valor inteiro. Experimente atribuir a essa variável tanto um caractere como o valor do código ASCII correspondente (por exemplo: 'a' é 97). (e) A mesma técnica pode ser usada para vermos como uma string é armazenada. Modifique o exemplo abaixo para descobrir os códigos ASCII dos caracteres 'A', ' ', '\n', e '$'; int main() { char p[] = "7509"; dump(p, sizeof(p)); return 0; } 2. 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 () { printf("==> %d\n", string2num("1234")); printf("==> %d\n", string2num("1234") + 1); printf("==> %d\n", string2num("1234") + string2num("1")); return 0; } (a) Procure entender como funciona a função string2num. Mande imprimir o valor de “*s” e de “a” a cada iteração do for, ambos com “%d”. O que está acontecendo? O que será o valor de “(*s - '0')” a cada iteração? (b) 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. O retorno de string2num deve ser um int na base 10. Teste sua função com as chamadas abaixo: printf("%d\n", string2num("777", 8)); printf("%d\n", string2num("777", 10)); (c) 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. Use as letras a-z para isso, com “a” representando o “dígito” 10, “b” representando 11, e assim por diante, até “z” representando o “dígito” 35. (Qual a maior base que podemos usar com esse esquema?) Dica: talvez as funções isdigit() ou isalpha() possam ser úteis. Teste sua função com as chamadas abaixo: printf("%d\n", string2num("1a", 16)); printf("%d\n", string2num("a09b", 16)); printf("%d\n", string2num("k09b", 30)); RECONHECIMENTO Este material foi produzido por Noemi Rodriguez (PUC-Rio), Ana Lúcia de Moura (PUC-Rio) e Raúl Renteria (PUC-Rio), e adaptado por Bruno Silvestre (UFG).
Compartilhar