Donar $20 Donar $50 Donar $100 Donar mensualmente
 


Enviar respuesta 
 
Calificación:
  • 0 votos - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Buscar en el tema
Final de sintaxis (no entiendo nada)
Autor Mensaje
rodri042 Sin conexión
Militante

***

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 81
Agradecimientos dados: 12
Agradecimientos: 35 en 10 posts
Registro en: Aug 2010
Mensaje: #1
Final de sintaxis (no entiendo nada) Finales y 1 más Sintaxis y Semántica de los Lenguajes
Tengo que rendir el lunes... alguien me ayuda con estas dudas?

1) Qué hace la función ungetc? si me dan una función y me preguntan cuantos ungetc realiza el scanner qué pongo?

2) Si la función es...
unsigned int XX (const char *s, int c) {
unsigned int i, n;
for(i=n=0; s[i]!='\0'; i++)
if (s[i] == c)
n++;
}

al invocar XX ("abccaxxc", 'c') por qué devuelve 3? para mi no tiene sentido esa función, declara el parametro s como puntero a constante char, y despues lo usa como vector (s[i]) :/

3) En ANSI C: For(4,6)+Else("abc") puede ser una expresión sintácticamente correcta para el programador. Verdadero. Por qué? ¿?

4) No entiendo cómo obtener una regla BNF a partir de un PAS (cursé con silvina ortega, nos dejo en bolas a todos con la teoría del final, y del libro no se entiende mucho..
Otros adjuntos en este tema
.jpg  Imagen.jpg ( 445,1 KB / 596) por rodri042
.jpg  Imagen (5).jpg ( 303,27 KB / 605) por rodri042
28-07-2011 21:59
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] rodri042 recibio 2 Gracias por este post
NYKO_ (27-07-2014), CarooLina (20-11-2016)
lucho6 Sin conexión
Profesor del Modulo A
Sin estado :)
*****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 325
Agradecimientos dados: 5
Agradecimientos: 5 en 3 posts
Registro en: Nov 2008
Mensaje: #2
RE: Final de sintaxis (no entiendo nada)
1.ungetc retrocede un char cuando se encuentra con un centinela el analizador lexico.

2.a la funcion le pasas una cadena y un caracter, y hace un for hasta que en la cadena haya un \0, que seria el caracter final de una cadena...... y cuando el caracter de la cadena sea igual al que le pasaste, suma 1 al contador que retorna,,,, entonces te devuelve la cantidad de ocurrncias de ese caracter en la cadena.

3. porque For y Else pueden ser funciones cuaolquieras hechas por vos, acordate que la palabra reservada es "for" y "else" en minuscula.

el 4 te lo debo
28-07-2011 22:09
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
[-] lucho6 recibio 1 Gracias por este post
CarooLina (18-11-2016)
rodri042 Sin conexión
Militante

***

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 81
Agradecimientos dados: 12
Agradecimientos: 35 en 10 posts
Registro en: Aug 2010
Mensaje: #3
RE: Final de sintaxis (no entiendo nada)
gracias lucho , me quedó mucho mas claro.
un par de cosas..
si el primer parametro de XX es un vector de caracteres o sea una cadena, en la definicion no debería decir const char s[20] o algún tamaño maximo para el vector, o a lo sumo sin el const?

y sobre esa funcion, que pide contar la cantidad de ungetc, que serían la cantidad de centinelas.. la respuesta cuenta 29. yo cuento 27 (las marque en rojo acá abajo), que esta fallando? xD

unsignedintXX(constchar*s, intc) { unsignedinti, n;
for(i=n=0; s[i]!='\0'; i++) if (s[i] == c) n++; returnn; }
28-07-2011 23:47
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
gonnza Sin conexión
User Verde

*********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 17.112
Agradecimientos dados: 763
Agradecimientos: 732 en 317 posts
Registro en: Mar 2010
BlogSpot Google+ YouTube
Mensaje: #4
RE: Final de sintaxis (no entiendo nada)
Cita:4) No entiendo cómo obtener una regla BNF a partir de un PAS (cursé con silvina ortega, nos dejo en bolas a todos con la teoría del final, y del libro no se entiende mucho..

quizas esto te sirva UN poquito nomas..

http://www.utnianos.com.ar/foro/tema-ssl...8#pid96368

Antes alguien pregunto por ese PAS que esta ahi, como obtener la BNF..
Fijate si te sirve, cualquier duda pregunta.

Cita:y sobre esa funcion, que pide contar la cantidad de ungetc, que serían la cantidad de centinelas.. la respuesta cuenta 29. yo cuento 27 (las marque en rojo acá abajo), que esta fallando? xD

eso se resolvio acaaaaaa

http://www.utnianos.com.ar/foro/tema-sin...#pid126373

[Imagen: v34BEFt.gif]
29-07-2011 00:52
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
rld Sin conexión
Secretario General
ლ(ಠ益ಠლ)
*******

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 787
Agradecimientos dados: 9
Agradecimientos: 10 en 9 posts
Registro en: Nov 2010
Mensaje: #5
RE: Final de sintaxis (no entiendo nada)
(28-07-2011 23:47)rodri042 escribió:  si el primer parametro de XX es un vector de caracteres o sea una cadena, en la definicion no debería decir const char s[20] o algún tamaño maximo para el vector, o a lo sumo sin el const?

El primer parametro es un puntero que tiene la dirección del primer caracter de un string de cualquier longitud. Puede ser de longitud fija (char s[20] por ejemplo) o variable (char *s = malloc(20)), no hay diferencia. El const es nada mas para que quede claro que la funcion no modifica el string.

Ahora que lo veo, le falta el "return n" a esa funcion, sino no hace nada =P

Tambien se podria hacer sin la variable i, reemplazando i++ por s++ y s[i] por *s
(Este mensaje fue modificado por última vez en: 29-07-2011 01:40 por rld.)
29-07-2011 01:26
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
rodri042 Sin conexión
Militante

***

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 81
Agradecimientos dados: 12
Agradecimientos: 35 en 10 posts
Registro en: Aug 2010
Mensaje: #6
RE: Final de sintaxis (no entiendo nada)
Aaaaaaaaaaaaaaaaaa, genial, estaba contando el ' como centinela que no es, y no estaba contando ni el 0 ni el n, que intuyo que sirven para que el compilador sepa que es un = y no un == (?)

Lo del PAS ahora entiendo un poco mas =P igual si se hacer los demás seguramente ese no lo resuelva por las dudas...

(29-07-2011 01:26)rld escribió:  Ahora que lo veo, le falta el "return n" a esa funcion, sino no hace nada =P
si, el return me lo comi jajajaj

gracias gente por la buena onda! ya la rindieron esta ustedes? fue jodido lo que les tomaron?
29-07-2011 01:46
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
gonnza Sin conexión
User Verde

*********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 17.112
Agradecimientos dados: 763
Agradecimientos: 732 en 317 posts
Registro en: Mar 2010
BlogSpot Google+ YouTube
Mensaje: #7
RE: Final de sintaxis (no entiendo nada)
Yo lo di 4 veces
mis notas:

2
2
2
6


la primera vez no sabia una mierda y nose porque no me levante. Mi sumatoria daba -1
la segunda sabia mas, me cabio leer apurado, la sumatoria daba 2. Resp una bien en vez de mal y aprobaba
La tercera sabia banda, me re cabio los nervios, la sumatoria daba 3. Respondia dudas aca a 2 manos, asique imaginate si sabia
La cuarta respondi 6 puntos, saque 6, me los comi a todos crudos

Todavia me acuerdo banda como para responder dudas, y eso que la curse hace un año..

[Imagen: v34BEFt.gif]
29-07-2011 10:55
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
rodri042 Sin conexión
Militante

***

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 81
Agradecimientos dados: 12
Agradecimientos: 35 en 10 posts
Registro en: Aug 2010
Mensaje: #8
RE: Final de sintaxis (no entiendo nada)
uh me asustás jajajj yo encima estoy medio cagado xD el tema de este final es que es jodido por la forma en que lo toman..
ahora no me sale este :/

En un AFPD, luego de la transición T(1,a,x) = (1,xy) el tope de la pila es x. Es verdadero
pero para mi es falso, yo leo eso como "si el estado es 1 y el último caracter de la pila es x, al leer una a se va al estado 1, y se agrega una 'y' en la pila". el último de la pila no seria y?
29-07-2011 14:58
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
gonnza Sin conexión
User Verde

*********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 17.112
Agradecimientos dados: 763
Agradecimientos: 732 en 317 posts
Registro en: Mar 2010
BlogSpot Google+ YouTube
Mensaje: #9
RE: Final de sintaxis (no entiendo nada)
En los automatas de pila la notacion es al revez, de derecha a izquiera
osea, si te paso xy primero hago push y (poner el simbolo y en la pila) y luego push x (poner el simbolo x en la pila,y te queda arriba de y)

si yo te diera axyumz para poner en una pila, el que queda arriba es una a

si queres pensarlo bien facil, hace de cuenta que es la pila es un pozo y vos tens la cadena a la izquierda del pozo, y la vas empujando por la izquierda (hacia la derecha)hacia el pozo.. tonces las letras caen de a una: primero la z, la m, la u.. y la ultima en caer es la a, que es la que queda arriba de todo lol jajajajaja

[Imagen: v34BEFt.gif]
29-07-2011 15:09
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
rodri042 Sin conexión
Militante

***

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 81
Agradecimientos dados: 12
Agradecimientos: 35 en 10 posts
Registro en: Aug 2010
Mensaje: #10
RE: Final de sintaxis (no entiendo nada)
sos un capo xD , o sea que T(1,a,x) = (1,xy) reemplaza esa ultima 'x' que hay en la pila por una 'y' y agrega otra nueva 'x' arriba....
el lunes cuento que onda el final para los que no fueron... igual si tengo mas dudas volveré a hinchar las bolas jajaj
29-07-2011 15:18
Envíale un email Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
gonnza Sin conexión
User Verde

*********

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 17.112
Agradecimientos dados: 763
Agradecimientos: 732 en 317 posts
Registro en: Mar 2010
BlogSpot Google+ YouTube
Mensaje: #11
RE: Final de sintaxis (no entiendo nada)
dale, pregunte nomas, siempre que podamos te damos una mano! jaajja exitos

[Imagen: v34BEFt.gif]
29-07-2011 17:02
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
aaajfabio Sin conexión
Profesor del Modulo A
Retomando la carrera
*****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 257
Agradecimientos dados: 18
Agradecimientos: 18 en 7 posts
Registro en: Sep 2009
Mensaje: #12
RE: Final de sintaxis (no entiendo nada)
(28-07-2011 21:59)rodri042 escribió:  2) Si la función es...
unsigned int XX (const char *s, int c) {
unsigned int i, n;
for(i=n=0; s[i]!='\0'; i++)
if (s[i] == c)
n++;
}

