Ir ao conteúdo
  • Cadastre-se

C Isso é uma função?


MatheusINF
Ir à solução Resolvido por Simon Viegas,

Posts recomendados

Bom galera eu preciso fazer uma função que recebe um decimal e retorna ele em Binario e também e Hexa., porém eu não tenho certeza se o que eu fiz é uma função, alguém pode me falar se está certo?

int a; // VARIAVEL GLOBAL

void Decimal_Bi_He()
{
char b[9];
int num;

num=a;

itoa(num,b,2); //Converte para base 2
printf("\n\tO numero %d em binario = %s\n\n",num,b);
printf ("\tO numero %d em hexadecimal = %X\n",a,a);

}

int main()

{
   printf("Digite um numero em decimal: ");
   scanf("%d",&a);

   Decimal_Bi_He();
   return 0;
}

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Veja a definição de uma função. O que é uma função em C?

 

Para mim, função seria "método", ou seja, aquele bagulho que você "invoca" e que tem ()..., mas com a característica específica de retornar algo em si mesmo, no caso como o método main() do seu código. Ela faz algo e ao mesmo tempo retorna um valor nele mesmo... no caso um int.

 

Já um procedimento, seria um "método" que faz exatamente o que uma função faz, mas que não retorna nada nela mesma, ou seja, é void, como o seu Decimal_Bi_He().

 

Se para o C "método" e função "função" são sinônimo*, então seria apenas essas negoças que tem ()... portanto, estaria usando sim uma função, no caso Decimal_Bi_He(). obs.: o main() não contaria, é claro, já que é "obrigatória".

 

Se função estiver se referindo ao retorno como citado (não ser void), então não, você estaria usando um procedimento.

 

 

 

RESUMINDO:

Eu acho que no C tudo é uma coisa só... logo está usando uma função. (ao mesmo tempo que acho estranho, ou seja, não chamaria de função, apenas de método, como no Java)

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Simon Viegas Então mnw eu até tirei o Void e coloquei "Int Decimal_Bi_He( )", porque achei que o meu professor não ia considerar uma função, porém na minha opinião isso não precisaria retornar nada já que o resultado é em printf, estou com medo dele não considerar saca?, porém eu fiz assim e não vi diferença :/

  • Haha 1
Link para o comentário
Compartilhar em outros sites

É uma boa pergunta!

 

 

Eu as vezes não sei dizer ao certo mais mistura muito as coisas, então a pouco tempo por resolução pessoal decretei dois tipos fundamentais: Declarações Funções

 

Dennis Ritchie um dos autores da linguagem C, não se preocupou em deixar bem claro tal diferença. Eu seu livro no Capítulo 4 tudo é visto como sendo função, pois void é também um tipo de retorno. Descreve ele uma função como tendo a seguinte condição estrutural: 

                                    return-type function-name(argument declarations)

 

Portanto, os autores da linguagem, não entendem: Métodos.

 

Já método é coisa nova que veio junto com C++, junto a OOP se confundindo as vezes com funções, cujo a diferença mais significativa é que no método se passa um ou mais argumentos de maneira oculta, segundo a classe que o chamou. E em funções, temos plena controle de seus argumentos.

 

 

Com isso, julgo ser

void Decimal_Bi_He()

Uma função :thumbsup:

 
EDIT:
39 minutos atrás, MatheusINF disse:

Então mnw eu até tirei o Void e coloquei "Int Decimal_Bi_He( )"

Discordo!

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Concordo com o @AnsiC , procedimentos não são definidos como parte da linguagem C, a única distinção feita na linguagem é se a função retorna ou não retorna um valor não nulo, nesse caso no contexto da linguagem C poderíamos dizer que um procedimento é uma função que não retorna valor (portanto todo "procedimento" é uma função em C).

 

Algumas outras linguagens fazem distinção explícita entre os 2, preferindo relacionar o termo função ao sentido usado na matemática onde dados parâmetros de entrada espera-se que seja calculado um valor, enquanto o termo procedimento designa um conjunto de comandos a serem executados em ordem.

  • Obrigado 2
Link para o comentário
Compartilhar em outros sites

  • Membro VIP
  • Solução
13 horas atrás, MatheusINF disse:

@Simon Viegas Então mnw eu até tirei o Void e coloquei "Int Decimal_Bi_He( )", porque achei que o meu professor não ia considerar uma função, porém na minha opinião isso não precisaria retornar nada já que o resultado é em printf, estou com medo dele não considerar saca?, porém eu fiz assim e não vi diferença :/

 

Vou tentar expor como eu entendo.

 

Tomemos os seguintes códigos:

void Decimal_Bi_He() {
    
}

e

int Decimal_Bi_He() {
    
}

 

O primeiro está definido para fazer algo e "não retornar" nada nela mesma;

O segundo faz algo e retorna algo nela mesma, ou seja, por exemplo, poderia invocar esse método dentro de um printf().

 

Entendi que tem 2 pontos centrais:

  1. o nome dessas estrutura no C, ou seja, como elas são chamadas; (tem diferença entre uma e outra?)
  2. como usar uma ou outra estrutura no seu código, ou seja, em relação ao uso ou não do retorno ou parâmetros.

1#

Em relação ao "nome dessas estruturas no C", como citado por @AnsiC e @isrnick, ambos podem ser chamados de função, ou seja, não é definido uma diferenciação entre uma coisa e outra... ambos são chamados funções e pronto.

 

Em outras linguagens como Pascal, quando uma "estrutura dessa" retorna um valor nela mesma (como esse int da segunda) seria chamada de function (função), quando não retorna nada (como a que tem void), é chamada de procedure (procedimento).

 

Ou seja, no Pascal, quando é solicitado uma função, subentenderia de cara que "essa estrutura" retornasse algo nela mesma (obs.: e que esse retorno seria usado, como tentarei explicar na segunda parte). Caso fosse solicitado um procedimento, seria como você fez, ou seja, a própria "estrutura" faria algo, mas sem o uso do retorno de algum algo nela mesma.

 

 

RESUMINDO:

No C, pelo já citado, não tem diferença entre retornar ou não... ambos são chamados de função, logo, você está usando uma função. A questão agora é  apenas se está usando como se quer ou não.

 

 

 

2#

Já em relação ao uso da função em si, aí entra outros critérios, como o uso de parâmetros e uso ou não de retorno pela própria estrutura.

 

Veja o que diz o enunciado (ou o que você citou):

15 horas atrás, MatheusINF disse:

Bom galera eu preciso fazer uma função que recebe um decimal e retorna ele em Binario e também e Hexa., porém eu não tenho certeza se o que eu fiz é uma função, alguém pode me falar se está certo?

 

 

- Como citado, dizer "uma função" no C não ajuda sobre ser void ou não;

- Dizer receber, na minha suposição, seria receber por parâmetro, ou seja, no seu código está "recebendo por uma variável global";

- Já o retornar eu entendo que a função deveria retornar nela mesma, ou seja, seria como a tal function do Pascal. No seu código, você está imprimindo o resultado na própria função (não está utilizando o recurso de retornar com o return), mas o enunciado pede que a função apenas retorne o valor... ai entra outra questão: retornar como? tem pelo menos 3 formas: pode ser por uma variável global; pode ser por uma variável do parâmetro; ou pode ser pelo próprio método. Eu acho que é pela terceira.

 

RESUMINDO:

Para mim a maneira mais provável é que a função receba  2 parâmetros e retorne a resposta na própria função, algo como:

string Decimal_Bi_He(int decimal, int base) {
    string resultado;
       
    
    
    return resultado; 
}

obs.: no C não usa string, apenas estou expondo a ideia. Teria que adaptar ao contexto... acho que seria algo como char*.

 

Ai no código usa essa resposta da função, ou seja, o papel da função é apenas fazer as contas e entregar o resultado... que é coletado la no main() e usado como desejar.

 

 

ADENDO:

Acho também muuuito provável que não é para usar uma função pronta como a itoa(), mas deixe isso para depois.

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Simon Viegas Cara sério esse texto foi MUITO melhor que a explicação que recebi em aula ontem, e quanto ao "itoa" eu já tinha pedido ajuda em um tópico e ajudaram resolver de outra forma, coloquei lá só pra dar uma diminuida no código  e já mudei, enfim Obrigado pela explicação :D

adicionado 21 minutos depois

Se ajudar alguém em futuras dúvidas, aqui está o algoritmo ;) 

#include<stdlib.h>
#include<stdio.h>

int Decimal_Bi_He(int x)
{
    int i,n,j=7;
    char op[9];

    n=x;

    if(x>255)
        x=255;
    do{
        if(x % 2 == 0)
           op[j]='0';
        else
           op[j]='1';
        x/=2;
        j--;
    }while(x>0);
    if(j>=0){
        for(i=j;i>=0;i--)
            op[i]='0';
    }
    op[8]='\0';

    printf("\n\t O numero %d em binario = %s\n\n",n,op);
    printf ("\tO numero %d em hexadecimal = %X\n",n,n);


}

int main()

{
   int a;
   printf("Digite um numero em decimal: ");
   scanf("%d",&a);

   Decimal_Bi_He(a);
   return 0;
}

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Em relação à assinatura da função:

2 horas atrás, MatheusINF disse:

int Decimal_Bi_He(int x) {
    
}

 

Perceba que definiu o retorno como int, mas onde no seu código está retornando um int para quem invocou o método a função? Ou seja, a definição de "um retorno em si mesmo" tem um propósito... se não está retornando nada, pode mudar para void. Em outras palavras: se definiu que a função retorna algo, então retorne! Se não é para retornar algo em si mesma, então coloque void ali no início.

 

 

Sobre que comentei:

 

4 horas atrás, Simon Viegas disse:

- Já o retornar eu entendo que a função deveria retornar nela mesma, ou seja, seria como a tal function do Pascal. No seu código, você está imprimindo o resultado na própria função (não está utilizando o recurso de retornar com o return), mas o enunciado pede que a função apenas retorne o valor... ai entra outra questão: retornar como? tem pelo menos 3 formas: pode ser por uma variável global; pode ser por uma variável do parâmetro; ou pode ser pelo próprio método. Eu acho que é pela terceira.

 

Ou seja, pelo menos pelo que eu entendi, NÃO é para imprimir a resposta na própria função, a função apenas retornaria o resultado da conversão. Ai no main(), pega essa resposta e usa.


Entende? a resposta VEM DA função, o que é diferente de IMPRESSA NA função.

 

 

O conceito seria mais ou menos assim:

4 horas atrás, Simon Viegas disse:

char[] Decimal_Bi_He(int decimal, int base) { //obs.: a sintaxe no C não é assim, precisa descobrir como retornar um char[]
  
    ...
    
    
    return op[9]; 
}

 

No main() poderia ficar algo assim:

printf("\n\t O numero %d em binario     = %s\n\n",a,Decimal_Bi_He(a,2));
printf("\n\t O numero %d em hexadecimal = %s\n\n",a,Decimal_Bi_He(a,16));

 

 

 

Outro ponto é sobre:

2 horas atrás, MatheusINF disse:

printf ("\tO numero %d em hexadecimal = %X\n",n,n);

 

Para mim também seria inválido... o objetivo seria "calcular o valor em hexadecimal", não apenas "exibir em hexadecimal". Seria análogo ao usar aquela função itoa()...  não é o resultado que importa, mas sim o meio para chegar a um. Seria necessário efetuar o mesmo processo que foi feito para o binário (apenas muda que para hexadecimal existem 16 possibilidades, em vez de apenas 2 como no binário. Ai usam-se letras para os maiores ou iguais a 10, pois senão ia ter como diferenciar, por exemplo, "11" de "1" e "1", ai, colocam B).

 

 

 

RESUMINDO:

- acho que não é para imprimir dentro da função;

- se pode ser assim, OK. Mas de qualquer forma acho que necessitaria calcular o Hexadecimal na mão (em vez de usar %x);

 

 

Então, poste também o enunciado completo para entendermos melhor o que precisa ser feito.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Eu acho que esse meu post de outro tópico pode ser de ajuda aqui:

 

Em 14/06/2018 às 19:50, isrnick disse:

O tipo da função serve para especificar o tipo do valor que pode ser retornado por ela para o escopo onde a função foi chamada, usando a palavra reservada return.

 

Por exemplo:


double quadrado(double x){
    return x * x;
}

é uma função que calcula o valor do quadrado de x e retorna o resultado calculado, o resultado é do tipo double, logo a função deve ser do tipo double para poder retornar esse tipo de valor.

 

Como um valor é retornado, isso significa que onde a função é chamada podemos atribuir o valor retornado pela função a uma variável do tipo double, ou realizar operações com o valor retornado. Por exemplo:


double y;
y = quadrado(2.5) * 5;

 

 

 

Se a função não usa o termo return para retornar nenhum valor então o tipo da função deve ser void (que significa vazio em português), identificando que nenhum valor é retornado (logo não podemos fazer atribuições ou operações usando esta função).

 

Por exemplo:


void imprime_double(double x){
    printf("%lf", x);
}

A função apenas imprime um valor do tipo double, e não precisa retornar nada, logo é do tipo void.

 

 

 

Observação: Note que também podemos usar "return;" em uma função void, sem indicar nenhum valor de retorno, para sair da função imediatamente, o que pode ser útil para interromper a função em algum ponto antes do seu fim.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

11 minutos atrás, MatheusINF disse:

@Simon Viegas Vou arrumar o código aqui então :d,a pergunta em em questão é essa:

- Escreva uma função  que recebe um número em decimal e retorna seus valores correspondentes em binário e hexadecimal

 

Nesse caso deseja-se fazer 1 função retornar 2 valores, então seria necessário fazer um retorno por parâmetros (não vamos considerar retorno por variáveis globais), o que significa que seria necessário saber passar parâmetros por referência para poder usar o parâmetro como um "retorno".

 

Você já aprendeu a usar vetores como parâmetros de uma função? Já aprendeu sobre ponteiros?

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP
1 hora atrás, MatheusINF disse:

- Escreva uma função  que recebe um número em decimal e retorna seus valores correspondentes em binário e hexadecimal

 

Pois então, muito vago. O que significa "retornar"? rs

 

 

Se for imprimir na própria função, seria algo como:

void Decimal_Bi_He(int x) {

}

Ai você calcula para cada base e imprime na própria função. Seria basicamente como já vez, mas acho mais coerente calcular o hexadecimal, em vez de usar um recurso de print.

 

 

 

Se for para retornar o valor, como são dois valores, poderia retornar o valor pelo parâmetro, usando o tal recurso de "referência", seria algo como:

void Decimal_Bi_He(int x, char[] binario, char[] hexadecimal) {


  //calcula o binário e retorna, algo como:
  binario = b[9]; //essa variável é do parâmetro, e a variável que foi usada ao invocar a função irá receber o valor (é uma referência)

  //calcula o hexadecimal e retorna, algo como:
  hexadecimal = h[9];

}

obs.: não sei como é a sintaxe no C para receber e retornar um char[], apenas passei a lógica. Acho que seria algo como *char. (usando ponteiros).. em fim... o segundo e terceiro parâmetros devem ser passado como referência ("persistir as alterações após finalizar a função" - o oposto da passagem por valor).

 

OU

 

Poderia retornar uma matriz de char pela própria função, mas acho que usando os parâmetros fica mais simples. Sugiro fazer com os parâmetros mesmo.... mais pra frente tentava assim, ou seja, faz da forma imprimindo dentro, depois faz outro código retornando por parâmetro por referência, depois faz retornando via matriz. (3 conceitos em um único exercício)

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

21 minutos atrás, MatheusINF disse:

 

@isrnick Bom o nome ponteiro em especifico não lembro dele ter citado, porém passagem por valor e por referência ele já passou sim. 

 

 

Fiz um esboço da função usando 2 vetores de chars como parâmetros, que servirão como variáveis de retorno para a função:

void converteDecBinHex(int decimal, char binario[], char hexadecimal[]){
    /*
    Vetores são passados por referência, então aqui 
    você faz a conversão de decimal para binario e para 
    hexadecimal, o binario guarda como uma string no 
    vetor binario, e o hexadecimal guarda como uma
    string no vetor hexadecimal.
    
    Quando sair da função os valores serão acessados nos
    vetores.
    
    Note que o tipo da função é void, pois não usará
    return para retornar um valor, o "retorno" é feito
    através dos vetores passados como parâmetros da função.
    */
    
    // Se o número decimal é igual a 179:
    strcpy( binario, "10110011" );
    strcpy( hexadecimal, "B3" );
}

 

 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

@isrnick, então acertei o chute na passagem de parâmetro, rs.

 

Sobre:

10 minutos atrás, isrnick disse:

    strcpy( binario, "10110011" );
    strcpy( hexadecimal, "B3" );

 

@MatheusINF, ai usaria a variável que usou nas respectivas contas... algo como:

    //calcula o valor em binário
    ...
    strcpy(binario, resultado);
    //calcula o valor em hexadecimal
    ...   
    strcpy(hexadecimal, resultado);

:)

 

 

 

 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...