C/Visual C - Operaciones aritmeticas en C

   
Vista:

Operaciones aritmeticas en C

Publicado por Gustavo Ramirez (1 intervención) el 01/03/2015 16:15:59
¿Como puedo hacer un programa en C que calcule expresiones aritméticas, que dependa de la importancia de los datos entre parentesis?

Como puedo realizar un programa en donde utilice, por lo menos, una de las
expresiones aritméticas (lógicas y relacionales), que detecte y calcule la prioridod de elementos dentro de un parentesis.

La prioridad es mayor en la multiplicación que en la suma, ejemplo el valor de: 3 más 5 * 3 = 18; pero cambiando prioridad: (3 más 5) * 3 = 24

Gracias y excelente dia.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Operaciones aritmeticas en C

Publicado por aguml (179 intervenciones) el 02/03/2015 23:27:21
El tema no es sencillo, lo que debes hacer es el divide y vencerás. Primero buscas un parentesis '(' y si se encuentra en la cadena guardas la posicion en un entero. Luego buscas el ')' desde la posicion siguiente al '('. Una vez obtenemos esos valores obtenemos la substring y volvemos a buscar mas parentesis pero en la substring y asi hasta obtener la mas interna. Una vez tenemos la parte mas interna buscamos el de multiplicar o dividir y resolvemos esas partes y por ultimo resolvemos las sumas y restas. Asi hasta resolver la operacion entera.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Operaciones aritmeticas en C

Publicado por aguml (179 intervenciones) el 03/03/2015 18:05:02
en cuanto pueda hago unas pruebas y te comento.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Operaciones aritmeticas en C

Publicado por Chema (187 intervenciones) el 04/03/2015 01:22:21
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/*
Este ejemplo es una forma diferente del clasico y facilon.
(Si encuentro un parentesis entonces leo hasta el parentesis contrario.)
se procesan los datos seguidos sin ningun While ( hasta el otro parentesis)
Se procesna los datos en conjunto al encontrar el terminador de linea

*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
 
char str[] = 	"#comentario\n"
 		"#comentario\n"
		"  ( (3(33+4(2(23+3)) (18+4(2+2( 3 + 3))) #Linea con parentesis sin cerrar\n"
		"  (3) (4) (5) 		#comentario\n"
		"  ( ((6))(44+55 (34+5)  ))(88 +99(99 + 88((((99))))) )   (6- 6 / 6) #comentario\n"
		"#comentario\n"
		"#comentario\n"
		" (1(2(3(4(5)))))\n";
 
 
typedef struct Token{
	char *ptr;
	char *end;
	char *sep;
	int orderparent;
}Token;
 
#define IsOperator(n) ( (n) == '*' || (n) == '+' || (n) == '/' || (n) == '-')
#define IsSeparator(n) ( (n) == '(' || (n) == ')' )
#define IsValidChar(n) ( isdigit(n) || IsOperator(n)  )
#define IsNoValidChar(n) ( !IsValidChar(n) && !IsSeparator(n) &&  !isspace(n)  )
 
int ReadToken(char *start, char *end){
	char *raw;
	char *ptr;
	char *praw;
	char *c;
	int i;
	int line = 0;
	int parent = 0;
	int orderparent = 0;
	int COMMENT = 0;
	int tkindex = 0;
	int maxtoken = 50;
 
	Token tk[50];
	ptr = raw = start;
 
	while ( start < end){
		c = start++;
		if ( *c == '#'){
			COMMENT = 1;
		} else if ( *c == '\n') {
			COMMENT = 0;
		}
		if ( COMMENT == 0){
			if ( IsValidChar(*c) ){
				if ( raw == ptr)
					ptr = raw = c;
				raw++;
			}else{
				if ( IsNoValidChar(*c)){
					printf("\nCaracter no permitido Linea: = %d caracter: = %c", line,*c);
					return 1;
				}
				if ( (raw - ptr > 0) && !IsSeparator(*c))
					raw++;
			}
 
			if (IsSeparator(*c) ){
				*c == '(' ?parent++ : parent--;
				if ( raw - ptr > 0){
					if ( *c == '(')
						orderparent++;
						tk[tkindex].orderparent = orderparent;
						tk[tkindex].ptr = ptr;
						tk[tkindex].end = raw;
						tkindex++;
						if ( tkindex > maxtoken){
							return 1;
						}
				}
				ptr = raw = c;
			} else if ( *c == '\n'){
				line++;
				if (tkindex > 0){ /* salta los comentarios de una linea completa*/
					if ( parent != 0) {
						printf("\nParentesis sin cerrrar Linea: = %d\n",line);
					}
					for ( i = 0; i < tkindex; i++){
						ptr = tk[i].ptr ;
						praw = tk[i].end ;
						while ( ptr < praw){
							/* con los datos recopilados, debiera ser suficiente para 
							*aplicar las reglas de precendencia de operadores*/
							if (IsOperator(*ptr)){
							//printf("  	Orden = %d",tk[i].orderparent);
							}
							printf("%c",*ptr);
							ptr++;
						}
						printf("\n");
					}
					printf("--------\n");
					parent = orderparent =  tkindex = 0;
					ptr = raw = c;
				}
			}
		}
	}
 
	return 0;
}
 
int main(void){
	int size;
	char *p;
	size = strlen(str);
	p = str;
	ReadToken(p, p+size);
	return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar