Jump to content

[Resolvido] Não me lê estes programas!


Guest Markito

Recommended Posts

Continuo a estudar as instruções de control de fluxo... Mas agora já tenho o livro Linguagem C do Luís Damas e o meu estudo já está mais normalizado.

Apesar de já ter lido aqui no fórum que o livro pode estar desatualizado, parece-me um livro muito bem estruturado, com uma evolução muito bem cimentada, e além disso tem exercicios!

Apesar de tudo parece que há programas que não me lêm como estes dois aqui:

/*Escreva um programa que aplique uma taxa de imposto aos soslteiros de 10% e de 9% aos casados*/
#include<stdio.h>
int main()
{
float salario;
char est_civil;
printf("Qual o Salario:"); scanf("%f",&salario);
printf("Qual o estado civil?"); scanf("%c",&est_civil);
if(est_civil=='C'||est_civil=='c')
 printf("Imposto:%.2f\n",salario*0.09);
else
 if(est_civil=='S'||est_civil=='s')
   printf("Imposto:%.2f\n",salario*0.10);
 else
   printf("Estado civil incorrecto!!!");
   return (0);
}

e este:

/*Escreva um programa que calcule o imposto pago por mulheres e por homens, sabendo que as mulheres pagam 10% de imposto e que os homens pagam mais 5% do que as mulheres*/
#include<stdio.h>
main()
{
float salario, imposto=0.0;
char sexo;
printf("Introduza o salario:\n"); scanf("%f",&salario);
printf("Qual o sexo:\n); sexo=getchar();
switch(sexo)
  {
   case 'f':
   case 'F': imposto=0.10;
           break;
   case 'm':
   case 'M': imposto=0.15;
           break;
   }
   printf("Imposto %.2f\n",salario*imposto);
}

Já os corri de lés a lés e parece-me que não falta nada, então... qual é o problema?

O primeiro pede-me o valor do salário e depois disso imprime automáticamente "Estado civil incorrecto!!!"???

Já o 2º diz no Build log 'imposto' is assigned a value that is never used in function main!!!

Gostava de contar com a vossa ajuda sff! Obrigado! 👍

Edited by thoga31
GeSHi
Link to comment
Share on other sites

para resolver o primeiro, vou-te apresentar um truque para usares SEMPRE que usas a função scanf ...

/*Escreva um programa que aplique uma taxa de imposto aos soslteiros de 10% e de 9% aos casados*/
#include<stdio.h>

// definição de uma macro que irá limpar tudo que exista no buffer de leitura
#define CLEAR_INPUT (while (getchar() != '\n') /* void */;)

int main()
{
 float salario;
 char est_civil;

 printf("Qual o Salario:");
 scanf("%f",&salario);
 CLEAR_INPUT; // <----- sempre depois de um scanf

 printf("Qual o estado civil?");
 scanf("%c",&est_civil);
 CLEAR_INPUT; // <----- sempre depois de um scanf

 if(est_civil=='C'||est_civil=='c')
   printf("Imposto:%.2f\n",salario*0.09);
 else
 {
   if(est_civil=='S'||est_civil=='s')
     printf("Imposto:%.2f\n",salario*0.10);
   else
     printf("Estado civil incorrecto!!!");
     return (0);
 }

 return 0;
}

----

printf("Qual o sexo:\n); sexo=getchar();
//                     A
//                     |
//                  falta fechar a string
//    (o teu editor não tem syntaxe highlight ?? )
Edited by HappyHippyHippo
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Boas;

Hippo mesmo assim depois das alterações feitas os programas não saiem correctamente. No caso do 1º programa por exemplo nem me chega a pedir o sexo e o prompt desaparece da tela. Já experimentei ambos no code::blocks e no Dev C++!

O problema do prompt desaparecer da tela no Dev C++ podes resolver utilizando system("PAUSE"); antes do return 0.

O problema de não te pedir o sexo deve-se ao facto de teres de limpar o buffer como o Hippo referiu.

Comigo o código funciona correctamente em NetBeans, penso que nos outros também funcione.

Tenta este código adaptado para Dev C:

#include <stdio.h>
#include <stdlib.h>
int main() {
/*Escreva um programa que aplique uma taxa de imposto aos soslteiros de 10% e de 9% aos casados*/
float salario;
char est_civil;
printf("Qual o Salario:");
scanf("%f",&salario);
while (getchar() != '\n'); // Pode ser substituido pelo tal Clear_input caso definas como macro
printf("Qual o estado civil?\n");
scanf("%c",&est_civil);
if(est_civil=='C'||est_civil=='c')
 printf("Imposto:%.2f\n",salario*0.09);
else
 if(est_civil=='S'||est_civil=='s')
printf("Imposto:%.2f\n",salario*0.10);
 else
printf("Estado civil incorrecto!!!");
system("PAUSE");  
return 0;
}
Edited by Carlos7
Link to comment
Share on other sites

Impecável! Agora sim funciona sem espinhas! Limpinho!

Acho que vou baixar o NetBeans!Já agora o que é que achas do code::blocks? O dev c++ parece ser muito conceituado aqui no forum portanto já nem pergunto.... Mas também se fala muito bem aqui no fórum do NetBeans.

Obrigado agora deu limpinho! 👍

Link to comment
Share on other sites

Impecável! Agora sim funciona sem espinhas! Limpinho!

Acho que vou baixar o NetBeans!Já agora o que é que achas do code::blocks? O dev c++ parece ser muito conceituado aqui no forum portanto já nem pergunto.... Mas também se fala muito bem aqui no fórum do NetBeans.

Obrigado agora deu limpinho! 👍

Para te ser sincero não gosto muito do DevC, talvez por estar habituado ao NetBeans. O CodeBlocks uso algumas vezes e até é um bom editor, simples e com muitas funcionalidades. Mas sem sombra de dúvidas que eu pessoalmente prefiro o NetBeans, ajuda muito principalmente quem está a iniciar. E lá não precisas disso do system ("PAUSE") 🙂

Dependendo é do teu sistema operativo podes ter de instalar os compiladores de C depois de instalares o NetBeans mas se precisares ajuda o pessoal cá está 😛

Link to comment
Share on other sites

Para te ser sincero não gosto muito do DevC, talvez por estar habituado ao NetBeans. O CodeBlocks uso algumas vezes e até é um bom editor, simples e com muitas funcionalidades. Mas sem sombra de dúvidas que eu pessoalmente prefiro o NetBeans, ajuda muito principalmente quem está a iniciar. E lá não precisas disso do system ("PAUSE") 🙂

Dependendo é do teu sistema operativo podes ter de instalar os compiladores de C depois de instalares o NetBeans mas se precisares ajuda o pessoal cá está 😛

Obrigado penso que já tenho os compiladores instalados aquando da instalação do code::blocks.

Mas obrigado na mesma pela disponibilidade 😛

Link to comment
Share on other sites

O DevC++ não é muito conceituado aqui no fórum, apenas entre os membros mais jovens que estão a ter o seu primeiro contacto com as linguagens C/C++.

Na realidade, o DevC++ é um IDE antigo que até incentiva a más práticas de programação e deve, por esse motivo, ser abandonado. O Code::Blocks ou o NetBeans são alternativas imensamente melhores.

No entanto, para quem está a começar (como parece ser o caso), o ideal mesmo é aprender a fazer as coisas manualmente, sem um IDE, ou seja: utilizar um editor de texto decente (ex.: Vim, Emacs, SublimeText 2, Notepad++, ...) e compilar os programas também manualmente, com recurso à linha de comandos.

Uma nota final: system("PAUSE"); é um péssimo hábito.

Link to comment
Share on other sites

O DevC++ não é muito conceituado aqui no fórum, apenas entre os membros mais jovens que estão a ter o seu primeiro contacto com as linguagens C/C++.

Na realidade, o DevC++ é um IDE antigo que até incentiva a más práticas de programação e deve, por esse motivo, ser abandonado. O Code::Blocks ou o NetBeans são alternativas imensamente melhores.

No entanto, para quem está a começar (como parece ser o caso), o ideal mesmo é aprender a fazer as coisas manualmente, sem um IDE, ou seja: utilizar um editor de texto decente (ex.: Vim, Emacs, SublimeText 2, Notepad++, ...) e compilar os programas também manualmente, com recurso à linha de comandos.

Uma nota final: system("PAUSE"); é um péssimo hábito.

Eu uso mais o code::blocks e vou descarregar o net beans amanhã mesmo para aproveitar a net da biblioteca Municipal.

Quanto ao system ("pause") já tinha inetriorizado que é uma má prática e no code::blocks até nem foge muito o prompt de comando, só raramente.

uma alternativa ao system("PAUSE")

printf("Carregue no ENTER para continuar");
fflush(stdout);
getchar();

Obrigado por mais essa dica de ouro! São esses pequenos truques que acabam por dar muito jeito e evitam os maus "hábitos" que eu que estou a começar não quero ter.

Obrigado 👍

Link to comment
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
×
×
  • Create New...

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.