2015-06-11 1 views
1

Кто-нибудь знает, как решить эту проблему? Я хочу, чтобы моя программа остановится, если значение amount_notes не является целым числом ... Но он по-прежнему продолжают работать, хотя значение amount_notes имеет десятичное место или остаток ...Как остановить программу, если значение, которое я получаю для amount_notes, не является целым числом?

#include <stdio.h> 
#include <stdlib.h> 
#define acc_balance 5000.00 

int main() 
{ 

    //variables decleration 
    int rm_100, rm_50, rm_20, rm_10; 
    float total_notes, total_100, total_50, total_20, total_10; 
    float total_amount, balance_amount; 
    int amount_notes; 
    float withdraw_amount, withdraw_balance; 


    // input 
    printf("DEPOSIT SYSTEM\n\n"); 
    printf("Your balance is RM %.2lf\n\n", acc_balance); 

    printf("Please key in the amount of notes for Cash Deposit :\n"); 
    printf("The number of RM 100 notes : "); 
    scanf("%d", &rm_100); 
    printf("The number of RM 50 notes : "); 
    scanf("%d", &rm_50); 
    printf("The number of RM 20 notes : "); 
    scanf("%d", &rm_20); 
    printf("The number of RM 10 notes : "); 
    scanf("%d", &rm_10); 

    //process 
    total_notes = rm_10 + rm_20 + rm_50 + rm_100; 

    if (total_notes > 100) { 

     printf("\nThe process is unsuccessful because total exceed 99 notes.\n"); 

     return 0; 
    }else{ 

     printf("\n"); 
     printf("Deposit Successful. You have deposit the following notes amount :\n"); 

     total_100 = 100 * rm_100; 
     printf("RM 100 X %3d = RM %5.2f\n", rm_100, total_100); 

     total_50 = 50 * rm_50; 
     printf("RM 50 X %3d = RM %5.2f\n", rm_50, total_50); 

     total_20 = 20 * rm_20; 
     printf("RM 20 X %3d = RM %5.2f\n", rm_20, total_20); 

     total_10 = 10 * rm_10; 
     printf("RM 10 X %3d = RM %5.2f\n", rm_10, total_10); 

     total_amount = total_100 + total_50 + total_20 + total_10; 
     printf("\n\tTotal \t= RM %5.2f\n", total_amount); 

     balance_amount = acc_balance + total_amount; 
     printf("\nYour balance is now RM %.2f\n", balance_amount); 

    } 

    printf("\nWITHDRAWAL SYSTEM\n"); 

    printf("\nYour withdrawal balance is RM %.2f\n", balance_amount); 

    printf("\nAmount to be Withdrawn : RM "); 
    scanf("%f", &withdraw_amount); 

    amount_notes = withdraw_amount/50; 
    withdraw_balance = balance_amount - withdraw_amount; 

    if (withdraw_balance < 20) { 

     printf("Insufficient Funds - Minimum Balance of RM20 must remain in your account.\n"); 

     return 0; 

    }if (withdraw_amount <= 0) { 

     printf("Invalid amount - Ensure the amount is greater than 0.\n"); 

     return 0; 

    }if (amount_notes != (int)amount_notes) { 
    //HERE THE PROBLEM, HOW TO STOP HERE IF THE AMOUNT_NOTES IN NOT AN INTEGER 
     printf("Invalid amount - Ensure the amount is a multiple of 50.\n"); 

     return 0; 

    }else{ 

     printf("\nWithdrawal Successful...\n"); 
     printf("\t%d notes X RM 50 = RM %.2f\n", amount_notes, withdraw_amount); 

     printf("\nYour balance is now RM %.2f\n", withdraw_balance); 

     return 0; 

    } 

} 

Результаты показывают, как это:

DEPOSIT SYSTEM 

Your balance is RM 5000.00 

Please key in the amount of notes for Cash Deposit : 
The number of RM 100 notes : 10 
The number of RM 50 notes : 10 
The number of RM 20 notes : 10 
The number of RM 10 notes : 10 

