[ create a new paste ] login | about

Link: http://codepad.org/ZiyXiSsP    [ raw code | output | fork ]

C, pasted on Dec 3:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char    buffer[1000];           /* 式入力バッファ      */
char    *bufferptr;             /* 入力バッファポインタ   */
char    token[100];             /* トークン         */

/*----------------------------------------------------------------------*/

int isblank( char c )       { return c=='\t' || c==' '; }

char *inittoken( char *str );
char *gettoken();
int factor();
int term();
int  expr();


char *inittoken( char *str )
{
	strcpy( buffer, str );
	bufferptr = buffer;
	return  gettoken();
}

char *gettoken()
{
	char *tp = token;

	*tp = '\0';
	while( isblank(*bufferptr) )
		++bufferptr;
	if( (*bufferptr == '\n') || (*bufferptr == '\0') )
		return  NULL;
	if( isdigit(*bufferptr) ) {
		while( isdigit(*bufferptr) )
			*tp++ = *bufferptr++;
        } else {
			*tp++ = *bufferptr++;
        }
	*tp = '\0';
	return  bufferptr;
}


int factor()
{
	int value;

	if(isdigit( token[0] ) ){
		value = atoi(token);
		gettoken();
	}else if( token[0] == '(' ){
		gettoken();
		value = expr();
		if( token[0] == ')' ) {
			gettoken();
		}else{
			fprintf(stderr,"エラー ( と ) がバランスしていない\n");
			exit(EXIT_FAILURE);
		}
	}
	return  value;
}

int term()
{
	int value, v;
	char  op;
	
	value = factor();
	
	for(;;){
		op = token[0];
		if( !( op =='*' || op=='/' ) )
			break;
		if( !gettoken() )
			break;
		v = factor();
		switch( op ){
			case '*':  value *= v;
				break;
			case '/':
				value /= v;
				break;
		}
	}
	return  value;
}


int  expr()
{
	int value, v;
	int sign = 1;
	char op;
	
	if( token[0] == '+' ){
		gettoken();
	}else if( token[0] == '-' ){
		sign = -1;
		gettoken();
	}
	
	value = term();
	if( sign == -1 )
		value = -value;
	
	for(;;){
		op = token[0];
		if( !( op =='+' || op=='-' ) )
			break;
		if( !gettoken())
			break;
		v = term();

		switch( op ){
			case '+':  value += v;
				break;
			case '-':  value -= v;
				break;
		}
	}
	return  value;
}

int expression(char *str )
{
	inittoken( str );
	
	return  expr();
}


int main(int argc, char **argv )
{
	char str[1000] = {'\0'};
	int i;
	for(i=1;i<argc;i++)
		strcat(str,argv[i]);
	
	printf( "答えは %d\n", expression(str) );
	
	return 0;
}


Output:
1
答えは 1075105060


Create a new paste based on this one


Comments: