[ Foro de Pascal ]
Cordial saludo profesor nacho cabanes.
profesor es que no se que me estara pasando en un programa que he realizado y que te anexo( no pude enviartelo como adjunto por que comprimido me daba 13kb y el maximo permitido es 10kb) completo para que puedas ejecutarlo y quiza ayudarme en por que no me esta ordenando los codigos, me muestra cero en ellos, sin embargo las notas si que me las ordena al igual que las materias perdidas, la ordenacion es de mayor a menor ( descendente ) y estoy utilizando el metodo de burbuja:
el programa me pide que digite los codigos y las notas:
digite codigo del estudiante:
881170
digite la nota 1:
2.0
...
digite la nota 10:
2.0
digite codigo del estudiante:
881164
digite la nota 1:
3.0
...
digite la nota 10:
3.0
digite el codigo del estudiante:
0 ***finaliza la introduccion de datos
el reporte deberia generarme (orden descendente)
codigo n1 n2 n3 n4 n5 n6 n7 n8 n9 n10 promedio perdidas
------ -- -- -- -- -- -- -- -- -- -- ------- --------
881164 3 3 3 3 3 3 3 3 3 3 3.0 0
881170 2 2 2 2 2 2 2 2 2 2 2.0 10
...
las notas aunque las puse en el ejemplo del reporte como enteros , estan definidas como real.
el resultado que me esta dando y puedes comprobar con el codigo que te adjunte en documento de word es:
codigo n1 n2 n3 n4 n5 n6 n7 n8 n9 n10 promedio perdidas
------ -- -- -- -- -- -- -- -- -- -- ------- --------
0 3 3 3 3 3 3 3 3 3 3 3.0 0
0 2 2 2 2 2 2 2 2 2 2 2.0 10
...
y ese es mi problema , no entiendo de donde esta sacando esos codigos 0 y si me hace el cambio de orden para las notas y las materias perdidas.
por favor profesor ayudame para poder dar con el problema que tengo ,en espere de tus siempre valiosas ayudas gracias y mil gracias
program notas;
uses crt;
const
maxnotas=10;
type
estudiantes=record
codigo:array[1..100] of longint;
nota:array[1..maxnotas] of real;
end;
array_estudiantes=array[1..100] of estudiantes;
promedio=array[1..100] of real;
materiasPerdidas=array[1..maxnotas] of byte;
var
i,k, contadorEstudiantes:integer;
estudiante:array_estudiantes;
prom:promedio;
mp:materiasPerdidas;
suma:array[1..100] of real;
procedure ordenar(var est:array_estudiantes;var matper:materiasPerdidas;var promed:promedio;numEstudiantes:integer);
var
j,l:integer;
aux:estudiantes;
auxprom:real;
auxmp:byte;
begin
for j:=1 to numEstudiantes do
for l:=j+1 to numEstudiantes do
if promed[j]<promed[l] then
begin
auxprom:=promed[l];
promed[l]:=promed[j];
promed[j]:=auxprom;
auxmp:=matper[l];
matper[l]:=matper[j];
matper[j]:=auxmp;
aux:=est[l];
est[l]:=est[j];
est[j]:=aux;
end;
end;
begin { PROGRAMA PRINCIPAL}
clrscr;
writeln;writeln;writeln;writeln;
{NO SABEMOS EL NUMERO DE ESTUDIANTES, POR LO QUE UTILIZO UN CENTINELA PARA CUANDO EL CODIGO SEA CERO NO SE PIDAN MAS DATOS}
i:=1;
writeln('digite el codigo del estudiante: ');
readln(estudiante[i].codigo[i]);
while estudiante[i].codigo[i] <> 0 do
begin
contadorEstudiantes:=i;
suma[i]:=0.0;
mp[i]:=0;
for k:=1 to maxnotas do
begin
writeln('introduzca la nota ',k, ':');
readln(estudiante[i].nota[k]);
if estudiante[i].nota[k] < 3.0 then
mp[i]:=mp[i]+1;
suma[i]:=(suma[i] + (estudiante[i].nota[k]));
end;
prom[i]:=suma[i]/maxnotas;
i:=i+1;
writeln('digite el codigo del estudiante: ');
readln(estudiante[i].codigo[i]);
end;
clrscr;
ordenar(estudiante,mp,prom,contadorEstudiantes);
gotoxy(22,12);
writeln(' **** REPORTE DE PROMEDIOS **** ');
gotoxy(4,9);
writeln('Codigo N1 N2 N3 N4 N5 N6 N7 N8 N9 N10 PROMEDIO MPerdidas');
gotoxy(4,10);
write('______ __ __ __ __ __ __ __ __ __ __ ________ _________');
for i:=1 to contadorEstudiantes do
begin
gotoxy(4,11+i);
write(estudiante[i].codigo[i]);
gotoxy(14,11+i);
for k:=1 to maxnotas do
write( estudiante[i].nota[k]:2:1,' ');
gotoxy(58,11+i);
write(prom[i]:2:2);
gotoxy(69,11+i);
write(mp[i]);
writeln;
end;
readkey;
end.
gracias.
Buenas tardes, profesor Nacho Cabanes.
creo que tenia mal el procedimiento ordenar, sin embargo aun asi sigue presentandome el problema de los codigos en 0, y no se porque?
procedure ordenar(var est:array_estudiantes;var matper:materiasPerdidas;var promed:promedio;numEstudiantes:integer);
var
j,l:integer;
aux:estudiantes;
auxprom:real;
auxmp:byte;
begin
for j:=1 to numEstudiantes-1 do
for l:=j+1 to numEstudiantes do
if promed[j]<promed[l] then
begin
auxprom:=promed[j];
promed[j]:=promed[l];
promed[l]:=auxprom;
auxmp:=matper[j];
matper[j]:=matper[l];
matper[l]:=auxmp;
aux:=est[j];
est[j]:=est[l];
est[l]:=aux;
end;
end;
por tu ayuda mil gracias.
Aquí está el programa corregido (Nota: el procedimiento ordenar lo tomé del primer código que colocastes, si hay algo que corregistes, sustituyelo en este cógigo que te presento:
program notas;
uses crt;
const
maxnotas=10;
type
estudiantes=record
codigo: longint;
{codigo:array[1..100] of longint;}
nota:array[1..maxnotas] of real;
end;
array_estudiantes=array[1..100] of estudiantes;
promedio=array[1..100] of real;
materiasPerdidas=array[1..maxnotas] of byte;
var
i,k, contadorEstudiantes:integer;
estudiante:array_estudiantes;
prom:promedio;
mp:materiasPerdidas;
suma:array[1..100] of real;
procedure ordenar(var est:array_estudiantes;var matper:materiasPerdidas;var promed:promedio;numEstudiantes:integer);
var
j,l:integer;
aux:estudiantes;
auxprom:real;
auxmp:byte;
begin
for j:=1 to numEstudiantes do
for l:=j+1 to numEstudiantes do
if promed[j]<promed[l] then
begin
auxprom:=promed[l];
promed[l]:=promed[j];
promed[j]:=auxprom;
auxmp:=matper[l];
matper[l]:=matper[j];
matper[j]:=auxmp;
aux:=est[l];
est[l]:=est[j];
est[j]:=aux;
end;
end;
begin { PROGRAMA PRINCIPAL}
clrscr;
writeln;writeln;writeln;writeln;
{NO SABEMOS EL NUMERO DE ESTUDIANTES, POR LO QUE UTILIZO UN CENTINELA PARA CUANDO EL CODIGO SEA CERO NO SE PIDAN MAS DATOS}
i:=1;
writeln('digite el codigo del estudiante: ');
readln(estudiante[i].codigo);
while estudiante[i].codigo <> 0 do
begin
contadorEstudiantes:=i;
suma[i]:=0.0;
mp[i]:=0;
for k:=1 to maxnotas do
begin
writeln('introduzca la nota ',k, ':');
readln(estudiante[i].nota[k]);
if estudiante[i].nota[k] < 3.0 then
mp[i]:=mp[i]+1;
suma[i]:=(suma[i] + (estudiante[i].nota[k]));
end;
prom[i]:=suma[i]/maxnotas;
i:=i+1;
writeln('digite el codigo del estudiante: ');
readln(estudiante[i].codigo);
end;
clrscr;
ordenar(estudiante,mp,prom,contadorEstudiantes);
gotoxy(22,12);
writeln(' **** REPORTE DE PROMEDIOS **** ');
gotoxy(4,9);
writeln('Codigo N1 N2 N3 N4 N5 N6 N7 N8 N9 N10 PROMEDIO MPerdidas');
gotoxy(4,10);
write('______ __ __ __ __ __ __ __ __ __ __ ________ _________');
for i:=1 to contadorEstudiantes do
begin
gotoxy(4,11+i);
write(estudiante[i].codigo);
gotoxy(14,11+i);
for k:=1 to maxnotas do
write( estudiante[i].nota[k]:2:1,' ');
gotoxy(58,11+i);
write(prom[i]:2:2);
gotoxy(69,11+i);
write(mp[i]);
writeln;
end;
readkey;
end.
Hola Luis gracias por tu ayuda y he probado el ejercicio y si ejecuta correctamente, y note que el cambio que hiciste fue definir el campo codigo como longint y no como array que era como lo habia definido, mi pregunta para ti y ojala el profesor nacho nos de su toque de profesor y experiencia para resolver el por que pasa esto, si utilizo array en el codigo o por que no se puede, o si se puede entonces cual es el problema, mil gracias por todo y en espera de saber el porque, pues se me hace raro que no pueda utilizar el array en codigo.
No se necesitaba un array para almacenar UN SOLO CODIGO por alumno y, para referenciarlo sólo es necesario el índice del alumno para cada alumno. Está demás utilizar un array. Saludos.
Hola luis muy amable por responderme, y claro tenes toda la razon no habia caido en cuenta en ello , esta muy bien tu explicacion.
Luis queria que me revizaras que problema tengo en esta nueva ordenacion que no me la devuelve correctamente , la idea es igual , y en orden de menor a mayor. te dejo el codigo para que porfavor me ayudes a ver que me pasa con esto de las ordenaciones, me volvi tonto parece que no doy.te agradezco me ayudes a ver que pasa en este problema.gracias.
program personas_caminando;
uses crt;
const numpart=4;
numvueltas=4;
type
cadena=string[30];
persona=record
nombre,pais:cadena;
t:array[1..numvueltas] of integer;
end;
carrera=array[1..numpart] of persona;
tiempos=array[1..numpart] of integer;
var
c:carrera;
i,j:integer;
pais:cadena;
tiempo:tiempos;
procedure ordenar(var c:carrera;var tiemp:tiempos;numpart:integer);
var
k,l:integer;
aux:persona;
auxt:integer;
begin
{ordeno por burbuja de menor a mayor}
for k:=1 to numpart-1 do
for l:=k+1 to numpart do
if tiemp[k]>tiemp[l] then
begin
auxt:=tiemp[k];
tiemp[k]:=tiemp[l];
tiemp[l]:=auxt;
aux:=c[k];
c[k]:=c[l];
c[l]:=aux;
end;
[muestro las tres primeras personas ordenadas de menor a mayor}
FOR k:=1 to 3 do
begin
GOTOXY(2,31+k);
WRITE(c[k].nombre,' ');
GOTOXY(16,31+k);
WRITE(c[k].pais);
for l:=1 to numvueltas do
begin
GOTOXY(22+10*l,31+k);
WRITE(c[k].t[l]);
WRITELN;
end;
end;
end;
begin
clrscr;
writeln;writeln;writeln;writeln;
for i:=1 to numpart do
begin
writeln('introduzca el nombre de la persona: ');
readln(c[i].nombre);
writeln('introduzca la nacionalidad de la persona: ');
readln(c[i].pais);
for j:=1 to numvueltas do
begin
writeln('introduca el tiempo ',j,':');
readln(c[i].t[j]);
end;
end;
clrscr;
GOTOXY(17,7);
WRITELN(' ******** DATOS DE ENTRADA ******** ');
WRITELN;
GOTOXY(7,9);
WRITELN(' Nombre Nacionalidad Tiempo1 Tiempo2 Tiempo3 Tiempo4');
GOTOXY(7,10);
WRITE('_______ ____________ _______ _______ _______ _______');
WRITELN;WRITELN;WRITELN;
FOR i:=1 to numpart do
begin
GOTOXY(7,10+i);
WRITE(c[i].nombre,' ');
GOTOXY(21,10+i);
WRITE(c[i].pais);
for j:=1 to numvueltas do
begin
GOTOXY(27+10*j,10+i);
WRITE(c[i].t[j]);
WRITELN;
end;
end;
WRITELN;
WRITELN;
WRITELN;
WRITELN;
WRITELN;
WRITELN;
ordenar(c,tiempo,numpart);
readkey;
end.
Explícame, primero, ¿cómo quieres ordenarlo?, ¿cuál es el criterio de ordenación?, ¿en base a cuál variable?. Explícame para saber qué es lo que quieres tú que el programa haga. Si me puedes poner un ejemplo te lo agradecería. Saludos.
En el procedimiento ordenar, he notado que pasas la variable tiempo, pero esta variable no contiene ningún valor. Si estás pensando que dicho parámetro es el mismo que usastes para llenar los tiempos de cada participante, estás equivocado. Eso es lo que he observado hasta ahora, y es el mismo error que tienes en el primer programa (mismo procedimiento). De todas maneras, espero la explicación de cómo quieres ordenarlo. Saludos
Cordial saludo Luis y por supuesto a nuestro profesor Nacho.
Luis tenias toda la razon el problema era el de la variable tiempo y creeme error no de concepto sino de cuidado, y claro no lo veia ,pero gracias a ti lo solucione perfectamente y te lo agradezco muchisimo.
Luis queria no se si te parezca mi idea,no se si estas estudiando o ya terminaste, pero mi idea es si quieres como practica nuestra intentar resolver entre los dos (y con la ayuda del profesor Nacho cuando nos sea necesario para no agobiarlo, pues muchisimo tiene con su trabajo y a dios gracias nos atiende siempre con su brillantes, amabilidad y vocacion indiscutible de profesor), el juego del cuatro en raya, por ahora sin la parte grafica que del todo no estoy muy empapado pero podriamos desarrollarlo sin parte grafica,o algun ejercicio que nos llame la atencion , no se me gusta cada vez practicar y bueno espero la idea te suene y lo coordinemos bien sea por aqui o directamente a traves de nuestras direcciones de email personales para logicamente no invadir este espacio que nos brinda el profesor nacho.mi direccion por si te parece es oscarydey2002@hotmail.com. me cuentas, estare atento y mil gracias por sacarme de esta laguna absurda de apreciacion.hasta luego y espero me respondas para bien o para mal.
program personas_caminando;
uses crt;
const numpart=4;
numvueltas=4;
type
cadena=string[30];
persona=record
nombre,pais:cadena;
t:array[1..numvueltas] of integer;
end;
carrera=array[1..numpart] of persona;
tiempos=array[1..numpart] of integer;
var
c:carrera;
i,j:integer;
pais:cadena;
tiempo:tiempos;
procedure ordenar(var c:carrera;var tiemp:tiempos;numpart:integer);
var
k,l:integer;
aux:persona;
auxt:integer;
begin
{ordeno por burbuja de menor a mayor}
for k:=1 to numpart-1 do
for l:=k+1 to numpart do
if tiemp[k]>tiemp[l] then
begin
auxt:=tiemp[k];
tiemp[k]:=tiemp[l];
tiemp[l]:=auxt;
aux:=c[k];
c[k]:=c[l];
c[l]:=aux;
end;
GOTOXY(17,29);
WRITELN(' ******** LOS MAS RAPIDOS ******** ');
WRITELN;WRITELN;WRITELN;
GOTOXY(2,30);
WRITELN(' Nombre Nacionalidad Tiempo1 Tiempo2 Tiempo3 Tiempo4');
GOTOXY(2,31);
WRITE('_______ ____________ _______ _______ _______ _______');
WRITELN;WRITELN;WRITELN;
FOR k:=1 to 3 do
begin
GOTOXY(2,31+k);
WRITE(c[k].nombre,' ');
GOTOXY(16,31+k);
WRITE(c[k].pais);
for l:=1 to numvueltas do
begin
GOTOXY(22+10*l,31+k);
WRITE(c[k].t[l]);
WRITELN;
end;
end;
end;
begin
clrscr;
writeln;writeln;writeln;writeln;
for i:=1 to numpart do
tiempo[i]:=0;
for i:=1 to numpart do
begin
writeln('introduzca el nombre de la persona: ');
readln(c[i].nombre);
writeln('introduzca la nacionalidad de la persona: ');
readln(c[i].pais);
for j:=1 to numvueltas do
begin
writeln('introduca el tiempo ',j,':');
readln(c[i].t[j]);
tiempo[i]:=tiempo[i]+(c[i].t[j]);
end;
writeln('el tiempo para el atleta ',i, 'es: ' ,tiempo[i]);
end;
clrscr;
GOTOXY(17,7);
WRITELN(' ******** DATOS DE ENTRADA ******** ');
WRITELN;
GOTOXY(7,9);
WRITELN(' Nombre Nacionalidad Tiempo1 Tiempo2 Tiempo3 Tiempo4');
GOTOXY(7,10);
WRITE('_______ ____________ _______ _______ _______ _______');
WRITELN;WRITELN;WRITELN;
FOR i:=1 to numpart do
begin
GOTOXY(7,10+i);
WRITE(c[i].nombre,' ');
GOTOXY(21,10+i);
WRITE(c[i].pais);
for j:=1 to numvueltas do
begin
GOTOXY(27+10*j,10+i);
WRITE(c[i].t[j]);
WRITELN;
end;
end;
WRITELN;
WRITELN;
WRITELN;
WRITELN;
WRITELN;
WRITELN;
ordenar(c,tiempo,numpart);
readkey;
end.
Dos cosas rápidas, Óscar:
- No deberías dar tu correo privado en un foro abierto, como este, que esté abierto a Google, para evitar bombardeos de Spam.
- Empieza por un juego de 3 en raya en modo texto, que puede ser muy fácil de hacer. Cuando ese funcione bien, te habrá ayudado a entender la mayoría de ideas que necesitas para el 4 en raya.
Por favor, Prof. Nacho, borre mi post, yo coloqué mi dirección de e-mail. No quiero ser bombardeado con spams. En cuanto al programa Las Tres En Raya, sabes, Gómez, el domingo pasado tuve un tiempo libre y me puse a hacerlo por mi cuenta. Ya lo terminé, pero no está validado. Si quieres verlo, avísame. Como lo hice apresuradamente el resultado fue un programa que se puede mejorar y optimizar su código. Hice muchas cosas, que podrían haberse hecho con bucles y así disminuir el código. Dime si quieres verlo, está hecho en modo de texto. Saludos.
¿Este es el programa finalizado?. No veo que hayas corregido el error. Danos una explicación de ¿qué es lo que quieres que haga el programa?, ¿sobre qué variable lo quieres ordenar?, danos ejemplo del resultado que esperas llegar. Saludos.
Bueno, estoy estudiando. Creo que para hacer el juego necesitaríamos la ayuda del profesor. Me gustaría desarrollarno entre varios. Encuanto al problema anterior, me gustaría que colocaras el código del mismo por este medio, quiero verlo correr en mi computadora. A veces necesitamos los ojos de otros para ver cosas que nuestras preocupaciones nos nos dejan ver. Ya tomé nota de tu dirección de e-mail, la mía es [CENSURADO]. Saludos.
(Edited by Administrador AprendeAProgramar - original submission sábado, 18 de febrero de 2012, 22:00)
Hola luis cordial saludo. mira lo siguiente:
efectivamente si que es el programa funcionando ok, si revizas el post en este mismo hilo veras mi contestación a ti ,que dice asi:
” no se puede utlizar el codigo como un array???
de oscar gomez - viernes, 17 de febrero de 2012, 09:24
Hola Luis gracias por tu ayuda y he probado el ejercicio y si ejecuta correctamente, y note que el cambio que hiciste fue definir el campo codigo como longint y no como array que era como lo habia definido. "
Ahora referente al otro ejercicio del hilo correspondiente a la fecha que te indico dentro de los parentesis(de oscar gomez - domingo, 19 de febrero de 2012, 15:09).
si que le hice un cambio , quiza no lo viste pero revizalo que te lo envie funcionando ok para ejecucion tal cual esta, sin embargo si por algun caso no te das cuenta del cambio que hice fue este:
tiempo[i]:=tiempo[i]+(c[i].t[j]);
pues antes no estaba calculando estos tiempo y pasaba vacio el array al precedimiento.espero que lo revices y te des cuenta que te lo envie corregido ok, espero lo aproveches.Un saludo
Buenos dias profesor Nacho cabanes, agradeciendo siempre tu ayuda y atencion.
profesor si que tienes razon en lo de haber dejado mi correo abierto a spam por favor eliminame ese post para no ser blanco directo de los mismos.
respecto al consejo que me das de iniciar primero con el juego del tres en raya antes de empezar con el 4 en raya, te puedo decir que tanto mi compañero Luis con el que estamos empeñados en superarnos cada dia mas en esto de la programacion ,y que nos pusimos el reto de solucionar el 4 en raya, ambos ya hemos solucionado el juego del tres en raya, en mi caso utilice una matriz[1..3,1..3] of char , ya sabes para los caracteres "X" Y "O", eso si sin utilizar de momento nada de graficos, pero si funcionando ok con matrices y para dos jugadores. queria preguntarte de inicio si puedes orientarnos en como atacar la logica de este juego 4 en raya que cambia un poco respecto al tres en raya, no se si la mejor idea inicial seria utilizar un tipo enumerado para las casillas enum {VACIA, BLANCA, NEGRA} TCasilla; donde TCasilla es: TCasilla TCuatroEnRaya[8][8];
si pudieras orientarnos profesor en como tratarlo de la mejor forma dandonos ideas seria de muchisima ayuda para poder iniciar nuestro pequeño reto de ir solucionandolo.mil gracias por tu ayuda.
Hola luis,cuentame una cosa ,hiciste el tres en raya contra el pc,seria super,pues contra dos jugadores no resulta ser tan complicado, y bueno lo que hablabamos de empezar con el de 4 en raya que es mas complejo dime cuando, escribeme al correo.cuidate.
Ok, ya me dí cuenta de que tomastes el "tiempo total" para ordenar a los participantes. De todas maneras el programa no presenta la lista de todas las personas con todos los datos como lo hacía el primer programa que colocastes.
Para la próxima, debes decir de acuerdo a qué variable vas a ordenar y presentar tanta información como te sea posible (sin exagerar, claro está), así se te podrá ayudar más rapidamente y encontrarás más personas dispuestas a hacerlo.
Saludos.
Hice el tres en raya con dos jugadores. ¿Cómo es el cuatro en raya?, supongo que es igual al tres en raya, pero, en vez de ser una matriz de 3x3, se utilizará una de 4x4, ¿es así?. Saludos.
Hola luis, referente a lo que me dices del tres en raya estupendo, ojalá podamos realizarlo para que el juego sea contra el pc, que es mas interesante para nosotros en cuanto a pratica de programacion.yo tambien lo hice para dos jugadores, contra el pc tengo dudas de como hacerlo, a ver si en una ocasion lo miramos.
referente a lo del juego del CUATRO EN RAYA , NO ES LO MISMO QUE EL TRES EN RAYA, ASI QUE LO ME DICES DE PODER UTILIZAR " una matriz de 3x3, se utilizará una de 4x4"
NO ES PARA ESTE JUEGO. te dejo el enunciado y si gustas empezamos a intentar hacerlo y nuestras dudas seguramente el profesor nacho nos heche una mano como siempre sabe hacerlo.
En el juego de las “cuatro en raya” dos jugadores juegan con un
tablero vertical de tamaño (m x n). Cada jugador, que dispone de
fichas de un color (negro o blanco), intenta formar una línea
(horizontal, vertical o diagonal) con cuatro fichas de su color. Para ello, los jugadores alternativamente introducen fichas en el tablero eligiendo una de sus columnas. Una vez elegida la columna, la ficha se deja caer por ella de manera que ocupará la primera fila libre.
ese es el juego , si quieres entenderlo mejor puedes entrar a google y buscar juego del 4 en raya en linea para que te familiarices en el juego y podamos iniciar intentar resolverlo.
ya me contaras y estamos en contacto, ya sabes que tenes mi correo cuando creas conveniente me escribes por alli y me cuentas.
Bueno, esta semana y la siguiente estoy muy ocupado, porque tengo que terminar y entregar un trabajo en Pascal. Pero voy a empaparme más con el juego, buscando el google y jugándolo. Creo que lo más sano sería hacer un post en este mismo foro y, que el profesor nos dé las directrices de cómo solucionarlo. Teniendo claro el esquema de solución podremos arrancar. Así que, dame tú tus sugerencias. Saludos.
(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)