Ir para o conteúdo
darkangel_13

que tipo de erro é ?

Mensagens Recomendadas

darkangel_13    0
darkangel_13

/* Problema: Saber quanto se vai pagar ao banco, lendo a taxa de juro , pagamento inicial , o numero de anos. Portugal
   David Russo, 2/1/2012
*/
#include <stdio.h>
#include <conio.h>
#include <math.h>
main()
{
      float pagamento_total,valor_imovel,taxa_juro,numero_anos,numero_meses;
      char nome[30],banco[30];
      printf("Digite o seu nome. :");
      scanf("%s",nome);
      printf("\nDigite o nome do seu banco. :");
      scanf("%s",banco);
      printf("\nDigite o valor do imovel. :");
      scanf("%f",&valor_imovel);
      printf("\nDigite a taxa de juro aplicada pelo banco. :");
      scanf("%f",&taxa_juro);
      numero_meses=numero_anos*12;
      pagamento_total=valor_imovel*pow((1+(taxa_juro/100)),(numero_meses)); //(1+(taxa_juro/100))^pow(numero_meses);
      printf("Nome = %s\n",nome);
      printf("Banco =%s\n ",banco);
      printf("Pagamento a realizar na totalidade =%f ",pagamento_total);
      getch();

}

Boa tarde pessoa, hoje propus um desafio a mim próprio usando uma função exponencial calcular o pagamento total ao banco, visto que eu usei um modulo de calculo ou seja esta expressão Pagamento Final=valor de imovel*(1+taxa de juro)^numero de meses, eu não poderei ter a certeza do calculo final .

Ao ser compilado não é detectado nenhum numero mas ao inciar o programa e testa-lo se eu colocar no nome Arlindo Neves, já não consigo colocar o nome do banco mas se colocar Arlindo já consigo ,que tipo de erro é ?

cumprimentos, obrigado e bom ano!!!!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

O formato "%s" para o scanf le a string sem contar com espacos antes ou depois. O input "Arlindo Neves" tem um espaco que é exactamente onde o scanf acaba de ler.

Solucoes:

1) Usa outra funcao para ler input (eg: fgets())

2) Usa o formato "%[...]" (ou "%[^...]") para especificar os caracters que sao aceites (ou terminam) no input

3) le caracter-a-caracter e vai construindo o nome

Nota: com o scanf é aconselhavel especificar também o comprimento maximo a ler, por exemplo para 29 caracteres (mais o '\0' que é automatico) e verificar o valor de retorno: if (scanf("%29[^\n]", nome) != 1) /* erro */;

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
darkangel_13    0
darkangel_13

Poderas dar-me um exemplo de codigo ? é que as minhas tentativas no codigo ou fizeram o programa terminar ou nada alteraram.

cumps

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
darkangel_13    0
darkangel_13

Mostra as tentativas que fizeste. Se já não as tens, recria-as.

scanf("%s""%[^...]",nome);

fiz essa e depois tentei meter o %[^...] ao lado do nome entre virgulas

if (scanf("%29[^\n]", nome) != 1) /* erro */; <- não tentei nada com isto porque não percebo a parte do "retorno" e o que significa

cumps

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
KTachyon    272
KTachyon

O scanf() retorna o número de argumentos lidos. Ou seja, se estás a ler uma string, o scanf() tem que retornar 1, caso contrário é sinal que não conseguiu ler.

scanf("%[^\n]",line);

Isto diz para o scanf ler tudo até ao \n.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

Aproveitando este tópico alguém me poderia dar um género de desafio ?

Faz um programa que leia do stdin numeros e os some. Se o input contiver coisas que nao sao numeros, essas coisas devem ser ignoradas.

Ex: para o input "1 dois 3 quatro 42 cem 1000" o output deve ser 1046

Podes assumir que os numeros tem sempre espacos (ou enters) de ambos os lados (excepto no principio / fim do input), ie "RS232C" nao forma um numero.

Podes assumir que os numeros sao razoaveis (digamos entre 1 e 10000) e que a some nunca da overflow.

Podes assumir que o input e constituido apenas por letras ASCII, digitos ASCII e espacos e enters.

Diverte-te

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
darkangel_13    0
darkangel_13

Faz um programa que leia do stdin numeros e os some. Se o input contiver coisas que nao sao numeros, essas coisas devem ser ignoradas.

Ex: para o input "1 dois 3 quatro 42 cem 1000" o output deve ser 1046

Podes assumir que os numeros tem sempre espacos (ou enters) de ambos os lados (excepto no principio / fim do input), ie "RS232C" nao forma um numero.

Podes assumir que os numeros sao razoaveis (digamos entre 1 e 10000) e que a some nunca da overflow.

Podes assumir que o input e constituido apenas por letras ASCII, digitos ASCII e espacos e enters.

Diverte-te

thanks vou guarda-lo para quando perceber como faze-lo, faze-lo

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1134
HappyHippyHippo

Faz um programa que leia do stdin numeros e os some. Se o input contiver coisas que nao sao numeros, essas coisas devem ser ignoradas.

Ex: para o input "1 dois 3 quatro 42 cem 1000" o output deve ser 1046

Podes assumir que os numeros tem sempre espacos (ou enters) de ambos os lados (excepto no principio / fim do input), ie "RS232C" nao forma um numero.

