Donar $20 Donar $50 Donar $100 Donar mensualmente
 


Enviar respuesta 
 
Calificación:
  • 1 votos - 2 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Buscar en el tema
[INFO 1] Final 18/12/12 [RESUELTO]
Autor Mensaje
JulianD Sin conexión
Colaborador
~`☼`~
********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 2.435
Agradecimientos dados: 275
Agradecimientos: 769 en 108 posts
Registro en: Feb 2011
Mensaje: #1
[INFO 1] Final 18/12/12 [RESUELTO] Finales Informática I (Electrónica)
Les escribo lo que me acuerdo de lo que tomaron hoy así queda asentado:

TEÓRICO

T1. Explicar en forma clara y concisa en que consisten los procesos de compilación y linkeado.

T2. Te daban dos números, uno en base octal y otro en decimal.. y tenías que pasarlos a binario y hacer no sé qué cuenta de complemento 2 (como verán este no lo hice, pero lo importante es que tomaron sistemas de numeración).

PRACTICO :

Te explicaban un sistema para realizar operaciones matemáticas que funcionaba de la siguiente manera:
Los números de una determinada operación van todos a la izquierda (operando) y el operador (+-*%) a la derecha.

Algunos ejemplos serian:

Original: 2+2
Codificado: 22+

Original: 2*7*8
Codificado: 278*

Etc.

La cuestión es que tenías que hacer una función llamada calculadora que tenía el siguiente prototipo:

int Calculadora (nodo **pila, char *trama, double *resultado)

Pila: Te daban la dirección del primer elemento de una pila, pasado por referencia.
La idea era usarlo como "memoria" mientras vas realizando las operaciones.

Trama: En la trama venia cargado un mensaje codificado de la forma explicada atrás, ej.

987+5645*56

Resultado: Bueno, acá obviamente cargabas el resultado de toda la operación.

Procedimiento:
La idea es que con el uso de la función de cola "push" (la cual tenías que desarrollar como parte del ejercicio) fueras metiendo los números que te llegaban en la trama, hasta que llegabas a un char que representaba una operación.
En ese punto resolvías esa operación para todos los números que habías llegado a almacenar en la cola, y guardabas el resultado en la cola.
Lo ideal era hacer la operación de a 2 operandos a la vez (que los sacabas de la cola con la funcion "pop"), reemplazar el resultado y volver a hacerla con 2 operandos más (el resultado anterior + uno nuevo).
Así hasta que en la cola te quedara 1 solo resultado final para esa operación.
Luego de eso, seguías leyendo la trama y "pusheando" los números en la cola hasta la siguiente operación, realizabas la operación, etc.
Así sucesivamente, hasta que en algún momento llegabas al final de string.
Cargabas el valor en la variable resultado pasada por referencia, y te ibas a tu casa =D

Eso fue todo, si bien el practico parece jodido al explicarlo fue bastante fácil.
Una vez que entendías lo que pedía el enunciado, bastaba saber manejar colas (y saberse las funciones push y pop), y saber hacer casteos y el pasaje de char a números.

Estaba al pedo y en un rato lo hice, este es mi aporte del mes (?

ACLARACION 1: Los numeros solo eran de una cifra (un char por numero) y las operaciones eran las 4 basicas (+-*/)

ACLARACION 2: Si bien la funcion aparece con el nombre de pila, para que todo fucione bien se debe trabajar con una cola.
Si se fijan la funcion "push" va insertando nodos al final, y "pop" retira los nodos del principio..
Si no se trabajara con una cola aparecerian errores en las operaciones no conmutativas.



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

#define MAX_SIZE 30

typedef struct pNodo {

struct pNodo *sig;
double valor;

} pnodo;

void imprimir_pila(pnodo *pila);
int pop (pnodo **pila, double *popval);
int push (pnodo **pila, double pushval);
int Calculadora (pnodo **pila, char *trama, double *resultado);


int main () {

int n=0;
pnodo *pila=NULL;
char trama[MAX_SIZE]={'\0'};
double resultado;

printf ("\n** CALCULADORA ** \nIngrese la trama que desea procesar:\n");

fgets (trama,MAX_SIZE,stdin);

printf ("\nTrama ingresada: %s", trama);

if ((Calculadora ( &pila , trama , &resultado ))==1)
printf ("\nResultado: %f\n\n", resultado);

else printf ("\nError en el formato de la trama ingresada\n");

return 0;

}

int Calculadora (pnodo **pila, char *trama, double *resultado) {

int n=0,validacion=0;
double num1=0, num2=0;

while (trama[n]!='\0') {

/** CASO 1: IR AGREGANDO LOS NUMEROS DE 1 CIFRA EN LA COLA */
if ( (trama[n]>='0') && (trama[n]<='9') ) {
push (pila , (double)trama[n]-'0'); /** Mientras recibo numeros los voy agregando a la pila */
}

/** CASO 2: CUALQUIER COSA QUE NO SEA UN NUMERO, SI ES UNA OPERACION SE EFECTUA CON TODOS LOS NUMEROS CARGADOS EN LA COLA */
else {

if (!(*pila))
return 0; /** Validacion: Trama sin numeros */

while ((*pila)->sig!=NULL) { /** Quedarse en el while hasta que quede solo un elemento en la pila */

validacion=pop (pila,&num1);
validacion+=pop (pila,&num2);

if (validacion<2) {
return 0; /** Validacion: Ocurrio algun error al extraer los valores de la pila */
}

switch (trama[n]){

case '+':

push ( pila , num1+num2); /** Realizo la operacion indicada con 2 numeros */
break; /** y agrego el resultado a la pila */

case '-':

push ( pila , num1-num2);
break;

case '*':

push ( pila , num1*num2);
break;

case '/':

push ( pila , num1/num2);
break;

default:
return 0; /** Validacion: Caracter de operacion no identificado */

} //FIN DEL SWITCH//
}
}

n++; /** Incremento la variable que uso para recorrer la trama */
}

pop (pila, resultado); /** Cargo el ultimo elemento de la pila en la variable 'resultado' pasada por referencia */

return 1;

}

/*********** FUNCIONES DE PILA ***********/

int pop (pnodo **pila, double *popval) {

pnodo *temp;

if (pila) {

temp = *pila; /** Almaceno la posicion de me moria para liberarla luego */
*popval = (*pila)->valor; /** Guardo el dato */
*pila=(*pila)->sig; /** Corro el inicio de la pila al siguiente nodo */
free(temp); /** Libero la memoria del nodo */
return 1;
}

else
return 0; /** Validacion: Pila vacia */

}


int push (pnodo **pila, double pushval) {

pnodo *nuevo, *act;

nuevo = (pnodo*) malloc (sizeof(pnodo)); /** Reservo memoria para el nodo */

//printf ("\n%f",pushval);

if (!nuevo) {
printf ("\nNo hay memoria disponible");
return 0; /** Validacion: Error */
}

nuevo->valor=pushval; /** Cargo el dato en el nodo */
nuevo->sig=NULL;
act = *pila;

if (!(*pila)) {
*pila=nuevo;
return 1;
}

else {

while (act->sig!=NULL)
act=act->sig;

act->sig=nuevo;
return 1;
}
}



Asi como esta derecho al gcc, y obviamente puede fallar.. Si encuentran algun error me avisan =P

NOTA 1: No lo prueben con el compilador del foro porque el programa utiliza memoria dinamica y no va a funcar.

NOTA 2: Si quieren copiar el codigo directo de aca pueden hacer click en "citar" y lo copian de ahi.

[Imagen: 2r27ldw.jpg]
(Este mensaje fue modificado por última vez en: 03-01-2013 17:54 por Aye.)
19-12-2012 02:22
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] JulianD recibio 4 Gracias por este post
Feer (19-12-2012), John_Doe* (20-12-2012), anonimail (06-02-2013), Alescaramanzia (15-04-2013)
Feer Sin conexión
Presidente del CEIT
win-win
**********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 4.565
Agradecimientos dados: 594
Agradecimientos: 2.486 en 411 posts
Registro en: Apr 2010
Mensaje: #2
RE: [INFO 1] Final 18/12/12
Gracias loco!
Espero que me sirva para febrero.. y no para otra fecha ajja.

[Imagen: digitalizartransparent.png]
19-12-2012 15:32
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
JulianD Sin conexión
Colaborador
~`☼`~
********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 2.435
Agradecimientos dados: 275
Agradecimientos: 769 en 108 posts
Registro en: Feb 2011
Mensaje: #3
RE: [INFO 1] Final 18/12/12
Agrego el archivo con el programa aca porque no me deja agregarlo al primer mensaje :/

_____________________________________________________

batiseñal brunodiaz

No me deja subir archivos, ni aca ni en el mensaje original..
Pongo cargar el archivo y todo Ok, cuando quiero subirlo como que se carga la barrita pero al toque se actualiza la pagina y el archivo cargado ya no esta...

[Imagen: 2r27ldw.jpg]
(Este mensaje fue modificado por última vez en: 20-12-2012 01:10 por JulianD.)
20-12-2012 01:06
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
John_Doe* Sin conexión
Profesor del Modulo A
Steampowered
*****

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 307
Agradecimientos dados: 18
Agradecimientos: 60 en 41 posts
Registro en: Dec 2012
Mensaje: #4
RE: [INFO 1] Final 18/12/12
Julian te diria que revises lo de validacion. La funcion pop devolvia un 1 si la salida era correcta o un 0 si ocurria un error.
Por lo tanto validacion siempre va a ser menor a 2.
Otra cosa el case que tiene por default: return 0 lo sacaria; sino al encontrar un numero lo pushea y como no es ningun caracter de operacion retorna finalizando tu cuenta. A menos que en el main vos hayas pensado desarmar la string que recibis por stdin ejemplo: 22+3*-5 que por lo que entendi equivaldria a : ((2+2)*3)-5.

Por otra parte en el inicio del programa no desarmaste la string para tener aquellos caracteres que son numeros, entonces cuando hagas pop seguramente te va a devolver un 0 porque la pila esta vacia.

Ojo eso es lo que interpreto mirando el codigo ahora rapido y recordando el enunciado con lo que dijo uno de los docentes.
Por otro lado hay otro error, si se pidio armar una pila el ultimo numero pusheado es el primero que sale por lo tanto la operacion va a ser completamente distinta a la que se ingreso al inicio.
Hay otros puntos que habria que ver con mas calma creo, pero eso a simple vista me parece lo mas proximo a corregir. Puede que me haya equivocado en alguna cosa que vi rapido, asi que cualquier cosa se puede armar por este medio el codigo mas depurado.

No quiero que se tome a mal mis comentarios, menos siendo este uno de mis primeros posts. Si suena un poco brusca la respuesta no es hacia vos Julian. Hay cosas para criticarle a los que hicieron y llevaron el final ese dia, o al menos a mi criterio.

Fuera de eso me parece muy bueno que subas el enunciado cuando no te dejan llevarte finales ni los podes conseguir por otro lado. Te dejo un punto de agradecimiento por el aporte.

OFF: El libro de fisica que te compre fue un golazo, sino fisica hubiese sido un muerto.

[Imagen: 335x50sfm_1.gif]
(Este mensaje fue modificado por última vez en: 20-12-2012 01:23 por John_Doe*.)
20-12-2012 01:21
Visita su sitio web Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
JulianD Sin conexión
Colaborador
~`☼`~
********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 2.435
Agradecimientos dados: 275
Agradecimientos: 769 en 108 posts
Registro en: Feb 2011
Mensaje: #5
RE: [INFO 1] Final 18/12/12
Como andas chabon?
No me lo tomo nada a mal, te explico punto por punto.

