[EI/ETIS/ETIX] 1º - Pro (Programación)

Subforo de asignaturas del curso 2007-08.

Re: Programación (Pro)

Notapor dvd182 » Mié, 28 Nov 2007 11:20

Código: Seleccionar todo
TYPE
   informacion=Record
      primera_palabra:string(20);
      absolute_line:integer;
      num_pagina:integer;
      num_palabras_linea:integer;
      ultima_palabra:string(20);
   End;
   tfila=bindable text;   
   tline=string(255);
   minusculas='a'..'z';
   conj_minusculas= SET OF minusculas;
   mayusculas='A'..'Z';
   conj_mayusculas= SET OF mayusculas;
   numeros='0'..'9';
   conj_numeros= SET OF numeros;
   tname=string(20);
               
VAR
   conj1:conj_minusculas;
   conj2:conj_mayusculas;
   conj3:conj_numeros;
   datos:informacion;
   entrada,salida:tfila;
   linea:tline;
   nombre:tname;

PROCEDURE asignar(VAR archivo:tfila; nombre_archivo:tname);
VAR
b:bindingtype;
BEGIN
unbind(archivo);
b:=binding(archivo);          {Procedimiento para recoger el archivo y hacer
                  las operaciones}
b.name:=nombre_archivo;
bind(archivo,b);
END;

Function Estadistica (VAR entrada:tfila):informacion;
VAR
   nlinea,ncar,npalabras:INTEGER;palabra:string(20);caracter:char;pertenece:boolean;
BEGIN
   palabra:=''; caracter:='';
   nlinea:=0;ncar:=0;npalabras:=0;
   WHILE NOT EOF(entrada) DO BEGIN
      Readln(entrada,linea);
      trim(linea);
      nlinea:=nlinea+1;         
   WHILE NOT EOLN (entrada) DO BEGIN
      caracter:=Substr(linea,ncar,ncar+1);
      If pertenece=caracter IN conj1
        If pertenece=caracter IN conj2
          If pertenece=caracter IN conj3 then BEGIN;
         if palabra='' then npalabras:=npalabras+1;
         palabra:=palabra+caracter;
      End
      else begin
         {chr(13) es el caracter de fin de linea para las palabras acabadas en '-'}
         If npalabras=1 then Estadistica.primera_palabra:=palabra;
         palabra:='';
      end;
      ncar:=ncar+1;         
END;


