Pascal/Turbo Pascal - Verificar Arrray

 
Vista:

Verificar Arrray

Publicado por Rossbill (6 intervenciones) el 03/07/2009 22:32:51
Saludos a todos:
Tengo un pequeño problema con este programa, aqui puedo introducir codigos de estudiantes sin problemas, pero ahora quiero que al introducir un codigo verifique si ya esta introducido y de un ensaje por ejemplo el codigo que introdujo ya existe por favor intente de nuevo.
Y en verdad no se como hacerlo, Les agradceria quien me ayudara.
Gracias, ah y otra cosa; coloque una contraseña y quiero que cuando la escriban no se vea o se vea encriptado gracias.

PROGRAM ARREGLO;

USES CRT;
VAR
CODIGO:ARRAY [1..10] OF INTEGER;
R:CHAR;C:BYTE;
BEGIN
TEXTCOLOR(15);
TEXTBACKGROUND(9);
C:=0;
REPEAT
CLRSCR;
C:=C+1;
GOTOXY(25,5);WRITELN('INGRESE CODIGO DEL ESTUDIANTE: ');GOTOXY(25,7);READLN(CODIGO[C]);
GOTOXY(25,29);WRITELN('DESEA INGRESAR OTRO CODIGO (S/N)?');
R:=READKEY;
UNTIL UPCASE(R)='N';
END.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Verificar Arrray

Publicado por Miguel (159 intervenciones) el 04/07/2009 00:26:13
Bueno Rossbill, primero y principal al ver tu codigo quiero aclararte que tiene un problema, has declarado un arreglo de [1..10] recuerda que es un tipo de dato estructurado, ya esta definida de esa forma lo cualquiere decir que vas a poder trabajar solo con 10 elementos del arreglo, ¿por que te digo esto?, por que veo tu tratamiento sobre el arreglo cuando ingresas los datos de los alumnos, y veo que introduces datos preguntado por si o por no, ahora que sucede si ingreso mas de diez veces (aunque creo que con nueve ya hay problemas) la opcion "S" (si), voy a estar tratando de ingresar mas de diez alumnos en campos del arreglo que no han sido aclarados.
Me parece bien que le pidas al usuario por si o por no si desea ingresar mas datos del alumno, pero recuerda controlar el tamaño de tu arreglo, es decir a de mas de controlar el valor de la variable R, controla que C sea menor o igual a 10 (o menor a 11, es lo mismo).
Tambien te aconsejaría que modularices el código que ya tenes.
Para controlar de que no se repita ningun código aconsejaría crear una funcion que se encargue de eso, a la cual se le pasará como parametro el arreglo y el nuevo código que quieres ingresar. Ahora, ese "nuevo código" es importante que este almacenado en una nueva variable ya que permitirá trabajar de forma mas sencilla y adecuada. Es más aconsejo que cuando ingreses datos de esta forma (es muy comun) la lectura la hagas primero en variables auxiliares y asignas al respectivo campo del arreglo estas variables.
Otra especificación que seria de ayuda es la longitud del código y para que sería necesario, ya que muchas veces a un numero es mejor representarlo como un STRING (por ejemplo un código, un documento), ya que es mas facil su tratamiento y muchas veces la longitud necesaria de este número imposibilita que la representación sea de tipo entera (ya que en PASCAL tiene un limite).
Por suerte me encontras aburrido y con tiempo así que te voy a ayudar con este ejercicio.

Aca esta el código (lamentablemente se va a perder la identación espero que te des cuenta como identarlo bien, cualquier cosa deja tu e-mail y te envio el .pas)

PROGRAM ejemplo;
USES CRT;
TYPE
TLong = 1..10;
TCodigo = STRING[15];
TArr = ARRAY[TLong] OF TCodigo;
VAR
a : TArr;

{ función que se encarga de controlar la repeticion de codigo, si el nuevo }
{ ya se encuentra en el arreglo la función devuelve TRUE (verdadero) }
FUNCTION Control_Codigo (arr : TArr; codigo : TCodigo) : BOOLEAN;
VAR
i : TLong;
flag : BOOLEAN;
BEGIN
i:=1;
flag:=FALSE;
WHILE (i<=10)AND(flag=FALSE) DO
BEGIN
IF codigo=arr[i]
THEN
flag:=TRUE;
i:=i+1;
END;
Control_Codigo:=flag;
END;

PROCEDURE Cargar_Arreglo (VAR b : TArr);
VAR
i : TLong;
cod : TCodigo;
opc : CHAR;
BEGIN
i:=1;
opc:='S';
WHILE (i<=10)AND(opc='S') DO
BEGIN
CLRSCR;
WRITE('Ingrese el codigo del ',i,' almuno: ');
READLN(cod);
IF Control_Codigo(b,cod)
THEN BEGIN
WRITELN('El codigo que intenta ingresar ya ha sido ingresado anteriormente.');
WRITELN('Por favor intentelo de nuevo. Oprima cualquier tecla para intentarlo.');
READKEY;
END
ELSE BEGIN
b[i]:=cod;
i:=i+1;
IF i<=10
THEN BEGIN
WRITE('Desea ingresar un nuevo codigo? S/N : ');
REPEAT opc:=UpCase(READKEY) UNTIL (opc='S')OR(opc='N');
END;
END;
END;
WRITELN();
WRITELN('Oprima cualquier tecla para salir.');
READKEY
END;

BEGIN
Cargar_Arreglo(a);
END.

Con respecto a como hacer que aparescan asteriscos mientras escribes una contraseña encontre esto que escribi aquí ahce unos meses a un usuario que solicitaba algo igual:
"Muestra asteriscos mientras se escribe, y en una variable de tipo cadena se guarda la pass. Se ingresan caracteres hasta que se oprime el "enter", pero deberias hacer un control sobre las demas teclas que no son alfanumericas.
PROCEDURE CapturarPass (VAR pass : STRING);
VAR
car : CHAR;
BEGIN
Write('digite su clave: ');
car:=READKEY;
WHILE car<>#13 DO
BEGIN
WRITE('*');
pass:=pass+car;
car:=READKEY;
END;
END; "

Espero que ta haya servido mi ayuda...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Verificar Arrray

Publicado por Rossbill (6 intervenciones) el 04/07/2009 10:54:17
Gracias por tu respuesta es muy especifica, esa es una parte de una programa mas grande que estoy haciendo.
este es mi correo [email protected] si me puedes enviar el .pas para enterderlo un poco mejor te lo agradeceria.
Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Verificar Arrray

Publicado por Rossbill (6 intervenciones) el 04/07/2009 12:58:39
Lo que pasa Miguel es que hice un programa con menu:
1 Ingrese Estudiante:
Ingrese Codigo
Ingrese Nombre
Ingrese Nota 1er Corte
Ingrese Nota 2do Corte
Ingrese Nota 3er Corte
Ingrese Nota 4to Corte
2 Buscar Estudiante
Ingrese Codigo a Buscar
Codigo: xxxxxxx
Nombre: xxxxxxxxxxxxxxxx
Notas:
Nota 1er Corte: xx
Nota 2do Corte: xx
Nota 3er Corte: xx
Nota 4to Corte: xx
Desea Realizar Otra Busqueda? S/N
3 Editar Información
Ingrese Contraseña
Ingrese Codigo a Buscar
(aqui se encuentra el codigo y se modifica el registro)
4 Salir

Esa es mas o menos la estructura del programa, ya lo he hecho, ahora me faltan los detalles, por ejemplo el que expuse mas arriba, de que diera un mensaje si se introduce un codigo que ya se alla metido.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Verificar Arrray

Publicado por Miguel (1 intervención) el 04/07/2009 20:58:54
A ver, necesito que me lo especifiques mejor, vos necesitas que te avise que hay un codigo repetido cuando estas cargando el arreglo, o una vez cargado que te diga si hay uno repetido, de ser de la primer forma el codigo que te pase lo hace. Solo copia los dos modulos y agrégacelos a tu programa. Compilalo y pruebalo, vas a ver que si entroduces un codigo ya ingresado te avisa por pantalla y te pide que reingreses otro.
Lamentablemente por un descuido ayer elimine el archivo .pas, asi que no podré enviártelo.
Cualquier cosa que necesites me avisas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Verificar Arrray

Publicado por Rossbill (6 intervenciones) el 05/07/2009 01:01:03
Bueno como estoy introduciendo datos de un estudiante y el dato que es unico es el codigo, es decir, que dos estudiantes no pueden tener el mismo codigo.
Cuando entre a la opcion de ingresar estudiante lo primero que me va a pedir es el codigo, si ya esta el codigo entonces no es necesario seguir pidiendo los demas datos, como nombre, notas etc; porque entonces habrian dos o mas estudiantes con el mismo codigo.
Y bueno seria cuando se esta cargando el arreglo, porque cmo te comente antes si ya esta el codigo no es necesario seguir introduciendo datos, hay es cuando me tendria que dar el mensaje de que esta ya en el sistema que pruebe con otro codigo.
Gracias,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Verificar Arrray

Publicado por Miguel (4 intervenciones) el 05/07/2009 01:52:48
A ver si entendi bien, lo que vos queres es ingresar un solo alumno y que si el codigo se repite que te vuelva a pedir otro, y una vez ingresado un codigo valido que vuelva al menu, no que te pida seguir llenando el arreglo?.
Si es asi, olvidate la accion que te pase, quedate con la funcion Controlar_Codigo, a esas le pasas el arreglo y el codigo que quieres ingresar y te devuelve verdadero si ese codigo ya se encuentra en el arreglo..
Es decir ahora has una nueva accion en la cual pidas el codigo... y con un IF preguntas si Controlar_Codigo(arreglo,codigo) es TRUE entonces muestra un mensaje de error, y pidele que reingrese otra vez el codigo, de caso contrario insertas en el arreglo el nuevo codigo.
Si no entiendes me avisas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Verificar Arrray

Publicado por Rossbill (6 intervenciones) el 05/07/2009 04:43:34
Es ingresar a mas de un alumno en el arreglo coloque 10, pero podria colocar mas. Despues que introduzca el codigo y éste sea un codigo nuevo, es decir, que no este ya registrado, entonces siga llenando el arreglo con los demas datos que faltan. Nombre, notas.
Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Verificar Arrray

Publicado por Willy (177 intervenciones) el 05/07/2009 05:37:15
Miguel.
Tan solo quiero felicitarte por la atención que le prestas a los usuarios de este foro.
Me he dado cuenta de tus conocimientos en Pascal y no me queda duda de que puedas resolver cualquier cosa.

Bueno, en esta ocación me nación hacer el comentario de que en una aula de estudios generalmente hay un número de estudiantes que ya está determinado, por lo cual es correcto hacer un programa precisamente para ese número de estudiantes ya que difícilmente este número cambiaría durante el proceso de aprendizaje.

Si yo me llamé "experto" en alguna ocación, será solamente porque me refiero a la sección "Expertos" de este sitio Web hecho que realmente no demuestra que un programador sea experto en el lenguaje, solo demuesra que ha participado mucho.

Principalmente quería decirte que si vas a ayudar a fondo a alguien deverías pedirle los detalles exactos que le dieron en su universidad o cualquier establecimiento, ya que el alumo siempre tiende a malinterpretar las instrucciones del maestro y po ende transferir una idea equivocada en los foros.

¡Saludos Miguel!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Verificar Arrray

Publicado por Rossbill (6 intervenciones) el 05/07/2009 20:57:21
Saludos amigo Miguel, como pude he tratado de seguir tus instrucciones pero se me hace un poco dificil. De todas aqui este el .pas, hasta aqui trabaja pero ahora me toca pulirlo mas de todas gracias por la ayuda prestada. (Estoy empezando a estudiar programacion)

PROGRAM ARREGLO;

USES CRT;
VAR
CODIGO:ARRAY [1..10] OF INTEGER;
NOMBRE:ARRAY [1..10] OF STRING [20];
CORTE1:ARRAY [1..10] OF INTEGER;
CORTE2:ARRAY [1..10] OF INTEGER;
CORTE3:ARRAY [1..10] OF INTEGER;
CORTE4:ARRAY [1..10] OF INTEGER;
R,X,P,OP:CHAR;COD,PASS:INTEGER;C,I:BYTE;SW,SW1:BOOLEAN;
PROCEDURE INGRESAR;
BEGIN
TEXTCOLOR(15);
TEXTBACKGROUND(9);
C:=0;
REPEAT
CLRSCR;
C:=C+1;
GOTOXY(25,5);WRITELN('INGRESE CODIGO DEL ESTUDIANTE: ');GOTOXY(25,7);READLN(CODIGO[C]);


{en este momento de correr este programa queria que hiciera lo que te habia comentado mas arriba, que era dar el mensaje si habia otro codigo igual ya registrado, y que se pudiera corregir para ingresar uno nuevamente y seguir con lo que viene.}

GOTOXY(25,9);WRITELN('INGRESE NOMBRE DEL ESTUDIANTE: ');GOTOXY(25,11);READLN(NOMBRE[C]);
GOTOXY(25,13);WRITELN('INGRESE NOTA DEL 1er CORTE: ');GOTOXY(25,15);READLN(CORTE1[C]);
GOTOXY(25,17);WRITELN('INGRESE NOTA DEL 2do CORTE: ');GOTOXY(25,19);READLN(CORTE2[C]);
GOTOXY(25,21);WRITELN('INGRESE NOTA DEL 3er CORTE: ');GOTOXY(25,23);READLN(CORTE3[C]);
GOTOXY(25,25);WRITELN('INGRESE NOTA DEL 4to CORTE: ');GOTOXY(25,27);READLN(CORTE4[C]);
GOTOXY(25,29);WRITELN('DESEA INGRESAR OTRO ESTUDIANTE (S/N)?');
R:=READKEY;
UNTIL UPCASE(R)='N';
END;
PROCEDURE BUSCAR;
BEGIN
REPEAT
CLRSCR;
GOTOXY(25,5);WRITELN('INTRODUZCA EL CODIGO A BUSCAR: '); GOTOXY(25,7);READ(COD);
SW:=FALSE;
FOR X:=1 TO C DO
BEGIN
IF (COD=CODIGO[X]) THEN
BEGIN
CLRSCR;
GOTOXY(30,11);WRITELN('CODIGO: ');
GOTOXY(38,11);TEXTCOLOR(4);WRITELN(CODIGO[X]);
GOTOXY(30,13);TEXTCOLOR(15);WRITELN('NOMBRE: ');
GOTOXY(38,13);TEXTCOLOR(4);WRITELN(NOMBRE[X]);
GOTOXY(35,15);TEXTCOLOR(15);WRITELN('NOTAS');
GOTOXY(27,17);TEXTCOLOR(15);WRITELN('1er CORTE: ');
GOTOXY(38,17);TEXTCOLOR(4);WRITELN(CORTE1[X]);
GOTOXY(27,19);TEXTCOLOR(15);WRITELN('2do CORTE: ');
GOTOXY(38,19);TEXTCOLOR(4);WRITELN(CORTE2[X]);
GOTOXY(27,21);TEXTCOLOR(15);WRITELN('3er CORTE: ');
GOTOXY(38,21);TEXTCOLOR(4);WRITELN(CORTE3[X]);
GOTOXY(27,23);TEXTCOLOR(15);WRITELN('4to CORTE: ');
GOTOXY(38,23);TEXTCOLOR(4);WRITELN(CORTE4[X]);
GOTOXY(19,25);TEXTCOLOR(15);WRITELN('PROMEDIO DE NOTAS: ');
GOTOXY(38,25);TEXTCOLOR(124);WRITELN((CORTE1[X]+CORTE2[X]+CORTE3[X]+CORTE4[X])/4:2:2);
SW:=TRUE;
END;
IF SW=TRUE THEN
X:=C;
END;
IF SW=FALSE THEN
BEGIN
CLRSCR;
SOUND(1000);
GOTOXY(25,25);WRITELN('NO SE ENCUENTRA EL CODIGO');READKEY;
NOSOUND;
END;
GOTOXY(22,30);TEXTCOLOR(15);WRITELN('DESEA HACER OTRA BUSQUEDA: (S/N)');
P:=READKEY;
UNTIL UPCASE(P)='N';
CLRSCR;
END;
BEGIN
TEXTCOLOR(15);
TEXTBACKGROUND(9);
PASS:=111;
REPEAT
CLRSCR;
GOTOXY(25,9);WRITELN('1. INGRESAR ESTUDIANTE');
GOTOXY(25,11);WRITELN('2. BUSCAR ESTUDIANTE');
GOTOXY(25,13);WRITELN('3. EDITAR INFORMACION');
GOTOXY(25,15);WRITELN('4. SALIR');
OP:=READKEY;
CASE OP OF
'1':INGRESAR;
'2':BUSCAR;
'3':EDITAR;
END;
UNTIL (OP='4');
END.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Verificar Arrray

