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