Wątek przeniesiony 2016-10-06 21:59 z Delphi i Pascal przez furious programming.

Rysowanie rombu z gwiazdek

0

Witam!
Jestem studentem I-szego roku informatyki, i staram się zrobić "prosty przykład" zaproponowany przez wykładowce...
O object pascalu nie wiem nic, w TP znam z 4 komendy ;)

Program ma rysować romb z gwiazdek w konsoli dla "n=5" zgaduje że n ma być przekątną tego rombu...
Mam plan jak to zrobić ale przy okazji chciałbym zrobić 2gą wersję troszkę bardziej ambitną...
Chce by użytkownik sam podawał długość (ilość gwiazdek) przekątnej
słyszałem że wykładowca lubi robić rzeczy złośliwie np w polu na cyfry wpisać ułamki, wartości ujemne itp ;)
dlatego program muszę zabezpieczyć przed wpisywaniem głupot XD

Po ok 2h na waszym kursie delphi natrafiłem na pierwszy problem z moim programem

Nie wiem jak sprawdzić czy moje "n" w kodzie przekątna NIE jest ułamkiem tzn mogę pracowac tylko na liczbach całkowitych przy moim pomyśle na rysowanie rombu...

Oto kod w 100% moj, proszę tylko o podpowiedz dodania 3ciego warunku, nie jestem orłem z matematyki i po prostu nie mam pojecia co zrobić ze zmienną by sprawdzić czy jest to liczba całkowita...

                                                                                //Rysuje romb z gwiazdek w konsoli.
                                                                                //Efekt docelowy dla przekontna=5
                                                                                {
                                                                                  *
                                                                                 ***
                                                                                *****
                                                                                 ***
                                                                                  *
                                                                                }
const
  gwiazdki=1;                                                                   //Pierwsza gwiazdka tworząca wierzcholek rombu

var
  spacje:Integer;                                                               //?
  przekontna:Currency;                                                          //"dlugosc" przekątnej rombu (ilosc gwiazdek)

begin
Writeln('Podaj dlugosc przekontnej rombu');
Writeln('Minimalna wartosc to 3, uzyj CALKOWITYCH liczb NIEPARZYSTYCH!');
 Readln(przekontna);
   if (przekontna mod 2>0) and (przekontna >=3)  and (przekontna ???????)   //elminujemy liczby ujemne, mniejsze od 3 oraz ulamki
   then

     begin                                                                      // rysujemy romb tylko jeszcze nie wiem jak ;)
      Writeln('Rysuje romb...');                                                // debug   - do usunięcia

     end
   else
    Writeln('Wybrano nieprawidlowa liczbe!');

  Readln;

???????????
end.                                    
 

chciałbym umieścić na końcu jakaś komendę idz do początku, restart coś takiego + komendę wyczyść ekran (konsole) na samym początku programu tak jak sie robiło ClrScr; w tutbo pascalu...

Z góry dziękuje za pomoc...

0

Oto kod w 100% moj, proszę tylko o podpowiedz dodania 3ciego warunku, nie jestem orłem z matematyki i po prostu nie mam pojecia co zrobić ze zmienną by sprawdzić czy jest to liczba całkowita...

Użyć typu Integer, a Currency zostawić do obliczeń finansowych;

Przykład procedury rysującej romb dla Free Pascala - z małą przeróbką pójdzie pod Delphi:

procedure DrawDiamond(const ALength: Integer);
var
  LLength: Integer = 1;
begin
  while LLength < ALength do
  begin
    WriteLn(StringOfChar(' ', (ALength - LLength) div 2), StringOfChar('*', LLength));
    LLength += 2;
  end;

  WriteLn(StringOfChar('*', ALength));

  repeat
    LLength -= 2;
    WriteLn(StringOfChar(' ', (ALength - LLength) div 2), StringOfChar('*', LLength));
  until LLength = 1;
end;

Postaraj się zrozumieć działanie tego kodu, a jak zrozumiesz jak działa to bez problemu napiszesz swoją wersję.

0

Jeśli dobrze rozumiem Integer nie obsługuje wartości 123456789.45

Chce napisać sam na razie mam to zapisane na kartce idea polega na podzieleniu przekątnej na 2 bez reszty do obliczenia 1 wiersza spacji potem -1 spacje a stała gwiazdka będzie rosła o 2 co wiersz dopóki ilość wierszy nie równa się przekątnej... to taki skrót mojego pomysłu gdy spacja dojdzie do 0 będzie rosła o +1

A co do samego pytania o ułamki
(round przekątna = przekątna) dobrze kombinuje?

 
const
  gwiazdki=1;                                                                   //Pierwsza gwiazdka tworząca wierzcholek rombu

var
  spacje:Integer;                                                               //?
  przekontna:Currency;                                                          //"dlugosc" przekątnej rombu (ilosc gwiazdek)

begin
Writeln('Podaj dlugosc przekontnej rombu');
Writeln('Minimalna wartosc to 3, uzyj CALKOWITYCH liczb NIEPARZYSTYCH!');
 Readln(przekontna);
   if (przekontna mod 2>0) and (przekontna >=3) and (round (przekontna) = przekontna)         //elminujemy liczby ujemne, mniejsze od 3 oraz ulamki
   then

     begin                                                                      // rysujemy romb tylko jeszcze nie wiem jak ;)
      Writeln('Rysuje romb...');                                                // debug   - do usunięcia

     end
   else
    Writeln('Wybrano nieprawidlowa liczbe!');

  Readln;
end.

0

Napiszę jeszcze raz - do przechowania długości przek__ą__tnej używaj typu całkowitoliczbowego, najlepiej bez znaku; Do Twojego programu w zupełności wystarczy Byte, chyba że w środowisku którego używasz są czytelniejsze aliasy, czyli np. UInt8; Program nie ma obsługiwać długości rzeczywistych, więc Currency jest złym typem danych; Tym bardziej, że przeznaczony jest do obliczeń finansowych;

Druga sprawa - program ma rysować romb linia po linii, lustrzane odbicie względem osi X; Dlatego też zacząć masz od linii zawierającej wcięcie oraz jedną gwiazdkę; W każdym kolejnym kroku rysujesz linię zawierającą wcięcie mniejsze o jeden znak oraz ciąg gwiazdek, powiększany o dwie gwiazdki w każdej iteracji; Wykonujesz tyle iteracji, co połowa długości przekątnej rombu -1; Możesz skorzystać z pętli For; Po wykonaniu pętli rysujesz środkową linię z gwiazdek - o długości przekątnej; Następnie znów w pętli rysujesz zwężającą się część, tym razem zwiększając wcięcie o jeden znak i zmniejszając liczbę gwiazdek, po dwie mniej na każdą iterację; Pętla ma się wykonywać tyle razy, ile wynosi połowa długości przekątnej -1.

0

<offtop>Turbo Pascal, uczelnia wyższa nie używa byle czego. Przecież studenci nie będą używać zabawek, które są modne od niedawna w firmach i niedługo wyjdą z użycia. Lepiej przecież uczyć korzystania z czegoś co im się przyda w przyszłości.</offtop>

0

@Patryk_P napisał

zgaduje że n ma być przekątną tego rombu.

Na pewno źle zgadujesz, romb ma dwie przekątne o różnych długościach. n jest długością boku.

0

Łopatologicznie: n = ilość linijek, z których powstanie romb.

0

Czyli wysokość rombu. :D

0

@Spine: to zależy od sposobu rysowania. Stawiam jednakże na sposób "latawiec", więc wtedy n jest jedną z przekątnych, natomiast w pozycji "rysuję romb leżący" to wtedy jest to wysokość.

Wasze n to d1/d2 czy h? :P
user image

0

Już nie cudujcie - przecież znaczenie n w tym zadaniu jest oczywiste; Bez znaczenia czy nazwiemy to długością przekątnej, liczbą linii figury czy maksymalną liczbą gwiazdek w linii środkowej - wszystkie trzy stwierdzenia są prawidłowe; Poza tym macie w komentarzu przykładową figurę dla n równego 5:

//Efekt docelowy dla przekontna=5
{
  *
 ***
*****
 ***
  *
}

Zadanie jest zbyt proste i oczywiste, by prowadzić niekończące się dywagacje; Widzę naturalną tendencję doświadczonych koderów do komplikowania prostych spraw i chwalenia się tym, kto w tej materii ma większe jaja;

Problem był już rozwiązany - rozwiązanie opisane, przykładowy kod podany, koniec dyskusji; Jedyne na co ten wątek oczekuje to na odpowiedź pytacza, czy zrozumiał działanie algorytmu czy nie zrozumiał.

0

@furious programming Dokładnie to miałem właśnie napisać. Po co utrudniać coś, co jest proste? Niepotrzebnie mieszacie w głowie autorowi.

0

A kiedyś takie zadania rozwiązywało się bez forum...

0

Autor, poradziłeś sobie?

0

Kod się nie kompiluje, wydaje mi się że rozumiem teraz tylko nie wiem gdzie jest błąd, używam lazarusa bo takowy jest na uczelni...

ALenght to ilośc lini?
StringOfChar? Co to jest? ciag znaków z angielskiego rozuumiem?

procedure DrawDiamond(const ALength: Integer);             //stała
var
  LLength: Integer = 1;                                     //zmienna
begin
  while LLength < ALength do                              //Nie rozumiem po co te begin i end w srodku a potem reszta bez coś mi tuu też kompilator wywala...
  begin
    WriteLn(StringOfChar(' ', (ALength - LLength) div 2), StringOfChar('*', LLength));
    LLength += 2;                                                                                                              //nie rozumiem +=2 podniesienie wartości o 2?
  end;
 
  WriteLn(StringOfChar('*', ALength));
 
  repeat
    LLength -= 2;                                                                                                             // w ogóle nie rozumiem tego zapisu -=2
    WriteLn(StringOfChar(' ', (ALength - LLength) div 2), StringOfChar('*', LLength));
  until LLength = 1;
end;



program ROMB2_P;
                                                                                

var
  gwiazdki: Integer =1;
  spacje:Integer;                                                              
  przekatna:Integer;  
                                                          
begin
Writeln('Podaj dlugosc przekatnej rombu:');
Writeln('Uwaga tylko NIEPARZYSTE! Minimalna wartosc to 3!');
 Readln(przekatna);
   if
    (przekatna mod 2>0) and (przekatna >=3) and (round (przekatna) = przekatna)                       
   then

     begin                                                                                          
      Writeln('Rysuje romb...');                                                                  
      WriteLn(StringOfChar(' ', (przekatna - gwiazdki) div 2), StringOfChar('*', gwiazdki);      
// jak to dalej ma być to chyba powinna być pętla dopóki gwiazdki nie są równe przekatnej
     (gwiazdki + 2);                                                                            
//Czy to jest prawidlpwy zapis? chce zwiekszyc wartosc zmiennej o 2 a tak jak bylo w przykladzie nie kompiluje sie. teraz mam blad niespodziewany koniec pliku?!
//Teraz po wyelminowaniu bledu kompilacji powinienem powtarzac ta lnie az do gwiazdki = przekatna? 
//Dalej muszę rysować lustrzane odbicie 2gą czesc przukladu ale na razie chce uruchomic to
// Dlaczego to sie nie kompiluje używam lazarusa

     end

else
    Writeln('Wybrano nieprawidlowa liczbe!');

  Readln;
end.
                                                     
 
 
var
  gwiazdki: Integer =1;
  spacje:Integer;
  przekatna:Integer;

begin
Writeln('Podaj dlugosc przekatnej rombu:');
Writeln('Uwaga tylko NIEPARZYSTE! Minimalna wartosc to 3!');
 Readln(przekatna);
   if
    (przekatna mod 2>0) and (przekatna >=3) and (round (przekatna) = przekatna)
   then

   while gwiazdki < przekatna do
     WriteLn(StringOfChar(' ', (przekatna) div 2), StringOfChar('*', gwiazdki) );
     (gwiazdki + 2);


   else

    Writeln('Wybrano nieprawidlowa liczbe!');

  Readln;


end.

0

Kod się nie kompiluje, wydaje mi się że rozumiem teraz tylko nie wiem gdzie jest błąd [...]

A jest jakiś błąd? Jeśli jest to napisz gdzie i co się dzieje;

[...] używam lazarusa bo takowy jest na uczelni...

No to po co dodałeś tag delphi do wątku? Usuwam go i wstawiam prawidłowe;


No dobra, teraz zajmijmy się kodem;

Komentarze umieszczaj ponad komentowaną linijką, z takim samym wcięciem, a nie obok niej; Poza tym nie wyjaśniaj działania programu w komentarzach, bo nie do tego służą; Nam też nie musisz wyjaśniać jak ten kod działa, bo dobrze wiemy jak działa i ew. dlaczego nie działa :]

ALenght to ilośc lini?

Zobacz sobie miejsce wywołania tej procedury i co zostaje do niej podane; Już wcześniej tłumaczyłem, że w tym konkretnym zadaniu obojętnym jest to, co podaje użytkownik; A dzieje się tak dlatego, że podawana przez użytkownika liczba określa jednocześnie liczbę linii, maksymalną długość linii (tu: środkowej) oraz długość przekątnej figury;

StringOfChar? Co to jest? ciag znaków z angielskiego rozuumiem?

Jak nie wiesz czym coś jest to korzystaj z dokumentacji; StringOfChar to standardowa funkcja RTL, która zwraca łańcuch, zbudowany z podanego w pierwszym parametrze znaku, o długości określonej w drugim parametrze; Przykładowe wywołanie funkcji:

StringOfChar('*', 5)  // zwróci łańcuch '*****'

Użycie tej funkcji wyklucza konieczność pisania pętli, która miałaby służyć do tworzenia takiego łańcucha; Po to takie funkcje istnieją, aby z nich korzystać i nie wymyślać każdego koła na nowo;

LLength += 2;  //nie rozumiem +=2 podniesienie wartości o 2?

Tak, jest to inkrementacja wartości zmiennej o prawy operand; Jest to skrócony zapis, zapożyczony z C++ i oznacza dokładnie to samo co poniższe dwa:

LLength := LLength + 2;
Inc(LLength, 2);

Innymi operatorami obsługiwanymi przez Lazarusa i wyglądającymi podobnie są: -=, *=, /= (przeznaczenia raczej nie muszę opisywać); Obsługę tych zapożyczonych operatorów można wyłączyć w ustawieniach projektu;

//Nie rozumiem po co te begin i end w srodku a potem reszta bez coś mi tuu też kompilator wywala...

Bloki Begin End służą do grupowania instrukcji; W tym kontretnym przypadku, służą do zgrupowania dwóch linii kodu, tak aby właśnie te dwie były wykonywane w każdej iteracji pętli; Masz braki, jeśli chodzi o podstawową wiedzę;

Poza tym, jak jest błąd w kodzie lub w działaniu programu to opisuj problem sensownie, a nie "coś kompilator wywala"; Podany przeze mnie kod najpierw sprawdziłem u siebie i działa prawidłowo, bez żadnych błędów kompilacji, ostrzeżeń czy hintów; Tak więc nic nie wywala - działa prawidłowo.

0

Tak wygląda opis błędu:

Hint: (11030) Start of reading config file C:\lazarus\fpc\3.0.0\bin\x86_64-win64\fpc.cfg
Hint: (11031) End of reading config file C:\lazarus\fpc\3.0.0\bin\x86_64-win64\fpc.cfg
Free Pascal Compiler version 3.0.0 [2016/02/14] for x86_64
Copyright (c) 1993-2015 by Florian Klaempfl and others
(1002) Target OS: Win64 for x64
(3104) Compiling C:\Users\Pika\AppData\Local\Temp\project1.lpr
project1.lpr(19) Fatal: (2003) Syntax error, "BEGIN" expected but "end of file" found
Fatal: (1018) Compilation aborted
Error: C:\lazarus\fpc\3.0.0\bin\x86_64-win64\ppcx64.exe returned an error exitcode

Stąd też napisałem:
Nie rozumiem o co chodzi z tą 2gą sekcją begin end - kompilator wywala błąd ;)

Braki mieć muszę skoro dopiero zaczynam naukę...

0

Podaj kod pliku project1.lpr a napiszę Ci co jest problemem, bo na pewno nie to o czym myślisz.

0

Udało mi się to skompilować...
Przypisałem na stałe wartość do stałej, niestety moj program musi działać również z wartościami parzystymi (tzn np zwrócić komunikat o niepoprawnej wartości czy coś...)

Procedury to dla mnie temat nieznany totalnie dlatego kilka pytań...
user image
Przed wywołaniem procedury chce dodać moją konstrukcje if...then..else
Ale chce też podawać wartość stałej (przekątnej poziomej) z klawiatury...

Czy mogę zrobić to poprzez ReadLn(nazwa_zmiennej); i czy mogę to wywołać w samym programie a nie w procedurze?

Co jest złego w moim pomyśle

(przekatna mod 2>0) and (przekatna >=3) and (round (przekatna) = przekatna) 

chodzi mi o to by program sprawdził czy liczba jest nieparzysta, jest dodatnia i większa od 3 (działa!) I CZY NIE JEST TO UŁAMEK i tu mi nie działa, kompiluje się ale po wpisaniu np 12.5 lub 12,5 program wywala błąd...

Zrobiłem coś takiego:

 
program rombdziala;

procedure DrawDiamond;
var
  przekatna: Integer;
  LLength: Integer = 1;
begin
     Writeln('Podaj dlugosc przekatnej rombu:');
   Writeln('Uwaga tylko NIEPARZYSTE! Minimalna wartosc to 3!');
   Readln(przekatna);
   if
    (przekatna mod 2>0) and (przekatna >=3) and (round (przekatna) = przekatna)
   then
  while LLength < przekatna do
  begin
    WriteLn(StringOfChar(' ', (przekatna - LLength) div 2), StringOfChar('*', LLength));
    LLength += 2;
  end;

  WriteLn(StringOfChar('*', przekatna));

  repeat
    LLength -= 2;
    WriteLn(StringOfChar(' ', (przekatna - LLength) div 2), StringOfChar('*', LLength));
  until LLength = 1;
  else
  Writeln('Wybrano bledna wartosc!!');
   Readln;
end;



begin

   DrawDiamond;
   Readln;

end.                             

Niestety kompilator wywala błąd na słowie ELSE
Czy może mi ktoś wytłumaczyć co robię źle?

PS. Bardzo proszę o wyrozumiałość, na zajęciach mam dopiero schematy blokowe a na wykładach wymarłe języki z lat 60 :/
Miałem kilka lekcji o TurboPascalu na infie w ogólniaku ale to było na poziomie nawet nie 0 a -1 ;)
Może i są lepsze rozwiązania ale stosuje tylko to co w miarę rozumiem...
Czy jest jakaś komenda czy coś co ma zrestartować aplikację?
Chodzi mi o to by po wpisaniu błędnej wartości i wyświetleniu komunikatu program się nie kończył tylko czyścił ekran i zaczynał się od początku...

Spróbowałem też tak:

 
procedure DrawDiamond;
var
  przekatna: Integer;
  LLength: Integer = 1;
begin
     Writeln('Podaj dlugosc przekatnej rombu:');
   Writeln('Uwaga tylko NIEPARZYSTE! Minimalna wartosc to 3!');
   Readln(przekatna);
   if
    (przekatna mod 2>0) and (przekatna >=3) and (round (przekatna) = przekatna)
   then
  while LLength < przekatna do
  begin
    WriteLn(StringOfChar(' ', (przekatna - LLength) div 2), StringOfChar('*', LLength));
    LLength += 2;
  end;

  WriteLn(StringOfChar('*', przekatna));

  repeat
    LLength -= 2;
    WriteLn(StringOfChar(' ', (przekatna - LLength) div 2), StringOfChar('*', LLength));
  until LLength = 1;
end;
else
Begin
  Writeln('Wybrano bledna wartosc!!');
   Readln;
end;



begin

   DrawDiamond;
   Readln;

end.                  

ale tak jakby kończy procedurę przed słowem "else"... no i kompilator czepia się tego else znowu...

Po wykasowaniu

else
Begin
  Writeln('Wybrano bledna wartosc!!');
   Readln;
end;
 

Program działa poprawnie...

0

Wszystko od if do else musi być między begin i end

0

Jeśli przekątna jest typu Integer, to jej wartość musi być liczbą całkowitą.

0
program rombdziala;

procedure DrawDiamond;
var
  przekatna: Integer;
  LLength: Integer = 1;
begin
     Writeln('Podaj dlugosc przekatnej rombu:');
   Writeln('Uwaga tylko NIEPARZYSTE! Minimalna wartosc to 3!');
   Readln(przekatna);
   if
    (przekatna mod 2>0) and (przekatna >=3) and (round (przekatna) = przekatna)
   then
  while LLength < przekatna do
  begin
    WriteLn(StringOfChar(' ', (przekatna - LLength) div 2), StringOfChar('*', LLength));
    LLength += 2;
  end;

  WriteLn(StringOfChar('*', przekatna));

  repeat
    LLength -= 2;
    WriteLn(StringOfChar(' ', (przekatna - LLength) div 2), StringOfChar('*', LLength));
  until LLength = 1;
//Dodaje instrukcje "else" w tym miejscu jeśli dobrze rozumiem begin/end działa jak <html></html> wiec de fakto jest to pomiędzy, mógłbyś napisać odrobinę jaśniej?
end;




begin

   DrawDiamond;
   Readln;

end.                             
 

W takim razie 1 problem odpada bo wcześniej używałem currency i działało ;)
Proszę o jaśniejsze wytłumaczenie z tym else gdzie powinno to być i przede wszystkim DLACZEGO?

mała aktualizacja ;)

program rombdziala;


var
  przekatna: Integer;
  LLength: Integer = 1;
begin
     Writeln('Podaj dlugosc przekatnej rombu:');
   Writeln('Uwaga tylko NIEPARZYSTE! Minimalna wartosc to 3!');
   Readln(przekatna);
   if
    (przekatna mod 2>0) and (przekatna >=3)
       then
  while LLength < przekatna do
  begin
    WriteLn(StringOfChar(' ', (przekatna - LLength) div 2), StringOfChar('*', LLength));
    LLength += 2;
  end;

  WriteLn(StringOfChar('*', przekatna));

  repeat
    LLength -= 2;
    WriteLn(StringOfChar(' ', (przekatna - LLength) div 2), StringOfChar('*', LLength));
  until LLength = 1;
  Readln;
end.                            
 

Pomyślałem o wykorzystaniu procedury

program rombdziala2;
procedure romb;
begin
  while gwiazdki < przekatna do
  begin
    WriteLn(StringOfChar(' ', (przekatna - gwiazdki) div 2), StringOfChar('*', gwiazdki));
    gwiazdki += 2;
  end;

  WriteLn(StringOfChar('*', przekatna));

  repeat
    gwiazdki -= 2;
    WriteLn(StringOfChar(' ', (przekatna - gwiazdki) div 2), StringOfChar('*', gwiazdki));
  until gwiazdki = 1;
  Readln;
end;


var
  przekatna: Integer;
  gwiazdki: Integer = 1;
begin
     Writeln('Podaj dlugosc przekatnej rombu:');
   Writeln('Uwaga tylko NIEPARZYSTE! Minimalna wartosc to 3!');
   Readln(przekatna);
   if
    (przekatna mod 2>0) and (przekatna >=3)
       then
        romb;
   else
   WriteLn('Podano bledna wartosc!');
end.                      
 

Nie działa bo zmienne są zdefiniowane w programie, nie mam już więcej pomysłów...

 
program rombdziala2;


var
  przekatna: Integer;
  gwiazdki: Integer = 1;
begin
     Writeln('Podaj dlugosc przekatnej rombu:');
   Writeln('Uwaga tylko NIEPARZYSTE! Minimalna wartosc to 3!');
   Readln(przekatna);
   if
    (przekatna mod 2>0) and (przekatna >=3)
       then
       Begin
  while gwiazdki < przekatna do
  begin
    WriteLn(StringOfChar(' ', (przekatna - gwiazdki) div 2), StringOfChar('*', gwiazdki));
    gwiazdki += 2;
  end;

  WriteLn(StringOfChar('*', przekatna));

  repeat
    gwiazdki -= 2;
    WriteLn(StringOfChar(' ', (przekatna - gwiazdki) div 2), StringOfChar('*', gwiazdki));
  until gwiazdki = 1;
  Readln;
       end;
     else
     Writeln('else');
     readln;
end.
                             

Też nie działa, zawsze problemem jest linijka "else"

1

Konstrukcja twojego if then powinna tak wyglądać:

if coś tam then
BEGIN

tu wszystkie bebechy

END
else
BEGIN
tu pozostałe bebechy
END;

Wygląda tak u ciebie?

0
var
  przekatna: Integer;
  gwiazdki: Integer = 1;
Begin
     WriteLn('Podaj dlugosc przekatnej rombu:');
   WriteLn('Uwaga tylko NIEPARZYSTE! Minimalna wartosc to 3!');
   ReadLn(przekatna);
   if
    (przekatna mod 2>0) and (przekatna >=3)
       then
       BEGIN
  while gwiazdki < przekatna do
  begin
    WriteLn(StringOfChar(' ', (przekatna - gwiazdki) div 2), StringOfChar('*', gwiazdki));
    gwiazdki += 2;
  end;

  WriteLn(StringOfChar('*', przekatna));

  repeat
    gwiazdki -= 2;
    WriteLn(StringOfChar(' ', (przekatna - gwiazdki) div 2), StringOfChar('*', gwiazdki));
  until gwiazdki = 1;
  ReadLn;
       END;

   ELSE

BEGIN
WriteLn('Podano zla wartosc!');
ReadLn;
END;

End.                 

Każda sekcja begin/end pisana inaczej dla wyróżnienia
Jest tak jak napisałeś dalej nie działa ten sam błąd

1

Ja tu nadal widzę średnik, którego być nie powinno, a o którym pisałem w komentarzu.

0

THX już działa...

Mógłbyś napisać dlaczego?
Begin end. ->To jak jest koniec programu ostatnie end ma być z "." tak?
Begin end
Begin end;
Czym to się różni?

0

Doczytaj sobie o konstrukcji If Then Else.

Np tu:
Else

0

ClrScr; czy działą w object pascalu i czy wymaga CRT?
Czy jest jakaś prosta komenda na powtórzenie kodu np od wybranej lini?

Chce by program po podaniu niepoprawnej wartości nie tylko wyświetlił komunikat ale też po kliknięciu enter zapytał ponownie o wartość "przekątnej"

program ROMB_09_Patryk_Pok;

var
  przekatna: Integer;
  gwiazdki: Integer = 1;
Begin
//Chciałbym wyczyścić ekran ClrScr; tak by po wpisaniu złej wartości i powrocie do początku programu ekran się czyścił... zerknij komentarz na końcu
   WriteLn('Podaj dlugosc przekatnej rombu:');
   WriteLn('Uwaga tylko NIEPARZYSTE! Wartosc od 3 do 79!');
   ReadLn(przekatna);
    if
    (przekatna mod 2>0) and (przekatna >=3) and (przekatna <=79)
    then
      BEGIN
       while gwiazdki < przekatna do
        begin
          WriteLn(StringOfChar(' ', (przekatna - gwiazdki) div 2), StringOfChar('*', gwiazdki));
          gwiazdki += 2;
        end;
           WriteLn(StringOfChar('*', przekatna));
          repeat
         gwiazdki -= 2;
        WriteLn(StringOfChar(' ', (przekatna - gwiazdki) div 2), StringOfChar('*', gwiazdki));
       until gwiazdki = 1;
       ReadLn;
      END
    else
      BEGIN
        WriteLn('Podano nieprawidlowa wartosc!');
        ReadLn;
        //Coś w stylu idz do początku chce tu dodać czy idź do lini x i wykonaj kod od tego momentu..
      END;
End.                        
 

Da się coś takiego PROSTO osiągnąć jakieś go to czy coś?

HAHA trafiłem z tym goto to chyba z TP pamiętałem ;)

program ROMB_09_Patryk_Pok;

var
  przekatna: Integer;
  gwiazdki: Integer = 1;
  LABEL Restart;
Begin
  Restart:
   WriteLn('Podaj dlugosc przekatnej rombu:');
   WriteLn('Uwaga tylko NIEPARZYSTE! Wartosc od 3 do 79!');
   ReadLn(przekatna);
    if
    (przekatna mod 2>0) and (przekatna >=3) and (przekatna <=79)
    then
      BEGIN
       while gwiazdki < przekatna do
        begin
          WriteLn(StringOfChar(' ', (przekatna - gwiazdki) div 2), StringOfChar('*', gwiazdki));
          gwiazdki += 2;
        end;
           WriteLn(StringOfChar('*', przekatna));
          repeat
         gwiazdki -= 2;
        WriteLn(StringOfChar(' ', (przekatna - gwiazdki) div 2), StringOfChar('*', gwiazdki));
       until gwiazdki = 1;
       ReadLn;
      END
    else
      BEGIN
        WriteLn('Podano nieprawidlowa wartosc!');
        ReadLn;
        goto Restart;
      END;
End.

A najlepsze... TO DZIAŁA ;) Niestety po dodaniu
ClrScr; wywala błąd w tej lini czyli musze dodać uses crt jak w TP?

0
Patryk_P napisał(a):

HAHA trafiłem z tym goto to chyba z TP pamiętałem ;)

Naprawdę to nie jest powód do dumy... Nawet wręcz przeciwnie, to haniebne. Powinieneś teraz postarać się wyeliminować goto. Żeby powtórzyć jakiś kod, zawrzyj go w procedurze/funkcji. Przerób ten kod, żeby używał normalnej pętli, np. while. To nie takie trudne.

Patryk_P napisał(a):

Niestety po dodaniu ClrScr; wywala błąd w tej lini czyli musze dodać uses crt jak w TP?

http://bfy.tw/8DdL
Powinieneś nauczyć się, żeby proste rzeczy wyszukiwać jednak w Google...

1

@Patryk_P - jeśli jeszcze raz napiszesz, że "wywala błąd w linii" zamiast podać treść błędu, zostaniesz skazany na 10 lat ciężkich robót w komarczu; To nie jest forum dla humanistów, więc albo sensownie opisuj problem, albo udawaj że wszystko gra;

Po pierwsze - label to nie jest nazwa zmiennej, a słowo kluczowe zapoczątkowujące sekcję, więc piszemy je tak samo jak słówko Var dla listy zmiennych; Przykład:

var
  LLength: Integer;
label
  Restart, Quit;

Po drugie - korzystaj z wbudowanych funkcji i konstrukcji języka, aby zwiększyć czytelność kodu i go uprościć; Twój warunek:

if (przekatna mod 2>0) and (przekatna >=3) and (przekatna <=79) then

można zapisać jako:

if Odd(Przekatna) and (Przekatna in [3 .. 79]) then

I formatuj kod, stosując wcięcia o długości dwóch znaków, a nie jednego.

0

@ Spine
Nie rozumiem "haniebności" goto...

@ furious programming

VAR
pass:string;
LABEL start1;
 
BEGIN
start1:
write('Podaj hasło: ');
read(pass);
IF pass<>'tajnehaslo' THEN goto start1;
writeln('OK. Haslo poprawne');
END. 
 

Nie wiedziałem, przykład z Waszej strony sugerował że ma być to w sekcji Var choć przykład dla TP...

Uczę się z Waszych kursów, nie mam wiedzy z dziedziny programowania (co pisałem niejednokrotnie) i Twoja wersja zapisu mojej instrukcji jest dla mnie niezrozumiała nie trafiłem jeszcze w początkowych lekcjach na to "odd", mam problem z podstawową składnią języka, nie rozumiem różnicy pomiędzy end a end; wiec sam fakt że coś działa jest już dla mnie sukcesem poniekąd...
Poza TP, w którym nic nie umiem miałem odczynienia tylko z lua => edycja plików gry.
Ja wiem że dla Was moje pytania i problemy są infantylne lub wprost głupie więc tym bardziej dziękuje za pomoc i wszelkie porady...

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