modulo.pas: In function `Estadistica':
modulo.pas:83: error: expression used as a statement {ESTO ES LO QUE ME FALLA}
modulo.pas:87: error: invalid operands to `='
modulo.pas:87: error: syntax error before `IN'
solnauj@solnauj-desktop:~/Desktop/practica$





{me da esos errores,lo de =,sigue sin ir...lo que quiero hacer es pillar las caracteres validos para las palabras k son mayusculas,minusculas y numeros,y el resto de caracteres ASCII son de separacion,no??
haer una cuenta de palabras para que te de el numero de palabras en linea y kuand sea 1 se la asignas al registro y luego vacias ese campo "palabra" para que almacene la ultima(aun me queda x hacer en la funcion)...kreo k podia ser una opcion,n?si no decirme una alternativa
ahhh...otro error es el de la funcion TRIM cuando se lo aplico al string donde almaceno la linea,no se pk da error...
UN SALUDO}
dvd182
Cuervo Sangriento
 
Mensajes: 78
Registrado: Mié, 28 Nov 2007 1:18

Re: Programación (Pro)

Notapor Fer » Mié, 28 Nov 2007 12:18

Primero te edité los mensajes para ponerlos más legibles. Usando el BBCode "Code" se ve mejor el código.

Segundo:

Código: Seleccionar todo
 If pertenece=caracter IN conj3 then BEGIN;


Ese punto y coma de ahí sobra, lo vi echándole una vista rápida. Podrías explicar mejor en qué consiste, que igual lo dijiste bien, pero estoy algo sobado xD Según entendí, creas 3 conjuntos: en el primero metes las minúsculas que lees, en el segundo las mayúsculas y en el tercero, los números. El Procedure Asignar, lo único que hace es enlazar el archivo físico (entrada.txt, por ejemplo), con el virtual, declarado arriba (FILE OF o TEXT) con el nombre nombre_archivo. Y luego, no sé qué más hace el programa, aparte de leer cosas y hacer cosas raras con ellas xD Aparte, si no nos dices cuáles son las líneas 83 y 87 (en las que falla) no podemos decirte más :D

Y a modo de consejo, para no liarte, en cada END podrías poner entre comentario a qué BEGIN pertenece. Es más visual y cómodo :wink:
Campaña de donación de apuntes:

¡Súbelos a la sección de apuntes o deja los tuyos en el local de alumnos!
Avatar de Usuario
Fer
QG Admin
Corresponsal de guerra
 
Mensajes: 26112
Registrado: Vie, 22 Sep 2006 14:18
Ubicación: A Coruña

Re: Programación (Pro)

Notapor inilatos » Mié, 28 Nov 2007 14:02

aparte de los fallos ya corregidos hay otro más, que ya dije antes pero ahora que pusiste más código lo confirmo:

el boolean pertenece no te hace falta para nada, porque aparte lo estás usando sin inicializar, y me parece recordar que un boolean se inicializa automáticamente a true (en Pascal), entonces no sería problema, pero de todos modos sobra, no te hace falta para nada. Con poner lo siguiente te llegaría:
Código: Seleccionar todo
if caracter IN conj1 then ...

Otro tema sería que el boolean se inicializase automáticamente a false (que creo que no), entonces el programa haría lo contrario de lo que quieres.
inilatos
 

Re: Programación (Pro)

Notapor Fer » Mié, 28 Nov 2007 14:07

inilatos escribió:Otro tema sería que el boolean se inicializase automáticamente a false (que creo que no), entonces el programa haría lo contrario de lo que quieres.


Una variable siempre la hay que inicializar, aunque tenga un valor aleatorio de por sí. Antes de nada, despues de empezar la función, no estaría de más que la asignaras a True o False, dependiendo de cómo quieras hacerlo.

PD: A todo esto, bienvenido al foro xDD ¿El 182 a qué viene? :P
Campaña de donación de apuntes:

¡Súbelos a la sección de apuntes o deja los tuyos en el local de alumnos!
Avatar de Usuario
Fer
QG Admin
Corresponsal de guerra
 
Mensajes: 26112
Registrado: Vie, 22 Sep 2006 14:18
Ubicación: A Coruña

Re: Programación (Pro)

Notapor inilatos » Mié, 28 Nov 2007 14:26

nada de asignar. Directamente sobra por lo siguiente:

Si tienes esto:
Código: Seleccionar todo
if pertenece = caracter IN conj1


tienes los siguientes casos:
    pertenece true y expresion true => la condición se cumple
    pertenece true y expresion false => la condición no se cumple
    pertenece false y expresion true => la condición no se cumple
    pertenece false y expresion false => la condición no se cumple

por tanto deberías poner solamente if caracter IN conj1 then (sin el pertenece)

despues debes revisar todas las estructuras condicionales que tienes ahi... porque algunas sobran me parece a mi. Puedes concatenar las expresiones en un solo "if" con "or" o "and" según lo que quieras hacer.

Otro detalle. inicializas palabra de la siguiente manera:
Código: Seleccionar todo
palabra:=' '

Luego más adelante haces esto:
Código: Seleccionar todo
if palabra='' then npalabras:=npalabras+1;

No se si te fijaste, pero nunca modificaste el valor de la variable palabra, por tanto esa condición siempre se va a cumplir.

Y por último, si pones 3 "if" tal como tienes, pues te falta el "then" de los 2 primeros, aunque ya te digo, mejor te será concatenarlos con operadores lógicos en un solo "if"
inilatos
 

Re: Programación (Pro)

Notapor dvd182 » Mié, 28 Nov 2007 16:58

ya solucione lo de los conjuntos y eso.asias
pero wen,aun hay cosas que no ntiendo,k lo d las practicas lo stoy haciendo y aun keda muxo para ntregar y hay koss k no ntiendo...komo esta:
me dice esto y no se lo que quiere decir,yo intento acceder a un campo del registro y usar la variable que tngo que va a ser un string y asignarselo al campo del registro...es decir...

Código: Seleccionar todo
If npalabras=1 then informacion.primera_palabra:=palabra;
         palabra:=' ';
      end;
      ncar:=ncar+1;         

lo que quiero es que meta lo que hay en palabra al registro y luego vaciar lo que hay en palabra para poder meter la ultima que es lo que pide la practica y me da este error al compilar...:


"trying to access fields of a type definition" y no se de que puede ser...


PD1:esk komo n teoria soy nuevo pos no m ntero muxo la verdd
PD2:asias x tener paciencia y asias x kntxtar os debo 1...
Código: Seleccionar todo
dvd182
Cuervo Sangriento
 
Mensajes: 78
Registrado: Mié, 28 Nov 2007 1:18

Re: Programación (Pro)

Notapor Fer » Mié, 28 Nov 2007 17:12

dvd182 escribió:"trying to access fields of a type definition" y no se de que puede ser...



Te lo dice claramente. Información es el nombre del tipo de dato (el registro). La variable se llama datos, no información.

Si pones:

Código: Seleccionar todo
If npalabras=1 then datos.primera_palabra:=palabra;
         palabra:=' ';
      end;
      ncar:=ncar+1;


No creo que te pete así XD Mira a ver...
Campaña de donación de apuntes:

¡Súbelos a la sección de apuntes o deja los tuyos en el local de alumnos!
Avatar de Usuario
Fer
QG Admin
Corresponsal de guerra
 
Mensajes: 26112
Registrado: Vie, 22 Sep 2006 14:18
Ubicación: A Coruña

Re: Programación (Pro)

Notapor inilatos » Jue, 29 Nov 2007 13:38

para no equivocarse con ese tipo de cosas es recomendable que cuando hagas la definición de tipos que le pongas una "t" delante a cada uno, asi ya sabes que son tipos y no variables y no te confundes. Si ves "tInformacion" pues ya sabes que eso es un tipo y no hay fallos de esos como el que tuviste, que además joden bastante porque son cosas tan tontas que cuesta encontrar el fallo xD
inilatos
 

Re: Programación (Pro)

Notapor dvd182 » Mar, 04 Dic 2007 0:18

Código: Seleccionar todo
PROGRAM Practica0708 (input,output);
   
{module modulo interface;}
{export modulo=ejecucion;}


TYPE
   informacion=Record
      primera_palabra:string(20);
      absolute_line:integer;
      num_pagina:integer;
      num_palabras_linea:integer;
      ultima_palabra:string(20);
   End;
   tfila=bindable text;   
   tline=string(255);
   minusculas='a'..'z';
   conj_minusculas= SET OF minusculas;
   mayusculas='A'..'Z';
   conj_mayusculas= SET OF mayusculas;
   numeros='0'..'9';
   conj_numeros= SET OF numeros;
   tname=string(20);
   tnumero=char;
               
VAR
   conj1:conj_minusculas;
   conj2:conj_mayusculas;
   conj3:conj_numeros;
   datos:informacion;
   entrada,salida:tfila;
   linea:tline;
   nombre:tname;

PROCEDURE asignar(VAR archivo:tfila; nombre_archivo:tname);
VAR
b:bindingtype;
BEGIN
unbind(archivo);
b:=binding(archivo);          {Procedimiento para recoger el archivo y hacer
                  las operaciones}
b.name:=nombre_archivo;
bind(archivo,b);
END;

Function Estadistica (VAR entrada:tfila):informacion;
VAR
   nchar,nlinea,npalabras:INTEGER;caracter:char;palabra:string(20);
        longitudlinea,i:integer;
BEGIN{end-linea 105}
   palabra:='';caracter:='';nlinea:=0;npalabras:=0;
   WHILE NOT EOF(entrada) DO BEGIN{end-linea 103}
      Readln(entrada,linea);
      linea:=TRIM(linea);
      nlinea:=nlinea+1;
   nchar:=1;
        longitudlinea:=length(linea);
        i:=1;
   WHILE i < longitudlinea DO BEGIN
      caracter:=linea[i];
                i:=i+1;
      If(caracter IN conj1)or(caracter IN conj2)or(caracter IN conj3) then BEGIN
         If palabra=' ' then npalabras:=npalabras+1;
         palabra:=palabra+caracter;
      End
      else begin
         If npalabras=1 then datos.primera_palabra:=palabra;
         palabra:='';
      end;
         nchar:=nchar+1;   
      end;
      end;
   Estadistica:=datos;   
END;



tengo un problemilla,consegui leer todo el texto caracter a caracter pero aoa quiero hacer distinciones en plan espacios y eso kn los knjuntos kn esta instruccion k esta en el codigo de arriba:
Código: Seleccionar todo
If(caracter IN conj1)or(caracter IN conj2)or(caracter IN conj3) then BEGIN
         If palabra=' ' then npalabras:=npalabras+1;
         palabra:=palabra+caracter;

y no el problema es que no entra en esa condicion para realizar esa operacion,no entra y ala...no se k hacer llevo tiempo dandole weltas y na...solucion?
un saludo
dvd182
Cuervo Sangriento
 
Mensajes: 78
Registrado: Mié, 28 Nov 2007 1:18

Re: Programación (Pro)

Notapor Fer » Mar, 04 Dic 2007 0:35

dvd182 escribió:
Código: Seleccionar todo
If(caracter IN conj1)or(caracter IN conj2)or(caracter IN conj3) then BEGIN
         If palabra=' ' then npalabras:=npalabras+1;
         palabra:=palabra+caracter;


Es que no es "palabra", es "caracter" xDD Compruebas que "caracter" sea el espacio, no? Pues eso xD


PD: Me llevó 10 minutos a mi también xDD
Campaña de donación de apuntes:

¡Súbelos a la sección de apuntes o deja los tuyos en el local de alumnos!
Avatar de Usuario
Fer
QG Admin
Corresponsal de guerra
 
Mensajes: 26112
Registrado: Vie, 22 Sep 2006 14:18
Ubicación: A Coruña

Re: Programación (Pro)

Notapor Sydanta » Mar, 04 Dic 2007 0:43

Al principio del if que remarcaste ya estás discriminando que caracter no sea un espacio, así que nunca se irá por el if interior ya que no hay manera de que palabra sea igual al espacio (y caracter tampoco).

Yo me la juego a que sí que entra en la parte esa de tu código pero que realmente no pasa nada. Prueba a poner un println ahí para ver si pasa por ese cacho o no.
Imagen
Avatar de Usuario
Sydanta
QG Admin
Corresponsal en Noruega
 
Mensajes: 3361
Registrado: Mié, 20 Sep 2006 10:26
Ubicación: Bergen

Re: Programación (Pro)

Notapor Fer » Mar, 04 Dic 2007 0:53

Código: Seleccionar todo
If caracter=' ' then npalabras:=npalabras+1;
         If(caracter IN conj1)or(caracter IN conj2)or(caracter IN conj3) then BEGIN
         palabra:=palabra+caracter;



Ese cacho tiene que ir así xD La comprobación de espacio fuera del IF y en ese IF poner caracter y no palabra.
Campaña de donación de apuntes:

¡Súbelos a la sección de apuntes o deja los tuyos en el local de alumnos!
Avatar de Usuario
Fer
QG Admin
Corresponsal de guerra
 
Mensajes: 26112
Registrado: Vie, 22 Sep 2006 14:18
Ubicación: A Coruña

Re: Programación (Pro)

Notapor dvd182 » Mar, 04 Dic 2007 1:50

Pero sigue sin entrar en la condicion,ya probara antes haciend un writeln en esa condicion pero nada,sigue sin entrar y no imprime naa...compila,ejecuta y punto...ala y no hace nada...ya le kambie eso pero nada... :(
dvd182
Cuervo Sangriento
 
Mensajes: 78
Registrado: Mié, 28 Nov 2007 1:18

Re: Programación (Pro)

Notapor Fer » Mar, 04 Dic 2007 12:53

Dices que no hace nada... ¿No será porque no imprimes nada por pantalla? XD Devuelves un valor de la función, pero sin más...
Campaña de donación de apuntes:

¡Súbelos a la sección de apuntes o deja los tuyos en el local de alumnos!
Avatar de Usuario
Fer
QG Admin
Corresponsal de guerra
 
Mensajes: 26112
Registrado: Vie, 22 Sep 2006 14:18
Ubicación: A Coruña

Re: Programación (Pro)

Notapor dvd182 » Mar, 04 Dic 2007 16:08

joe,ya le puse 100000 veces lo de writeln(palabra) o lo que sea dentro de esos if y no HACE NADA!simplement kmpila y ejecuta y se keda ahí ya lo dije,al ponerle lo k sea de writeln(...) despues de los Ifs no hace nada,no saka nada x pantalla ni lexes...
dvd182
Cuervo Sangriento
 
Mensajes: 78
Registrado: Mié, 28 Nov 2007 1:18

AnteriorSiguiente

Volver a FIC Asignaturas 2007-08

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron