segunda-feira, 10 de outubro de 2016

C: Putchar e puts - Solução

Atividades do putchar e puts

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.

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

LinkWithin

Related Posts Plugin for WordPress, Blogger...