¿Alguna forma de que un programa finalice al ejecutar una condición?

Holaa.

Bueno si por ejemplo tenemos lo siguiente:

[...] SI a > 10 ENTONCES [...]

y esa línea de código esta por el centro del algoritmo que se salte todo lo que queda de programa y vaya al final donde ponga:

Escribir('Error, finalizando programa');

No sé si después del Entonces existe alguna acción o palabra reservada que haga lo que quiero.Se puede hacer que el programa se cierre por la fuerza al escribir una letra o si declaro la variable a entre un rango de números pero me gustaria que diera un aviso diciendo que lo que has puesto no es correcto.

He pensado una forma pero no sé si se podrá hacer.Con la estructura Repeat-Until hacer que hasta que no introduzca un número correcto que te vuelva a pedir introducirlo.

Estoy usando Pascal.

Saludoss.
Hola, ¿has probado los comandos 'While', 'Repeat' y 'For'?, creo que servirán para finalizar el programa en ese momento, cuando se ejecute X condición,

Ciclos iterativos: While, For y Repeat

- While

La instruccion while estudia primero la condicion y, en caso de que se cumpla, procedera a ejecutar la(s) instruccion(es) deseada(s).

Su estructura es:

while (condicion) do
instruccion;

En caso de que haya mas de una instruccion a realizar, escribiremos:

while (condicion) do
begin
instrucciones;
end;

- For


El ciclo for realiza la(s) instruccion(es) deseada(s) durante un numero de vueltas predeterminadas. Este numero de vueltas no podra ser modificado NUNCA dentro del bucle, por lo que debemos tener cuidado en no tocar la variable indice (la que controla el numero de vueltas). Un ejemplo:

program pruebaFor;
CONST
N = 10; { numero de vueltas que dara el bucle}
VAR
i: integer; { variable que contara el numero de vueltas que llevamos}
BEGIN
for i:=1 to N do
writeln(i);
END.

Y se mostraria por pantalla:

1
2
3
4
5
6
7
8
9
10

En caso de que tengamos que ejecutar mas instrucciones dentro del bucle, escribiriamos:

for (contador) do
BEGIN
instrucciones;
END;

Un ejemplo de esto:

program pruebaForDos;
CONST
N=10;
VAR
i,j : integer; {Una nueva manera de declarar las variables. En caso de tener varias del mismo tipo,podemos separarlas por ","}
BEGIN
j:=0;
for i:=1 to N do
begin
writeln(i);
j:=j+3; {Con esta instruccion, a la variable j la sumamos durante N veces 3}
end;
write('j = ',j); {Cuando vamos a escribir varias cosas seguidas, podemos enviar la instruccion de esta manera}
END.

Y en pantalla se imprimiria:

1
2
3
4
5
6
7
8
9
10
j = 30

En los ciclos For, podemos seguir dos tipos de direccion. Ascendente (de 1 hasta N) o descendente (de N hasta 1). Esto lo deberemos indicar en el contador del siguiente modo (usaremos el ejemplo anterior):

Ascendente

for i:=1 TO N do
...

Descendente

for i:=N DOWNTO 1 do
...

- Repeat


El bucle Repeat realiza una serie de instrucciones y, una vez hechas, comprueba una condicion. En caso de cumplirse, no volvera a repetir dichas instrucciones, y en caso contrario las ejecutara. Su estructura es:

repeat
instruccion(es);
until (condicion);

- Aclaraciones


Observese que los 3 ciclos, bien implementados, son equivalentes entre si.

Hay que tener especial cuidado en el ciclo que se desea usar: · Si se desea hacer un numero de vueltas FIJO, podemos usar cualquiera de los 3. · Si las vueltas dependen de una condicion que se modifica dentro del bucle, solo podemos usar los ciclos WHILE y REPEAT. · Si queremos comprobar una condicion antes de realizar ciertas instrucciones, debemos usar el WHILE



(info de la Wiki)

No tengo ningún conocimiento de programación, pero me ha parecido que esos comandos o una combinación entre ellos podrían ser los adecuados.




Saludos
HALT finaliza el programa, EXIT finaliza el procedimiento, pero este tipo de funciones no son demasiado aconsejables, se suelen usar cuando el programa llega a un error irrecuperable.

No entiendo bien qué quieres hacer. Si lo que quieres es, por ejemplo, mostrar un menú, lo normal es usar un do-while (en pascal creo que es repeat-until).

hacer{
   mostrar menú
   número <- leer número
   llamar a la función elegida o mostrar mensaje de error si es una opción no válida
} mientras que número sea distinto de la condición de salida
Bueno, anoche se me ocurrio hacer algo para sumar dos fechas como por ejemplo 2 años,3 meses,6 semanas,7dias, 33 horas, 0min y 88 segundos + 3 años,22 meses y 60 min.
Queria poner como condiciones que no se pudiera introducir(cuando te piden los minutos, horas etc.), por ejemplo una cifra superior a 52 semanas etc., y que al poner por ejemplo 13 meses saltara un mensaje que dijera "el mes debe estar comprendido entre 0 y 12"... pero eso es más laborioso; ya lo haré cuando se pase la ola de calor [sonrisa] .
Entonces para hacerlo más sencillo, he puesto que se pueda introducir cualquier número positivo sin cota superior.Y ha salido esto:

program SumarTiempo;

Type    duracion = record

        seg,min,hor,dia,semana,mes,ano:integer;

                  end;

Var

        d:duracion;
        TotalSegundos,TotalSegundos1,TotalSegundos2,TotalSegundosT:extended;
        TOTAL:qword;

procedure LeerAnoYComprobar(var a:integer);

        Begin
                Write('Escribe el n£mero de a¤os: ');
                readln(a);
                if a < 0 then begin
                                repeat
                                    write('El n£mero de a¤os no es v lido. Vuelve a escribirlo: ');
                                    readln(a);
                                until a >= 0;
                              end;
        End;

procedure LeerMesYComprobar(var b:integer);

        Begin
                Write('Escribe el n£mero de meses: ');
                readln(b);
                While (b < 0)  do
                        begin
                                Write('El n£mero de meses no es v lido. Vuelve a escribirlo: ');
                                readln(b);
                        end;


        End;


procedure LeerSemanaYComprobar(var c:integer);

        Begin
                Write('Escribe el n£mero de semanas: ');
                readln(c);
                While (c < 0)  do
                        begin
                                Write('El n£mero de semanas no es v lido. Vuelve a escribirlo: ');
                                readln(c);
                        end;


        End;


procedure LeerDiaYComprobar(var d:integer);

        Begin
                Write('Escribe el n£mero de dias: ');
                readln(d);
                While (d < 0)  do
                        begin
                                Write('El n£mero de dias no es v lido. Vuelve a escribirlo: ');
                                readln(d);
                        end;


        End;

procedure LeerHorasYComprobar(var e:integer);

        Begin
                Write('Escribe el n£mero de horas: ');
                readln(e);
                While (e < 0)  do
                        begin
                                Write('El n£mero de horas no es v lido. Vuelve a escribirlo: ');
                                readln(e);
                        end;


        End;




procedure LeerMinutosYComprobar(var f:integer);

        Begin
                Write('Escribe el n£mero de minutos: ');
                readln(f);
                While (f < 0)  do
                        begin
                                Write('El n£mero de minutos no es v lido. Vuelve a escribirlo: ');
                                readln(f);
                        end;


        End;




procedure LeerSegundosYComprobar(var g:integer);

        Begin
                Write('Escribe el n£mero de segundos: ');
                readln(g);
                While (g < 0)  do
                        begin
                                Write('El n£mero de segundos no es v lido. Vuelve a escribirlo: ');
                                readln(g);
                        end;


        End;


function TodoASegundos(h,i,j,k,l,m,n:integer):extended;

         Begin

          TotalSegundos:=(h * 12 * 30.4166 * 24 * 60 * 60) + ( i * 30.4166 * 24 * 60 * 60) + (j * 7 * 24 * 60 * 60)+
                         (k * 24 * 60 * 60) + (l * 60 * 60) + (m * 60) + n
         End;


procedure SegundosAUnidades(o:qword; var p,q,r,s,t,u,v:integer);

         Var resto:qword;

         Begin
                p:= o         DIV   trunc (12 * 30.4166 * 24 * 60 * 60);
                resto:= o     MOD   trunc (12 * 30.4166 * 24 * 60 * 60);
                q:= resto     DIV   trunc (30.4166 * 24 * 60 * 60);
                resto:= resto MOD   trunc (30.4166 * 24 * 60 * 60);
                r:= resto     DIV   (7 * 24 * 60 * 60);
                resto:= resto MOD   (7 * 24 * 60 * 60);
                s:= resto     DIV   (24 * 60 * 60);
                resto:= resto MOD   (24 * 60 * 60);
                t:= resto     DIV   (60 * 60);
                resto:= resto MOD   (60 * 60);
                u:= resto     DIV   (60);
                resto:= resto MOD   (60);
                v:= resto;

         End;


Begin

        Writeln('    SUMAR DOS DURACIONES DE TIEMPO');
        Writeln('    ______________________________');

        Writeln('Primera duraci¢n.');

        LeerAnoYComprobar(d.ano);
        LeerMesYComprobar(d.mes);
        LeerSemanaYComprobar(d.semana);
        LeerDiaYComprobar(d.dia);
        LeerHorasYComprobar(d.hor);
        LeerMinutosYComprobar(d.min);
        LeerSegundosYComprobar(d.seg);
        TodoASegundos(d.ano,d.mes,d.semana,d.dia,d.hor,d.min,d.seg);

        TotalSegundos1:=TotalSegundos;

        Writeln('Segunda duraci¢n.');

        LeerAnoYComprobar(d.ano);
        LeerMesYComprobar(d.mes);
        LeerSemanaYComprobar(d.semana);
        LeerDiaYComprobar(d.dia);
        LeerHorasYComprobar(d.hor);
        LeerMinutosYComprobar(d.min);
        LeerSegundosYComprobar(d.seg);
        TodoASegundos(d.ano,d.mes,d.semana,d.dia,d.hor,d.min,d.seg);

        TotalSegundos2:=TotalSegundos;
        TotalSegundosT:=TotalSegundos1 + TotalSegundos2;

        TOTAL:= trunc (TotalSegundosT);

        SegundosAUnidades(TOTAL,d.ano,d.mes,d.semana,d.dia,d.hor,d.min,d.seg);


        Write('La suma de las dos duraciones da como resultado ',TOTAL, ' segundos');
        Write(' y en unidades de tiempo: ',d.ano, ' a¤os, ', d.mes, ' meses, ', d.semana, ' semanas,' , d.dia, ' dias,');
        write(' ', d.hor, ' horas, ', d.min, ' minutos y ', d.seg, ' segundos.');
        readln();

End.


Por último, pregunto si hay alguna forma para que el programa no se cierre al escribir una A cuando lo que se espera es un Entero, por ejmplo.

Saludoss.
shinix escribió:Por último, pregunto si hay alguna forma para que el programa no se cierre al escribir una A cuando lo que se espera es un Entero, por ejmplo.


No estoy muy puesto en pascal pero supongo que la forma normal será con excepciones.
4 respuestas