Hola a todos.-
Por el enunciado se darán cuenta de lo que deseo hacer, si me dejan ser prejuicio muchos dirán que ganas de complicarse por algo que el compilador de C lo efectúa perfectamente, si bien esto es cierto tengo mucha fe que este hilo me proporcionara mucho conocimiento (intuición, corazonada).-
Lo primero que deseo hacer es poner en una variable int (9 - 2) y borrarlo de la variable cadena, si bien logro extraer la cadena con un inicio correcto pero no logro el corte en el último paréntesis.-
Por último ¿lo harían de otra manera?.-

Código: Seleccionar todo

#include <stdio.h>
#include <string.h>
 
int main(){
	char cadena[100] = "3 * 5 + (9 - 2) + 5", *enc = NULL;
	
	enc = strchr(cadena, '(');
	
	printf("\n %s", enc);
	
	printf("\n\n");
	return 0;
}
Saludos y desde ya muchas gracias.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Hola a todos.
Pink muchas gracias por responder, si observas el código te darás una idea más acabada de lo que quiero hacer, he logrado avanzar un tanto y te voy a aprovechar para que me digas como debo hacer para insertar en cadena[inicio] la variable auxiliar, me fije en todas las funciones de manejo de cadena en C y no encuentro una que haga esto específicamente.-

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>

int main(void){
	int i, j, inicio, final, resultado = 0;
	char cadena[100] = "3 * 5 + (9 - 2) + 5", auxiliar[100] = {'\0'}, auxUno[2] = {'\0'}, auxDos[2] = {'\0'}, operador[2] = {'\0'};

	for (i = 0; cadena[i]; i++){
		if (cadena[i] == '(')
			inicio = i;
		if (cadena[i] == ')') {
			final = i;
			break;
		}
	}

	for (i = inicio + 1, j = 0; i < final; i++, j++)
		auxiliar[j] = cadena[i];

	auxiliar[j] = '\0';
	operador[0] = auxiliar[2]; operador[1] = '\0';
	auxUno[0] = auxiliar[0]; auxUno[1] = '\0';
	auxDos[0] = auxiliar[4]; auxDos[1] = '\0'; 
	
	if(operador[0] == '+'){
		resultado = atoi(auxUno) + atoi(auxDos);
	}
	if(operador[0] == '-'){
		resultado = atoi(auxUno) - atoi(auxDos);
	}
	if(operador[0] == '*'){
		resultado = atoi(auxUno) * atoi(auxDos);
	}
	if(operador[0] == '/'){
		resultado = atoi(auxUno) / atoi(auxDos);
	}
	if(operador[0] == '%'){
		resultado = atoi(auxUno) % atoi(auxDos);
	}

	for (i = inicio; i <= final; i++){
		cadena[i] = ' ';
	}

	sprintf(auxiliar, "%d", resultado); 

	return 0;
}

Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
SI no he entendido mal lo que quieres es partir de un origen y que imprima hasta el final indicado, dentro de una cadena.
Asi que te he hecho esto a ver si es lo que te sirve:
#include <stdio.h>
#include <string.h>
 
int main(){
   char cadena[] = "3 * 5 + (9 - 2) + 5", *ini = NULL;;
   int i;
   ini = strchr(cadena, '(');
   char fin = ')';
   
   for (i=0; i<strlen(ini); i++){
	   if (ini[i] != fin){
		   printf("%c", ini[i]);
	   }
	   else{
		   printf("%c", ini[i]);
		   break;
	   }
   }
}

Código: Seleccionar todo

[sanko@Sanko-PC Desktop]$ ./prueba 
(9 - 2)[sanko@Sanko-PC Desktop]$ 
Donde yo indico que el inicio/origen sea '(' y que deje de imprimir cuando se tope con el final: ')'
ami no me quedo del todo claro que es lo que quiere hacer xD
Abolición para el torneo del toro de la vega. Death to the murderers of bulls.
Hola a todos.
Pink en general lo que quiero hacer es un programa que emule al compilador cuando se declara una variable como esta.-

int a = 3 * 5 + (9 - 2) + 5;// creo que el resultado es 27

¿Se entiende?, es simplemente eso, lo que ocurre es que soy un autodidacta de 62 años y hace 4 meses que estoy estudiando en serio el lenguaje C.-
Estoy muy consciente que me falta un montón de validaciones pero quiero primero terminarlo de esta manera luego lo adapto.-
Ahora lo que me falta es correr “+ 5” al lado de del “9” y a este elemento reemplazarlo por un espacio, espero que corran el código y me puedan ayudar.-
sanko me gustó tu código lo voy a aplicar al mio.-

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>

int main(void){
	int i, j, inicio, final, resultado = 0;
	char cadena[100] = "3 * 5 + (9 - 2) + 5", auxiliar[100] = {'\0'}, auxUno[2] = {'\0'}, auxDos[2] = {'\0'}, operador[2] = {'\0'};

	for (i = 0; cadena[i]; i++){
		if (cadena[i] == '(')
			inicio = i;
		if (cadena[i] == ')') {
			final = i;
			break;
		}
	}

	for (i = inicio + 1, j = 0; i < final; i++, j++)
		auxiliar[j] = cadena[i];

	auxiliar[j] = '\0';
	operador[0] = auxiliar[2]; operador[1] = '\0';
	auxUno[0] = auxiliar[0]; auxUno[1] = '\0';
	auxDos[0] = auxiliar[4]; auxDos[1] = '\0'; 
	
	if(operador[0] == '+'){
		resultado = atoi(auxUno) + atoi(auxDos);
	}
	if(operador[0] == '-'){
		resultado = atoi(auxUno) - atoi(auxDos);
	}
	if(operador[0] == '*'){
		resultado = atoi(auxUno) * atoi(auxDos);
	}
	if(operador[0] == '/'){
		resultado = atoi(auxUno) / atoi(auxDos);
	}
	if(operador[0] == '%'){
		resultado = atoi(auxUno) % atoi(auxDos);
	}

	sprintf(auxiliar, "%d", resultado); 
	cadena[inicio] = auxiliar[0];

	printf("\n %s", cadena);
		
	return 0;
}
Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
que gusto otro autodidacta.

bueno la verdad no soy mucho de C/C++.

te recomiendo que primero que nada quites todos los espacios de la cadena. luego si manipulala.

Saludos tocayo Daniel :)
Imagen
Hola a todos.
Tocayo ya logre lo que me sugerías.

Código: Seleccionar todo

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

#define MAS +

int main(void){
	char *cadena = "3 * 5 + (9 - 2) + 5", auxiliar[100]={'\0'}, aux[10][10], *inicio=NULL, *final=NULL, op;
	int i=0, longitud=0, j=0, resultado=0, k=0;
	
	if ((inicio = strchr(cadena, '(')) && (final = strchr(inicio, ')'))){
		longitud = sprintf(auxiliar,"%.*s", (int) (final - (inicio +1)), inicio+1);
		for(; i<longitud; i++){
			if (auxiliar[i]!=' '){
				auxiliar[j] = auxiliar[i];
				j++;			
			}
		}
		auxiliar[j] = '\0';
		
	}

	i=0;
	for (j=0,k=0;auxiliar[j];j++){
		if (isdigit(auxiliar[j])){
			aux[k][i]=auxiliar[j];
			i++;
		}
		if (!isdigit(auxiliar[j])){
			op=auxiliar[j];
			aux[k][i]='\0';
			i=0,k++;
		}
	}
	aux[k][i]='\0';

	switch(op){
		case'+':resultado = atoi(aux[0]) + atoi(aux[1]);
			break;
		case'-':resultado = atoi(aux[0]) - atoi(aux[1]);
			break;
		case'*':resultado = atoi(aux[0]) * atoi(aux[1]);
			break;
		case'/':resultado = atoi(aux[0]) / atoi(aux[1]);
			break;
		case'%':resultado = atoi(aux[0]) % atoi(aux[1]);
			break;
	}
	printf("\n resultado = %d", resultado);
	
	i = k = -5;
	i = i MAS k;
	printf("\n resultado = %d", i);
	
	printf("\n\n");
	return 0;
}
Lo que me trae ahora es lo siguiente:deseo reemplazar esta parte del código:

Código: Seleccionar todo

switch(op){
	case'+':resultado = atoi(aux[0]) + atoi(aux[1]);
		break;
	case'-':resultado = atoi(aux[0]) - atoi(aux[1]);
		break;
	case'*':resultado = atoi(aux[0]) * atoi(aux[1]);
		break;
	case'/':resultado = atoi(aux[0]) / atoi(aux[1]);
		break;
	case'%':resultado = atoi(aux[0]) % atoi(aux[1]);
		break;
}
Por algo similar a lo siguiente que porsupuesto tiene una sintaxis erronea.-

Código: Seleccionar todo

int operador[]={+,-,*,/,%};
Y llamarlo desde op

Bueno espero en primer lugar que se entienda y luego que se pueda hacer dado que tengo unas cuantas horas investigando, practicando y googleando y no lo puedo lograr.-

Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Pino1952 escribió: Lo que me trae ahora es lo siguiente:deseo reemplazar esta parte del código:

Código: Seleccionar todo

switch(op){
	case'+':resultado = atoi(aux[0]) + atoi(aux[1]);
		break;
	case'-':resultado = atoi(aux[0]) - atoi(aux[1]);
		break;
	case'*':resultado = atoi(aux[0]) * atoi(aux[1]);
		break;
	case'/':resultado = atoi(aux[0]) / atoi(aux[1]);
		break;
	case'%':resultado = atoi(aux[0]) % atoi(aux[1]);
		break;
}
Por algo similar a lo siguiente que porsupuesto tiene una sintaxis erronea.-

Código: Seleccionar todo

int operador[]={+,-,*,/,%};
Y llamarlo desde op

Bueno espero en primer lugar que se entienda y luego que se pueda hacer dado que tengo unas cuantas horas investigando, practicando y googleando y no lo puedo lograr.-

Saludos.
Daniel
Primero, que conste que no sé nada de C.
La siguiente línea:

Código: Seleccionar todo

int operador[]={+,-,*,/,%};
lo que hace es crear un array de int (números enteros), por lo tanto no aceptará los símbolos +, -, etc. Como mucho podrías hacer una array de chars:

Código: Seleccionar todo

char operador[]={'+','-','*','/','%'};
(No creo que funcione el ejemplo de array de chars que he puesto).
Hola Blau.
Muchas gracias por tratar de ayudarme, lo estoy intentando de esta manera pero no me funciona.-

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int a =0;
	static const char *const operadores[] = {"%", "*", "+", "-", "/"};

	a = 5 *operadores 5;
	
	return 0;
}
Bueno seguiremos intentando (tal vez no se pueda, veremos).-

Por cierto alguien sabe donde está OK3NETu

Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
No sé si habrás resuelto la duda, espero que si :).

Tengo que comentarte que la notación infija es bastante compleja de evaluar si se quiere dar soporte a más funciones con diferente aridad, ampliar el modelo a un intérprete etc. En su lugar veo mejor utilizar las notaciones prefija o postfija y evaluar la expresión mediante un autómata de pila. Si sigues interesado en el tema mirate esto:

[Enlace externo eliminado para invitados]
[Enlace externo eliminado para invitados]
[Enlace externo eliminado para invitados]
[Enlace externo eliminado para invitados]

De paso te dejo el código de la evaluación postfija implementada, solo habría que traducir la expresión infija a postfija antes de iniciar el proceso:
( La pila ha sido tomada de: [Enlace externo eliminado para invitados] )

Código: Seleccionar todo

#include <stdio.h>

#define STACK_MAX 100

struct Stack {
    int    data[STACK_MAX];
    int       size;
};
typedef struct Stack Stack;

char isOperand(char);
int add(int,int);
int sub(int,int);
int div(int,int);
int mul(int,int);
void Stack_Init(Stack*);
void Stack_Push(Stack*,int);
void Stack_Pop(Stack*);
int Stack_Top(Stack*);
// mod,pow,or,and,xor ... Todas funciones binarias con aridad 2 en el ejemplo//

int main(int argc, char **argv)
{
	// Primero habría que convertir notación infija (cómun) a postfija, da más flexibilidad para evaluar las expresiones complejas // 
	// Se obvia el proceso y se parte de la expresión ya obtenida //
	char  exp[]   = "5 1 2 + 4 * + 3 -";
	char* pExp    = exp;
	char  op	  = 0x00; 
	// int(*pFnc)(int*); para generalizar la función viene bien un puntero a función y paso como parámetro un array de int (aridad genérica)
	// p.e hacer aparte un gestor de funciones que devuelva el puntero a la función a llamar desde main. (Se elige int como se puede elegir
	// cualquier otro tipo de datos) 
	Stack stk;    
	Stack_Init(&stk);
	for(;*pExp!=0;pExp++){
		if(*pExp!=' '){    // *pExp char '5' -> *pExp - 0x3A = valor === (*pExp - '0')
			if(isOperand((op = *pExp-0x30))) Stack_Push(&stk,op);
			else{ // Se asume por simplicidad que si no es un operando es una función, también se asume que las funciones toman únicamente 2 argumentos
				op = *pExp;
				// Se extraen los n argumentos y se pasan como parámetro a la función que toca
				if(stk.size<2){ fprintf(stderr,"Faltan argumentos."); exit(0); }
				else{
					int y                = Stack_Top(&stk);
					Stack_Pop(&stk);
					int x                = Stack_Top(&stk);
					Stack_Pop(&stk); 
					if(op=='+')            Stack_Push(&stk,add(x,y));
					else if(op=='-')       Stack_Push(&stk,sub(x,y));
					else if(op=='/')       Stack_Push(&stk,div(x,y));
					else if(op=='*')       Stack_Push(&stk,mul(x,y));
					// ... //
				}	
			}
		}
	}
	if(stk.size==1) fprintf(stdout,"Resultado: %d",Stack_Top(&stk));
	else fprintf(stderr,"Has introducido demasiados elementos.");
	return 0;
}

char isOperand(char i){
	if(i>=0 && i<=9) return 1;
	return 0;
}

// Ejemplo de definición de funciones para resolver expresiones //
int add(int x,int y){ return x+y; }
int sub(int x,int y){ return x-y; }
int div(int x,int y){ return x/y; }
int mul(int x,int y){ return x*y; }

void Stack_Init(Stack *S){
    S->size = 0;
}
int Stack_Top(Stack *S){
    if (S->size == 0) {
        fprintf(stderr, "Error: stack empty\n");
        return -1;
    } 
    return S->data[S->size-1];
}

void Stack_Push(Stack *S, int d){
    if (S->size < STACK_MAX){ S->data[S->size++] = d; }
    else{ fprintf(stderr, "Error: stack full\n"); }
}

void Stack_Pop(Stack *S){
    if (S->size == 0){
        fprintf(stderr, "Error: stack empty\n");
	}
    else{
        S->size--;
	}
}

Un saludo :D
Responder

Volver a “C/C++”