2017-01-21 1 views
-1

Je dois calculer le revenu imposable et, pour une raison quelconque, lorsque j'indique un revenu de 5000 et que je dépose m pour une personne mariée, cela me donne un nombre légèrement erroné. Voici mon code:Mauvais numéro émis par les boucles if

#include "stdafx.h" 
#include <iostream> 
#include <iomanip> 
#include <cmath> 

using namespace std; 

int main() 
{ 
    double calcTax = 0; 
    double income = 0; 
    char choice; 
    do { 
     //Prompt user for income 

     cout << "Please enter in your taxable income.\nThis must be a positve number:" << endl; 
     cin >> income; 
     while (income < 0) 
     { 
      cout << "Please enter a positive value" << endl; 
      cin >> income; 
     } 

     //Ask if user is filing as single or married. Continue until correct input is received 
     char status; 
     cout << "Please enter an 'm' if married and filing jointly or an 's' if single and filing alone:" << endl; 
     cin >> status; 
     while ((status != 'm') && (status != 's')) 
     { 
      cout << "You have pressed an incorrect key. Please enter an 'm' if married and filing jointly or an 's' if single and fiing alone:" << endl; 
      cin >> status; 
     } 
     double sBase1 = 863, 
      sBase2 = 2588, 
      sBase3 = 4313, 
      mBase1 = 1726, 
      mBase2 = 5176, 
      mBase3 = 8626; 

     double sAdd2 = 25, 
      sAdd3 = 85, 
      sAdd4 = 181, 
      mAdd2 = 40, 
      mAdd3 = 175, 
      mAdd4 = 390; 

     double taxRate1 = 0.023, 
      taxRate2 = 0.033, 
      taxRate3 = 0.052, 
      taxRate4 = 0.075; 



     //Calculate tax if user is single, based on income tier 
     if (status == 's') 
     { 
      if (income <= sBase1) 
      { 
       calcTax = income * taxRate1; 
      } 
      if (sBase1 < income <= sBase2) 
      { 
       calcTax = ((income - sBase1)) * taxRate2 + sAdd2; 
      } 
      if (sBase2 < income <= sBase3) 
      { 
       calcTax = ((income - sBase2) * taxRate3) + sAdd3; 
      } 
      if (sBase3 < income) 
      { 
       calcTax = ((income - sBase3) * taxRate4) + sAdd4; 
      } 
     } 

     //Calculate tax if user is married, based on income tier 
     if (status == 'm') 
     { 
      if (income <= mBase1) 
      { 
       calcTax = income * taxRate1; 
      } 
      if (mBase1 < income <= mBase2) 
      { 
       calcTax = ((income - mBase1)) * taxRate2 + mAdd2; 
      } 
      if (mBase2 < income <= mBase3) 
      { 
       calcTax = ((income - mBase2) * taxRate3) + mAdd3; 
      } 
      if (mBase3 < income) 
      { 
       calcTax = ((income - mBase3) * taxRate4) + mAdd4; 
      } 

     } 

     //Display user's tax 
     cout << "$" << fixed << setprecision(2) << calcTax << endl; 

     //Ask if user would like to calculate another tax 
     //If so, repeat until done 
     char response; 
     cout << "Would you like to perform another tax calculation (y or n)?:" << endl; 
     cin >> choice; 

     while (choice != 'n' && choice != 'y') 
     { 
      cout << "Please enter y or n" << endl; 
      cin >> choice; 
     } 


    } while (choice == 'y'); 
    return 0; 
} 

5000 et marié devrait retourner 148.04 mais à la place je reçois 165.85. Quelqu'un peut-il aider à souligner ce qui ne va pas?

+0

Je pense que vous bénéficieriez d'utiliser un IDE avec un débogueur . Je suggère de télécharger Visual Studio ou Eclipse. Si vous n'avez jamais débogué de code, recherchez une courte vidéo YouTube sur la façon de déboguer dans votre IDE de votre choix. – plukich

+0

Pourquoi ne fournissez-vous pas une formule avec laquelle vous êtes censé calculer votre code? De cette façon, nous pouvons comparer votre formule à la façon dont votre programme calcule la taxe et repérer le bug. –

+0

plukich, j'utilise déjà Visual Studio. – riahtron3000

Répondre

0

Vos clauses si sont la cause de ce comportement. Écrire quelque chose comme if (mBase1 < income <= mBase2) n'a pas la même signification mathématique en C++, puisque le compilateur ne compare que deux valeurs à la fois (si je ne me trompe pas).

donc écrire:

if (mBase1 < income && income <= mBase2) au lieu de vous assurer qu'il doit comparer les deux déclarations et assurer que les deux sont valables.

Remplacement de la ligne

if (mBase2 < income <= mBase3)

avec if (mBase2 < income && income <= mBase3)

déjà fait l'affaire en vous donnant le droit rapide pour votre exemple donné (5000 et « m). Sans cela, le compilateur pense quelque chose comme:

revenu mBase2 < Cela est faux, mais le revenu < = mBase3? Cela est vrai, permet de saisir cette option si la clause

et donc votre calcTax -value écraser

0
You cannot compare two conditions at a time using if statement 
if(a<b<c) is similar to 
if((a<b) || (b<c) ) 
so in your program you should use && instead of comparing straight away 

exemple:

#include<stdio.h> 

int main() 
{ 
    if (5 < 6) 
    { 
     printf("5 is less than 6\n"); 
    } 
    if (90 >6) 
    { 
     printf("6 is less than 90\n"); 
    } 
    if (5 < 6 <90) // here only half of the condition checking takes place ..till (5<6) and (6<90)is not verified 
    { 
     printf("5 is less than 6 and 6 is less than 90"); 
    } 

    getchar(); 
    return 0; 

} 



so change your code to---> 


#include < iostream> 

#include < iomanip> 

#include < cmath> 

using namespace std; 

int main() 
{ 

    double calcTax = 0; 

double income = 0; 

    char choice; 
    do { 
     //Prompt user for income 

     cout << "Please enter in your taxable income.\nThis must be a positve number:" << endl; 
     cin >> income; 
     while (income < 0) 
     { 
      cout << "Please enter a positive value" << endl; 
      cin >> income; 
     } 

     //Ask if user is filing as single or married. Continue until correct input is received 
     char status; 
     cout << "Please enter an 'm' if married and filing jointly or an 's' if single and filing alone:" << endl; 
     cin >> status; 
     while ((status != 'm') && (status != 's')) 
     { 
      cout << "You have pressed an incorrect key. Please enter an 'm' if married and filing jointly or an 's' if single and fiing alone:" << endl; 
      cin >> status; 
     } 
     double sBase1 = 863, 
      sBase2 = 2588, 
      sBase3 = 4313, 
      mBase1 = 1726, 
      mBase2 = 5176, 
      mBase3 = 8626; 

     double sAdd2 = 25, 
      sAdd3 = 85, 
      sAdd4 = 181, 
      mAdd2 = 40, 
      mAdd3 = 175, 
      mAdd4 = 390; 

     double taxRate1 = 0.023, 
      taxRate2 = 0.033, 
      taxRate3 = 0.052, 
      taxRate4 = 0.075; 



     //Calculate tax if user is single, based on income tier 
     if (status == 's') 
     { 
      if (income <= sBase1) 
      { 
       calcTax = income * taxRate1; 
      } 
      if (sBase1 < income <= sBase2) 
      { 
       calcTax = ((income - sBase1)) * taxRate2 + sAdd2; 
      } 
      if (sBase2 < income <= sBase3) 
      { 
       calcTax = ((income - sBase2) * taxRate3) + sAdd3; 
      } 
      if (sBase3 < income) 
      { 
       calcTax = ((income - sBase3) * taxRate4) + sAdd4; 
      } 
     } 

     //Calculate tax if user is married, based on income tier 
     if (status == 'm') 
     { 
      if (income <= mBase1) 
      { 
       calcTax = income * taxRate1; 
      } 
      if ((mBase1 < income) && (income <= mBase2)) 
      { 
       calcTax = (((income - mBase1) * taxRate2) + mAdd2); 
      } 
      if ((mBase2 < income) &&(income <= mBase3)) 
      { 
       calcTax = ((income - mBase2) * taxRate3) + mAdd3; 
      } 
      if (mBase3 < income) 
      { 
       calcTax = ((income - mBase3) * taxRate4) + mAdd4; 
      } 

     } 

     //Display user's tax 
     cout << "$" << fixed << setprecision(2) << calcTax << endl; 

     //Ask if user would like to calculate another tax 
     //If so, repeat until done 
     char response; 
     cout << "Would you like to perform another tax calculation (y or n)?:" << endl; 
     cin >> choice; 

     while (choice != 'n' && choice != 'y') 
     { 
      cout << "Please enter y or n" << endl; 
      cin >> choice; 
     } 


    } while (choice == 'y'); 
    return 0; 
}