Podes assumir que os numeros sao razoaveis (digamos entre 1 e 10000) e que a some nunca da overflow.

Podes assumir que o input e constituido apenas por letras ASCII, digitos ASCII e espacos e enters.

Diverte-te

falta dizer qual o marcador de fim de leitura do stdin para terminar a aplicação

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

falta dizer qual o marcador de fim de leitura do stdin para terminar a aplicação

Nao ha marcador: é tudo valido. O input acaba quando nao houver mais dados. Hint: normalmente o EOF detecta erro de leitura ou fim de dados.

Para este exercicio, podes assumir que o valor EOF devolvido por getchar(), scanf(), ou fgets() implica o fim de dados (que é o que se faz na realidade --- mas, de facto, o valor EOF nao significa necessariamente fim de dados).

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

pagamento_total=valor_imovel*pow((1+(taxa_juro/100)),(numero_meses))

isto está correcto ?

Aparentemente sim.

Mas taxa_juro deve ser double (ou float) para a divisao por 100 (100 é do tipo int) nao dar zero.

Alem disso se a taxa de juro é 6.8% ao ano porque é que estas a usar numero_meses na formula? ???

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
darkangel_13    0
darkangel_13

Aparentemente sim.

Mas taxa_juro deve ser double (ou float) para a divisao por 100 (100 é do tipo int) nao dar zero.

Alem disso se a taxa de juro é 6.8% ao ano porque é que estas a usar numero_meses na formula? ???

Realmente.. :wallbash:

/* Problema: Saber quanto se vai pagar ao banco, lendo a taxa de juro , pagamento inicial , o numero de anos. Portugal
   David Russo, 2/1/2012
*/
#include <stdio.h>
#include <conio.h>
#include <math.h>
main()
{
      float pagamento_total,valor_imovel,taxa_juro,anos;
      char nome[30];
      char banco[30];
      printf("Digite o seu nome. :");
  scanf("%s%[^\n]",nome);
  printf("\nDigite o nome do seu banco. :");
  scanf("%s%[^\n]",banco);
  printf("\nDigite o valor do imovel. :");
  scanf("%f",&valor_imovel);
  printf("\nDigite a taxa de juro aplicada pelo banco. :");
  scanf("%f",&taxa_juro);
  printf("\nDigite o numero de anos acordado. :");
  scanf("%f",&anos);
  pagamento_total=valor_imovel*pow((1+(taxa_juro/100)),(anos)); //(1+(taxa_juro/100))^pow(numero_meses);
  printf("Nome = %s\n",nome);
  printf("Banco =%s\n ",banco);
  printf("Pagamento a realizar na totalidade =%f ",pagamento_total);
  getch();
      
      
      
      
      
      }

Ai está o código reescrito só que não compreendo porque eu agora já consigo meter um nome completo , mas depois na parte de mostrar os dados ao utilizador só aparece a primeira palavra até ao espaço

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1134
HappyHippyHippo

porque o comando do scanf so le a primeira palavra e descarta o resto do conteudo que se encontra no buffer de entrada

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

O teu scanf("%s%[^\n]", nome) pede dois elementos, mas so forneces ponteiro para um deles: o nome.

O primeiro elemento ("%s") e um conjunto ilimitado de caracteres desde o primeiro nao espaco ate ao primeiro espaco a seguir;

o segundo elemento ("%[^\n]"), sem ponteiro!, e um conjunto ilimitado de caracteres acabado por, mas nao incluindo, um '\n'.

Sugestao: pede so um elemento com um maximo de 29 caracteres e acabado por, mas nao incluindo, um '\n'

scanf("%29[^\n]", nome);

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
darkangel_13    0
darkangel_13

#include <math.h>
main()
{
      float pagamento_total,valor_imovel,taxa_juro,anos;
      char nome[30];
      char banco[30];
      printf("Digite o seu nome. :");
  scanf("%s%29[^\n]",nome);
  printf("\nDigite o nome do seu banco. :");
  scanf("%s%29[^\n]",banco);
  printf("\nDigite o valor do imovel. :");
  scanf("%f",&valor_imovel);
  printf("\nDigite a taxa de juro aplicada pelo banco. :");
  scanf("%f",&taxa_juro);
  printf("\nDigite o numero de anos acordado. :");
  scanf("%f",&anos);
  pagamento_total=valor_imovel*pow((1+(taxa_juro/100)),(anos)); //(1+(taxa_juro/100))^pow(numero_meses);
  printf("Nome = %s\n",nome);
  printf("Banco =%s\n ",banco);
  printf("Pagamento a realizar na totalidade =%f ",pagamento_total);
  getch();
      
      
      
      
      
      }

Assim ? mas continua a dar o mesmo erro

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg

Assim ? mas continua a dar o mesmo erro

Nao, nao é assim. Assim continuas com duas conversoes no input: a "%s" e a "%[...]". Esquece o "%s"

scanf("%29[^\n]", nome);

O manual do scanf explica quais sao os conversores que podes usar e como eles funcionam.

s

    Matches a sequence of bytes that are not white-space characters. ...

[

    Matches a non-empty sequence of bytes from a set of expected bytes (the scanset). ...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade