Wątek przeniesiony 2014-02-01 20:16 z Delphi i Pascal przez furious programming.

Zagnieżdżanie if w Pascalu

0

Witam,
Uczę się programować we Free Pascalu. Jestem aktualnie przy warunku if then else. Wymyśliłem sobie takie zadanie:
Użytkownik podaje 5 liczb i program podaje, która z nich jest największa. Wiem, że dzięki funkcji można by napisać kod w 5 linijkach. Ja natomiast chciałbym dobrze nauczyć się zagnieżdżania if, więc robię to zadanie. ( w zadaniu nie uwzględniam tego, że 2 liczby mogą być sobie równe, proszę was o pominięcie tego elementu)

Podam najpierw kod, który podaje odpowiedź przy 4 liczbach:

program XYZ;

var
    A,B,C,D : integer;
begin
    write('Podaj liczbe A: ');
    readln(A);
    write('Podaj liczbe B: ');
    readln(B);
    write('Podaj liczbe C: ');
    readln(C);
    write('Podaj liczbe D: ');
    readln(D);

    IF A>B then
        begin
        IF A>C then
            begin 
            IF A>D then
            writeln('Najwieksza liczba to A')
            else
            writeln('Najwieksza liczba to D')
            end else
        IF C>D then
        writeln('Najwieksza liczba to C')
        else
        writeln('Najwieksza liczba to D')
        end else
            begin
            IF B>C then
                begin
                IF B>D then
                writeln('Najwieksza liczba to B')
                else
                writeln('Najwieksza liczba to D')
                end else
            IF C>D then
            writeln('Najwieksza liczba to C')
            else
            writeln('Najwieksza liczba to D')
            end;
    readln;
end.

Powyższy kod działa. Teraz ten niedziałający ( na 5 liczb ):

program piecliczb;

var
  A,B,C,D,E : integer;

begin
    write('Podaj A');
    readln(A);
    write('Podaj B');
    readln(B);
    write('Podaj C');
    Readln(C);
    write('Podaj D');
    readln(D);
    write('Podaj E');
    readln(E);
  IF A>B then
       begin
       IF A>C then
           begin
           IF A>D then
           begin
              IF A>E then
              writeln('Najwieksza jest A')
              else
              writeln('Najwieksza jest E')
              end else
              IF D>E then
              writeln('Najwieksza jest D')
              else
              writeln('Najwieksza jest E')
              end else
              begin
              IF C>D then
              begin
              IF C>E then
              writeln('Najwieksza jest C')
              else
              writeln('Najwieksza jest E')
              end else
              IF D>E then
              writeln('Najwieksza jest D')
              else
              writeln('Najwieksza jest E')
             ** end  else**
              begin
              IF B>C then
              begin
              IF B>D then
              begin
              IF B>E then
              writeln('Najwieksza jest B')
              else
              writeln('Najwieksza jest E')
              end else
              IF D>E then
              writeln('Najwieksza jest D')
              else
              writeln('najwieksza jest E')
              end else
              begin
              IF C>D then
              begin
              IF C>E then
              writeln('Najwieksza jest C')
              else
              writeln('Najwieksza jest E')
              end else
              IF D>E then
              writeln('najwieksza jest D')
              else
              writeln('najwieksza jest E')
              end;
              readln;
              end.

Zaznaczyłem dodatkowo pogrubionym pismem, w której linijce wyskakuje błąd. Czyli de facto mój problem polega na tym jak połączyć te 2 bloki ? Pozdrawiam

dodanie znaczników <code class="pascal"> - fp

1

Struktura kodu to koszmar, stąd nie widzisz błędu. Sformatuj, zrób wcięcia, to zobaczysz gdzie brakuje "end" a gdzie jest niepotrzebnie użyty.

Coś dostawiłem i sformatowałem , czy działa poprawnie to nie wiem , ale przynajmniej ma poprawną składnię

begin
  write('Podaj A');
  readln(A);
  write('Podaj B');
  readln(B);
  write('Podaj C');
  readln(C);
  write('Podaj D');
  readln(D);
  write('Podaj E');
  readln(E);
  IF A > B then
  begin
    IF A > C then
    begin
      IF A > D then
      begin
        IF A > E then
          writeln('Najwieksza jest A')
        else
          writeln('Najwieksza jest E')
      end
      else IF D > E then
        writeln('Najwieksza jest D')
      else
        writeln('Najwieksza jest E')
    end
    else
    begin
      IF C > D then
      begin
        IF C > E then
          writeln('Najwieksza jest C')
        else
          writeln('Najwieksza jest E')
      end
      else IF D > E then
        writeln('Najwieksza jest D')
      else
        writeln('Najwieksza jest E')
    end
  end
  else
  begin
    IF B > C then
    begin
      IF B > D then
      begin
        IF B > E then
          writeln('Najwieksza jest B')
        else
          writeln('Najwieksza jest E')
      end
      else IF D > E then
        writeln('Najwieksza jest D')
      else
        writeln('najwieksza jest E')
    end
    else
    begin
      IF C > D then
      begin
        IF C > E then
          writeln('Najwieksza jest C')
        else
          writeln('Najwieksza jest E')
      end
      else IF D > E then
        writeln('najwieksza jest D')
      else
        writeln('najwieksza jest E')
    end;
    readln;
  end;

end.
1

Jeżeli zacząłeś uczyć się programowania to musisz zacząć od nauki formatowania: Jak usunąć elementy z listy jednokierunkowej ?

0

Grzegorz wielkie dzięki za pomoc!
Działa, przeanalizowałem Twój kod i zauważyłem, że po prostu dodałeś słowo end.
Czy mógłbyś lub też ktoś inny wytłumaczyć mi dlaczego pisze się w kodzie 2 razy pod rząd "end"?

Pozdrawiam

0

każde "begin" musi mieć swojego "end"-a

0

Jak nie formatujesz to nic nie widzisz, natomiast w kodzie podanym przez @grzegorz_so wyraźnie widać który end zamyka który begin. Może być nawet milion razy pod rząd "end" - end jedynie zamyka odpowiadający mu begin

2

Przerób kod tak, aby dany napis (np. 'Najwieksza jest D') występował w kodzie tylko raz.

0

@krwq - po co tracić czas na sortowanie, skoro wystarczy wyliczyć zwykły max? Do tego potrzeba jedną procedurę uzupełniającą tablicę w pętli oraz funkcję, która zwróci indeks największego elementu i wyświetli go na ekranie (po przekształceniu indeksu na znak ze zbioru ABCDE); To z dobrym formatowaniem maksymalnie 35 linii kodu; Podałbym kod, ale pytacz ewidentnie ma za zadanie przećwiczyć warunki, choć w tym przypadku całkowicie nie mają sensu :]

A Ciebie @tyk3</span></b> proszę o to, abyś wątki dotyczące podstaw zakładał w dziale Newbie.

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