Publicado por Miguel (159 intervenciones) el 05/07/2009 21:08:42
Para Willy: Si, se cae de maduro que no nos entendemos con Rossbill jejeje. Tal vez no se entendio lo que quice decir, no esta mal que se declare un arreglo de 10 alumnos si hay 10 alumnos, lo que sucede es que el tratamiento que estaba haciendo Rossbill no tenia en cuenta el tamaño del arreglo, se le pedía al usuario si queria ingresar otro dato de estudiante ilimitadamente, claro que cuando llegara al alumno 11, caput!!! ya hay un error, hay que tener cuidado con el tratamiento nada mas.
A esto de tratar elementos del arreglo que no estan declarados se lo puede evitar haciendo uso de marcas (así se lo conoce en la computación, no solo para arreglos, para cualquier tratamiento de secuencia), marca final o inicial, real o virtual (la que propongo yo, ya que es mas eficiente), hasta PASCAL usa este tipo de marcas, en un STRING (arreglo de caracteres) utiliza una marca incial real, si no me creen fijense, declaren un STRING carguenlo con alguna cadena, y luego muestren por pantalla el campo 0, van a ver un caracter raro, no es en vano ese caracter raro, si lo pasan a su equivalente en codigo ASCII notaran que el numero equivale a la longitud del STRING, llevando de esta forma la información de la longitud del STRING.
Siempre es util saber esto.
No creo que sea un experto, pero me llevo bien con Don Pascal, jeje, y siempre digo lo mismo, en las universidad me ayudaron para que aprenda, es más aca me ayudaron cuando tenia algun problema con Pascal, seria egoista de mi parte si no ayudara, y mas aún cuando me gusta lo que me piden. Pero de todas formas no ayudo a cualquiera, hay muchos aca que pasan con la intencion de que les hagan todo el enunciado para pasar de grado, dejan el enunciado y nada mas. A mi me gusta que a parte de que resuelvan su trabajo que terminen aprendiendo.
El otro dia leyendo un libro de "Calculo de Programación" dice que gran cantidad de veces con algunos metodo sde enseñansa a programar se enseña un ejemplo y luego se tratan de resolver problemas analogos de la misma forma, bueno si Rosbill entiende el uso de las marcas y como tratar una secuencia, podra resolver analogamente muchisimos problemas con arreglos, listas enlazadas, Pilas, Colas, etc, que necesitan de un tratamiento secuencial.

Para Rosbill:
Bueno Rosbill, el programa que te envie funciona exactamente asi, pide uno por uno y si se repite, te lo vuelve a pedir.
Tal vez yo no te entienda, lo hacemos mas facil, o me lo especificas tal cual deberia ser el programa (con lujos de detalles, por que soy medio lento) o me dices que esta mal en el programa que te pase.

Saludos!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Verificar Arrray

Publicado por Willy (177 intervenciones) el 06/07/2009 22:56:41
Para Miguel y para todo aquel que le interese la programación en Pascal:

El tema de los strings:

De nuevo felicitaciones para Miguel. No deja de sorprenderme. Bueno, aquí un nuevo aporte ya que estamos hablando del tema "string":

Ciertamente una variable de tipo string puede identificarse como un arreglo de caracteres con ciertas características adicionales.

Supon que name ha sido decalrado de tipo string. Entonces despues del ennunciado:
name := 'Juan'

Los contenidos actuales de name podrían verse como se muestra a continuación.

012345... 255
J u a n

OBSERVACIÓN: La celda de momoria name[0] se usa para almacenar la longitud del varlor real de name (como lo mencionó antes Miguel). Se almacena en forma carácter, esto es, name[0] contiene el caráctrer 'Juan' name[0], almacenará el carácter cuyo valor ASCII es 4. ¿Porqué? porque la palabra Juan tiene 4 caracteres o letras.

Nosotros podemos manejar carcteres en un string como lo haríamamos con elementos de un arreglo. Así, con name como se definió arriba, el enunciado

writeLn(name[3]);

Imprimiría en pantalla la letra "a".

PD.
Ejemplo guiado por mi amado libro TURBO PASCAL CON APLICACIONEES 4.0-6.0 Segunda edición.

Si me permites, adjunto mi humilde firma:
¡Amarás al prójimo como a ti mismo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Verificar Arrray

Publicado por Miguel (159 intervenciones) el 07/07/2009 01:51:08
Estos ultimos dos post deberian estar a la vista de todos los novatos. Recuerdo cuando me entere de esto, yo creo que si del principio me decian que un STRING era un arreglo de caracteres iba a ser un muy buen dato.
Como dices tu Willy, se puede tratar tal cual como un arreglo, por que es un arreglo, y sirve mucho tener en cuenta esto a la hora de hacer tratamientos sobre cadenas.
Me parecio muy curioso e interesante la forma en que PASCAL lleva la informacion de la longitud de un STRING, y yo que pensaba que la funcion lenght hacia magia jeje, y era muy simple. Lo primero que me pregunte fue por que almacenaba la informacion de la longitu del string como un caracter (ingenioso), y no un entero o con los numeros como caracteres, la respuesta es simple, no puede ser un entero por que los arreglos son homogeneos, lo cual lo que haya adentro de cada campo del string deben ser caracteres, pero y por que no numeros como caracteres y luego utilzar la funcion VAL para pasarlo a entero ?('1','2'), mas simple aún solo podriamos representar un arreglo con longitud maxima de 9, por que si tuviese diez elementos el STRING deberiamos usar otro caracter mas, es decir una cadena (por ejemplo de longitud 15 seria '15'), y el arreglo sigue siendo de caracteres.
Ingenioso don Pascal, jejeje.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar