Páginas: 1 [2] 3
|
 |
|
Autor
|
Tema: Matrices en Pascal (duda) (Leído 1762 veces)
|
Lauta
Desconectado
Mensajes: 343
|
Tengo otro problemita, que es que el programa tiene un menú y cuando uno realiza una acción y termina de ejecutarla tiene que preguntar si se desea seguir y en caso afirmativo mostrar de nuevo el menú, pero mi programa no pregunta y muestra de nuevo el menú directamente  Dejo el código del cuerpo principal del programa, cualquier cosa pongo el código entero lo que pasa es que es muy largo...(menu es un procedimiento  ) while Ingreso<>'n' do begin menu(Eleccion); clrscr; writeln('Desea seguir utilizando el programa? s/n '); read(Ingreso); end;
|
|
|
|
|
En línea
|
|
|
|
barbate
Desconectado
Mensajes: 20
|
Sí, pero el que dije yo también funciona  Procedure Maximo(a:TMatriz;var b:TPosiciones;n,m:integer); Var i,j,k,max,posicion:integer; Begin Max:=a[1,1]; posicion:=0;
for i:=1 to n do for j:=1 to m do begin if a[i,j]>max then begin max:=a[i,j]; posicion:=1; b[posicion].fila:=i; b[posicion].columna:=j; end else if a[i,j]=max then begin posicion:=posicion+1; b[posicion].fila:=i; b[posicion].columna:=j; end; end; writeln('El valor maximo es: ',max,' y aparece en las posiciones: '); for k:=1 to posicion do writeln('[',b[k].fila,',',b[k].columna,']'); End;  En el ultimo for, para imprimir los datos, puedes utilizar i o j para ahorrarte una variable. s2
|
|
|
|
|
En línea
|
|
|
|
barbate
Desconectado
Mensajes: 20
|
Tengo otro problemita, que es que el programa tiene un menú y cuando uno realiza una acción y termina de ejecutarla tiene que preguntar si se desea seguir y en caso afirmativo mostrar de nuevo el menú, pero mi programa no pregunta y muestra de nuevo el menú directamente  Dejo el código del cuerpo principal del programa, cualquier cosa pongo el código entero lo que pasa es que es muy largo...(menu es un procedimiento  ) while Ingreso<>'n' do begin menu(Eleccion); clrscr; writeln('Desea seguir utilizando el programa? s/n '); read(Ingreso); end;
esto mejor con un repeat, ya que el codigo se ejecuta por lo menos una vez. s2
|
|
|
|
|
En línea
|
|
|
|
|
Shiro_himura
|
barbate tiene razón, si hay algo que como mínimo se va ejecutar una vez un repeat, de todas formas yo necesito más código para saber que falla puesto que ahí no veo ningún error.
|
|
|
|
|
En línea
|
 sudo rm -r ./religiones No eres Dios, así que te jodes >_<
|
|
|
|
|
Lauta
Desconectado
Mensajes: 343
|
Acá dejo el link al código. No es que sea muy largo, pero para el foro me parece que sí  En cuanto a lo del repeat, tendré en cuenta la sugerencia, no sé porque no me gusta usar repeats  , pero igual creo que ese no es el error. http://rapidshare.com/files/115928040/TP2.txt.htmlGracias por las ayudas!
|
|
|
|
|
En línea
|
|
|
|
cΔssiΔnі
Desconectado
Mensajes: 548
|
A ver pruebalo así... repeat clrscr; menu; clrscr; write('Desea seguir utilizando el programa? No --> n'); until upcase(readkey) = 'N' Hay pequñeses en el code haciendo cosas que no deberian, pero tengo sueño, trata de resolverlo.  ¿Qué le pasas como parámetro a la rutina menu?  tengo sueño.. saludos!!!  pd: después sigo revisando, tienes una sopa de letra... 
|
|
|
|
« Última modificación: 19 Mayo 2008, 06:09 por cΔssiΔnі »
|
En línea
|
|
|
|
Lauta
Desconectado
Mensajes: 343
|
A ver pruebalo así... repeat clrscr; menu; clrscr; write('Desea seguir utilizando el programa? No --> n'); until upcase(readkey) = 'N' Hay pequñeses en el code haciendo cosas que no deberian, pero tengo sueño, trata de resolverlo.  ¿Qué le pasas como parámetro a la rutina menu?  tengo sueño.. saludos!!!  pd: después sigo revisando, tienes una sopa de letra...  A menu le paso la variable eleccion como parametro, quizás me confundi y no la puse. En cuanto a lo de la sopa de letras  si me señalas más errores te lo agradezco. EDITO: cuando en el: write('Desea seguir utilizando el programa? No --> n'); until upcase(readkey) = 'N' presiono una tecla que no sea n, me repite la pregunta. en cambio, si aprieto n se sale solo...
|
|
|
|
« Última modificación: 20 Mayo 2008, 02:23 por Lauta »
|
En línea
|
|
|
|
|
Shiro_himura
|
EDITO: cuando en el: write('Desea seguir utilizando el programa? No --> n'); until upcase(readkey) = 'N'
presiono una tecla que no sea n, me repite la pregunta. en cambio, si aprieto n se sale solo...
until significa que sigue realizando el repeat hasta que, en este caso, readkey = N, por tanto cuando pulsas N es cuando se sale.
|
|
|
|
|
En línea
|
 sudo rm -r ./religiones No eres Dios, así que te jodes >_<
|
|
|
Lauta
Desconectado
Mensajes: 343
|
until significa que sigue realizando el repeat hasta que, en este caso, readkey = N, por tanto cuando pulsas N es cuando se sale.
Sí, pero tendría que comenzar el ciclo de nuevo, no saltar al write y readkey directamente, tendria que ir al procedimiento menu repeat clrscr; menu(eleccion); clrscr; write('Desea seguir utilizando el programa? No --> n'); until upcase(readkey) = 'N'
|
|
|
|
|
En línea
|
|
|
|
cΔssiΔnі
Desconectado
Mensajes: 548
|
Sigo sin entender para que haces esto: menu(eleccion); A mi parecer no hace falta que le pases algo como parámetro.  Por alguna razón luego de mostrarte el mensaje, muestra el menú, pero no captura la selección, por eso sale de la rutina menú y te vuelve a mostrar el mensaje de salida. Para solucionarlo, cambia el tipo de la variable "eleccion" a integer y obviamente deberás retocar el case dentro de la rutina menú, ya que no podrás hacer comparaciones usando comillas simples (simplemente quítaselas), te recomiendo que le hagas una 7ma opción al menú, que sea "Salir del programa o algo así" y dentro de ella colocas el write que hace la famosa pregunta de confirmación de salida, sino te sale vuelve a preguntar, como te dije antes, mientras tenga un poco de tiempo te ayudo. ¡Saludos!
|
|
|
|
|
En línea
|
|
|
|
|
Shiro_himura
|
Haz lo que te ha dicho cassiani me parece correcto, aunque yo creo que el problema es el segundo clrscr, por alguna razón (la desconozco)lo hace seguidamente al menú. Me explico: sale el menú elección pero como luego esta el clrscr, te limpia la pantalla y te sale la pregunta de si quieres continuar.
|
|
|
|
|
En línea
|
 sudo rm -r ./religiones No eres Dios, así que te jodes >_<
|
|
|
Lauta
Desconectado
Mensajes: 343
|
Bueno, creo que ya lo solucioné gracias a sus ayudas  Acá el código funcionando bien: Ah, alguién me podría explicar un poco el tema de VALIDAR en Pascal? Program TP2;
Uses crt;
Type TRegUsuario= record usuario:string[20]; clave:string[20]; end; TArrayUsuario=array[1..4]of TRegUsuario; TMatriz=array[1..100,1..100]of integer; TVector=array[1..100]of integer; TRegPosiciones=record fila:integer; columna:integer; end; Tposiciones=array[1..100]of TRegPosiciones;
Var n,m:integer; Usuarios:TArrayUsuario; Ingreso:boolean; Posiciones:TPosiciones; Fila,Columna:integer; Matriz1,Matriz2,Matriz_Suma:TMatriz; Vector:TVector;
Procedure Usuario(a:TArrayUsuario;var Ingreso:boolean); Var i:integer; usuario,clave:string[20];
Begin Ingreso:=false; i:=1; repeat begin writeln('Recuerde que el usuario y clave son CASE SENSITIVE.'); writeln('Ingrese el usuario: '); readln(usuario); writeln('Ingrese la clave'); readln(clave); clrscr; if (usuario=a[1].usuario)and(clave=a[1].clave)then begin Ingreso:=true; i:=4; writeln('Ingreso exitoso'); end; if (usuario=a[2].usuario)and(clave=a[2].clave)then begin Ingreso:=true; i:=4; writeln('Ingreso exitoso'); end; if (usuario=a[3].usuario)and(clave=a[3].clave)then begin Ingreso:=true; i:=4; writeln('Ingreso exitoso'); end; if (usuario=a[4].usuario)and(clave=a[4].clave)then begin Ingreso:=true; i:=4; writeln('Ingreso exitoso'); end else i:=i+1; End; until (i>3) or (Ingreso=true); clrscr; End;
Procedure Dimension(var n:integer;var m:integer); Begin Writeln('Ingrese el numero de filas de la matriz'); Read(n); Writeln('Ingrese el numero de columnas de la matriz'); Read(m); End;
Procedure Imprime_Matriz(a:TMatriz;n,m:integer); Var i,j:integer; Begin For i:=1 to n do begin if i<>1 then writeln(); For j:=1 to m do write(a[i,j],' '); end; End;
Procedure Carga_Matriz(var a:TMatriz;n,m:integer); Var i,j:integer; Begin For i:=1 to n do for j:=1 to m do begin Writeln('Ingrese el elemento [',i,',',j,']'); Read(a[i,j]); end; End;
Procedure Suma_Matrices(Matriz1,Matriz2:TMatriz;var c:TMatriz;n,m:integer); Var i,j:integer; Begin for i:=1 to n do begin for j:=1 to m do begin c[i,j]:=Matriz1[i,j]+Matriz2[i,j]; end; end; End;
Function Suma_Fila(a:TMatriz;m,fila:integer):integer; Var i,suma:integer; Begin suma:=0; for i:=1 to m do suma:=suma+a[fila,i]; Suma_Fila:=suma; End;
Function Suma_Columna(a:TMatriz;n,columna:integer):integer; Var i,suma:integer; Begin suma:=0; for i:=1 to n do suma:=suma+a[i,columna]; Suma_Columna:=suma; End;
Function Diagonal(a:TMatriz;n,m:integer):longint; Var i:integer;resultado:longint; Begin resultado:=1; if n<m then for i:=1 to n do resultado:=resultado*a[i,i] else for i:=1 to m do resultado:=resultado*a[i,i]; Diagonal:=resultado; End;
Procedure Pasar_Vector(a:TMatriz;var b:TVector;n,m:integer); Var i,j,k,dim_vector:integer; suma:longint; promedio:real; Begin suma:=0; For i:=1 to n do For j:=1 to m do suma:=suma+a[i,j]; promedio:=suma/(n*m); Writeln('El promedio es: ',promedio:2:2);
k:=0; for i:=1 to n do for j:=1 to m do if a[i,j]<promedio then begin k:=k+1; b[k]:=a[i,j]; end; dim_vector:=k;
for k:=1 to dim_vector do write(b[k],' '); End;
Procedure Maximo(a:TMatriz;var b:TPosiciones;n,m:integer); Var i,j,k,max,posicion:integer; Begin Max:=a[1,1]; posicion:=0;
for i:=1 to n do for j:=1 to m do begin if a[i,j]>max then begin max:=a[i,j]; posicion:=1; b[posicion].fila:=i; b[posicion].columna:=j; end else if a[i,j]=max then begin posicion:=posicion+1; b[posicion].fila:=i; b[posicion].columna:=j; end; end; writeln('El valor maximo es: ',max,' y aparece en las posiciones: '); for k:=1 to posicion do writeln('[',b[k].fila,',',b[k].columna,']'); End;
Procedure Menu; Var eleccion:integer; Begin Writeln('¿Que operacion desea realizar? '); Writeln('1-Suma de matrices'); Writeln('2-Valor maximo'); Writeln('3-Sumar una fila a elegir'); Writeln('4-Sumar una columna a elegir'); Writeln('5-Pasar a un vector los valores de las posiciones que estan por debajo del promedio'); Writeln('6-Multiplicar los elementos de la diagonal principal e informar el resultado'); Readln(eleccion); clrscr;
case eleccion of 1: begin Dimension(n,m); clrscr; writeln('Ingrese los valores de la Matriz 1: '); Carga_Matriz(Matriz1,n,m); clrscr; writeln('Ingrese los valores de la Matriz 2: '); Carga_Matriz(Matriz2,n,m); clrscr; writeln('Matriz 1: '); Imprime_Matriz(Matriz1,n,m); writeln(); writeln('Matriz 2: '); Imprime_Matriz(Matriz2,n,m); writeln(); writeln('Presione una tecla para continuar '); readkey(); Suma_Matrices(Matriz1,Matriz2,Matriz_Suma,n,m); clrscr; writeln('Resultado: '); Imprime_Matriz(Matriz_Suma,n,m); end; 2 :begin Dimension(n,m); clrscr; writeln('Ingrese los elementos de la Matriz: '); Carga_Matriz(Matriz1,n,m); clrscr; Imprime_Matriz(Matriz1,n,m); writeln(); writeln('Presione una tecla para continuar '); readkey(); Maximo(Matriz1,Posiciones,n,m); end; 3 :begin Dimension(n,m); clrscr; Carga_Matriz(Matriz1,n,m); clrscr; Imprime_Matriz(Matriz1,n,m); writeln(); writeln('Presione una tecla para continuar '); readkey(); Writeln('Ingrese el numero de fila que desee sumar: '); Readln(Fila); clrscr; Writeln('El resultado de sumar la fila ',fila,' es: ',Suma_Fila(Matriz1,m,fila)); end; 4: begin Dimension(n,m); clrscr; Carga_Matriz(Matriz1,n,m); clrscr; Imprime_Matriz(Matriz1,n,m); writeln(); writeln('Presione una tecla para continuar '); readkey(); Writeln('Ingrese el numero de columna que desee sumar '); Readln(Columna); clrscr; Writeln('El resultado de sumar la columna ',columna,' es: ',Suma_Columna(Matriz1,n,columna)); end; 5: begin Dimension(n,m); clrscr; Carga_Matriz(Matriz1,n,m); clrscr; Imprime_Matriz(Matriz1,n,m); writeln(); writeln('Presione una tecla para continuar '); readkey(); clrscr; Pasar_Vector(Matriz1,Vector,n,m); end; 6: begin Dimension(n,m); clrscr; Carga_Matriz(Matriz1,n,m); clrscr; Imprime_Matriz(Matriz1,n,m); writeln(); writeln('Presione una tecla para continuar '); readkey(); writeln(); Writeln('El resultado de multiplicar todos los elementos de la diagonal es: ',Diagonal(Matriz1,n,m)); end; end; //Fin Case End;
Begin //PROGRAMA PRINCIPAL!!!!!! Usuarios[1].usuario:='Administrador'; Usuarios[1].clave:='AyPI'; Usuarios[2].usuario:='algo1'; Usuarios[2].clave:='7540'; Usuarios[3].usuario:='7540'; Usuarios[3].clave:='03'; Usuarios[4].usuario:='uba'; Usuarios[4].clave:='fiuba';
textcolor(11); Usuario(Usuarios,Ingreso); if Ingreso then begin repeat clrscr; menu; readkey(); clrscr; write('Desea seguir utilizando el programa? s/n'); until upcase(readkey)='N'; end; End.
|
|
|
|
|
En línea
|
|
|
|
Lauta
Desconectado
Mensajes: 343
|
A ver tengo que validar los valores para la matriz que son ingresados por teclado, hice este código: Procedure Carga_Matriz(var a:TMatriz;n,m:integer); Var i,j:integer;validar:string;code:integer; Begin For i:=1 to n do for j:=1 to m do begin code:=1; while code<>0 do begin Writeln('Ingrese el elemento [',i,',',j,']'); Read(validar); val(validar,a[i,j],code); end; end; End; Pero cuando lo ejecuto entra en un bucle sin fin de impresiones de 'Ingrese el elemento...' y me ignora las otras dos acciones dentro del while. Alguna ayuda?
|
|
|
|
|
En línea
|
|
|
|
barbate
Desconectado
Mensajes: 20
|
code simpre vale 0?
|
|
|
|
|
En línea
|
|
|
|
|
Páginas: 1 [2] 3
|
|
|
|