alguien me ayuda a encontrar error en mi codigo noob?

#1
hola, bueno este es un pequeño proyecto que me mandaron a hacer en la uni, ya lo hice (vamos, apenas empiezo a programar) pero el problema es que las impresiones o datos de salida finales me los da erroneos, ya que en el programa se exige que se imprima el nombre, cedula, edad y calificacion del alumno con mayor calificacion, y porcentaje de alumnos aprobados...el problema es que solo me da como datos de salida los ultimos datos introducidos independientemente si son los solicitados o no, pero el porcentaje si se calcula bien....el problema es que por mas que analizo, pruebo y fallo no puedo conseguir el bendito error!...por eso solicito su ayuda!

segun el enunciado del proyecto el numero de alumnos esta limitado de 1 a 3 (porque nunca falta el profesor que prueba tu programa con numeros negativos y te quita puntuacion por un error tan tonto :¬¬: ), la nota o calificacion esta comprendida entre 1 y 20 puntos, se busca saber el porcentaje de aprobados, nombre, cedula, edad y calificacion del alumno con mayor calificacion...el programa esta hecho en delphi 7.2, es una aplicacion de consola hecha modularmente...aqui les dejo el codigo:

(la variable "porcapro" significa "porcentaje de aprobados, disculpen el nombre tan rarito xD)

program alumno;

{$APPTYPE CONSOLE}

uses
SysUtils;

const
alum=3;

var
edad: array [1..alum] of integer;
cedula: array [1..alum] of integer;
nombre: array [1..alum] of string;
notas: array [1..alum] of integer;
aprob: integer;
posi: integer;
i: integer;
total_alum: integer;
nota_mayor: integer;
porcapro: real;

procedure inicializar;
begin
for i:=1 to alum do
begin
cedula :=0;
edad :=0;
nombre :='';
notas :=0;
aprob:=0;
total_alum:=0;
nota_mayor:=0;
posi:=0;
end;
end;

procedure llenar_arreglo;
begin
writeln ('Cantidad de estudiantes a registrar');
readln (total_alum);
while (total_alum<1) or (total_alum>3) do
begin
writeln ('La cantidad de alumnos debe estar comprendida entre 1 y 3');
writeln ('Cantidad de estudiantes a registrar');
readln (total_alum);
end;
for i:=1 to total_alum do
begin
writeln ('Escriba el nombre del alumno');
readln (nombre);
writeln ('edad');
readln (edad);
writeln ('cedula');
readln (cedula);
writeln ('nota');
readln (notas);
while (notas<1) or (notas>20) do
begin
writeln ('El rango de notas tiene que estar comprendido entre 1 y 20 puntos');
writeln ('escriba la nota del alumno');
readln (notas);
end;
end;
end;

procedure sumar_aprobados;
begin
for i:=1 to total_alum do
begin
if (notas>=10) then
aprob:=aprob+1;
end;
end;

function porcentaje:real;
begin
porcapro:= aprob*100/total_alum;
end;

procedure nota_maxima;
begin
for i:=1 to total_alum do
begin
if notas>nota_mayor then
nota_mayor:=notas;
posi:=i;
end;
end;

procedure imprimir;
begin
writeln ('Porcentaje de alumnos aprobados : ',porcapro:3:2);
writeln (' ');
writeln ('***********************************************');
writeln (' ');
writeln ('Nombre del estudiante que obtuvo la mayor nota: ',nombre[posi]);
writeln ('Cédula: ',cedula[posi]);
writeln ('Edad: ',edad[posi]);
writeln ('Nota: ',notas[posi]);
writeln (' ');
writeln ('***********************************************');
end;

begin
inicializar;
llenar_arreglo;
sumar_aprobados;
porcentaje;
nota_maxima;
imprimir;
readln;
end.


espero que me puedan ayudar y muchas gracias de antemano, perdonen mis errores tontos :eolo:
 

Salandrews

Bovino maduro
#2
Bueno, primero que nada, basta de decir "errores tontos". Un error es un error, y todos empezamos así, cualquiera se puede equivocar e incluso a nivel profesional.

Ahora, con el asunto, el problema esta en este procedimiento:

procedure nota_maxima;
begin
for i:=1 to total_alum do
begin
if notas>nota_mayor then
nota_mayor:=notas;
posi:=i;
end;
end;

Date cuenta que independientemente de cual sea la nota mayor, recorres todo el vector. Y por eso tu variable posi SIEMPRE va a tener el valor de i=3, porque el ciclo for siempre va a terminar en 3. ¿Solución? Metelo dentro de un bloque, así:

procedure nota_maxima;
begin
for i:=1 to total_alum do
begin
if notas>nota_mayor then
begin
nota_mayor:=notas;
posi:=i;
end;
end;
end;

De esta manera, lo que a vos te interesa que se ejecute cuando una nota sea mayor, SOLO se va a ejecutar cuando efectivamente, se de la condición.

Creo que solo es eso, espero haberte ayudado.

Saludos
;)
 

jozeunico

Bovino maduro
#3
begin end en el IF

Que tal, bueno no tengo el Delphi, pero pude compilar tu aplicación con Turbo Pascal 7 (el abuelito de Delphi) solo tuve que remover un par de cosas y agregar 1 más, tu error en realidad no es mayor problema y al parecer es lo único, ahora te explico cual es y donde está.

Está en este procedimiento:

Código:
procedure nota_maxima;
begin
for i:=1 to total_alum do
begin
if notas[i]>nota_mayor then
nota_mayor:=notas[i];
posi:=i;
end;
end;
Más especificamente aqui:
Código:
if notas[i]>nota_mayor then
 nota_mayor:=notas[i];
 posi:=i;
Como no pones un bloque "BEGIN END" después del "then" del "IF" la sentencia:
Código:
posi:=1;
Siempre se ejecuta, por eso a pesar que con el IF filtres cuando tienes una nota mayor, debido al FOR siempre guardas la última posición (es decir vas reemplazando siempre el valor de la variable "posi") y por eso siempre se imprime el último alumno que registras.

El procedimiento corregido quedaria asi (solo se agrega un gloque "BEGIN END") :
:
Código:
procedure nota_maxima;
 begin
 for i:=1 to total_alum do
 begin
 if notas[i]>nota_mayor then
    [B]begin[/B]
        nota_mayor:=notas[i];
        posi:=i;
    [B]end;[/B]
 end;
 end;
Bueno lo probé en Turbo Pascal, pero supongo que vale para Delphi puesto que como te dije no tuve problemas para compilar tu código.

Saludos espero te sea de ayuda.
 

dondiablo0925

Bovino Milenario
#4
uy q recuerdos aquellos, cuando me tocaba ver pascal, es la misma cosa, lo unico q no alcance a ver arreglos en pascal eso lo vi en c++ jejeje, pero bueno al grano:

el compañero tiene razon, como despues del if va mas de 1 instruccion ahi tienes q meterla con el begin y el end, es que no me acordaba q en pascal los corchetes se rremplazaban por el begin y el end. de resto creo q no tienes nada mas asi raro, y en cuanto a eso de errores es verdad, a veces hasta los mejores programadores hacen algun error pendejo y se sacan los ojos ahi mirando que es.
 
#5
exelente!...muchisimas gracias amigos!...exelente ayuda, ahora el porgrama corre exelente!...tomare en cuenta esa observacion en un futuro...muchas gracias!
 
Arriba