Saturday, April 20, 2013

Simple calculator program in C!!

Recently one of my friend asked me to implement simple Application in C which reads simple calculator commands from the input file and writes the result in the output.  Below is the complete description of the problem. And  You can find the complete C programming language source code as well.

Simple Calculator Description:

The first line of the file contains two characters giving the initials of the user (such as GN). The rest of the file consists of a sequence of commands. Each line of the command file contains one command.

Each command starts with a character and may have zero or more operands. You may assume that the data file has no errors. The number of commands in the file is unknown. But your processing may stop as soon as the Quit command is processed. The commands are: integer add, integer subtract, integer multiply, integer divide, change to uppercase, change to lowercase, separate, print out all digits, printout the k-th digit, round real number to desired number of decimal places, divide number into two.


Calculator Commands:
-------------------------------------

+ i j [Integer Add]                        Add integers i and j and print out result

* i j [Integer Multiply]                  Multiply integers i and j and print out result

- i j [Integer Subtract ]                  Subtract integer j from i and print out result

/ i j [Integer Divide ]                     Divide integer i by j and print out result of integer division

C Ch [Character Case Change ]    Change character Ch to uppercase and print it out

c Ch [Character Case Change]      Change character Ch to lowercase and print it out

P i k [Print k-th Digit ]                  Print out the k-th digit of integer i

R x i [Round Reals ]                     Round double value x to i decimal places

S x [Separate ]                               Separate out the sign, integer part and fractional part of double value x

D i x [Partition Integer ]               Given integers i and x, print out two integers j and k, where the sum of j and k equals i, and when you take x% of i and truncate it you get j

H [Help ]                                       Print a short synopsis of all the available commands

Q [Quit ]                                       Quit

Click here for the C source code

C source code for simple calculator!!

Below is the complete working C source code for the simple calculator. Click here for the problem description. This programs takes the input file name as a command line argument and write the result in the output.dat in the current directory.

//
//  main.c
//  Calculator
//
//  Created by chanduthedev on 4/18/13.
//

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>


void add(int first, int second,FILE * ofp)
{
    printf("%d + %d = %d\n",first,second,first+second);
    fprintf(ofp,"%d + %d = %d\n",first,second,first+second);
    
}
void multiply(int first, int second,FILE *ofp)
{
    printf("%d * %d = %d\n",first,second,first * second);
    fprintf(ofp,"%d * %d = %d\n",first,second,first * second);

}
void substract(int first, int second, FILE *ofp)
{
    
    printf("%d - %d = %d\n",first,second,first-second);
    fprintf(ofp,"%d - %d = %d\n",first,second,first-second);

}
void divide(int first,int second, FILE * ofp)
{
    
    fprintf(ofp,"%d / %d = %d\n",first,second,first/second);
    printf("%d / %d = %d\n",first,second,first/second);
}
void toUpperCase(char ch, FILE * ofp)
{
    printf("%c ==> %c\n",ch,toupper(ch));
    fprintf(ofp,"%c ==> %c\n",ch,toupper(ch));
}
void toLowerCase(char ch,FILE * ofp)
{
    printf("%c ==> %c\n",ch,tolower(ch));
    fprintf(ofp,"%c ==> %c\n",ch,tolower(ch));

}
void printKthDigit(int val, int k,FILE * ofp)
{
    int i=1;
    int temp =val;
    while(temp >0)
    {
        if(i == k)
        {
            printf("%d (digit @ %d) ==> %d\n",val,k, temp%10);
            fprintf(ofp,"%d (digit @ %d) ==> %d\n",val,k, temp%10);

            break;
        };
        i++;
        temp = temp/10;
    }
    
}
void roundDecimal(double x, int n, FILE * ofp)
{
    char temp[32]="";
    
    double  rounded = round(x);
    
    sprintf(temp,"%.*lf",n,rounded);
    printf("%lf (precision=%d) => %s\n",x,n,temp);
    fprintf(ofp,"%lf (precision=%d) => %s\n",x,n,temp);
    
}