Deposit Successful. You have deposit the following notes amount : 
RM 100 X 10 = RM 1000.00 
RM 50 X 10 = RM 500.00 
RM 20 X 10 = RM 200.00 
RM 10 X 10 = RM 100.00 

    Total = RM 1800.00 

Your balance is now RM 6800.00 

WITHDRAWAL SYSTEM 

Your withdrawal balance is RM 6800.00 

Amount to be Withdrawn : RM 300.50 

//THE PROGRAM DIDN'T STOP HERE ALTHOUGH THE AMOUNT TO BE WITHDRAW HAS DECIMAL THAT SHOULDN'T BE SUCCESSFUL WITHDRAWAL ACTUALLY 

Withdrawal Successful... 
    6 notes X RM 50 = RM 300.50 

Your balance is now RM 6499.50 
Program ended with exit code: 0 

Как решить эту проблему ?? Нужна помощь ...

+0

Проблема: число 1.0e + 300 представляет собой целое число тоже. (примерный номер) – moffeltje

+1

Ваше сравнение всегда будет успешным, так как ваш amount_notes является int, и когда вы сравниваете количество_значений (int) amount_notes, это всегда будет равным. –

+0

настоятельно рекомендую только одно объявление переменной в строке. Затем, в реальном мире, легко комментировать переменную и легко документировать инструменты для получения переменной и ее «документации». – user3629249

ответ

2

Чтобы убедиться, что это на самом деле целое число, вы можете округлить и сравнить его с самого числа, но сначала нужно объявить его как поплавок:

float amount_nodes; 
//some code 

if (floor(amount_notes) != amount_notes) {   
    printf("Invalid amount, it's not a whole number - Ensure the amount is a whole number.\n"); 

    return 0; 
} 

Но если вы хотите, чтобы убедиться, что amount_nodes кратно 50 и целое число (так, например, 50, 150, 550), чем вы могли бы просто проверить напоминание, прежде чем делить на 50:

if (amount_notes % 50f != 0f) { 
    printf("Invalid amount - Ensure the amount is a multiple of 50.\n"); 

    return 0; 
} 
amount_notes = withdraw_amount/50; 
withdraw_balance = balance_amount - withdraw_amount; 
1

Ваш сравнение всегда s false как amount_notes - это int, как вы заявили.

if (amount_notes != (int)amount_notes) 
//its equivalent to 
//if (`int` amount_notes != int amount_notes) 
//which will always be false 

Изменить тип данных amount_notes к float в декларации части
Это обеспечит if условие имеет смысл

float amount_notes; //in declaration part 
//...else all your code is cool 

if (amount_notes != (int)amount_notes){ 
//now it says 
//if (`float` amount_notes != (int)amount_notes) 
printf("Invalid amount - Ensure the amount is a multiple of 50.\n"); 
    return 0; 
} 
1
unsigned int temp; // read into temporary unsigned int. Also solves the problem 
        // of withdrawing negative numbers 
scanf("%u", &temp); 
if (temp % 50) 
{ // not evenly divisible by 50, print error and return. 
    printf("Invalid amount - Ensure the amount is a multiple of 50.\n"); 

    return 0; 
} 

withdraw_amount = temp; // assign temporary value to float 
amount_notes = withdraw_amount/50; // continue as before 
... 
/* remove this: 
if (amount_notes != (int)amount_notes) { 
//HERE THE PROBLEM, HOW TO STOP HERE IF THE AMOUNT_NOTES IN NOT AN INTEGER 
    printf("Invalid amount - Ensure the amount is a multiple of 50.\n"); 

    return 0; 

}else{*/ 

Если добавить чеки вернуть код зсапЕ, так что вы знаете, чтение действует.

1

остановки, если значение amount_notes не является целым числом

Не определяйте amount_notes как целое.

Например сделать

float amount_notes; 
Смежные вопросы