al invocar XX ("abccaxxc", 'c') por qué devuelve 3? para mi no tiene sentido esa función, declara el parametro s como puntero a constante char, y despues lo usa como vector (s[i]) :/

En realidad esta perfectamente invocado porque vos le estas pasando como argumento un literal cadena "abccaxxc".

Un literal cadena es un arreglo(o vector o array) de caracteres constantes que finaliza con \0.

Cuando vos pasas a una función, como argumento, arreglo (o vector o array, como mas te guste llamarlo), no le pasas el arreglo entero, sino que eso se va a convertir en un puntero que contiene la dirección de memoria del primer elemento.

¿Por qué? Porque no sirve de nada saber la longitud del vector y mucho menos en el caso de las cadenas ya que estas terminan en \0 y aparte en ANSI C, siempre que pases un vector como argumento, este se convertirá en un puntero a la dirección de memoria del primer elemento. En todo caso le pasas la longitud como parámetro si es que la llegaras a necesitar.

Sólo hay 3 excepciones a esta regla en donde s significa todo el vector, y no un puntero a la direccion del primer elemento:
  • sizeof (s)
  • &s
  • char s [ 2 ] = { 'a' , 'b' } (DE ESTE NO ESTOY SEGURO HABRIA QUE CHEQUEARLO)
(Este mensaje fue modificado por última vez en: 30-07-2011 05:39 por aaajfabio.)
30-07-2011 05:38
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
rld Sin conexión
Secretario General
ლ(ಠ益ಠლ)
*******

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 787
Agradecimientos dados: 9
Agradecimientos: 10 en 9 posts
Registro en: Nov 2010
Mensaje: #13
RE: Final de sintaxis (no entiendo nada)
(30-07-2011 05:38)aaajfabio escribió:  En realidad esta perfectamente invocado porque vos le estas pasando como argumento un literal cadena "abccaxxc".

Un literal cadena es un arreglo(o vector o array) de caracteres constantes que finaliza con \0.

Cuando vos pasas a una función, como argumento, arreglo (o vector o array, como mas te guste llamarlo), no le pasas el arreglo entero, sino que eso se va a convertir en un puntero que contiene la dirección de memoria del primer elemento.

¿Por qué? Porque no sirve de nada saber la longitud del vector y mucho menos en el caso de las cadenas ya que estas terminan en \0 y aparte en ANSI C, siempre que pases un vector como argumento, este se convertirá en un puntero a la dirección de memoria del primer elemento. En todo caso le pasas la longitud como parámetro si es que la llegaras a necesitar.

Sólo hay 3 excepciones a esta regla en donde s significa todo el vector, y no un puntero a la direccion del primer elemento:
  • sizeof (s)
  • &s
  • char s [ 2 ] = { 'a' , 'b' } (DE ESTE NO ESTOY SEGURO HABRIA QUE CHEQUEARLO)

Podes hacer cualquiera de las dos y es lo mismo (ANSI C):


char s1[] = "que tal";
char *s2 = malloc(sizeof(s1)+1);
strcpy(s2, s1);




La unica diferencia es que no podes achicar/agrandar s1 en tiempo de ejecucion, ni usar sizeof(s2) ya que te devuelve el tamaño del puntero (mismo tamaño que int, suele ser 4) en vez de la longitud del array. sizeof() de un string estatico es lo mismo que strlen() de cualquier string.

Cualquier string termina con '\0', por mas que sea dinamico o estatico. Hacer esto esta mal porque te estaria faltando el '\0' (a menos que lo estes haciendo a proposito =P)



char s[2] = {'a', 'b'};




Fijate que si intentas imprimir s[3] probablemente tire segmentation fault, o algun caracter cualquiera. Si lo inicializas como char s[] = "ab", te reserva 3 bytes con 'a' 'b' y '\0' respectivamente.

(28-07-2011 21:59)rodri042 escribió:  declara el parametro s como puntero a constante char, y despues lo usa como vector (s[i]) :/

Hay una equivalencia entre arrays y punteros en C. Si no te gusta usarlo como vector, esa funcion se podria haber escrito asi:


unsigned XX(const char *s, int c)
{
unsigned n = 0;

/* Si s es NULL, al hacer *s tira segmentation fault */
if (s == NULL)
return -1;

for (n = 0; *s != '\0'; s++) {
if (*s == c)
n++;
}
return n;
}


(Este mensaje fue modificado por última vez en: 30-07-2011 11:01 por rld.)
30-07-2011 10:51
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
aaajfabio Sin conexión
Profesor del Modulo A
Retomando la carrera
*****

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 257
Agradecimientos dados: 18
Agradecimientos: 18 en 7 posts
Registro en: Sep 2009
Mensaje: #14
RE: Final de sintaxis (no entiendo nada)
tenes razon la tercer excepcion es
char s [ ] = "ab"
30-07-2011 11:00
Encuentra todos sus mensajes Agregar agradecimiento Cita este mensaje en tu respuesta
rld Sin conexión
Secretario General
ლ(ಠ益ಠლ)
*******

Ing. en Sistemas
Facultad Regional Buenos Aires

Mensajes: 787
Agradecimientos dados: 9
Agradecimientos: 10 en 9 posts
Registro en: Nov 2010
Mensaje: #15
RE: Final de sintaxis (no entiendo nada)
Ahora que lo veo, la regla del puntero al primer elemento se sigue aplicando. Por ejemplo:


char s[] = "hola";
putchar(*s); /* imprime "h" */



30-07-2011 11:11
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.