Cezar poprawka

K1
  • Rejestracja:prawie 13 lat
  • Ostatnio:prawie 11 lat
  • Postów:19
0

Przepraszam za tamten temat

Mógłby ktos sprawdzic czy procedura menu jest dobra albo jeszcze podtuningowac to menu

program cezar1;

{$APPTYPE CONSOLE}

uses
SysUtils,classes;
type
chars=set of char;
const
ileliter = 26;

function readfrontfile(filename:string):tstringlist;
var list:tstringlist;
plik:text;
line:string;
begin
list:=tstringlist.create;
assign(plik,filename);
reset(plik);
while not EOF(plik) do
begin
readln(plik,line);
list.add(line);
end;
close(plik);
result:=list;
end;

procedure print(source:tstringlist);
var i:integer;
begin
for i:=0 to source.count -1 do
writeln(source[i]);
end;

procedure writetofile(filename:string; source:tstringlist);
var plik:text;
i:integer;
begin
assign(plik,filename);
rewrite(plik);
for i:=0 to source.count -1 do
writeln(plik,source[i]);
close(plik);
end;

function isalpha(znak:char):boolean;
var litery:chars;
begin
litery := ['A'..'Z'];
if upcase(znak) in litery then isalpha := true
else isalpha:=false
end;

function kodujznak(znak:char;klucz:integer):char;
var wynik:char;
begin
klucz:=klucz mod ileliter;
if isalpha(znak) then
begin
wynik:=chr(ord(znak)+klucz);
if not isalpha(wynik) then wynik:=chr(ord(wynik)-ileliter);
end
else wynik:= znak;
kodujznak:=wynik;
end;

function kodujstring(linia:string;klucz:integer):string;
var wynik:string;
i:integer;
begin
wynik:='';
for i := 1 to length(linia) do
wynik:=wynik+kodujznak(linia[i],klucz);
kodujstring:=wynik;
end;

function cezar(source:tstringlist; klucz:integer):tstringlist;
var wynik:tstringlist;
i:integer;
begin
wynik:=tstringlist.create;
for i := 0 to source.count -1 do
wynik.add(kodujstring(source[i],klucz));
cezar:=wynik;
end;

procedure menu;
begin
writeln('1- Wyswietl niezakodowany plik');
writeln('2- Wyswietl zakodowany');
writeln('3- Zapis do pliku');
writeln('4- Zakoncz program');
end;
procedure cezarmenu;
var zakod,list:tstringlist;
begin
list:=tstringlist.create;
zakod:= tstringlist.create;
list:=readfrontfile('1.txt');
zakod:=cezar(list,3);
writeln('zapisano plik');
end;
var i,wybor:integer;
list,zakod:tstringlist;
begin

menu;
repeat
readln(wybor);
if wybor>4 then
writeln('niepoprawna opcja ');
case wybor of
1 : print(list);
2 : print(zakod);
3 : cezarmenu;

end;
until wybor=4;
writetofile('zakodowane.txt',zakod);

end.

Riddle
Zamiast całej pierwszej procedury mógłbyś po prostu lista.LoadFromFile();
K1
  • Rejestracja:prawie 13 lat
  • Ostatnio:prawie 11 lat
  • Postów:19
0

prosze pomoze ktos ???

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0
kubcio1906 napisał(a):

prosze pomoze ktos ???

1.Sformatuj normalnie kod.
2.Popraw literówki w nazwach.
3.Wrzuć go do pastebin bądź w odpowiednie znaczniki
5.A najlepiej przepisz go od nowa; ale tak, aby był on normalny, a nie to dziwactwo, które dajesz nam do sprawdzenia :|
6.Zauważ, iż brakło pkt.4.


Perełka:

Kopiuj
function readfrontfile(filename:string):tstringlist;
 var list:tstringlist;
 plik:text;
 line:string;
 begin
  list:=tstringlist.create;
  assign(plik,filename);
  reset(plik);
  while not EOF(plik) do
  begin
   readln(plik,line);
   list.add(line);
  end;
  close(plik);
  result:=list;
 end;

[rotfl]
A o czymś takim, jak TStringList.loadFromFile się słyszało?


edytowany 2x, ostatnio: Patryk27
K1
  • Rejestracja:prawie 13 lat
  • Ostatnio:prawie 11 lat
  • Postów:19
0

miałem na zadanie zrobic do tego menu jako funkcja i procedura i kolega mi to podeslal bo jestem zielony z programowania. Mógłbyś to ogarnąc i napisac jak ma byc ?? prosze :)

babubabu
  • Rejestracja:około 13 lat
  • Ostatnio:2 miesiące
  • Lokalizacja:Łódź
  • Postów:648
0

za 100 zł :D

JU
  • Rejestracja:około 22 lata
  • Ostatnio:około miesiąc
  • Postów:5042
0
babubabu napisał(a):

za 100 zł :D

Ja dzisiaj mam nawet dobry humor. Za 98 :P

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0

Czemu wszystko tak komplikować, przecież da się to wszystko zrobić znacznie mniejszym kosztem:

Kopiuj
program cesar;

{$APPTYPE CONSOLE}

uses
  Sysutils,
  Classes;

procedure ReadFile(const FileName:String;var Data:String);
var FS:TFileStream;
begin
  FS:=TFileStream.Create('plik.txt',fmOpenRead);
  SetLength(Data,FS.Size);
  FS.Read(Data[1],Length(Data));
  FS.Free;
  WriteLn(Data);
end;

procedure WriteFile(const FileName:String;const Data:String);
var FS:TFileStream;
begin
  FS:=TFileStream.Create('plik.txt',fmCreate);
  FS.Write(Data[1],Length(Data));
  FS.Free;
end;

procedure ReadKey(var Key:Byte);
begin
  Write('Podaj klucz: ');
  ReadLn(Key);
end;

procedure Code(var Data:String;Key:Byte);
var I:Integer;
var Ch:Char;
begin
  for I:=1 to Length(Data) do
  begin
    Ch:=Data[I];
    if ('a'<=Ch)and(Ch<='z') then
    begin
      Data[I]:=Chr(Ord('a')+((Ord(Ch)-Ord('a')+Key)mod(26)));
    end
    else if ('A'<=Ch)and(Ch<='Z') then
    begin
      Data[I]:=Chr(Ord('A')+((Ord(Ch)-Ord('A')+Key)mod(26)));
    end
  end;
  WriteLn(Data);
end;

procedure go;
var x,Data:String;
var Key:Byte;
begin
  Key:=13;
  ReadFile('plik.txt',Data);
  Code(Data,Key);
  while true do
  begin
    WriteLn('1: Wczytaj plik');
    WriteLn('2: Ustaw klucz');
    WriteLn('3: Koduj');
    WriteLn('4: Dekoduj');
    WriteLn('5: Zapisz plik');
    WriteLn('0: Koniec');
    Write('wybierz: '); 
    ReadLn(x);
    x:=Trim(x);
    if x='1' then ReadFile('plik.txt',Data)
    else if x='2' then ReadKey(Key)
    else if x='3' then Code(Data,Key)
    else if x='4' then Code(Data,Key+25)
    else if x='5' then WriteFile('plik.txt',Data)
    else if x='0' then Exit
    else WriteLn('Niema takiej opcji');
    WriteLn;
  end;
end;

begin
  go;
end.

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 12 godzin
  • Lokalizacja:Tuchów
  • Postów:12166
0
Kopiuj
var x,Data:String;

{...}

ReadLn(x);
x:=Trim(x);
if x='1' then ReadFile('plik.txt',Data)
else if x='2' then ReadKey(Key)
else if x='3' then Code(Data,Key)
else if x='4' then Code(Data,Key+25)
else if x='5' then WriteFile('plik.txt',Data)
else if x='0' then Exit
else WriteLn('Niema takiej opcji');

@_13th_Dragon, dlaczego zmienna X jest typu łańcuchowego? Chcesz zabezpieczyć się przed wpisaniem wartości nieliczbowej? Można pobrać liczbę (np. Byte) i obsłużyć ją instrukcją wyboru case .. of .. end...?

Kopiuj
var
  X: Byte;
begin
  {...}

  ReadLn(X);

  case X of
    0: Exit;
    1: ReadFile('Plik.txt', Data);
    2: ReadKey(Key);
    3: Code(Data,Key);
    4: Code(Data,Key+25);
    5: WriteFile('Plik.txt',Data);
  else
    WriteLn('Niema takiej opcji');
  end;

  {...}
end;

Poza tym procedura Go jest niepotrzebna - jej kod powinien znaleźć się w głównym bloku programu; Jeśli miałbym pobrać X jako łańcuch - i tak wpakowałbym ją w ww. blok warunkowy:

Kopiuj
var
  X: String;
begin
  {...}

  ReadLn(X);
  Trim(X);

  if (not (Length(X) in [1])) or (not (X[1] in ['0' .. '5'])) then
    WriteLn('Niema takiej opcji')
  else
    case X[1] of
      '0': Exit;
      '1': ReadFile('Plik.txt', Data);
      '2': ReadKey(Key);
      '3': Code(Data, Key);
      '4': Code(Data, Key + 25);
      '5': WriteFile('Plik.txt', Data);
    end;

  {...}
end;

Poza tym w zdaniu Niema takiej opcji jest błąd - nie ma pisze się osobno;


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 2x, ostatnio: flowCRANE
_13th_Dragon
A propos Byte zamiast String, jak twój program zareaguje na wpisanie literek zamiast liczb? Owszem da się zabezpieczyć przed tym zaś trzeba użyć dodatkowego try except, więc albo brak idioto-odporności albo dużo dodatkowych instrukcji. A propos bloku głównego zawsze staram się unikać zmiennych globalnych i tobie radzę, procedura go pozwala uniknąć trzech zmiennych globalnych. Więc radzę ci pozostać przy czepianiu się do literówek, bo twoje "usprawnienia" są bez sensu.
flowCRANE
Jak byś zauważył to nie są zmienne globalne, tylko lokalne procedury! To nie są usprawnienia tylko inne rozwiązanie, bo dają to samo; Poza tym w kółko powtarzanie "if then else if then else if..." jest dopiero bez sensu rozwiązaniem; Od tego jest blok warunkowy "case of end" by dokonywać większego wyboru niż "else";
_13th_Dragon
Co do zmiennych globalnych, to czy chcesz powiedzieć że w twoim innym rozwiązaniu zmienne: X,Key,Data to nie są zmiennymi globalnymi tylko procedurami lokalnymi? Co do if else if to czy ty myślisz że case robi co innego?
flowCRANE
Co do zmiennych globalnych - po to jest możliwość w taki sposób deklarowania ich by z tego korzystać; Jak sie robi to z głową - nie będzie przez to żadnych komplikacji; Jeśli chodzi o blok "case" - napisałem "To nie są usprawnienia tylko inne rozwiązanie, bo dają to samo;" - więc wiem, że to samo robi; Przedstawiłem taki sposób po to, by uniknąć "drabinki" z if'ów, czyli zwiększyć przejrzystość kodu; Nie napisałem że to błąd - podałem tylko inne rozwiązanie;
flowCRANE
W poście poniżej uzasadniłem swoją wypowiedź przedstawiając porównanie naszych warunków; Dlatego sądzę, że kłótnia jest nieotrzebna; Ja szanuje Twoje zdanie, ale nie pozwole sobie obrażać mnie; To, że Twoje zdanie jest inne nie upoważnia Cię do złośliwych komentarzy;
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 12 godzin
  • Lokalizacja:Tuchów
  • Postów:12166
0
_13th_Dragon napisał(a)

więc albo brak idioto-odporności albo dużo dodatkowych instrukcji.

Tak? Dużo? A porównałeś sobie Twój kod z moim? Bo różnica jakbyś zauważył jest w jednej linijce, między tą (Twoją):

Kopiuj
else WriteLn('Niema takiej opcji');

a tą (moją):

Kopiuj
if (not (Length(X) in [1])) or (not (X[1] in ['0' .. '5'])) then

którą w sumie można skrócić do:

Kopiuj
if (Length(X) <> 1) or (not (X[1] in ['0' .. '5'])) then

Dużo instrukcji? Trzba umieć posługiwać się łączeniem warunków - tyle dodatkowych instrukcji;

Poza tym, jeśli by sformatować po ludzku ten warunek:

Kopiuj
if x='1' then ReadFile('plik.txt',Data)
else if x='2' then ReadKey(Key)
else if x='3' then Code(Data,Key)
else if x='4' then Code(Data,Key+25)
else if x='5' then WriteFile('plik.txt',Data)
else if x='0' then Exit
else WriteLn('Niema takiej opcji');

powstanie to:

Kopiuj
if x='1' then
  ReadFile('plik.txt',Data)
else
  if x='2' then
    ReadKey(Key)
  else
    if x='3' then
      Code(Data,Key)
    else
      if x='4' then
        Code(Data,Key+25)
      else
        if x='5' then
          WriteFile('plik.txt',Data)
        else
          if x='0' then
            Exit
          else
            WriteLn('Niema takiej opcji');

co jest o wiele mniej czytelne, niż ten:

Kopiuj
if (Length(X) <> 1) or (not (X[1] in ['0' .. '5'])) then
  WriteLn('Niema takiej opcji')
else
  case X[1] of
    '0': Exit;
    '1': ReadFile('Plik.txt', Data);
    '2': ReadKey(Key);
    '3': Code(Data, Key);
    '4': Code(Data, Key + 25);
    '5': WriteFile('Plik.txt', Data);
  end;

z zastosowaniem odpowiedniego bloku wyboru, którego nie potrzeba i nie ma możliwości skrócić;

_13th_Dragon napisał(a)

Więc radzę ci pozostać przy czepianiu się do literówek, bo twoje "usprawnienia" są bez sensu.

Czym się denerwujesz? Dobrze wiesz, że mam rację i co do długości i do przejrzystości kodu, więc jak nie umiesz znieść krytyki to nie odgryzaj się w ten sposób; Nic Ci nie zrobiłem, więc nie rozumiem Twojej nieuzasadnionej zgryźliwości;

Więc radzę ci pozostać [...]

Ci pisze się dużą literą, tak samo jak Tobie, Twój itd.. Kultury trochę i poszanowania prosiłbym;


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 2x, ostatnio: flowCRANE
Zobacz pozostałe 9 komentarzy
flowCRANE
Douczyli, nie martw się o to; Jednych to nie obchodzi, drugich razi; "Jeżeli zawodowiec zacznie szanować inności zdania to stanie się amatorem" - naprawdę masz problem, przy czym nie pałasz skromnością; Z takimi jak Ty nie ma sensu dyskutować, skoro zdania innych nie szanujesz; A jest różnica między "szanować" a "zgadzać się"; To drugie potrzebuje faktu, pierwsze nie;
_13th_Dragon
Podsumujmy: Próbujesz promować zdecydowanie gorszę rozwiązanie jako lepsze. Mimo wskazania faktów nadal nie zamierzasz się przyznać że to co promujesz jest gorsze. A przy tym wszystkim żądasz wyrażenia do ciebie szacunku większego (większego wyrażenia) niż to się należy Bogu. I kto tu ma problem?
Patryk27
@_13th_Dragon: przed chwilą przeprowadziłem testy wydajności case oraz if. Wyniki (na 5 milionów iteracji): 156 dla IF, 125 dla CASE. CASE jest czytelniejsze i szybsze w działaniu. Kod: http://4programmers.net/Pastebin/1749 (testowane pod FPC 2.6.0); masz fakty. Nawet jeżeli kod assembler w case jest dłuższy, to jest to szybsze. Koniec, kropka. (z tego, co zrozumiałem z tego, co pisaliście...).
_13th_Dragon
Owszem tak się manipuluję prawdą, zobacz to: http://4programmers.net/Pastebin/1751 szczegóły niżej.
flowCRANE
Szacunek należy się wszystkim, a największy Bogu; Poza tym, pisanie ww. zwrotów jest wysoko cenione w społeczeństwie, w którym żyję i każdy z nas został tak nauczony; Nic nie promuję, tylko przedstawiam alternatywę, która dla szkolnego laika jest obojętna, bo w tak niskim skomplikowaniu algorytmu szybkość można mieć w głebokim poważaniu; A znajomość kilku rozwiązań danego zagadnienia jest zaletą; Dlatego skończ się upierać, bo ja mam swoje wartości, Ty swoje; Ja przedstawiam alternatywę, Ty próbujesz mnie zgnoić za inność zdania, więc zejdź ze mnie, bo nie uda Ci się;
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0

Patryk27, przy takim podejściu jak u ciebie to mogę udowodnić że 2*2=5

Popełniłeś kilka błędów w pisaniu testu sprawdzającego.

  1. Użyłeś składni akceptowalnej przez niewiele kompilatorów pascala (mam na myśli połączenie String z Case).
  2. Dałeś bardzo małą ilość kroków te 5 mln to nieprawda, włącz i poczytaj ostrzeżenia kompilatora (przy standardowych ustawieniach - błąd).
  3. Odpalasz najpierw ten który chcesz aby wypadł gorzej (pierwsze kilka instrukcji zawsze są wolniejsze, mogę wyjaśnić czemu).
  4. Drastycznie zmniejszyłeś ilość opcji (do 3-ch).
  5. Wywaliłeś else które tu jest bardzo istotne.
  6. Testujesz tylko dla jednej konkretnej wartości X.

Po naprawieniu przynajmniej kilku z tych błędów wynik jest zupełnie odwrotny:
http://4programmers.net/Pastebin/1751


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

Poszczególne testy dla:
Pierwsze trzy - integer
Następne trzy - char
Ostatnie trzy - string

Kompilowane pod FPC 2.6.0.

Kod (w tym wypadku dla typu string dla testu trzeciego; dla char kod jest taki sam, dla integer jest X := Random(4)):
http://4programmers.net/Pastebin/1752

Różnica pomiędzy pierwszym,drugim a trzecim testem jest taka, iż za trzecim podejściem zmieniałem zakres losowania (np.z random(4) na random(50)).

Bez dłuższego przeciągania - screenshoty (testowane na Intel Core 2 Duo i 2 GB ramu):

INTEGER
int_run1.pngint_run2.pngint_run3.png

CHAR
char_run1.pngchar_run2.pngchar_run3.png

STRING
string_run1.pngstring_run2.pngstring_run3.png


_13th_Dragon
Powiedz mi po kiego próbujesz nagiąć prawdę? Kod który podałeś nie kompiluje się pod FPC 2.6.0 Z powodu przekroczenia zakresu przez stałą. Po poprawieniu na Const Count:Cardinal = 50000000; wraz ze zmienną I wywala Runtime error 201. Więc wnioskuje że te ekrany są spreparowane.
Patryk27
Nagrać ci filmik jak to kompilowałem? Lazarus 0.9.30.4 z FPC 2.6.0 2012/03/14 kompiluje się bezproblemowo (jedynie jest hint, że zmienna A jest nieużywana).
Patryk27
Podpowiedź: flaga "Mobjfpc". Następnym razem może od razu tak nie oskarżaj, dobrze? Wyniki nie są spreparowane. Jeżeli nie wierzysz, to trudno. Ja wiem, co kompilowałem i wiem jakie były wyniki.
_13th_Dragon
Są spreparowane, czytaj post niżej.
pelsta
  • Rejestracja:prawie 19 lat
  • Ostatnio:około 22 godziny
  • Postów:819
0

@13th_Dragon, @Furious Programming

Dlaczego do obsługi prostego menu w aplikacji konsolowej używacie zmiennej typu string ewentualnie Byte?
Przecież do tego idealnie nadaje się typ Char i proste sprawdzenie warunków instrukcją case, nie martwiąc się długością stringa i sprawdzaniem czy wprowadzono cyfrę czy literę.

flowCRANE
Dlatego, że Dragon zastosował łańcuch; Ma dużą rację, że korzystając z typu "String" w pełni obsługuje wszelkie wartości, które nie pasują do pozycji w menu; Ja podałem "Byte" by uwidocznić "przejrzystość kodu" stosując blok "case of end"; Twoje rozwiązanie natomiast jest kompromisem pomiędzy rozwiązaniem Dragona, a moim (można ewentualnie wykorzystać rzutowanie); Ja nie chciałem nic mieszać, tylko pokazać, że warto stosować opisany przeze mnie blok ze względów wizualnych; Ale Pan Zawodowiec usilnie chce mnie zgnoić za to, że podałem rozwiązanie czytelniejsze od jego;
_13th_Dragon
Czytelniejsze, może dla niektórych, w takich zakresach case czy if to jest kwestja subiektywna. Nie chcę cię zgnoić tylko próbuję wszystkim odradzić: - niepotrzebnej konwersji na liczbę z brakiem obsługi nie liczb + case; -niepotrzebnych specjalnych warunków aby wyłuskać pierwszy znak napisu + case, zamiast użyć zwykłego łańcucha if'ów. A do tego wcina się Patryk27 który próbuje udowodnić że case jest szybszy od if'a, nie wiedząc nawet na co kompiluje się case w pascalu.
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
0

Mam FPC bez lazarusa. 2.6.0 widać wynik kompilacji.

Z małego czasu wnioskują że nie dochodzi do podanej przez ciebie wartości Count - więc mało kroków jest wykonywanych.
Zmieniłeś zakres losowanych liczb do 30 owszem else w case jest szybsze niż ostatnie else w łańcuchu if, z tym że musiałeś zrobić proporcję 1:9 aby pojawiła się jakaś przewaga case'a. Przeważnie to w "żadne z powyższych" programy wpadają rzadko, przynajmniej ten program o którym dyskutujemy w tym temacie.
Dla innych wariantów niż string kodu nie przedstawiłeś.

Dobierając dane w specjalny sposób łatwo udowodnić że quick-sort jest wolniejszy od bąbelkowego.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)