Co wstawić zamiast break'a, aby program przeskoczył w wybrane miejsce procedury

0

Witam,

Czy w ogóle da się tak wykombinować, aby bo wykryciu wartości 1 w tablicy program przeszedł mi w miejsce tuż przed wypisaniem na ekran "Brak wolnych miejsc..." (mam w to miejsce wstawione break'i, które oczywiście nic nie dają w tym przypadku)? Proszę o pomoc.

procedure sprawdz_wolne;

        begin
        clrscr;
        writeln ('Podaj dzien rezerwacji:');
        readln (dzien);
        writeln ('Podaj miesiac rezerwacji:');
        readln (miesiac);
        writeln ('Podaj dlugosc trwania rezerwacji:');
        readln (ilosc_dni);
                CASE miesiac of
                1: data:=dzien;
                2: data:=31+dzien;
                3: data:=31+28+dzien;
                4: data:=2*31+28+dzien;
                5: data:=2*31+30+28+dzien;
                6: data:=3*31+30+28+dzien;
                7: data:=3*31+2*30+28+dzien;
                8: data:=4*31+2*30+28+dzien;
                9: data:=5*31+2*30+28+dzien;
                10: data:=5*31+3*30+28+dzien;
                11: data:=6*31+3*30+28+dzien;
                12: data:=6*31+4*30+28+dzien;
                end;
        writeln ('Podaj ilosc osob');
        readln (ilosc_osob);
        CASE ilosc_osob of
        1: begin
           assign(pokoj1, 'pokoj1.dat');
           reset(pokoj1);
           for i:=1 to ilosc_dni do
                begin
                if (kalendarz_pokoj1[data]=1) then
                      break
                else
                data:=data+1;
                end;
           data:=data-ilosc_dni;
           for i:=1 to ilosc_dni do
                begin
                kalendarz_pokoj1[data]:=1;
                write(pokoj1, kalendarz_pokoj1[data]);
                data:=data+1;
                end;
           close(pokoj1);
           decyzja;
           end;
        2: begin
           assign(pokoj2, 'pokoj2.dat');
           reset(pokoj2);
           for i:=1 to ilosc_dni do
                begin
                if (kalendarz_pokoj2[data]=1) then
                      break
                else data:=data+1;
                end;
             data:=data-ilosc_dni;
           for i:=1 to ilosc_dni do
                begin
                kalendarz_pokoj2[data]:=1;
                write(pokoj2, kalendarz_pokoj2[data]);
                data:=data+1;
                end;
           close(pokoj2);
           decyzja;
           end;
        3: begin
           assign(pokoj3, 'pokoj3.dat');
           reset(pokoj3);
           for i:=1 to ilosc_dni do
                begin
                if (kalendarz_pokoj3[data]=1) then
                      break
                else data:=data+1;
                end;
             data:=data-ilosc_dni;
           for i:=1 to ilosc_dni do
                begin
                kalendarz_pokoj1[data]:=1;
                write(pokoj3, kalendarz_pokoj3[data]);
                data:=data+1;
                end;
           close(pokoj3);
           decyzja;
           end;
        4: begin
           assign(pokoj4, 'pokoj4.dat');
           reset(pokoj4);
           for i:=1 to ilosc_dni do
                begin
                if (kalendarz_pokoj4[data]=1) then
                      break
                else data:=data+1;
                end;
             data:=data-ilosc_dni;
           for i:=1 to ilosc_dni do
                begin
                kalendarz_pokoj1[data]:=1;
                write(pokoj4, kalendarz_pokoj4[data]);
                data:=data+1;
                end;
           close(pokoj4);
           decyzja;
           end;
           end;
           writeln('Brak wolnych miejsc/odrzucono propozycje rezerwacji');
           readln;
        end;
0

Formatowanie jest tragiczne. Jedyne co "wyłapałem" to fakt, że zamiast tak idiotycznie sumować dni posłużył byś się lepiej tablicą miesięcy z ilością dni oraz sprawdzaniem przestępności dla lutego. Co do jakiegoś tam "skakania", to na pewno niemal wszystko da się zrobić przez odpowiedni if i procedurę. Jednak w tak "sformatowanym" kodzie, ja się nie mogę odnaleźć. Być może inni tutaj dadzą radę.

0

Nie wiem co to za kompilator ale chyba wszystkie współczesne obsługują wyjątki (blok try except) więc zamiast brak wyrzuć wyjątek i go przechwyć przed linią do której ma skoczyć czyli:

begin
  //cos tam co masz przed case
  try
    //CASE i dalsza czesc
    raise EAbort.Create(''); //zamiast kazdego break
    //reszta kodu
  except
    on E: EAbort do
    begin
    //nic nie robimy
    end;
  end;
  writeln('Brak wolnych miejsc/odrzucono propozycje rezerwacji');
  readln;
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1