UTNianos

Versión completa: Final de sintaxis (no entiendo nada)
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Páginas: 1 2 3 4 5 6 7
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..
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
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; }
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
(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
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?
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..
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?
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
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
dale, pregunte nomas, siempre que podamos te damos una mano! jaajja exitos
(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)
(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;
}


tenes razon la tercer excepcion es
char s [ ] = "ab"
Ahora que lo veo, la regla del puntero al primer elemento se sigue aplicando. Por ejemplo:


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



Páginas: 1 2 3 4 5 6 7
URLs de referencia