Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
Nmaster

Questão acerca do codigo

Recommended Posts

Nmaster

Boas pessoal. Ando aqui no estudo(inicial) do C, a tentar ganhar o maximo de conhecimento que puder. Gostava que me dissessem como posso prevenir que ao correr o programa, e depois ao inserir no input letras ou caracteres que o programa fique "marado".

Sera isso possivel atravez de por exemplo o assert? há outras formas também?se sim quais?

Estou a tentar fazer isso para o seguinte codigo:

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

float celsius_from_fahr(void)
{
    float f,c;
    printf("Diga a temperatura em Fahreneit ao qual pretende saber a sua correspondencia em Celsius:");
    scanf("%f",&f);
    c = (f-32)/1.8;
    printf("Para %.2f fahreneit temos %.2f Celsius\n",f,c);
    return c;
}

float fahr_from_Celsius(void)
{
    float f,c;
    printf("Diga a temperatura em Celsius ao qual pretende saber a sua correspondencia em Fahreneit:");
    scanf("%f",&c);
    f = (c*1.8)+32;
    printf("Para %.2f Celsius temos %.2f fahreneit\n",c,f);
    return c;
}
   
int main (void)//o main não tem argumentos de entrada (logo tem como arg "void") mas da yn return de um inteiro (logo é do tipo int)
{
    int i;
   do{
      printf("Qual das seguintes conversoes de temperatura, pretende o usuario saber?\n1-Conversao Celsius -> Fahreneit\n2-Conversao Fahreneit -> Celsius\n0-Para sair\n");
      scanf("%d",&i);
                  switch (i)
            {
            case 0:
                 return 0;
            case 1:
                 fahr_from_Celsius();
                 break;
            case 2:
                 celsius_from_fahr();
                 break;
            default:
                 printf("Ups, nao existe essa opcao.\n");
                 break;
    }
}
while(i!=NULL);
      
    system("PAUSE");
    return 0;
}

Share this post


Link to post
Share on other sites
IRX773

Eu não sou muito a favor do assert devido à memoria que este gasta a mais .... principalmente se forem vários.

Mas acho que para o caso um assert faria a diferença.

Ou então ao pedir ao utilizador os graus pedias em formato string e depois convertias para int ou float antes de fazeres os cálculos ... isso resolvia o problema do programa ficar marado.

float celsius_from_fahr(void)
{
    float f,c;
    char string [99];
    printf("Diga a temperatura em Fahreneit ao qual pretende saber a sua correspondencia em Celsius:");
    gets(string);
    f = atof (string);
    c = (f-32)/1.8;
    printf("Para %.2f fahreneit temos %.2f Celsius\n",f,c);
    return c;
}

Share this post


Link to post
Share on other sites
Localhost

Não uses o gets para leres strings, corres o risco de ter bufferoverflow's e do programa ficar "marado" na mesma.


here since 2009

Share this post


Link to post
Share on other sites
IRX773

Não uses o gets para leres strings, corres o risco de ter bufferoverflow's e do programa ficar "marado" na mesma.

Sim ... usa o fgets .. .mas para a string .... Sorry ... esqueci-me do bufferoverflow.

Share this post


Link to post
Share on other sites
Nmaster

Ja fiz uma alterações, agora tenho o codigo assim:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <ctype.h>
//#include <string.h>

float celsius_from_fahr(void)
{
    float f,c;
    char string [99];
    printf("Diga a temperatura em Fahreneit ao qual pretende saber a sua correspondencia em Celsius:\n");
    fflush(stdin);
    gets(string);
    f=atof(string);
    //scanf("%f",&f);
    c = (f-32)/1.8;
    printf("Para %.2f fahreneit temos %.2f Celsius\n",f,c);
    return c;
}

float fahr_from_Celsius(void)
{
    float f,c;
    char string [99];
    printf("Diga a temperatura em Celsius ao qual pretende saber a sua correspondencia em Fahreneit:\n");
    fflush(stdin);
    gets(string);
    c=atof(string);
    //scanf("%f",&c);
    f = (c*1.8)+32;
    printf("Para %.2f Celsius temos %.2f fahreneit\n",c,f);
    return c;
}
   
int main (void)//o main não tem argumentos de entrada (logo tem como arg "void") mas da um return de um inteiro (logo é do tipo int)
{
char temp[100];
int i;
   do{
      printf("Qual das seguintes conversoes de temperatura, pretende o usuario saber?\n1-Conversao Celsius -> Fahreneit\n2-Conversao Fahreneit -> Celsius\n0-Para sair\n");
      scanf("%d",&i);
                  switch (i)
            {
            case 0:
                 return 0;
            case 1:
                 fahr_from_Celsius();
                 break;
            case 2:
                 celsius_from_fahr();
                 break;
            default:
                 printf("Ups, nao existe essa opcao.\n");
                 break;
    }
    printf("\nDeseja continuar? (S/N): ");
    fflush(stdin);
    gets(temp);
}
while(toupper(*temp)=='S');
      
    system("PAUSE");
    return 0;
}

Agora mesmo que ponha no input letras ou caracteres a variavel toma o valor de 'zero'.

Sabem de mais alguma coisa que possa fazer para melhorar? em que contexto usariam aqui o assert?

Obrigado pelas sugestões pessoal. :)

Share this post


Link to post
Share on other sites
Localhost

Usa a função atoi.

Deixo-te aqui um exemplo do seu uso:

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

int main(void) {
  int iNum = 0;
  char SzStr[10];
  fgets(SzStr,9,stdin);
  iNum = atoi(SzStr);
  printf("%i\n", iNum-1);
  return 0;
}

A função atoi se receber uma string que contenha letras retorna 0, se receber números retorna esses mesmos números.

Por isso tens de ter em atenção de que se forem letras estarás a lidar com o número 0.

p.s. Não uses a função gets como já foi dito anteriormente.


here since 2009

Share this post


Link to post
Share on other sites
Baderous

A função atoi se receber uma string que contenha letras retorna 0, se receber números retorna esses mesmos números.

Por isso tens de ter em atenção de que se forem letras estarás a lidar com o número 0.

É quase isso. Após eliminar os caracteres brancos iniciais, procura por um sinal de + ou - opcional, e de seguida começa a percorrer o que resta da string. Enquanto os caracteres encontrados corresponderem a dígitos, então ela vai fazendo a conversão. Mal encontre algo que não seja dígito  então pára. Ou seja, atoi("123asd") = 123. Mas caso encontre logo de início um caracter não dígito, então devolve 0, ou seja, atoi("asd123") = 0.

http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.