Atividades
1. Escreva uma função equivalente a puts usando apenas a putchar
A função puts recebe um vetor de caracteres, percorre ele escrevendo seu conteúdo na saída padrão. Ele para na hora que encontra o final da string, em outras palavras na hora que ele encontra o caractere nulo ('\0')
#include <stdio.h> #include <stdlib.h> int meu_puts(const char *str){ char c; int i = 0; c = str[i]; while(c != '\0'){ putchar(c); i++; c = str[i]; } return 0; } int main(void) { meu_puts("Ola mundo"); meu_puts("Estou vivo"); return EXIT_SUCCESS; }Saída:
Ola mundoEstou vivo |
Outra característica da função puts é que no final da string, ela escreve na saída padrão uma quebra de linha.
#include <stdio.h> #include <stdlib.h> int meu_puts(const char *str){ char c; int i = 0; c = str[i]; while(c != '\0'){ putchar(c); i++; c = str[i]; } putchar('\n'); return 0; } int main(void) { meu_puts("Ola mundo"); meu_puts("Estou vivo"); return EXIT_SUCCESS; }Saída:
Ola mundo Estou vivo |
Vamos agora fazer o return equivalente a da função puts. No nosso código ja temos a variável i usado para percorre a string, podemos apenas incrementar ele em +1 (por causa do '\n'), e mandar retorna essa variável.
#include <stdio.h> #include <stdlib.h> int meu_puts(const char *str){ char c; int i = 0; c = str[i]; while(c != '\0'){ putchar(c); i++; c = str[i]; } putchar('\n'); i++; return i; } int main(void) { meu_puts("Ola mundo"); printf("%i\n",n); return EXIT_SUCCESS; }Saída:
Ola mundo 10 |
Poderíamos para por aqui, no entanto, vamos modificar a função mais um pouco, não estamos consideramos possíveis erros da função putchar, vamos tratar isso, assim que der um erro saimos da função retornando o numero de carácter escrito.
#include <stdio.h> #include <stdlib.h> int meu_puts(const char *str){ char c; int i = 0; c = str[i]; while(c != '\0'){ if (putchar(c) == EOF){ return i; } i++; c = str[i]; } if(putchar('\n') == EOF){ return i; } i++; return i; } int main(void) { int n = meu_puts("Ola mundo"); printf("%i\n",n); return EXIT_SUCCESS; }
Saída:
Ola mundo 10 |
2. Escreva uma função que receba um inteiro e mostra ele na saída padão, use apenas a função putchar
Essa atividade é um pouco complicada de fazer só com o que conhecimento que temos, por isso ela esta mais para um desafio. Precisamos de duas funções auxiliares, uma para calcular o numero de dígitos e a outra para realizar o calculo da potencia de 10.
As duas são bem simples, a primeira num_digitos vai dividindo o numero por 10 ate chegar em zero, incrementando um contador, temos ai o nosso numero de dígitos.
Saída:
Podemos pensar em outra solução, sem o uso da função num_digitos e potencia10. A ideia é salvar os dígitos do menor significativo ate o mais significativo em um vetor de char, e depois percorrer o vetor de traz para frente.
As duas são bem simples, a primeira num_digitos vai dividindo o numero por 10 ate chegar em zero, incrementando um contador, temos ai o nosso numero de dígitos.
int num_digitos(int num){ if(num == 0) return 1; int cont = 0; while(num != 0){ num /= 10; cont++; } return cont; }A segunda potencia10 calcular a potencia de 10 para uma entrada positiva, a potencia é calculada usando multiplicação.
int potencia10(unsigned int n){ int res = 1; for(int i = 0; i < n; i++){ res *= 10; } return res; }Tanto a função num_digitos e potencia10 podia ser feitas usando funções matemática da biblioteca math.h, como a gente ainda não estudou ela, não achei legal usar. Criamos essas funções pois precisamos pegar o algorítimo mais significativo do numero, a ideia é ir caminhando do mais significativo ate o menos significativo
#include <stdio.h> #include <stdlib.h> int num_digitos(int num){ if(num == 0) return 1; int cont = 0; while(num != 0){ num /= 10; cont++; } return cont; } int potencia10(unsigned int n){ int res = 1; for(int i = 0; i < n; i++){ res *= 10; } return res; } void putint(int num){ if(num < 0){ putchar('-'); num = -num; //Faz o num ficar positivo } int n = num_digitos(num); char c; //Usado no putchar for(int i = n-1; i >= 0; i--){ c = (num/potencia10(i))%10 + '0'; putchar(c); } } int main(void) { putint(123); putchar('\n'); putint(0); putchar('\n'); putint(-123); }
Saída:
123 0 -123 |
Podemos pensar em outra solução, sem o uso da função num_digitos e potencia10. A ideia é salvar os dígitos do menor significativo ate o mais significativo em um vetor de char, e depois percorrer o vetor de traz para frente.
#include <stdio.h> #include <stdlib.h> void putint(int num){ if(num < 0){ putchar('-'); num = -num; //Faz o num ficar positivo } if(num == 0){ putchar('0'); } else{ char aux[64]; int i = 0; //Salva do menos significatio para o mais while(num != 0){ aux[i] = num%10; num /= 10; i++; } //Caminha no vetor for(int j = i - 1; j >= 0; j--){ putchar(aux[j] + '0'); } } } int main(void) { putint(123); putchar('\n'); putint(0); putchar('\n'); putint(-123); return 0; }Saída:
123 0 -123 |
Alguma duvida ou sugestão?
Nenhum comentário:
Postar um comentário