Lei todo lo que pusiste, y tenes razon con respecto a lo de la pila.

(20-12-2012 01:21)John_Doe* escribió:  Julian te diria que revises lo de validacion. La funcion pop devolvia un 1 si la salida era correcta o un 0 si ocurria un error.
Por lo tanto validacion siempre va a ser menor a 2.

Exactamente, lo que estoy validando si te fijas es el error.
Si te fijas en el codigo, cuando el main recibe un CERO despliega un mensaje de error.
Si cada popeo es correcto, la suma de validacion va a tener que ser igual a 2 (1+1).
Si es 0 o 1, hubo algun error (fijate que lo que hago es sumar las validaciones).

(20-12-2012 01:21)John_Doe* escribió:  Otra cosa el case que tiene por default: return 0 lo sacaria; sino al encontrar un numero lo pushea y como no es ningun caracter de operacion retorna finalizando tu cuenta. A menos que en el main vos hayas pensado desarmar la string que recibis por stdin ejemplo: 22+3*-5 que por lo que entendi equivaldria a : ((2+2)*3)-5.

Me da la impresion que no leiste mucho el codigo.

El programa basicamente esta dividido en dos partes:
Un "if" en el que entran todos los numeros y un "else" en el que entran todos los caracteres que no sean numeros.
El default que decis esta dentro del else, por lo tanto nunca un numero llegaria hasta ahi.
Lo que estoy validando es que el operador sea uno de los 4 que corresponden a las operaciones basicas.

(20-12-2012 01:21)John_Doe* escribió:  Por otra parte en el inicio del programa no desarmaste la string para tener aquellos caracteres que son numeros, entonces cuando hagas pop seguramente te va a devolver un 0 porque la pila esta vacia.

Al inicio del programa lo que hago es empezar a recorrer el string y cargar los numeros que encuentre.
Si hay un caso en el que encuentre un caracter de un operador antes de haber cargado numeros en la cola, hay una validacion que dice:

if (!(*pila))

Que esta preguntando justamente si la pila esta vacia.
Si lo esta retorna cero, y el main devuelve error.

(20-12-2012 01:21)John_Doe* escribió:  Ojo eso es lo que interpreto mirando el codigo ahora rapido y recordando el enunciado con lo que dijo uno de los docentes.

Ahora no quiero sonar mal yo, pero antes de poner en cuestion tantas cosas te deberias haber tomado un cachito mas para leer el codigo que encima esta bastante comentado! =P

(20-12-2012 01:21)John_Doe* escribió:  Por otro lado hay otro error, si se pidio armar una pila el ultimo numero pusheado es el primero que sale por lo tanto la operacion va a ser completamente distinta a la que se ingreso al inicio.

En esto tenes razon, las funciones correctas para el problema son las de cola no las de pila.
Creo que la confusion surgio por el nombre que les dieron a las funciones "push" y "pop", cuando los nombres habituales para las funciones de cola son otros que suenan raro (?
En el final lo hice bien, repitieron varias veces que la funcion de push era igual que la de agregar un nodo a una lista no ordenada, osea al final (y no al principio como esta aca).
Esta diferencia obviamente solo se aprecia con las operaciones que no son conmutativas..
Mañana si tengo un rato lo arreglo! =)

(20-12-2012 01:21)John_Doe* escribió:  Hay otros puntos que habria que ver con mas calma creo, pero eso a simple vista me parece lo mas proximo a corregir. Puede que me haya equivocado en alguna cosa que vi rapido, asi que cualquier cosa se puede armar por este medio el codigo mas depurado.

Ok, te tome una de las correciones.
Te recomiendo que de aca al futuro antes de comentar y hacer una critica tan puntillosa sobre algo que leas en el foro (que esta buenisimo que la hagas, si estas seguro de lo que estas diciendo) te tomes 5 minutos y leas y entiendas bien lo que estas por criticar.
Sino se genera una respuesta gigante como esta, donde pusiste en duda cosas que estan bastante obvias (y comentadas) en el codigo.

(20-12-2012 01:21)John_Doe* escribió:  No quiero que se tome a mal mis comentarios, menos siendo este uno de mis primeros posts. Si suena un poco brusca la respuesta no es hacia vos Julian. Hay cosas para criticarle a los que hicieron y llevaron el final ese dia, o al menos a mi criterio.

El final de ayer fue facil aunque no lo creas.. Yo me presente en Septiembre tambien y tomaron algo muchisimo mas complicado de entender y de implementar.
Por lo general los enunciados siempre van a tener este nivel de dificultad, al punto que para mi entender bien lo que te estan pidiendo significa tener mas de la mitad del parcial/final adentro.

(20-12-2012 01:21)John_Doe* escribió:  Fuera de eso me parece muy bueno que subas el enunciado cuando no te dejan llevarte finales ni los podes conseguir por otro lado. Te dejo un punto de agradecimiento por el aporte.

OFF: El libro de fisica que te compre fue un golazo, sino fisica hubiese sido un muerto.


Gracias por el agradecimiento, y buenisimo que te haya servido el libro!

No lo tomo a mal tu comentario, solo que la proxima leas un poco mas y si no entendes pregunta.. Pero no opines con la seguridad de que lo que estas diciendo es la verdad absoluta (asi me sono a mi) a menos que estes seguro de que tenes la verdad absoluta jaja =P
Espero que sigas participando en el foro y sumando al subforo de electronica!

Y cualquier duda que tengas, no dudes en consultar =D

____________________________________________________________________________________________

EDITO: Listo el pollo, ahi corregi la funcion de push.. Agrega en el ultimo nodo y no en el primero, probe con varias operaciones y salen con fritas

[Imagen: 2r27ldw.jpg]
(Este mensaje fue modificado por última vez en: 20-12-2012 02:28 por JulianD.)
20-12-2012 01:52
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
John_Doe* Sin conexión
Profesor del Modulo A
Steampowered
*****

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 307
Agradecimientos dados: 18
Agradecimientos: 60 en 41 posts
Registro en: Dec 2012
Mensaje: #6
RE: [INFO 1] Final 18/12/12
Lo de la validacion disculpame no te vi el + que pusiste delante. Por eso te lo tiraba abajo, ahora entiendo porque pusiste < 2. Te confieso que a mi personalmente no me gusta mucho es de poner la operacion por precedencia porque a mi me suele hacer pisar el palito, pero ahora que vi con mas detalle despues de lo que respondiste, si tenes razon.

Con respecto a lo ultimo del if y el else, tenes razon. Capaz que es como carga la pagina mi explorador o algo en particular mio pero me muestra desordenadas las llaves de los if y else. Ahora lo que hice fue copiarte el codigo y pegarlo en un editor para verlo con calma y si, el while esta dentro del else que vos decias y no por encima del otro que habia visto.

Con lo del final no me referia a la dificultad sino a otras cuestiones, sobre todo en haber tenido que aclarar el enunciado porque no se habian explicitado lo suficiente y aparte uno de los ejemplos tenia un error. Otros puntos tambien aparte que sinceramente aca no corresponde remarcarlos, en todo caso lo que hare es si en algun momento me cruzo a un docente en particular le comento algunas cosas amablemente para que cambie de actitud o al menos deje que otro se encargue de responder.

Para la proxima si cae un codigo asi lo que hago mejor es copiarlo en un editor que se ve mas claro al menos lo puedo reordenar, porque desde el foro se ve mal (desde mi computadora, no se si sera general el problema). Sino te termino cuestionando algo que estaba bien.

OFF: Los comentarios estan en un verde clarito ¿No? Tengo que cambiar unas cosas de las fuentes porque practicamente no se ve de lo clarito que me aparecen. Esto lo digo porque cuando lo copie en un editor ahi aparecieron los comentarios en mayusculas

[Imagen: 335x50sfm_1.gif]
(Este mensaje fue modificado por última vez en: 20-12-2012 02:34 por John_Doe*.)
20-12-2012 02:29
Visita su sitio web Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
JulianD Sin conexión
Colaborador
~`☼`~
********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 2.435
Agradecimientos dados: 275
Agradecimientos: 769 en 108 posts
Registro en: Feb 2011
Mensaje: #7
RE: [INFO 1] Final 18/12/12
Si, los comentarios están en verde.. pero no tan clarito!

Ojo que hay un par de comentarios en mayúsculas que los agregue en la ultima edición para que quede un poco mas claro.

Yo queria subir el archivo .c para que quede bien clarito y organizado pero el foro no me esta dejando.. En cuanto lo solucione lo subo asi queda directo para bajarlo desde el primer mensaje.

En fin, tomatelo con calma.. Te digo por experiencia propia, el final de info 1 es el que mas parí (me falta solo el de fisica 1 pero no es jodido). De hecho me costo muchisimo regularizar esta materia.

En Septiembre tomaron una cosa con listas dobles, archivos, ordenamiento de listas.. y un enunciado que era mas inentendible (hasta se contradecia a si mismo) que este.

Ahora olvidate de la facu por un tiempo!!

Saludos!

[Imagen: 2r27ldw.jpg]
20-12-2012 02:46
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
John_Doe* Sin conexión
Profesor del Modulo A
Steampowered
*****

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 307
Agradecimientos dados: 18
Agradecimientos: 60 en 41 posts
Registro en: Dec 2012
Mensaje: #8
RE: [INFO 1] Final 18/12/12
Igual mira que sigo sin referirme sobre la dificultad, sino algunas actitudes que presencie por parte de algunos docentes.

Igual todo aclarado, si subis algun codigo me haces mas un favor a mi que a otros calculo asi que mas sencillo es hacer copy paste y mirarlo en blanco y negro en un editor.
De todas formas asumo que tengo que tener un problema yo, si incluso tuve que cambiar de cuenta porque mi "vieja" cuenta no la pude loguear otra vez desde mi explorador en esta pc (con PC me refieron a una netbook con ubuntu 12.04 y firefox como explorador).

Como dije arriba, gracias por el aporte Julian.

OFF: Si tenes algun libro de segundo año que pensas vender de analisis 2 o fisica 2 avisame si te conviene, que hasta ahora los que te compre me sirvieron.

[Imagen: 335x50sfm_1.gif]
20-12-2012 02:54
Visita su sitio web Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
anonimail Sin conexión
Campeon del cubo Rubik

****

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 108
Agradecimientos dados: 45
Agradecimientos: 74 en 21 posts
Registro en: Feb 2012
Mensaje: #9
RE: [INFO 1] Final 18/12/12 [RESUELTO]
¿No tomaron socket? ¿Alguien sabe que tanto se toma?
13-01-2013 18:05
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Feer Sin conexión
Presidente del CEIT
win-win
**********

Ing. Electrónica
Facultad Regional Buenos Aires

Mensajes: 4.565
Agradecimientos dados: 594
Agradecimientos: 2.486 en 411 posts
Registro en: Apr 2010
Mensaje: #10
RE: [INFO 1] Final 18/12/12 [RESUELTO]
Suele caer socket es un tema que se esta tomando como listas pero en algunos puede no entrar..
Yo me la juego a que en marzo va a entrar en 2 de 3.
Siempre cae un final que no tiene socket o listas para hacernos sentir bien(?)

[Imagen: digitalizartransparent.png]
18-01-2013 14:28
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
Buscar en el tema
Enviar respuesta 




Usuario(s) navegando en este tema: 1 invitado(s)



    This forum uses Lukasz Tkacz MyBB addons.