Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Jennifer Tognetti Vassão

Ordenar valores

Recommended Posts

Eu to tentando fazer com que o programa leia 3 valores e os coloque em ordem crescente, mas ele não roda, e aparece a mensagem de erro " multiple definition of `main' " , ja tentei int main e mesmo assim não dá, gostaria de saber se alguem sabe pq ?

 

#include <stdio.h>

main ()
{
       int a,b,c;
       int aux;

       printf("entre com tres numeros:");
       scanf("%i%i%i",&a,&b,&c);

       if(a>B)
       {
               aux=a;
               a=b;
               b=aux;
       }
       if(a>c)
       {
               aux=a;
               a=c;
               c=aux;
       }
       if(b>c)
       {
               aux=b;
               b=c;
               c=aux;
       }

       printf("%i%i%i", a,b,c);


}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Jennifer Tognetti Vassão,

 

Você sempre deve especificar o tipo de retorno da função main, e não esquecer de retornar ao Sistema operacional que executou corretamente com return 0.

 

Caso não utilize os parametros por linha de comando, a declaração de main deve ser esta:

int main (void)

 

Quanto ao erro que você mencionou, não ocorreu comigo. Utilizei o Devc-C++ portable para compilar.

 

Segue o código revisado:

#include <stdio.h>

int main (void)
{
       int a,b,c;
       int aux;

       printf("entre com tres numeros:");
       scanf("%i%i%i",&a,&b,&c);

       if(a>B)
       {
               aux=a;
               a=b;
               b=aux;
       }
       if(a>c)
       {
               aux=a;
               a=c;
               c=aux;
       }
       if(b>c)
       {
               aux=b;
               b=c;
               c=aux;
       }

       printf("%i%i%i\n", a,b,c);

       system("PAUSE");
       return 0;
}

 

Espero ter ajudado, FLW!

Compartilhar este post


Link para o post
Compartilhar em outros sites

 if(a>B)

 

Lembre-se que C é case-sensitive: o nome 'var' é diferente de 'Var', que é diferente de 'VaR', que é diferente de 'VAR', que é diferente de 'vaR', e assim vai. Por isso, 'b' é diferente de 'B'. São variáveis diferentes.

 

Evite system("PAUSE"), veja abaixo o motivo:

 

http://forum.imasters.com.br/topic/336835-tutorial-systempause-e-fflushstdin/

 

Sempre inicialize variáveis antes de enviá-las a uma chamada para scanf. E aquela chamada a scanf não dá muito certo, pois entrar com 3 números sem espaços entre eles, como você vai definir onde acaba um número e onde começa outro? O mesmo vale para o printf lá embaixo...

 

Porque não define melhor o nome das variáveis? Ao invés de 'a', 'b' e 'c', porque não 'numero_1', 'numero_2', 'numero_3'? Melhor ainda, use um vetor. E 'aux', porque não 'auxiliar'? Você sempre deve prezar pela facilidade de leitura.

 

-----------------------

 

Então, fiz umas mudanças, dá uma olhada para ver a diferença (OBS: não precisa ter medo de espaços em C) (vou considerar que você ainda não aprendeu a mexer com vetores):

 

#include <stdio.h>

int main(void)
{
       int numero_0 = 0, numero_1 = 1, numero_2 = 2, auxiliar;

       printf("entre com tres numeros, separados por espaços:");
       scanf(" %i %i %i",&numero_0, &numero_1, &numero_2);

       if(numero_0 > numero_1)
       {
               auxiliar = numero_0;
               numero_0 = numero_1;
               numero_1 = auxiliar;
       }
       if(numero_0 > numero_2)
       {
               auxiliar = numero_0;
               numero_0 = numero_2;
               numero_2 = auxiliar;
       }
       if(numero_1 > numero_2)
       {
               auxiliar = numero_1;
               numero_1 = numero_2;
               numero_1 = auxiliar;
       }

       printf("%i %i %i\n", numero_0, numero_1, numero_2);

       getchar();
       return 0;
}

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Renato,

 

E aquela chamada a scanf não dá muito certo, pois entrar com 3 números sem espaços entre eles, como você vai definir onde acaba um número e onde começa outro? O mesmo vale para o printf lá embaixo...

 

A funcionalidade dos espaços entre o scanf e o printf, é bem diferente.

Não é necessário utilizar espaços no scanf, se o motivo for organização, prefiro utilizar um scanf para cada variável. Não?

 

FLW!

Compartilhar este post


Link para o post
Compartilhar em outros sites
A funcionalidade dos espaços entre o scanf e o printf, é bem diferente.

Não é necessário utilizar espaços no scanf, se o motivo for organização, prefiro utilizar um scanf para cada variável. Não?

 

FLW!

 

Sim e não (respectivamente), o que eu tava me referindo era isso:

 

---------------------

 

Temos o seguinte programa com scanf():

 

#include <stdio.h>

int main(void)
{
   int a = 0, b = 0, c = 0;

   printf("Entre com 3 números: ");
   scanf("%d%d%d", &a, &b, &c);

   return 0;
}

 

Agora pense em como você fará a entrada aos números. Se você digitar 2748567, você poderia estar dizendo os números 27, 48 e 567, ou 274, 856 e 7, ou 2847, 5, 67. Como o computador vai saber qual é qual? Só se você limitar o número de caracteres do scanf() usando %n<op> (exemplo: %2d só pega 2 caracteres do número). Não adianta digitar um número e digitar enter, depois o outro, e enter, e depois o último, pois iria para o scanf como "%d\n%d\n%d\n" em linux e "%d\r\n%d\r\n%d\r\n" em windows, o que não é o que estamos querendo e o scanf() não pegaria.

 

Então, a solução mais razoável é separar por espaços, ficando:

 

#include <stdio.h>

int main(void)
{
   int a = 0, b = 0, c = 0;

   printf("Entre com 3 números: ");
   scanf("%d %d %d", &a, &b, &c);

   return 0;
}

 

Pois na entrada, podemos fazer tanto "274 767 4" quanto "27 476 74", e ambas funcionarão.

 

Uma coisa que eu acho bem interessante quanto a essa propriedade do printf é porque ele funciona como um 'regex' bem básico:

 

#include <stdio.h>

int main(void)
{
   int dia = 0, mes = 0, ano = 0;

   printf("Entre com a data (no formato DD/MM/YYYY): ");
   scanf("%d/%d/%d", &dia, &mes, &ano);

   return 0;
}

------------------------------------

 

Quanto ao printf, vamos continuar o programa dos "3 números":

 

#include <stdio.h>

int main(void)
{
   int a = 0, b = 0, c = 0;

   printf("Entre com 3 números: ");
   scanf("%d %d %d", &a, &b, &c);
   printf("Os 3 números: %d%d%d", a, b, c);

   return 0;
}

 

Imagine a saída disso. Vai printar tudo junto, e não número por número. Como vou diferenciar? O correto seria colocar um separador, tanto um , quanto um ; quanto um espaço, por isso a minha sugestão:

 

 

#include <stdio.h>

int main(void)
{
   int a = 0, b = 0, c = 0;

   printf("Entre com 3 números: ");
   scanf("%d %d %d", &a, &b, &c);
   printf("Os 3 números: %d %d %d", a, b, c);

   return 0;
}

 

 

---------------------------------------

 

Agora que estava mexendo aqui, lembrei que scanf() não aceita %i, só %d. Portanto, o programa que você postou, Jennifer, seria assim:

 

#include <stdio.h>

int main(void)
{
       int numero_0 = 0, numero_1 = 1, numero_2 = 2, auxiliar;

       printf("entre com tres numeros, separados por espaços:");
       scanf(" %d %d %d",&numero_0, &numero_1, &numero_2);

       if(numero_0 > numero_1)
       {
               auxiliar = numero_0;
               numero_0 = numero_1;
               numero_1 = auxiliar;
       }
       if(numero_0 > numero_2)
       {
               auxiliar = numero_0;
               numero_0 = numero_2;
               numero_2 = auxiliar;
       }
       if(numero_1 > numero_2)
       {
               auxiliar = numero_1;
               numero_1 = numero_2;
               numero_1 = auxiliar;
       }

       printf("%d %d %d\n", numero_0, numero_1, numero_2);

       getchar();
       return 0;
}

 

O printf() aceita %i, mas, para manter a consistência e evitar confusões, use sempre %d. Aliás, se não souber o significado de %d, lembre-se de decimal.

 

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

GBecker: O return 0; é implícito em main desde a penúltima versão de C.

 

Renato: Acho que vale a pena falar que o problema não é chamar scanf passando como argumentos ponteiros para regiões não incializadas, e sim tentar acessá-las depois caso alguma não receba um valor lido. De qualquer forma, sugiro que recomende checar o valor de retorno da função pra verificar se houve erros de leitura e agir de acordo com o resultado. Note que o seguinte código é perfeitamente válido:

 

#include <stdio.h>

int main(void)
{
   int a;

   scanf("%d", &a);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites
Renato: Acho que vale a pena falar que o problema não é chamar scanf passando como argumentos ponteiros para regiões não incializadas, e sim tentar acessá-las depois caso alguma não receba um valor lido. De qualquer forma, sugiro que recomende checar o valor de retorno da função pra verificar se houve erros de leitura e agir de acordo com o resultado. Note que o seguinte código é perfeitamente válido:

 

É verdade, é mais válido explicar a verdade inteira do que explicar meias verdades deixando a pessoa achando que entendeu o problema quando não entendeu na verdade.

 

Farei isso nas próximas vezes.

 

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.