Korean, Edit

C言語で計算機(+、-、​​×、÷)を実装します。

上位カテゴリ:【C言語】 C言語索引


a. Github



#include <stdio.h>
#include <stdlib.h>
#define Max 100
/* This source is for calculation at practical input situation */
// Devision on this calculator prints quota. 
// If you want real Devision, you should change the format (Now the format is 'int')

int Calculator_I(char *Array, int Array_Size);				// seperator; separate by each monomials; + and -
int Calculator_II(char *Array, int Array_Size);				// calculate a monomial; * and /

int Calculator_I(char *Array, int Array_Size){				// 'a*(b+c) + d'  >>  'a*(b+c)' and 'd'
	if(Array_Size == 0)	return 0;					               // for the case that initial number < 0
	int i = 0; 
	int j, k;	
	int count = 0;								            // count = 0  "="  peripheral state 
	int count2;									    // for '-' operation
	while(1){
		if(i > Array_Size - 1){						    // only monomial can reach this stage
			return Calculator_II(Array, Array_Size);
		}						
		if(Array[i] == '(')	count ++;
		else if(Array[i] == ')') count --;
		else if(count == 0 && 
				(Array[i] == '+' || Array[i] == '-')){		    // only polynomial can reach this stage
			if(Array[i] == '+'){
				char Array_2[Array_Size - i - 1];		    // number(i+1 ~ Array_Size-1)
				for(j = i + 1; j < Array_Size; j++){
					Array_2[j - i - 1] = Array[j]; 		    // if j = i + 1, j - i - 1 = 0
				}				
				return Calculator_I(Array, i) + Calculator_I(Array_2, Array_Size - i - 1);	
			}
			else if(Array[i] == '-'){
				j = i + 1;
				count2 = 0;
				while(1){
					if(j > Array_Size - 1){					// only 'A-B' can reach this stage
						char Array_2[Array_Size - i - 1];		// number(i+1 ~ Array_Size-1)
						for(k = i + 1; k < Array_Size; k ++){
							Array_2[k - i - 1] = Array[k];
						}
						return Calculator_I(Array, i) - Calculator_I(Array_2, Array_Size - i - 1);			
					}
					if(Array[j] == '(')    	count2 ++;
					else if(Array[j] == ')')	count2 --;
					else if(count2 == 0 && Array[j] == '+'){	     // only 'A-B+C...' can reach this stage
						char Array_2[j - i - 1];			            //

 number(i+1 ~ j-1)
						char Array_3[Array_Size - j - 1]; 		    // number(j+1 ~ Array_Size-1)
						for(k = i + 1; k < j; k ++){
							Array_2[k - i - 1] = Array[k];
						}
						for(k = j + 1; k < Array_Size; k ++){
							Array_3[k - j - 1] = Array[k];
						}
						return Calculator_I(Array, i) - Calculator_I(Array_2, j - i - 1)
									+ Calculator_I(Array_3, Array_Size - j - 1);
					}
					j ++;
				}
				char Array_2[Array_Size - i - 1 + 2];			// '2' indicates '(-1)' and '*'
				Array_2[0] = '0' - 1;
				Array_2[1] = '*';				
				for(j = i + 1; j < Array_Size; j ++){
					Array_2[j - i - 1 + 2] = Array[j];	
				}
				return Calculator_I(Array, i) + Calculator_I(Array_2, Array_Size - i - 1 + 2);			
			}			
		}	
		i ++;
	}
}

int Calculator_II(char *Array, int Array_Size){
	int i = 0;
	int j, k;	
	int count = 0;								            // count = 0  "="  peripheral state	
	while(1){	
		if(i > Array_Size - 1){						    // only '()' or number can reach this stage
			if(Array[0] == '('){					            //    (---)    →    ---
				char Array_2[Array_Size - 2];	
				for(j = 1; j <= Array_Size - 2; j ++){
					Array_2[j - 1] = Array[j];
				}
				return Calculator_I(Array_2, Array_Size - 2);
			}
			int test = 1;                                  // only number can reach this stage
			int test2 = 0;                                // below commands print the number as it is
			for(j = 0; j < Array_Size - 1; j ++)	test *= 10;
			for(j = 0; j < Array_Size; j ++){
				test2 += (Array[j] - '0') * test;
				test /= 10;
			}
			return test2;
		}
		if(Array[i] == '(')    	count ++;
		else if(Array[i] == ')')	count --;
		else if(count == 0 && Array[i] == '*'){			    // only 'A*B...' can reach this stage
			char Array_2[Array_Size - i - 1];			    // number(i+1 ~ Array_Size-1)
			for(j = i + 1; j < Array_Size; j ++){
				Array_2[j - i - 1] = Array[j];			    // if j = i + 1, j - i - 1 = 0
			}
			return Calculator_I(Array, i) * Calculator_I(Array_2, Array_Size - i - 1);			
		}
		else if(count == 0 && Array[i] == '/'){
			j = i + 1;
			while(1){
				if(j > Array_Size - 1){				    // only 'A/B' can reach this stage
					char Array_2[Array_Size - i - 1];

	    // number(i+1 ~ Array_Size-1)
					for(k = i + 1; k < Array_Size; k ++){
						Array_2[k - i - 1] = Array[k];
					}	
					return Calculator_I(Array, i) / Calculator_I(Array_2, Array_Size - i - 1);
				}	
				if(Array[j] == '*'){				            // only 'A/B*C...' can reach this stage
					char Array_2[j - i - 1];		            // number(i+1 ~ j-1)
					char Array_3[Array_Size - j - 1];	    // number(j+1 ~ Array_Size-1)
					for(k = i + 1; k < j; k ++){
						Array_2[k - i - 1] = Array[k];
					}
					for(k = j + 1; k < Array_Size; k ++){
						Array_3[k - j - 1] = Array[k];
					}					
					return Calculator_I(Array, i) / Calculator_I(Array_2, j - i - 1) 
													* Calculator_I(Array_3, Array_Size - j - 1);					
				}
				j ++;				
			}
		}
		i ++;
	}
}

int main(int argc, char *argv[]) {
	char Array[Max];
	int i;
	scanf("%s", Array);
	for(i = 0; 1; i ++){
		if(Array[i] == 0)	break;
	}
	printf("%d", Calculator_I(Array, i));                    // number(1 ~ i-1)
	return 0;
}


入力: 2013.07.11 21:52

修正:2023.06.16 11:46

results matching ""

    No results matching ""