void separte(double x , FILE * ofp)
{
    char temp[32]="";
    char sign;
    int intPart;
    int fraction;
    sprintf(temp,"%lf",x);
    
    sscanf(temp,"%d.%d",&intPart,&fraction);
    
    if(intPart > 0)
        sign = '+';
    else
    {
        sign = '-';
        intPart = -1 * intPart;
    }
    printf("%lf ==>  sign=%c, integer=%d,fraction=%d\n",x, sign,intPart,fraction);
    fprintf(ofp,"%lf ==>  sign=%c, integer=%d,fraction=%d\n",x, sign,intPart,fraction);

}
void partitionInteger(int i, int x, FILE * ofp)
{
    int j;
    int k;
    
    j = floor(x* i/100.0);
    
    k = i-j;
    
    printf("i=%d,x=%d ==>  j=%d, k=%d \n",i,x,j,k);
    fprintf(ofp,"i=%d,x=%d ==>  j=%d, k=%d \n",i,x,j,k);
}
void help( FILE * ofp)
{
    printf("\n *** Help Menu! See below for Calculator Commands: ***\n");
    printf("\n + i j ---> Add integers i and j \n");
    printf("\n * i j ---> Multiply integers i and j \n");
    printf("\n + -i j ---> Subtract integer j from i \n");
    printf("\n /i j ---> Divide integer i by j \n");
    printf("\n C Ch ---> Change character Ch to uppercase \n");
    printf("\n c Ch ---> Change character Ch to lowercase \n");
    printf("\n P i k ---> Print out the k-th digit of integer i \n");
    printf("\n R x i ---> Round double value x to i decimal places \n");
    printf("\n S x ---> Separate out the sign, integer part and fractional part of double value x \n");
    printf("\n D i x ---> Given integers i and x, print out two integers j and k, where the sum of j and k equals i, and when you take x'percent' of i and truncate it you get j \n");
    printf("\n H ---> view all commands \n");
    printf("\n Q ---> Quit program\n");
    
}


int main(int argc, const char * argv[])
{

    if(argc != 2)
    {
        printf("Usage ");
        exit(0);
    }
    
    const char * inFile=argv[1];
 
    char str[64];
    int lineNum=1;
    int first,second;
    double firstDouble;
    char ch;
    char outFile[]="outData.dat";
    
    FILE * ofp = fopen(outFile,"w");
    
    FILE * fp = fopen(inFile,"r");
    while(fgets(str,64,fp) != NULL)
    {
        if(lineNum == 1)
        {
            printf("Initial %s",str);
        }
        else
        {
            char * temp = str;
            char cmd = temp[0];
            temp++; //ignore command
            temp++; //ignore space;
                
            printf("CMD=%c : ",cmd);
            if(cmd == '+')
            {
                sscanf(temp,"%d %d",&first,&second);
                add(first,second,ofp);
            }
            else if (cmd == '*')
            {
                sscanf(temp,"%d %d",&first,&second);
                multiply(first,second,ofp);
            }
            else if (cmd == '-')
            {
                sscanf(temp,"%d %d",&first,&second);
                substract(first,second,ofp);
            }
            else if (cmd == '/')
            {
                sscanf(temp,"%d %d",&first,&second);
                divide(first,second,ofp);
            }
            else if (cmd == 'C')
            {
                sscanf(temp,"%c",&ch);
                toUpperCase(ch,ofp);
            }
            else if (cmd == 'c')
            {
                sscanf(temp,"%c",&ch);
                toLowerCase(ch,ofp);
            }
            else if (cmd == 'P')
            {
                sscanf(temp,"%d %d",&first, &second);
                printKthDigit(first,second,ofp);
            }
            else if (cmd == 'R')
            {
                sscanf(temp, "%lf %d",&firstDouble,&second);
                roundDecimal(firstDouble, second,ofp);
            }
            else if (cmd == 'S')
            {
                sscanf(temp,"%lf",&firstDouble);
                separte(firstDouble,ofp);
            }
            else if (cmd == 'D')
            {
                sscanf(temp,"%d %d",&first,&second);
                partitionInteger(first,second,ofp);
            }
            else if (cmd == 'H')
            {
                help(ofp);
            }
            else if (cmd == 'Q')
            {
                break;//quits
            }
            else
            {
                printf("Function Z not implemented yet!");
            }
        }
        lineNum++;
    }
    
    fclose(fp);
    fclose(ofp);
    return 0;
}


Input file format:

KING
H
+ 2 5
- 10 5
* 8 9
/ 92 3
c A
C b
P 56234 3
R 3.64195 2
S -51.235
D 50 10

OutPut:
2 + 5 = 7
10 - 5 = 5
8 * 9 = 72
92 / 3 = 30
A ==> a
b ==> B
56234 (digit @ 3) ==> 2
3.641950 (precision=2) => 4.00
-51.235000 ==>  sign=-, integer=51,fraction=235000
i=50,x=10 ==>  j=5, k=45


Popular Posts