C: Calculate Order Price Based On User's Input.

 https://github.com/pereiradaniel/beginning_c/blob/master/ch2/exercises/2_3/exercise2_3.c

// Exercise 2-3
// Daniele Grech Pereira 22 November 2022

// You’re selling a product that’s available in two versions: type 1 is a
// standard version priced at $3.50, and type 2 is a deluxe version priced at $5.50.
// Write a program using only what you’ve learned up to now that prompts for the user to
// enter the product type and a quantity, and then calculates and outputs the price for
// the quantity entered.

#include <stdio.h>
#include <ctype.h>  // toupper
#include <limits.h> // INT_MAX

// FIXED PRODUCT PRICES:
#define TYPE1 3.5f  // Type1 price
#define TYPE2 5.5f  // Type2 price

// A function that returns the calculated the price.
double calculatePrice(int input, int quantity);
// A function that validates a user's input.
int checkInput(int input, int min, int max);
// A function that returns the user's validated input.
int getInput(char* msg, int min, int max);

int main(int argc, char* argv[])
{
    // Set and initialize vars for main program:
    int type = 0, quantity = 0; // Vars for storing user input.    
    double price = 0;           // Stores calculated results.

    char repeat = 'Y';          // Loop var for main program to repeat.

    // Main program loop:
    while (toupper(repeat) == 'Y')
    {
        // Get type from user, can be either 1 or 2:
        type = getInput("Select product type (1 or 2): ", 1, 2);
        
        // Get quantity from user, can be from 1 to largest possible INT value:
        quantity = getInput("Select quantity: ", 1, INT_MAX);

        // Display user's selection before calculating:
        printf("\nProduct type %d selected @ %d units.", type, quantity);

        // Calculate price based on user's input:
        price = calculatePrice(type, quantity);
        
        // Display final results:
        printf("\n\nRESULTS:\nProduct type: %d, quantity: %d, total: $%.2f\n", type, quantity, price);

        // Ask if user wants to repeat the main program:
        printf("\nAgain? (Y to repeat/any other key to quit) ");
        scanf(" %c", &repeat);
    };

    return 0;
}

int getInput(char* msg, int min, int max)
{
    int var = 0;
    printf("%s", msg);
    while(var == 0) {
        scanf(" %d", &var);
        var = checkInput(var, min, max);
    }; // Loops until input is valid and not == 0
    return var;
}

double calculatePrice(int input, int quantity)
{
    double unit_price = 0;

    if (input == 1)
        unit_price = TYPE1;
    if (input == 2)
        unit_price = TYPE2;

    return unit_price * (double)quantity;
}

int checkInput(int input, int min, int max)
{
    int result = 0; // Return 0 if input is invalid.

    if (input < min || input > max)     // out of bounds, invalid!
        printf("\nEnter a number between %d or %d!\n", min, max);
    
    if (input >= min && input <= max)   // inbounds, validate!
        result = input;

    return result;
}
https://github.com/pereiradaniel/beginning_c/blob/master/ch2/exercises/2_3/exercise2_3.txt
==662== Memcheck, a memory error detector
==662== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==662== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==662== Command: ./exercise2_3
==662==
Select product type (1 or 2): 0

Enter a number between 1 or 2!
3

Enter a number between 1 or 2!
1

Select quantity: -1

Enter a number between 1 or 2147483647!
0

Enter a number between 1 or 2147483647!
2147483648

Enter a number between 1 or 2147483647!
1000

Product type 1 selected @ 1000 units.

RESULTS:
Product type: 1, quantity: 1000, total: $3500.00
==662== 
==662== HEAP SUMMARY:
==662==     in use at exit: 0 bytes in 0 blocks
==662==   total heap usage: 2 allocs, 2 frees, 2,048 bytes allocated
==662==
==662== All heap blocks were freed -- no leaks are possible
==662==
==662== For lists of detected and suppressed errors, rerun with: -s
==662== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)


Popular posts from this blog

C programming and relevancy

Shakespeare AI: My lady is more beauteous than a rose.

C: Temperature Conversion With Main Repeat