Programação em C pow e sqrt " Resolvido "

Iniciado por Deis, 05 de Dezembro de 2012, 21:14

tópico anterior - próximo tópico

Deis

Ola pessoal.

Estou començando a programar em C pelo Geany (Geany facil de usar e em protugues) e estou com dificulade em programar com " pow " e " sqrt " o Geany não enxerga a biblioteca math.h somente usando o lm ( linkar biblioteca math no codigo ) pelo terminal ai funciona.

A pergunta é a seguinte: Porque o Geany não linka a biblioteca math.h se ela foi declarada? Falta configuração?

Pegeui o programa abaixo na internet com a seguinte proposta:

Caso não de uma raiz quadrada exata, o programa executa a potenciação do numero digitado.

Mas o programa esta errado.

No " if (NUM==0) " somente a raiz de zero dara zero.

Qualquer outro numero digitado dara diferente de zero e nunca sera excutado o else, porque só o zero atende o " if (NUM==0) ".

Se eu digitar 9 sera executado o " if (); se eu digitar 5 sera executado o else().

Qual seria a condição que eu tenho que colocar no if para dar certo a proposta do exercicio?

Tem raiz inteiro executa if. Se der raiz quebrada executa else: potenciação.


#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
int main()
{
int NUM;
printf("\nINFORME NUMERO: ");
scanf("%i",&NUM);
if (NUM==0)
printf("\nA RAIZ QUADRADA DO NUMERO E:%f",sqrt(NUM));
else
printf("\nO QUADRADO DO NUMERO E:%f",pow(NUM,2));
printf("\n\n");
system("pause");
return(0);
}



Sergio Benjamim

Amigão, vc está salvando o seu arquivo em .c né? E tem coisa errada no seu programa aí cara.
É novo no Ubuntu? Já leu o Ubuntu – Guia do Iniciante 2.0 ?
Experimente o Xubuntu 14.04 !

Deis

Citação de: Sergio Benjamim online 05 de Dezembro de 2012, 21:50
Amigão, vc está salvando o seu arquivo em .c né? E tem coisa errada no seu programa aí cara.

Sim ele esta salvo em .c

E com certeza tem coisa errada.

Eu peguei esse programa na internet, puz para rodar, e deu para ver que tem falha.

Ele não cumpre o exercicio proposto.

Sergio Benjamim

#3
Aqui o Geany está configurado desse jeito:

Citar
Compilar: gcc -Wall -c "%f"
Construir: gcc -Wall "%f" -lm -o "%e"

Alterei o programa, agora ele está fazendo o pedido. Cuidado com os vícios de linguagem lá do windows, tem coisa que não funciona no Ubuntu porque é variável de sistema, como o "system" e "cls".


#include<stdio.h>
#include<stdlib.h>
#include<math.h>
// #include<string.h> // Não precisa dessa biblioteca

int main() {
   int num, raiz_num_truncado; // Convenção para um bom código: variáveis utilizam letras minúsculas, CONSTANTES utilizam letras MAIÚSCULAS.
   double raiz_num;

   printf("\nINFORME NUMERO: ");
   scanf("%d", &num); // Aqui é %d !!! Experimenta usar o %i e entrar lá no programa com 012, para ver o que acontece.

   // Aqui vc vai tirar a raiz do número que o usuário digitou, independente se for uma raiz quadrada exata ou não
   raiz_num = sqrt((double)num); // O double é conversor de cast, precisa converter o inteiro em double nesta função
   
   // Aqui vc vai truncar o número, para poder compará-lo com ele mesmo à frente
   raiz_num_truncado = (int)raiz_num; // Ao converter o raiz_num para inteiro, o número dentro dele é truncado (3.46396 vira 3 por exemplo)
   
   // Se o número for uma raiz quadrada exata, então o raiz_num será igual ao raiz_num_truncado
   // Se não for raiz quadrada exata, então na hora de truncar o raiz_num_truncado será diferente do raiz_num
   // Lembrar que ao truncar um número, vc só pega a parte que vem antes da virgula, por exemplo: 7,290 truncando fica 7
   if ( raiz_num == (double)raiz_num_truncado )
      printf("\nA RAIZ QUADRADA DO NUMERO E: %.3f", raiz_num); // Importante indentar seu programa!!!
   else
      printf("\nO QUADRADO DO NUMERO E: %.3f", pow((double)num, 2.0));

   printf("\n\n");

   // O "pause" é variável de sistema, para ser específico é do rWindows, portanto não funcionará em Linux. Não faz parte da linguagem C.
   //system("pause");

   // No lugar do comando anterior, use:
   printf("Aperte enter para sair");
   getchar(); // Essas duas linhas são mais universais, funciona para qualquer sistema

   return(0);
}
É novo no Ubuntu? Já leu o Ubuntu – Guia do Iniciante 2.0 ?
Experimente o Xubuntu 14.04 !

Deis

#4
Citação de: Sergio Benjamim online 05 de Dezembro de 2012, 22:15
Aqui o Geany está configurado desse jeito:

Citar
Compilar: gcc -Wall -c "%f"
Construir: gcc -Wall "%f" -lm -o "%e"

Alterei o programa, agora ele está fazendo o pedido. Cuidado com os vícios de linguagem lá do windows, tem coisa que não funciona no Ubuntu porque é variável de sistema, como o "system" e "cls".


#include<stdio.h>
#include<stdlib.h>
#include<math.h>
// #include<string.h> // Não precisa dessa biblioteca

int main() {
  int num, raiz_num_truncado; // Convenção para um bom código: variáveis utilizam letras minúsculas, CONSTANTES utilizam letras MAIÚSCULAS.
  double raiz_num;

  printf("\nINFORME NUMERO: ");
  scanf("%i", &num);

  raiz_num = sqrt((double)num); // O double é conversor de cast, precisa converter o inteiro em double nesta função
  raiz_num_truncado = (int)raiz_num; // Ao converter o raiz_num para inteiro, o número dentro dele é truncado (3.46396 vira 3 por exemplo)

  if ( raiz_num == (double)raiz_num_truncado )
     printf("\nA RAIZ QUADRADA DO NUMERO E: %.3f", raiz_num); // Importante indentar seu programa!!!
  else
     printf("\nO QUADRADO DO NUMERO E: %.3f", pow((double)num, 2.0));

  printf("\n\n");

  // O "pause" é variável de sistema, para ser específico é do rWindows, portanto não funcionará em Linux. Não faz parte da linguagem C.
  //system("pause");

  // No lugar do comando anterior, use:
  printf("Aperte enter para sair");
  getchar(); // Essas duas linhas são mais universais, funciona para qualquer sistema

  return(0);
}


O brigado  Sergio Benjamim pela ajuda.

Eu não sei quase nada de programação; faz uns 2 meses que começei a programar e nunca programei no Windows.

Eu sou leigo mesmo em programação.

Rodei seu programa e deu certinho, mas tive que rodar pelo terminal:

gcc raiz-quadrada.c -lm -o raiz-quadrada

./raiz-quadrada

Eu não sei como que eu configuro o Geany do jeito que você mostrou como  esta configurado o seu.

Você poderia me ajudar a configurar o Geany?

E você poderia me orientar, dar um norte para eu me aprofundar em linguagem C?

Eu li seu codigo fonte e não entendi ele.


Deis

Muito obrigado mesmo Sergio Benjamim.

Eu fui fuçando e consegui achar aba que eu teria que colocar: Construir: gcc -Wall "%f" -lm -o "%e"

Estava assim: gcc-Wall-o"%""%f"

Perguntei para um monte de pessoas em alguns forum e não tive sucesso.

Mas você acertou na mosca a minha duvida e resolvou o meu problema.

Só preciso agora que você  me oriente, me de um norte para eu me aprofundar em linguagem C?

Começar de modo certo.

Sergio Benjamim

Oh, tem que usar %d para ler inteiros, não %i, eu modifiquei lá no programa, dá uma olhada. Experimenta rodar o programa e jogar o número 012 e depois 12, vc vai notar que ele vai funcionar diferente se tiver com %i no scanf().

Para mudar as configurações que te falei, vá em Construir -> Definir Comandos de Construção.

Tem dois livros muito bons de C, que usei bastante para aprender aqui na facu:

Linguagem C, de Luis Damas

Treinamento em linguagem C, de Victorine Viviane Mizrahi

Aprendi bastante com eles, mesmo. Atualizei o código que postei anteriormente, dá uma olhada se está mais fácil de entender.
É novo no Ubuntu? Já leu o Ubuntu – Guia do Iniciante 2.0 ?
Experimente o Xubuntu 14.04 !

Deis

Citação de: Sergio Benjamim online 05 de Dezembro de 2012, 22:57
Oh, tem que usar %d para ler inteiros, não %i, eu modifiquei lá no programa, dá uma olhada. Experimenta rodar o programa e jogar o número 012 e depois 12, vc vai notar que ele vai funcionar diferente se tiver com %i no scanf().

Para mudar as configurações que te falei, vá em Construir -> Definir Comandos de Construção.

Tem dois livros muito bons de C, que usei bastante para aprender aqui na facu:

Linguagem C, de Luis Damas

Treinamento em linguagem C, de Victorine Viviane Mizrahi

Aprendi bastante com eles, mesmo. Atualizei o código que postei anteriormente, dá uma olhada se está mais fácil de entender.

Entendi que inteiro é %d e não %i.

Já consegui configurar o Geany.

Vou procurar esses livros na internet.

Aonde esta o código atualizado que você mencionou?

E porque digitando 012 da resultado diferente se digitasse 12?

Sergio Benjamim

Citação de: Deis online 05 de Dezembro de 2012, 23:11
Citação de: Sergio Benjamim online 05 de Dezembro de 2012, 22:57
Oh, tem que usar %d para ler inteiros, não %i, eu modifiquei lá no programa, dá uma olhada. Experimenta rodar o programa e jogar o número 012 e depois 12, vc vai notar que ele vai funcionar diferente se tiver com %i no scanf().

Para mudar as configurações que te falei, vá em Construir -> Definir Comandos de Construção.

Tem dois livros muito bons de C, que usei bastante para aprender aqui na facu:

Linguagem C, de Luis Damas

Treinamento em linguagem C, de Victorine Viviane Mizrahi

Aprendi bastante com eles, mesmo. Atualizei o código que postei anteriormente, dá uma olhada se está mais fácil de entender.

Entendi que inteiro é %d e não %i.

Já consegui configurar o Geany.

Vou procurar esses livros na internet.

Aonde esta o código atualizado que você mencionou?

E porque digitando 012 da resultado diferente se digitasse 12?

Atualizei ele no meu segundo post deste tópico, dá uma reparada lá em cima (eu editei o post).

Não tenho certeza, mas me parece que com %i se vc colocar um zero na frente o número é interpretado como sendo de base octal, ao invés de decimal.

Cara, se eu fosse vc eu compraria o livro do Luis Damas, ele é muito bom, vai ser um investimento para vc, não um gasto. Vale muito a pena. Procure usado mesmo, em sebos (procure na estante virtual).
É novo no Ubuntu? Já leu o Ubuntu – Guia do Iniciante 2.0 ?
Experimente o Xubuntu 14.04 !

Deis

Citação de: Sergio Benjamim online 05 de Dezembro de 2012, 23:19
Citação de: Deis online 05 de Dezembro de 2012, 23:11
Citação de: Sergio Benjamim online 05 de Dezembro de 2012, 22:57
Oh, tem que usar %d para ler inteiros, não %i, eu modifiquei lá no programa, dá uma olhada. Experimenta rodar o programa e jogar o número 012 e depois 12, vc vai notar que ele vai funcionar diferente se tiver com %i no scanf().

Para mudar as configurações que te falei, vá em Construir -> Definir Comandos de Construção.

Tem dois livros muito bons de C, que usei bastante para aprender aqui na facu:

Linguagem C, de Luis Damas

Treinamento em linguagem C, de Victorine Viviane Mizrahi

Aprendi bastante com eles, mesmo. Atualizei o código que postei anteriormente, dá uma olhada se está mais fácil de entender.

Entendi que inteiro é %d e não %i.

Já consegui configurar o Geany.

Vou procurar esses livros na internet.

Aonde esta o código atualizado que você mencionou?

E porque digitando 012 da resultado diferente se digitasse 12?

Atualizei ele no meu segundo post deste tópico, dá uma reparada lá em cima (eu editei o post).

Não tenho certeza, mas me parece que com %i se vc colocar um zero na frente o número é interpretado como sendo de base octal, ao invés de decimal.

Cara, se eu fosse vc eu compraria o livro do Luis Damas, ele é muito bom, vai ser um investimento para vc, não um gasto. Vale muito a pena. Procure usado mesmo, em sebos (procure na estante virtual).

Ok Sergio Benjamim, entendi.

Conheço a estante virtual, já comprei um livro la.

Muito obrigado por sua atenção.

Deis

Qual a edição do Livro Linguagem C, de Luis Damas 10ª Edição 2007?

Sergio Benjamim

Citação de: Deis online 05 de Dezembro de 2012, 23:30
Qual a edição do Livro Linguagem C, de Luis Damas 10ª Edição 2007?

Acho q usava o 10ª edição mesmo.
É novo no Ubuntu? Já leu o Ubuntu – Guia do Iniciante 2.0 ?
Experimente o Xubuntu 14.04 !

Deis


Deis

Tem como converter codigo fonte C++ para C e vice-versa?

Sergio Benjamim

Citação de: Deis online 05 de Dezembro de 2012, 23:42
Tem como converter codigo fonte C++ para C e vice-versa?

Tem, mas no sentido de vc ler todo o código e ir substituindo os códigos e funções (pensando assim vc também pode converter de C para Java, Java para Python e etc). Mas não esquente a cabeça com C++ por enquanto, ela é uma linguagem orientada à objetos e é mais chatinha de aprender do que C (minha opinião).
É novo no Ubuntu? Já leu o Ubuntu – Guia do Iniciante 2.0 ?
Experimente o Xubuntu 14.04 !