C/Small Application/Calculator
A calculator that allows multiple calculations
#include <stdio.h>
int main()
{
double number1 = 1.0;
double number2 = 2.0;
char operation = "+";
char answer = 0;
switch(operation)
{
case "+":
printf("= %lf\n", number1 + number2);
break;
case "-":
printf("= %lf\n", number1 - number2);
break;
case "*":
printf("= %lf\n", number1 * number2);
break;
case "/":
if(number2 == 0)
printf("\n\n\aDivision by zero error!\n");
else
printf("= %lf\n", number1 / number2);
break;
case "%":
if((long)number2 == 0)
printf("\n\n\aDivision by zero error!\n");
else
printf("= %ld\n", (long)number1 % (long)number2);
break;
default:
printf("\n\n\aIllegal operation!\n");
}
}
An improved calculator
/*
Beginning C, Third Edition
By Ivor Horton
ISBN: 1-59059-253-0
Published: Apr 2004
Publisher: apress
*/
/* */
#include <stdio.h> /* Standard input/output */
#include <string.h> /* For string functions */
#include <ctype.h> /* For classifying characters */
#include <stdlib.h> /* For converting strings to numeric values */
#include <math.h> /* For power() function */
void main()
{
char input[256]; /* Input expression */
char number_string[30]; /* Stores a number string from input */
char op = 0; /* Stores an operator */
unsigned int index = 0; /* Index of the current a character in input */
unsigned int to = 0; /* To index for copying input to itself */
size_t input_length = 0; /* Length of the string in input */
unsigned int number_length = 0; /* Length of the string in number_string */
double result = 0.0; /* The result of an operation */
double number = 0.0; /* Stores the value of number_string */
printf("\nTo use this calculator, enter any expression with"
" or without spaces");
printf("\nAn expression may include the operators:");
printf("\n +, -, *, /, %%, or ^(raise to a power).");
printf("\nUse = at the beginning of a line to operate on ");
printf("\nthe result of the previous calculation.");
printf("\nUse quit by itself to stop the calculator.\n\n");
/* The main calculator loop */
while(strcmp(gets(input), "quit") != 0)
{
input_length = strlen(input); /* Get the input string length */
/* Remove all spaces from the input by copy the string to itself */
/* including the string terminating character */
for(to = 0, index = 0 ; index<=input_length ; index++)
if(*(input+index) != " ") /* If it is not a space */
*(input+to++) = *(input+index); /* Copy the character */
input_length = strlen(input); /* Get the new string length */
index = 0; /* Start at the first character */
if(input[index]== "=") /* Is there =? */
index++; /* Yes so skip over it */
else
{ /* No - look for the left operand */
/* Look for a number that is the left operand for the 1st operator */
/* Check for sign and copy it */
number_length = 0; /* Initialize length */
if(input[index]=="+" || input[index]=="-") /* Is it + or -? */
*(number_string+number_length++) = *(input+index++); /* Yes so copy it */
/* Copy all following digits */
for( ; isdigit(*(input+index)) ; index++) /* Is it a digit? */
*(number_string+number_length++) = *(input+index); /* Yes - Copy it */
/* copy any fractional part */
if(*(input+index)==".") /* Is it decimal point? */
{ /* Yes so copy the decimal point and the following digits */
*(number_string+number_length++) = *(input+index++); /* Copy point */
for( ; isdigit(*(input+index)) ; index++) /* For each digit */
*(number_string+number_length++) = *(input+index); /* copy it */
}
*(number_string+number_length) = "\0"; /* Append string terminator */
/* If we have a left operand, the length of number_string */
/* will be > 0. In this case convert to a double so we */
/* can use it in the calculation */
if(number_length>0)
result = atof(number_string); /* Store first number as result */
}
/* Now look for "op number" combinations */
for(;index < input_length;)
{
op = *(input+index++); /* Get the operator */
/* Copy the next operand and store it in number */
number_length = 0; /* Initialize the length */
/* Check for sign and copy it */
if(input[index]=="+" || input[index]=="-") /* Is it + or -? */
*(number_string+number_length++) = *(input+index++); /* Yes - copy it. */
/* Copy all following digits */
for( ; isdigit(*(input+index)) ; index++) /* For each digit */
*(number_string+number_length++) = *(input+index); /* copy it. */
/* copy any fractional part */
if(*(input+index)==".") /* Is is a decimal point? */
{ /* Copy the decimal point and the following digits */
/* Copy point */
*(number_string+number_length++) = *(input+index++);
for( ; isdigit(*(input+index)) ; index++) /* For each digit */
*(number_string+number_length++) = *(input+index); /* copy it. */
}
*(number_string+number_length) = "\0"; /* terminate string */
/* Convert to a double so we can use it in the calculation */
number = atof(number_string);
/* Execute operation, as "result op= number" */
switch(op)
{
case "+": /* Addition */
result += number;
break;
case "-": /* Subtraction */
result -= number;
break;
case "*": /* Multiplication */
result *= number;
break;
case "/": /* Division */
/* Check second operand for zero */
if(number == 0)
printf("\n\n\aDivision by zero error!\n");
else
result /= number;
break;
case "%": /* Modulus operator - remainder */
/* Check second operand for zero */
if((long)number == 0)
printf("\n\n\aDivision by zero error!\n");
else
result = (double)((long)result % (long)number);
break;
case "^": /* Raise to a power */
result = pow(result, number);
break;
default: /* Invalid operation or bad input */
printf("\n\n\aIllegal operation!\n");
}
}
printf("= %f\n", result); /* Output the result */
}
}