You are on page 1of 7

#include<stdio.

h>
#include<string.h>
#define ERROR -1
#define max 52
char cmd[104];
char num1[max];
char num2[max];
char result[102];
int main()
{
get_command(cmd);
if(check_command(cmd) == ERROR)
{
printf("Wrong command\n");
exit(0);
}
int operation = find_operation(cmd);
if(operation == ERROR)
{
printf("Wrong Operation\n");
exit(0);
}
if(get_number(cmd,num1,num2) == ERROR)
{
printf("Invalid Numbers");
exit(0);
}
if(do_operation(num1,num2,result,operation) == ERROR)
{
printf("Unable perform Operation\n");
exit(0);
}
if(print_result(result) == ERROR)
{
printf("Unable To Print Result \n");
exit(0);
}
return 0;
}
void get_command(char cmd[]){
gets(cmd);
}
int check_command(char cmd[]){
int i=0,j=0;
while(cmd[i]){
if((cmd[i]>='!')&&(cmd[i]<='?')){
// if((cmd[i]>='0')&&(cmd[i]<='9')||(cmd[i]=='+')||(cmd[i]=='-')||
(cmd[i]=='/')||(cmd[i]=='+')){
j++;
}
i++;
}
int p=strlen(cmd);
if(j==p){
return 1;
}
else{
return -1;
}
}
int find_operation(char cmd[]){
int p=0;
char opt;
while(cmd[p]!='\0'){
if(cmd[p]=='+'||cmd[p]=='-'||cmd[p]=='*'||cmd[p]=='/'){
opt=cmd[p];
}
p++;
}
if(opt=='+'){
return 1;
}
else if(opt=='-'){
return 2;
}
else if(opt=='*'){
return 3;
}
else if(opt=='/'){
return 4;
}
else {
return -1;
}
}
int get_number(char cmd[],char num1[],char num2[]){
int i=0;
while(cmd[i]!='\0'){
if(cmd[i]=='+'||cmd[i]=='-'||cmd[i]=='*'||cmd[i]=='/'){
break;
}
else{
num1[i]=cmd[i];
}
i++;
}
num1[i]='\0';
int f = cheaking_string(num1);
//printf("\n num1 :- %s\n",num1);
int j=0;
for(j=0;cmd[j]!='\0';j++){
num2[j]=cmd[j+i+1];
}
// printf("\n num2 :- %s\n",num2);
int m = cheaking_string(num2);
if(m*f ==1){
return 1;
}
else{
return -1;
}
}
int do_operation(num1,num2,result,operation){
int m = do_operar(result);
if(m==1){
switch(operation){
case 1:
addition_of_number(num1,num2,result);
break;
case 2:
compare(num1,num2);
break;
case 3:
Multiplication(num1,num2,result);
break;
case 4:
division(num1,num2,result);
break;
default:
printf("\nerror");
}
}
else{
return -1;
}
}
void addition_of_number(char num1[max],char num2[max],char result[max]){
int i,j,p1,p2,k,s,c=0;
p1=strlen(num1);
p2=strlen(num2);
i=p1-1;
j=p2-1;
k=p1>p2?p1:p2;
result[k]='\0';
k--;
while(i>=0&&j>=0){
s=(num1[i]-48)+(num2[j]-48)+c;
result[k]=s%10+48;
c=s/10;
i--;
j--;
k--;
}
if(i>=0){
while(i>=0){
s=num1[i]-48+c;
result[k]=s%10+48;
c=s/10;
i--;
k--;
}
}else if(j>=0){
while(j>=0){
s=num2[j]-48+c;
result[k]=s%10+48;
c=s/10;
j--;
k--;
}
}
if(c>0){
for(i=strlen(result);i>0;i--){
result[i+1]=result[i];
result[0]=c+48;
}
}
}

void subtraction(char num1[],char num2[],char result[]){


int i,j,p1,p2,k,s,c=0;
p1=strlen(num1);
p2=strlen(num2);
i=p1-1;
j=p2-1;
k=p1>p2?p1:p2;
result[k]='\0';
k--;
while(i>=0&&j>=0){
s=(num1[i]-48)-(num2[j]-48)-c;
if(s<0){
s+=10;
c=1;
}
else{
c=0;
}
result[k]=s%10+48;
i--;
j--;
k--;
}//
if(i>=0){
while(i>=0){
s=num1[i]-48-c;
if(s<0){
s+=10;
c=1;
}
else{
c=0;
}
result[k]=s%10+48;
i--;
k--;
}
}
}
void compare(char num1[],char num2[]){
int i,flag;
int p=strlen(num1);
int q=strlen(num2);
if(p==q){
flag=0;
for(i=0;i<p;i++){
if(num1[i]>=num2[i]){
flag=1;
break;
}
}
if(flag==1){
subtraction(num1,num2,result);
}
else if(num1[i]<num2[i]){
// swap(num1,num2);
subtraction(num1,num2,result);
}
}
else if (p>q){
// swap(num1,num2);
subtraction(num1,num2,result);
//swap(num1,num2);
}
else if(p<q){
subtraction(num1,num2,result);
}
}
void swap(char num1[],char num2[]){
char temp[max];
strcpy(temp,num1);
strcpy(num1,num2);
strcpy(num2,temp);
}
void division(char num1[],char num2[],char result[]){
char str[104];
int p=convert(num2);
int temp=0;
int i=0,j=0,n;
while(num1[i]){
temp=temp*10+(num1[i]-48);
if(temp<p){
str[j++]=48;
}
else{
str[j++]=(temp/p)+48;
temp=temp%p;
}
i++;
}
str[j]='\0';
removing_leading_zero(str,result);
}
void removing_leading_zero(char str[],char result[]){
int i=0;
int count=0;
while(str[i]!='\0'){
if(str[i]>='1'&&str[i]<='9'){
break;
}
else{
count++;
}
i++;
}
int j=0;
for(j=0;str[j]!='\0';j++){
result[j]=str[j+i];
}
//print_result(result);
}
int convert(char num2[]){
int rem=0,i;
int Q=strlen(num2);
for(i=0;i<Q;i++){
rem=rem*10+num2[i]-'0';
}
return rem;
}
int print_result(char result[]){
int i,p,flag;
p=strlen(result);
flag=0;
for(i=0;i<p;i++){
if(result[i]=='-'){
flag=1;
break;
}
}
if(strlen(result)<=0){
return -1;
}
else if(flag=1){
printf(" result : -%s",result);
}
else{
printf(" result : %s",result);
}
}
void Multiplication(char num1[max],char num2[max],char result[]){
int left_shift = 0,i,j,n1,n2,k,len;
n1 = strlen(num1);
n2 = strlen(num2);
for(i = n2-1; i >= 0; i--)
{
int carry = 0, k = left_shift;
for(j=n1-1;j >=0;j--)
{
int r=(num1[j]-'0')*(num2[i]-'0')+carry;
if(result[k]){
r+=result[k]-'0';
}
result[k++]=r%10+'0';
carry=r/10;
}
if(carry>0){
result[k]=carry+'0';
}
left_shift++;
}
strrev(result);
printf("\n");
}
int cheaking_string(char str[]){
if(str[0]=='\0'){
return -1;
}
else{
return 1;
}
}
int do_operar(char str[]){
if(str[0]=='\0'){
return 1;
}
else{
return -1;
}
}

You might also like