LaTeX/Слика

окружење омогућава програмирање слика директно у LaTeX-у. Са једне стране, постоје веома строга ограничења, као што су нагиби делова линија као и радијуси кругова који су ограничени на узак избор вредности. Са друге стране, окружење слике LaTeX2e-а доноси са собом у \qbezier команди, "q" што означава ''квадратну''. Доста најчеће коришћених кривих као што су кругови, елипсе, и catenaries могу се задовољавајући апроксимирати користећи Безијерове криве, ово ипак захтева математички тежак посао. Ако се користи програмски језик као Java за прављење \qbezier блокова LaTeX улазних фајлова, окружење слике постаје моћно.
Иако је прављење слике директно у LaTeX-у веома ограничено, и често одузима доста времена, и даље постоје разлози да се слика баш у њему прави. Документи прављени на овај начин су "мали" у бајтовима, и нема додатних фајлова графика које морају да иду уз фајл.
Пакети као што су , , или побољшавају оригинално окужење слике, и доста ојачавају графичку моћ LaTeX-а.
1 Основне команде
окружење доступно је у доста LaTeX дистрибуција, без потребе за убацивањем додатних пакета. Ово окрућење прави се помоћу ових команди
или
Први пар, <math>(x, y)</math>, утиче на резервацију, унутар документа, правоугаоног простора слике.
Опциони други пар, <math>(x_0, y_0)</math>, додељује произвољне кординате доњем левом углу затвореног правоугаоника .
Бројеви ''x'', ''y'', ''x''0, ''y''0 су бројеви (дужине) у јединицама , који се могу увек рестартовати (али не у окружењу слике) са комадама као што су
Основна вредност је .
Већина команди за цртање има једну од две форме
или
Безијерове криве су изузетак. Оне се цртају са овом командом
Са пакетом апсолутне димензије (на пример 15pt) и експресије су дозвољене, заједно са бројевима релативним на .
2 Линијски сегменти
Линијски сегменти цртају се следећим командама:
команда има два аргумента:
# вектор правца,
# "дужину" (отприлике: овај аргумент је вертикална дужина у случају вертикалних сегментних линија и у свим осталим случајевима је хоризонтална удаљеност линије, а не дужина самог сегмента).
Компоненте вектора дужине су огранићене на интиџере (''−6, −5, ... , 5, 6'') и морају да буду прости бројеви (дељиви само са један). Доња фигура илуструје свих 25 могућих нагиних вредности у првом квадранту. Дужина је релетивна у односу на .
3 Стрелице
Стрелице се цртају са командом
За стрелице, компоненте вектора правца су још уже ограничене него ли компоненте линијских сегмената, углавном на интиџере (''−4, −3, ... , 3, 4''). Компоненте такође морају да буду прости бројеви (дељии само са 1). приметите ефекте команде на две стрлице које показују на горњи леви угао.
4 Кругови
Команда
Црта круг са центром (x, y) и пречником (не полупречник) одређеним са ''diameter''. Окружење слике прима само пречнике до 14mm, па чак и испод ове границе, нису сви пречници могући. команда прави дискове (испуњене кругове). Као у случају линијских сегмената, морали бисте да потражите додатне пакете, као што су , , или .
Ово је још јенда могућност у оквиру окружења слике. Ако се не плашите неопходних прорачунавања (или их оставите да их програм одради), поизвољни кругови и елипсе могу се закрпити помоћу Безијерових квадратних кривих . Погледајте ''Graphics in LaTeX2e'' за примере и Java изворне фајлове.
5 Текст и формуле
као што овај пример показује, текст и формуле могу зе писати у окружењу са командом на уобичајен начин:
6 \multiput and \linethickness
Команда
има 4 аргумента: почетну тачку, вектор транслације од једног објекта до другог, број објеката, и објекат који се црта. \linethickness команда односи се на хоризонталне и вертикалне сегменте, али не на косе сегменте, а ни на кругове. Али односи се,ипак, на Безијерове квадратне криве!
7 Овали
Команда
или
прави овал центриран у ''(x, y)'' са ширином ''w'' и висином ''h''. Опциони аргументи позиције ''b, t, l, r'' односе се на "горе", "доле", "лево", "десно", и могу нити комбиновани, као што пример илуструје. Дебљина линије може да се контролише помоћу ове две команде: са једне стране, и са друге. Док се односи на хоризонталне и вертикалне линије (и квадратне безијерове криве), и се односе на криволинијске сегменте као и на кругове и овале.
8 Више примена предефинисаних сликовних сандука
сандук слике може се ''декларисати'' командом
па се ''дефинише'' са
и коначно произвољно ''цртан'' са
Опциони параметар позиције има ефекат дефинисања "тачке уточишта" savebox-а. У примеру постављен је на "bl" који поставља тачку уточишта у дну левог угла savebox-а. Други одредници позиције су горе и десно.
''име'' аргумент се односи LaTeX складишни bin и као такав има природу команде (што објашњава косе црте у овом примеру). Усандучене слике могу се повезати: У овом примеру, се користи у оквиту дефиниције . команда морала је се користити јер команда не ради ако је дужина сегмента мања од 3 mm.
9 Квадратне Безијерове криве
Команда
црта квадратну Безијерову криву где <math>P_1 = (x_1, y_1)</math>, <math>P_2 = (x_2, y_2)</math> означава крајње тачке, и <math>S = (x, y)</math> означава средњу контролну тачку. Респективне тангентне косине, <math>m_1</math> и <math>m_2</math>, могу се добавити из једначина
:<math>
\begin{cases}
x= \frac{m_2 x_2 - m_1 x_1 - (y_2 - y_1)}{m_2 - m_1} \\
y= y_i + m_i (x - x_i); \quad (i=1,2\, \hbox{ даје нека решења})
\end{cases}
</math>
Погледајте ''Graphics in LaTeX2e'' за Java програм који прави неопходну линију комадне.
Као што овај пример илуструје, дељење круга у 4 квадратне Безијерове криве није погодно. Најмање 8 је потребно. Фигура поново показује ефекат команде на хоризонталне и вертикалне линије, па и на и команде криволинијских сегмената . Такође показује да обе врсте команди утичу на квадратне Безијерове криве, а свака комада постаје важнија од претходне .
10 Катемптоте
У овој фигури, свака симетрична половина катемптоте <math>y= \cosh x - 1</math> је апроксмирана Безијеровом квадратном кривом. Десни део криве завршава се у тачки (2, 2.7622), где нагиб има вредност m = 3.6269.Користећи поново једначину (*), можемо израчунати средњу котролну тачку. А оне су (1.2384, 0) и (−1.2384, 0). Крстићи указују натачке реалне катемптоте. Грешка је једва видљива, јер је мањаид 1%. Овај пример указуке на коришћење опционалних аргумената команде. Слика је дефинисана у одговарајућим "математичким" координатама, где је у команди
њен доњи леви угао (означен са црним диском) у координатама (−2.5,−0.25).
11 Плотовање графика функција
Контролне тачке Безијерових кривих израчунате су формулама (*). Позитивна грана је одређена са <math>P_1 = (0, 0)</math>, <math>m_1 = 1</math> and <math>P_2 = (2, \tanh 2)</math>, <math>m_2 = 1/ \cosh^2 2</math>. Поново, the слика је дифинисана у математички одговарајућим координатама , и доњем левом углу додељене су математичке координате (−3,−2) (црни диск).
12 окружење слике и gnuplot
Моћни научни пакет за плотовање gnuplot има могућност да се директно убаци у окружење. Често је погодније да се плотује директно у LaTeX , јер нам то омогућава да се после не бавимо са потенцијално проблематичним постскрпт фајловима. Плотовање научних података (или, такође, математичких фигура) на овај начин даје много бољу контролу, и наравно могућност typesetting-а, но доступан је и за друге потребе (као што је постскрипт ).
Такве слике се онда могу додати у документ користећи команду.
N.B. gnuplot је моћан софтвер са доста команди. Пуна дискусија о gnuplot-у не може се провући кроз једну ноту . Погледајте туторијал.
en:LaTeX/Picture


Водич за Пајтон 2.6/Булови изрази

Овде је мали пример Булових израза(не морате да га куцате):
a = 6
b = 7
c = 42
print 1, a == 6
print 2, a == 7
print 3, a == 6 and b == 7
print 4, a == 7 and b == 7
print 5, not a == 7 and b == 7
print 6, a == 7 or b == 7
print 7, a == 7 or b == 6
print 8, not (a == 7 and b == 6)
print 9, not a == 7 and b == 6
Са излазом:
1 True
2 False
3 True
4 False
5 True
6 True
7 False
8 True
9 False
Шта се дешава? Програм се састоји од гомиле чудних print наредби. Свака print наредба штампа број и израз. Број служи да помогне да пратимо стазу наредбе којом се рачунар бави. Обратите пажњу како се сваки израз заврши као False или True. У Пајтону, нетачно се такође може написати као 0 а тачно као 1.
Линије:
print 1, a == 6
print 2, a == 7
штампа True и False односно баш као што се очекује, јер прва је тачна, а друга је нетачна. Трећа штампа, print 3, a == 6 and b == 7, је мало другачија. Оператор and значи да ако су обе наредбе пре и после тачне онда ће цеп израз бити тачан, у супротном цео израз ће бити нетачан. Следећа линија, print 4, a == 7 and b == 7, приказује ако је део пре and израза нетачан, онда је све нетачно. Понашање and наредбе се може сажети на следећи начин:
израз, резултат
тачно and тачно, тачно
тачно and нетачно, нетачно
нетачно and тачно, нетачно
нетачно and нетачно, нетачно
Обратите пажњу да ако је први израз је лажан Пајтон не чека други израз, јер зна да је цео израз лажан.
Следећа линија, print 5, not a == 7 and b == 7, користи not операцију. not само даје супротан израз. (Израз се може преправити овако  print 5, a != 7 and b == 7). Овде је табела:
израз, резултат
not тачно, нетачно
not нетачно, тачно
Следеће две линије, print 6, a == 7 or b == 7 и print 7, a == 7 or b == 6, користе or операцију. Операција or враћа тачно ако је први израз тачан, или ако је други таћан или ако су оба. Ако ниједан није тачан враћа нетачно. Овде је табела:
израз, резултат
тачно or тачно, тачно
тачно or нетачно, тачно
нетачно or тачно, тачно
нетачно or нетачно, нетачно
Имајте на уму да ако је први израз тачан Пајтон не проверава други израз пошто зна да је цео израз тачан. Ово ради or да је тачно ако је бар једна половина израза тачна. Први део је тачан тако да ће други део бити или тачан или нетачан, али је цео израз и даље тачан.
Следеће две линије, print 8, not (a == 7 and b == 6) и print 9, not a == 7 and b == 6, приказују како заграде могу користити за груписање израза и тада тражи да се један део први израчуна. Приметите да су заграде промениле израз из нетачно у тачно. То се догодило јер су заграде приморале not да се примени на цео израз осим на само a == 7 део.
Овде је пример коришћења Булових израза:
листа = ["Живот", "Универзум", "Све", "Џек", "Џил", "Живот", "Џил"]
# направите копију листе. погледајте поглавље Више са листама да видите шта [:] значи.
коп = листа[:]
# сортирање копије
коп.sort()
прет = коп[0]
del коп[0]
бројање = 0
# проћи кроз листу у потрази за паром
while бројање < len(коп) and коп[бројање] != прет:
прет = коп[бројање]
бројање = бројање + 1
# Ако пар није пронађен онда бројање не може бити мање од дужине
# јер се while петља наставља док је бројање мање од дужине
# а није пронаћен пар
if бројање < len(коп):
print "Први пар:", прет
И овде је излаз:
Први пар: Џил
Овај програм ради настављајући да проверава пар while бројање < len(коп) and коп[бројање] није једнако прет. Онда је бројање веће од последњег индекса коп или је пар пронађен and више није тачно па петља постоји. if једноставно проверава да се увери да је из while петље изашао јер је пронађено подударање.
Други "трик" је and коришћен у овом примеру. Ако погледате у табелу за and приметићете да је трећи улаз "нетачан и неће проверавати". Ако бројање >= len(коп) (другим речима бројање < len(коп) је нетачно) онда коп[пројање] није никад погледано. Ово је зато што Пајтон зна да ако је први тачан онда не могу оба бити тачна. Ово је познато као пречица и корисно је, ако ће друга половина and изазвати грешку ако нешто није добро. Ја користим први израз (бројање < len(коп)) да проверим и видим да ли је бројање добар индекс за коп. (Ако ми не верујете уклоните парове "Џил" и "Живот", проверите да ли и даље ради, а онда обрните редослед бројање < len(коп) and коп[бројање] != прет у коп[бројање] != прет and бројање < len(коп).)
Булови изрази могу да се користе када треба да проверите две или више различитих ствари одједном.
0.1 Напомена о Буловим операторима
Уобичајена грешка за људе нове у програмирању је неразумевање начина на који логички оператори раде, која произилази из начина на који пајтон преводилац чита ове изразе. На пример, након првобитног учења о "and " и "or" исказима, могло би се претпоставити да ће израз x == ('a' or 'b') проверавати да види ако је променљива x једнака низу 'a' или 'b'. То није. Да бисте видели о чему причам, започните интерактивну сесију са преводиоцем и унесите следеће изразе:
>>> 'a' == ('a' or 'b')
>>> 'b' == ('a' or 'b')
>>> 'a' == ('a' and 'b')
>>> 'b' == ('a' and 'b')
И ово ће бити неинтуитиван резултат:
>>> 'a' == ('a' or 'b')
True
>>> 'b' == ('a' or 'b')
False
>>> 'a' == ('a' and 'b')
False
>>> 'b' == ('a' and 'b')
True
Са ове тачке, and и or оператери изгледају да су сломљени. Нема смисла да је, за прва два израза, 'a' једнако 'a' или 'b' док 'b' није. Штавише, нема смисла да је 'b' једнако 'a' и 'b'. Након разматрања шта преводилац ради са логичким операторима, ови резултати раде у ствари управо оно што сте тражили од њих, то једноставно није исто као оно што сте мислили да питате.
Када Пајтон преводилац гледа or израз, узима прву изјаву и проверава да ли је истина. Ако је прва изјава тачна, онда Пајтон враћа вредност тог објекта без проверавања друге изјаве. Ово је зато што је за or израз, цела ствар тачна ако је једна од вредности тачна; програм не мора да се бави другом изјавом. Са друге стране, ако је прва вредност нетачна Пајтон проверава другу половину и враћа ту вредност. Та друга половина одређује вредност целог израза јер је прва била нетачна. Ова "лењост" дела интерпретера се зове "пречица" и представља уобичајен начин вредновања булових израз у многим програмским језицима.
Слично, за and израз, Пајтон користи технику пречице да убрза истинитосну процену вредности. Ако је прва изјава нетачна онда цео израз мора бити нетачан, па ово враћа ту вредност. У супротном ако је прва вредност тачна он проверава другу и враћа вредност.
Једну ствар имајте на уму у овом тренутку,а то је да Булов израз враћа вредност указујући на True или False, али Пајтон сматра да велики број различитих ствари има истине вредности додељене на њих. Да бисте проверили истинитосну вредност о било ком предмету x, можете користити функцију bool(x) да видите његову истинитосну вредност. Испод је табела са примерима вредности истине разних објеката:
Тачно, Нетачно
Тачно, Нетачно
1, 0
Бројеви различити од нуле, Низ 'None'
Не-празан низ, Празан низ
Не-празна листа, Празна листа
Не-празни речници, Празни речници
Сада је могуће разумети збуњујући резултате које смо добијали када смо тестирали те булове изразе пре. Хајде да погледамо шта интерпретер "види" када пролази кроз тај код:
Први случај:
>>> 'a' == ('a' or 'b') # Погледајте заграде прво, тако је вредност израза "('a' or 'b')"
# 'a' је не-празан низ, па је прва вредност тачна
# Враћа ту прву вредност: 'a'
>>> 'a' == 'a' # низ 'a' је једнак низу 'a', па је израз тачан
True
Други случај:
>>> 'b' == ('a' or 'b') # Погледајте заграде прво, тако је вредност израза "('a' or 'b')"
# 'a' је не-празан низ, па је прва вредност тачна
# Враћа ту прву вредност: 'a'
>>> 'b' == 'a' # низ 'b' није једнак низу 'a', па је израз нетачан
False
Трећи случај:
>>> 'a' == ('a' and 'b') # Погледајте заграде прво, тако је вредност израза "('a' and 'b')"
# 'a' је не-празан низ, па је прва вредност тачна, испитати другу вредност
# 'b' је не-празан низ, па је друга вредност тачна
# Враћа ту другу вредност као резултат целог израза: 'b'
>>> 'a' == 'b' # низ 'a' није једнак низу 'b', па је израз нетачан
False
Четврти случај:
>>> 'b' == ('a' and 'b') # Погледајте заграде прво, so evaluate expression "('a' and 'b')"
# 'a' је не-празан низ, па је прва вредност тачна, испитати другу вредност
# 'b' је не-празан низ, па је друга вредност тачна
# Враћа ту другу вредност као резултат целог израза: 'b'
>>> 'b' == 'b' # низ 'b' је једнак низу 'b', па је израз тачан
True
Тако да је Пајтон заиста радио свој посао када је дао те наизглед лажне резултате. Како је већ поменуто, важно је да препозна шта ће вредност вашег Буловог израза вратити када се процењује, јер није увек очигледно.
Да се вратимо тим првим изразима, овако би сте их написати тако да би се понашали на начин на који желите:
>>> 'a' == 'a' or 'a' == 'b'
True
>>> 'b' == 'a' or 'b' == 'b'
True
>>> 'a' == 'a' and 'a' == 'b'
False
>>> 'b' == 'a' and 'b' == 'b'
False
Када би се ова поређења оцењивала вратиле би се вредности истине у погледу Тачно или Нетачно, не као низови, тако да смо добили одговарајуће резултате.
0.2 Примери
шифра1.py
## Овај програм пита корисника за име и лозинку.
# Затим их проверава, да ли је кориснику дозвољено унутра.
име = raw_input("Које је Ваше име? ")
шифра = raw_input("Која је шифра? ")
if име == "Џош" and шифра== "Петак":
print "Добродошао Џоше"
elif име == "Фред" and шифра== "Рок":
print "Добродошао Фреде"
else:
print "Не познајем те."
Примери
Које је Ваше име? Џош
Која је шифра? Петак
Добродошао Џоше
Које је Ваше име? Бил
Која је шифра? Новац
Не познајем те.
0.3 Вежбе
Напишите програм који има задатак да кориснику погоди име, али има само 3 поготка
док се програм не заврши.
en:Non-Programmer's Tutorial for Python 2.6/Boolean Expressions


LaTeX/Писма

Понекад су свакодневне ствари најтеже. Међутим, не мора тако да буде због развијених, шаблона који су прилагођени за кориснике. Срећом, LaTeX дозвољава веома брзо писање писама, са мало муке.
1 Класа писама
Да бисте писали писма користике стандардну класу докумената ''letter''.
Можете писати више писама у једној LaTeX датотеци - свако почните са и завршите са . Можете да оставите ''прималац'' непопуњено. Свако слово се састоји из четири дела.
# Увод (нешто налик на или ).
# Разрада (написан као по обичају у LaTeX-у). Ако желите исту разраду у свим писмима, можда ћете пожелети да размотрите постављање целе разраде у нову команду налик на а онда да употребите у свим писмима.
# Закључак (налик на ).
#: LaTeX ће оставити празан простор после тзакључка за ваш ручно написан потпис; онда ће ставити ваше име и презиме, ако сте их прогласили.
# Додатни елементи: пост скрипта, индиго копија и списак прилога.
Ако желите да ваше се име, адреса и број телефона појаве у писму, морате их прогласити првим потписивањем, адресом и телефоном.
Излазно писмо ће изгледати овако:
Ово је код овог примера:
<syntaxhighlight>
\documentclass{letter}
\usepackage{hyperref}
\signature{Joe Bloggs}
\address{21 Bridge Street \\ Smallville \\ Dunwich DU3 4WE}
\begin{document}
\begin{letter}{Director \\ Doe \& Co \\ 35 Anthony Road
\\ Newport \\ Ipswich IP3 5RT}
\opening{Dear Sir or Madam:}
I am writing to you on behalf of the Wikipedia project (http://www.wikipedia.org/),
an endeavour to build a fully-fledged multilingual encyclopaedia in an entirely
open manner, to ask for permission to use your copyrighted material.
% \ldots команда производи тачке на начин који неће пореметити
% подешавање типа документа.
\ldots
That said, allow me to reiterate that your material will be used to the noble end of
providing a free collection of knowledge for everyone; naturally enough, only if you
agree. If that is the case, could you kindly fill in the attached form and post it
back to me? We shall greatly appreciate it.
Thank you for your time and consideration.
I look forward to your reply.
\closing{Yours Faithfully,}
\ps
Пс. Можете наћи цео текст GFDL лиценсе на
\url{http://www.gnu.org/copyleft/fdl.html}.
\encl{Copyright permission form}
\end{letter}
\end{document}
</syntaxhighlight>
Да померите закључак и потписне делове на леву страну, убаците следеће пре :
Величина простора са леве стране може бити може бити прилагођена са повећањем 0pt.
2 Коверте
2.2 Употреба пакета
пакет обезбеђује прилагођавање команде, дозвољавајући кориснику да штампа на на било коју од изабраних ознака или беличина коверата. На пример, започињати вашу LaTeX датотеку на овај начин производи дукумент који укључује писмо и коверту бизнис величине (#10) на следећој страни.
Односи се на за више информација о овом способном пакету. Приметите да пакет има проблеме са приказивањем знакова који не припадају базичном ASCII комплету знакова, погледајте за више информација.
2.2 Употреба пакета
Овде је једна релативно проста коверта која користи пакет који се употребљава зато што драстично поједностављује задатак уређивања ствари на страници (и саме стране).
2.3 Штампање
Ово горе наведено ће свакако водити рачуна о растојањима али стварно штампање је између вас и вашег штампача. Један корисник пријављује да штампање коверата направљених са је релативно безболно. Ако користите пакет, можете наћи следеће команде веома корисне за штамшање коверте.
$ pdflatex envelope.tex
$ pdf2ps envelope.pdf
$ lpr -o landscape envelope.ps
Алтернативно, можете да користите latex dvi излазни драјвер.
У првом реду, dvips команда претвара .dvi датотеку коју је направио latex у .ps (ПостСкрипт) датотеку. У другом реду, ПостСкрипт датотека се шаље штампачу.
$ latex envelope.tex && dvips -t unknown -T 9.5in,4.125in envelope.dvi
$ lpr -o landscape envelope.ps
Пријављено је да pdflatex ствара праву величину странице али не и dvips упркос ономе што пише у упутству. Никад неће радити уколико опције на вашем штампачу нису подешене на тачан стил стране. Ове подешавања зависе од филтера вашег штампача и у CUPS може бити доступно у lpr командној линији.
3 Коверте у прозорима
Алтернатива за одвојено штампање адреса на ковертама је да користите класу писама из KOMA пакета. Он подржава додатне функције као на пример савијање ознака и и тачно постављање адреса за коверте у прозорима. Употреба класе документа из KOMA пакета, пример кода писма је:
<syntaxhighlight>
% кома-коверта.tex
\documentclass[a4paper]{scrlttr2}
\usepackage{lmodern}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english]{babel}
\usepackage{url}
\setkomavar{fromname}{Joe Bloggs}
\setkomavar{fromaddress}{21 Bridge Street \\ Smallville \\ Dunwich DU3 4WE}
\setkomavar{fromphone}{0123 45679}
\begin{document}
\begin{letter}{Director \\ Doe \& Co \\ 35 Anthony Road
\\ Newport \\ Ipswich IP3 5RT}
\KOMAoptions{fromphone=true,fromfax=false}
\setkomavar{subject}{Wikipedia}
\setkomavar{customer}{2342}
\opening{Dear Sir or Madam,}
I am writing to you on behalf of the Wikipedia project
(\url{http://www.wikipedia.org/}), an endeavour to build
a fully-fledged multilingual encyclopaedia in an entirely
open manner, to ask for permission to use your copyrighted material
\ldots
That said, allow me to reiterate that your material will be used to the noble end of
providing a free collection of knowledge for everyone; naturally enough, only if you
agree. If that is the case, could you kindly fill in the attached form and post it
back to me? We shall greatly appreciate it.
Thank you for your time and consideration.
I look forward to your reply.
\closing{Yours Faithfully,}
\ps{P.S. You can find the full text of GFDL license at
\url{http://www.gnu.org/copyleft/fdl.html}.}
\encl{Copyright permission form}
\end{letter}
\end{document}
</syntaxhighlight>
Излаз се генерише преко
$ pdflatex кома-коверта
Паковање штампања резултујуће датотеке кома-коверта.pdf према прекломним маркама може бити стављено у стандардизоване коверте ограничене прозорима DIN C6/5, DL, C4, C5 or C6.
Као додатак уобичајеном, KOMA-пакет садржи и предефинисане дефиниције формата за различите стандардизоване швајцарске и јапанске формате слова.
4 Референце: letter.cls команде
команда, опис
\name{}
\signature{}
\address{}
\location{}
\telephone{}
\makelabels
\stopbreaks
\startbreaks
\opening{}
\closing{}
\cc{}, Стартујте parbox који је упознат са \ccname:
\encl{}, Стартујте parbox који је упознат са \enclname:
\ps, Почиње нови параграф, Нормално на крају писма
\stopletter, (празно)
\returnaddress, (празно)
\startlabels
\mlabel{}{}
\descriptionlabel{}
\ccname, "cc"
\enclname, "encl"
\pagename, "Page"
\headtoname, "To"
\date{}, Промените датум. Погледајте ''datetime'' пакет за алтернативна форматирања.
\today, Дугачка форма датума
окружење, Опис
letter{}, Погледајте главни чланак
description
verse
quotation
quote


Алгоритми/Апроксимација раздаљине

Израчунавање растојања заједничко за просторне и остале алгоритме претраживања, као што је и за комјутерску игру физичка машина. Међутим, заједничко Еуклидово растојање захтева издрачунавање кватратног корена , која је често релативно тешка операција у CPU-у.
1 За упоређивање растојања није потребан квадратни корен
Дати су уређени парови (x1, y1) и (x2, y2), који је ближи координатном почетку по Еуклидовом растојању? Можда ћете доћи у искушење да израчунате та два Еуклидова растојања и упоредити их:
d1 = sqrt(x1^2 + y1^2)
d2 = sqrt(x2^2 + y2^2)
return d1 > d2
Али су ти квадратни корени често тешки за израчунавање, али чак шта више, не морате све да их израчунате.
Уместо тога, урадите ово:
dd1 = x1^2 + y1^2
dd2 = x2^2 + y2^2
return dd1 > dd2
Резултат је тотално исти (зато што је позитиван квадратни корен стриктно ''монотона'' функција). Ово ради само за упоређивање растојања, али не за израчунавање индивидуалних вредности, које су понекад оно што вам треба. Погледајмо апроксимације.
2 Апроксимација Еуклидовог растојања
2.1 Такси/Менхетн/Л1
w:taxicab distance је једна од једноставнијих за израчунавање, тако да се користи када има мало ресурса:
Дате су координате двеју тачака (x1, y1) и (x2, y2).
:<math>dx = | x1 - x2 |</math> (w:absolute value)
:<math>dy = | y1 - y2 |</math>:<math>d = dx + dy</math> (такси дистанца)
Приметити да ово такође можете користити као "први пролаз", с'озиром да је никад ниже од Еуклидовог растојања. Можете проверити ако су тачке са посебном граничном кутијом, као првипролаз за проверавање ако су са граничном сфером за коју сте заиста заинтересовани. Уосталом, ако проширимо ову идеју, завршићемо са ефикасном просторном структуром као што је w:Kd-tree.
Међутим, будите на опрезу да такси дистанца није w:isotropic - ако сте у Еуклидовом простору, такси дистанце доста тога мењају у зависности од тога на који је начин ваша "мрежа" поравнана. Ово може довести до великих одступања ако га користите као замену за Еуклидово растојање. Апроксимације осмоугаоног растојања помажу да скинемо неке од проблематичних углова, давајући бољу изотропију:
2.2 Осмоугао
Брза апроксимација 2D раздаљине основана на осмоугаоној граници се може израчунати на следећи начин.
Дате су две тачке <math>(p_x, p_y)</math> и <math>(q_x, q_y)</math>, Нека <math>dx = | p_x - q_x |</math> (w:absolute value) и <math>dy = | p_y - q_y|</math>. Ако <math>dy > dx</math>, апроксимирана раздањина је <math>0.41 dx + 0.941246 dy </math>.
: Пре неколико година, пронашао сам сличан алгоритам апроксимације раздаљине користећи три услова, уместо само 2, што је тачније и пошто користи степен 2 од имениоца за коефицијенте, може бити имплементиран без коришћена хардвера за дељење. Формула је: ''1007/1024 max(|x|,|y|) + 441/1024 min(|x|,|y|) - if ( max(|x|.|y|)<16min(|x|,|y|), 40/1024 max(|x|,|y|), 0 )''. Такође, могуће је имплементирати апроксимацију раздаљине без коришћења множења и дељења када имате ограничен хардвер: ''((( max << 8 ) + ( max << 3 ) - ( max << 4 ) - ( max << 1 ) + ( min << 7 ) - ( min << 5 ) + ( min << 3 ) - ( min << 1 )) >> 8 )''. Ово је баш као min max алгоритам са 2 коефицијента који је показан раније, али са коефицијентима 123/128 и 51/128. Имам чланак о томе наhttp://web.oroboro.com:90/rafael/docserv.php/index/programming/article/distance --Rafael
: (Наводно, тај чланак је пребачен овде: ?)
()
<noinclude>
----


Алгоритми/Ада Имплементација

1 Увод
Добродошли у Ада имплементације из викикњиге "Алгоритми". Уколико нисте упознати са Ада програмирањем, ево неколико правила:
* Сви примери су потпуно функционални са свим потребним улазним и излазним операцијама. Међутим, само код које треба да имплементира алгоритам је копиран у текст - цели примери су доступни преко веза за download-овање. (Приметити да то може да траје и до 48 сати док се ЦВС ажурира).
* Ретко користимо предефинисане типове у коду у примерима, али дефинишемо специјалне типове који су погодни за конкретне алгоритме.
* Ада допушта коришћење подразумеваних параметра функције; међутим, ми увек попунимо и именујемо све параметре, како би читалац могао да види које су му опције доступне.
* Ретко користимо пречице- као кад користимо атрибуте Image или Value за String <=> Integer конверзије.
Сва ова правила доприносе да код буде више разградив него што је потребно. Међутим, надамо се да је док такође зато и размуљив.
2 Поглавље 1: Увод
Следећи потпрограми су имплементације примера из одељка Осмислити алгоритам.
2.1 Снизити
Пример Ада кода се не додаје на низ као алгоритми. Зато, креирамо празан низ жељене дужине, а онда мењамо места карактерима.
function To_Lower (C : Character) return Character renames
Ada.Characters.Handling.To_Lower;
-- tolower - преводи све алфабет карактере који су велико слово
function To_Lower (Str : String) return String is
Result : String (Str'Range);
begin
for C in Str'Range loop
Result (C) := To_Lower (Str (C));
end loop;
return Result;
end To_Lower;
Да ли би приступ додавању био могућ са Ада имплементацијом? Не, али би био значајно комплекснији и спорији.
2.2 Equal_Ignore_Case
-- equal-ignore-case -- враћа true ако су s или t једнаки,
-- случај који се занемарује
function Equal_Ignore_Case
(S : String;
T : String)
return Boolean
is
O : constant Integer := S'First - T'First;
begin
if T'Length /= S'Length then
return False; -- ако нису истих дужина, онда
-- нису једнаки
else
for I in S'Range loop
if To_Lower (S (I)) /=
To_Lower (T (I + O))
then
return False;
end if;
end loop;
end if;
return True;
end Equal_Ignore_Case;
3 Поглавље 6: Динамичко програмирање
3.1 Фибоначијев низ
Следећи кодови су имплементације примера Фибоначијев низ.
3.1.1 Једноставна имплементација
...
Да израчунате негативне вредности Фибоначијевог низа није потребно, тако да смо дефинисали integer тип који почиње у 0. Са дефинисаним integer типом се може израчунати чак до Fib (87). Fib (88) ће резултирати Constraint_Error.
type Integer_Type is range 0 .. 999_999_999_999_999_999;
Можда приметите да не постоји једнакост за тврђење (n >= 0) из оригиналног примера. Ада ће тестирати тачност параметра ''пре'' позива функције.
function Fib (n : Integer_Type) return Integer_Type is
begin
if n = 0 then
return 0;
elsif n = 1 then
return 1;
else
return Fib (n - 1) + Fib (n - 2);
end if;
end Fib;
...
3.1.2 Кеширане имплементације
...
За ову имплементацију нам треба посебан кеширани тип који може да складишти -1 као "не израчунат".
type Cache_Type is range -1 .. 999_999_999_999_999_999;
Прави тип за израчунавање фибоначијевих бројева наставља да почиње са 0. Пошто је подтип од кешираног типа , Ада ће аутоматски конвертовати између два. (валидност конверзије је - наравно - проверена)
subtype Integer_Type is Cache_Type range
0 .. Cache_Type'Last;
Да бисмо знали колико је велики кеш, треба прво прочитати праву вредност са командне линије.
Value : constant Integer_Type :=
Integer_Type'Value (Ada.Command_Line.Argument (1));
Кеширани низ почиње са елементом 2 с'обзиром да су Fib (0) и Fib (1) константе и завршава са вредношћу коју желимо да израчунамо.
type Cache_Array is
array (Integer_Type range 2 .. Value) of Cache_Type;
Кеш је инициализован на прву валидну вредност кешираног типа - а то је -1.
F : Cache_Array := (others => Cache_Type'First);
Из чега следи алгоритам:
function Fib (N : Integer_Type) return Integer_Type is
begin
if N = 0 or else N = 1 then
return N;
elsif F (N) /= Cache_Type'First then
return F (N);
else
F (N) := Fib (N - 1) + Fib (N - 2);
return F (N);
end if;
end Fib;
...
Ова имплементације је верна оригиналној из ове књиге. Међутим, у Ада имплементацији је то мало другачије:
када користите мало већи низ који такође складишти елементе 0 и 1 и инициализује их на тачне вредности
type Cache_Array is
array (Integer_Type range 0 .. Value) of Cache_Type;
F : Cache_Array :=
(0 => 0,
1 => 1,
others => Cache_Type'First);
и онда можете да уклоните први if.
if N = 0 or else N = 1 then
return N;
elsif F (N) /= Cache_Type'First then
Ово ће запамтити око 45% времена извшења (измерено на Linux i686), док вам треба само још два елемента у кешираном низу.
3.1.3 Имплементације оптимизације меморије
Ова верзија исто изгледа као и оригинална у ВикиКоду.
type Integer_Type is range 0 .. 999_999_999_999_999_999;
function Fib (N : Integer_Type) return Integer_Type is
U : Integer_Type := 0;
V : Integer_Type := 1;
begin
for I in 2 .. N loop
Calculate_Next : declare
T : constant Integer_Type := U + V;
begin
U := V;
V := T;
end Calculate_Next;
end loop;
return V;
end Fib;
3.1.4 Нешездесетчетворобитни цели бројеви
Ваш Ада компајлер нема подршку за 64-битне целе бројеве? Онда можете уместо тога да користите децималне бројеве. То резултира спорији програм (три пута спорији), али ће резултат бити исти.
Следећи пример показује како да дефинишете погодан децимални тип. Експериментишите са цифрама и опсезима параметара док не добијете оптимални излаз од Ада компејлера.
type Integer_Type is delta 1.0 digits 18 range
0.0 .. 999_999_999_999_999_999.0;
Требало би да знате да бројеви са покретним зарезом су погодни за израчунавање фибоначијевих бројева. Неће пријавити услов грешке када је израчунати број превише велик - уместо тога, изгубиће прецизност, што доводи до тога да резултат губи суштину.


Алгоритми/Увод

Ова књига покрива технике за пројектовање и анализу алгоритама. Алгоритамске технике укључују: "завади, па владај", "бектрекинг", динамичко програмирање, "похлепи алгоритми" и претраживање успоном.
Било који решиви проблем у општем смислу има бар један од следећих типова алгоритама:
# очигледан начин
# медотичан начин
# паметан начин; и
# чудесан начин
Први, од свих основних нивоа, "очигледно" решење би можда покушао да исцрпљујуће претражује одговор. Интуитивно, очигледно решење је оно које настаје једноставно ако сте упознати са програмским језиком и основним техникама решавања проблема.
Други ниво је методичан ниво и он је кључ ове књиге: након разумевања материјала који је приказан овде, моћи ћете да на методичан начин да претворите већину очигледних алгоритама у боље представљен алгоритам.
Трећи ниво, паметан ниво, захтева више разумевања елемената који су укључени у проблем и разумевање њихових особина, или чак редефинисање алгоритма (на пример, нумерички алгоритми искоришћавају математичка својства која нису очигледна). Паметан алгоритам је можда тежак за разумевање, јер није очигледно да је тачан, или је тежак за разумевање, јер се заправо извршава брже него што би изгледало то што захтева.
Четврти и последњи ниво алгоритамског решења је чудесан ниво: он је резервисан за ретке случајеве где је продоран резултат веома не-интуитивно решење.
Природно, сваки од ова четири нивоа је релативан и неки паметни алгоритми су такође обухваћени у овој књизи. Почнимо.
1 Предуслови
Како бисте разумели метерију која је приказана у овој књизи, морате знати програмски језик довољно добро да можете преведете псеудокод у овој књизи у радно решење. Такође треба да знате основе о следећим структурама података: низовима, стековима, редовима, уланчаним листама, стаблу, хипу или реду са приоритетом, раздвојеним скуповима и графовима.
Осим тога, требало би да знате основне алгоритме као што су бинарна претрага, алгориам сортирања (merge sort, heap sort, insertion sort и други) и претраживање-прво-у-ширину или претраживање-прво-у-дубину. Ако нисте упознати ни са једним од ових предуслова, требало би прво да погледате материју у књизи Структуре Података.
2 Када је ефикасност битна?
Не захтева сваки проблем најефикасније могуће решење. За наше намене, термин ефикасан се бави временом и/или простором за које је потребно да обави задатак. Кад су и време и простор обилни и јефтини, онда се можда не исплати плаћање програмера да проведе дан радећи да томе да програм постане бржи.
Међутим, ево неких случаја где је ефикасност битна:
* Када су ресурси ограничени, промена у алгоритму може да направи велику уштеду и допусти да се ограничене машине (као што су мобилни телефони, уграђени системи и сензор мрежа) протежу на границама могућности.
* Када је податак јако велик, ефикасније решење може означавати разлику између завршавања задатка у два дана уместо у две недеље. Пример укључује физику, генетику, веб претраживање, масивне онлајн продавнице и мрежно анализирање саобраћаја.
* Апликације које раде у реалном времену: овај термин се, уствари, односи на прорачуне који дају временску гаранцију, наспрам значења речи "брзо". Међутим, квалитет може само да расте даље бирајући примерени алгоритам.
* Рачунско скупи послови, као што је динамика флуида, парцијална диференцијална питања, VLSI дизајн и анализирање криптограма се некад само могу размотрити када решење буде нађено довоњно ефикасно.
Када се потпрограм често користи, време проведено на ефикаснијој имплементацији може да допринесе корист за сваку апликацију која користи потпрограм. Примери укључују сортирање, претраживање, генерисање псеудослучајног броја, кернел операције (не треба мешати са оперативним системом кернел), упити база података и графике.
In short, it's important to save time when you do not have any time to spare.
When is efficiency unimportant? Examples of these cases include prototypes that are used only a few times, cases where the input is small, when simplicity and ease of maintenance is more important, when the area concerned is not the bottle neck, or when there's another process or area in the code that would benefit far more from efficient design and attention to the algorithm(s).
Укратко, битно је уштедети време, када немате времена за губљење.
Када је битна ефикасност? Примери ових случајева укључују прототипе који се користе само неколико пута, када је улаз врло мали, када је једноставност одржавања битнија, када посматрана област није "уско грло" или када када постоји други процес или област у коду где би било много више користи од ефикасног пројектовања и пажње на алгоритам (алгоритме).
3 Смислити алгоритам
Пошто претпостављамо да имате неко знање о неком програмском језику, почнимо са питањем како бисмо превели идеју у алгоритам. Претпоставимо да желите да напишете функцију која узима стринг као улазни податак и исти тај стринг са малим словима као излазни податак:
// ''tolower -- функција која преводи сва алфабетска велика слова, у неком низу карактера str, у мала слова''
function tolower(string ''str''): string
Шта вам прво пада на памет када размишљате како бисте решили овај проблем? Можда нека од ова два разматрања:
# Сваки карактер у ''str'' се мора размотрити
# Потребна је функција која пребацује један карактер у мало слово
Прва тачка је "очигледна", јер карактер који треба да буде претворен у мало слово се може налазити било где у стрингу. Друга тачка произилази из прве јер, онда када размотримо сваки карактер, морамо нешто и урадити са њим. Постоји много начина да се напише tolower функција за карактере:
Постоји пар начина да имплементирате ову функцију, који укључују следеће:
* погледати ''c'' у табели -- индексирани карактер у низу карактера који има верзију малог слова за сваки карактер.
* проверити да ли је ''c'' у опсегу 'A' ≤''c''≤ 'Z' и онда му додати нумерички офсет.
Ове технике зависе од кода карактера.
(Као проблем поделе, можда је табела боље решење, јер је јасније да треба променити само један део кода.)
Међутим када је такав подпрограм имплементиран, имплементација нашег оригиналног проблема одмах следи:
function tolower(string ''str''): string
let ''result'' := ""
for-each ''c'' in ''str'':
''result''.append(tolower(''c''))
repeat
return ''result''
end
Петља је резултат наше способности да преведемо "сваки карактер треба размотрити" у наш нативни програмски језик.
Да позив функције tolower треба бити у телу петље, постаје очигледно. Овде смо решили да почнемо са празним стрингом и да додамо карактере на крај стринга.
Сада претпоставимо да желите да напишете функцију која пореди два стринга тако што тестира да ли су исти, занемарујући да ли су слова мала или велика:
// ''equal-ignore-case -- враћа true ако су стрингови s и t једнаки, без обзира на то да ли су слова мала или велика''
function equal-ignore-case(string ''s'', string ''t''): boolean
Ове идеје вам можда падну на памет:
# Сваки карактер у стрингу ''s'' и ''t'' ће се морати размотрити
# Једна петља која ће пролазити кроз оба стринга би то решила
# Али таква петља би требало да припази прво да ли су стрингови исте дужине
# Ако стрингови нису истих дужина, онда не могу бити једнаки, јер игнорисање величине слова не утиче на то колико је стринг дугачак
# tolower потпрограм за карактере се може поново искористити и пореди ће само мала слова
Функција коју смо размотрили би изгледала отприлике овако:
function equal-ignore-case(string ''s''[1..''n''], string ''t''[1..''m'']): boolean
if ''n'' != ''m'':
return false ''\if they aren't the same length, they aren't equal\''
fi
for ''i'' := 1 to ''n'':
if tolower(''s''[''i'']) != tolower(''t''[''i'']):
return false
fi
repeat
return true
end
Или, ако сте разматрали проблем у смислу функционалне декомпозиције уместо итерација, функција би изгледала овако:
function equal-ignore-case(string ''s'', string ''t''): boolean
return tolower(''s'').equals(tolower(''t''))
end
Алтернативно, можда сматрате да ни један од ових решења није добољно ефикасан и да бисте више волели да алгоритам направи један пролаз кроз ''s'' или ''t''. Ове две имплементације изнад захтевају два пролаза: прва верзија рачуна дужину стринга и онда пореди карактере, док друга верзија рачуна да ли је карактер мало или велико слово у стрингу и онда пореди резултате. (Приметите да је за пар стрингова такође могуће да се њихова дужина израчуна пре другог пролаза, али то такође има недостатака понекад.) Можете замислити колико сличних потпрогорама који тестирају јендакост стрингова који не само да игноришу мала и велика слова, већ и акценте, могу бити написани.
Већ сад можда можете да увидите како се пише псеудокод. Псеудокод није намењен да буде прави програмски језик: апстрахује детаље које бисте морали да садржите у било ком прорамском језику. На пример, језик не преузима генеричке типове или динамичне у односу на статичке типове: идеја је да буде јасно да сте наменили и да не буде много тешко да га преведе на свој нативни језик. (Међутим, тако радећи, морате да донсете неке одлуке што се тиче пројектовања које ограничавају имплементацију у један конкретан тип форме податка.)
Нема ничег посебног у техникама које смо користили како бисмо решили једноставан проблем стринга: можда сте пронашли боље или елегантније решење у програмском језику који сте изабрали. У овој књизи смо истражили опште технике алгоритама како бисмо проширили ваше знање. Можда нећете одмах успети да неки нативни алгоритам направите ефикаснијим, али након разумевања материје ове књиге ћете моћи да методично нађете различита решења и, што је још битније, моћи ћете да питате себе више питања о свом програму. Постављање питања може бити једнако битно као и одговарање на питања, јер постављање добрих питања вам може помоћи да реформулишете проблем и да размишљате инвентивно.
4 Разумевање алгоритма
Програмери треба одлично да разумеју вишеструко-слојевите абстракције. На пример, погледајте следећи код:
function foo(integer ''a''):
if (''a'' / 2) * 2 == ''a'':
print "The value " ''a'' " is even."
fi
end
Depending on the programming task, you may think on the layer of hardware, on down to the level of processor branch-prediction or the cache.
Да бисте разумели овај пример, морате да знате да дељење целих бројева користи скраћивање и да ако је if-услов тачан, онда је последњи значајан бит у ''a'' нула (што значи да ''a'' мора да буде паран). Такође, код користи исписивање стринга API и сам по себи је дефиниција функције која се користи различите модуле. У зависности од задатка, можете размишљати ??
Често је разумевање бинарног система је од пресудног значаја, али многи модерни језици имају абстракције довољно далеке од хардвера тако да ови нижи нивои нису потребни. Негде се абстракције заустављају: многи програмери не морају да мисле о логичким капијама, нити су физика и електроника потребне. Ипак, битан део програмирања је вишеструко-слојевити начин размишљања.
Али удаљавањем од комјутерских програма према алгоритмима захтева још један слој: математику. Програм може да искористи својства бинарне репрезентације. Алгоритам може да искористи и својства теорије скупова и других математичких структура. Баш као што бинарни систем није експлицитно у програму, ни математичка својства коришћена у алгоритму нису експлицитна.
Типично, када је алгоритам упознат, дискусија (одвојена од кода) је потребна да објасни математику која се користи у алгоритму. На пример, да бисте заиста разумели "похлепи" алгоритам (као што је Дајкстрин алгоритам) морате да разумете математичка својства која показују да је "похлепи" алгоритам валидан за све случајеве. На неки начин, можете посматрати математику као посебну врсту потпрограма који алгоритам позива. Али овај "потпрограм" није показан у коду зато што нема шта да се позива. Док читате ову књигу, покушајте да посматрате математику као имплицитан потпрограм.
5 Преглед техника
* Подели, па владај: Многи проблеми, посебно када је улазни податак дат у низу, се може решити тако што ''поделимо'' проблем у мање делове, решимо те мање делове рекурзивно (''владај'') и онда комбинујемо резултате у један резултат. Примери укључују сортирање спајањем и алгоритам брзог сортирања.
* Рандомизација: Технике рандомизације су битне за све више и више апликација. Ово поглавље показује неке класичне алгоритме који користе случајне бројеве.
* Бектрекинг: Скоро сваки проблем може да се формулише као бектрекинг алгоритам. Код бектрекинг алгоритама, треба узети у обзир све могуће изборе како би решили проблем и рекурзивно решили потпроблеме под претпоставци да је избор донет. Скуп свих рекурзивних позива генерише стабло у ком се сваки скуп избора се узима у обзир узастопно. Стога, ако решење постоји, оно ће се у своје време наћи.Бектрекинг је генерално неефикасан, насилна техника, али постоје оптимизације које могу бити извршене да смање и дубину стабла и број грана. Техника се зове бектрекинг, јер након што је први лист посећен, алгоритам се враћа назад и позива стек (поништавање избора који не воде ка успеху) и онда наставити на доњу грану. Да би решили проблем техникама бектрекинг-а, проблем треба да има форму "само-сличности", тако да мањи примерак проблема (након што је донешена одлука) мора да личи на оригиналан проблем. Обично, проблеми могу бити уопштени да би постали само-слични.
* Динамичко програмирање: Динамичко програмирање је оптимизациона техника за бектрекинг алгоритме. Када потпроблеми треба да се реше брзо (нпр. када има пуно дупликата грана у бектрекинг алгоритму) време може бити запамћено тако што се реши прво сваки проблем (од доле-па на горе, од најмањег до највћих) и тако што се складиште решења сваког потпроблема у табелу. Тако, сваки потпроблем може бити посећен и решен једном уместо брзо. "Програмирање" у називу ове технике долази од програмирања у смислу уписивања у табелу; на пример, програмирање телевизије је прављење табеле емисија које ће се емитовати и када ће се емитовати.
* "Похлепни" алгортми: Похлепи алгоритам може бити користан када се зна довољно информација о могућим изборима. Најбољи избор се може одредити без обзира на све могуће изборе. Типично, похлепни алгоритам нису тешки за писање, али се тешко доказују да су тачни.
* Претраживање успоном: Последња техника коју само истражили је претраживање успоном. Основна идеја је да се почне са лошем решењем и да се брзо примени оптимизација за решење док не постане оптималан или се не испуни неки други услов. Битан случај претраживања успоном је мрежни проток. Упркос имена, мрежни проток је користан за многе проблеме који описују односе, тако да нису само за рачунарске мреже. Многи слични проблеми се могу решити коришћењем мрежне протоке.
<noinclude>
----
6 Алгоритми и примери кодова
6.1 Први ниво (најлакши)
1. Пронаћи максимум: са алгоритмом и више различитих програмских језика
2. Пронаћи минимум: са алгоритмом и више различитих програмских језика
3. Пронаћи средњу вредност: са алгоритмом и више различитих програмских језика
4. Пронаћи стање: са алгоритмом и више различитих програмских језика
5. Пронаћи тотал: са алгоритмом и више различитих програмских језика
6. Рачунање: са алгоритмом и више различитих програмских језика
6.2 Други ниво
1. Разговор са рачунаром Ниво 1: са алгоритмом и више различитих програмских језика
2. Сортитање - bublle sort: са алгоритмом и више различитих програмских језика
6.3 Трећи ниво
1. Разговор са рачунаром Ниво 2: са алгоритмом и више различитих програмских језика
6.4 Четврти ниво
1. Разговор са рачунаром Ниво 3: са алгоритмом и више различитих програмских језика
2. Пронаћи приближан максимум: са алгоритмом и више различитих програмских језика
6.5 Пети ниво
1. Quicksort


Kuvar:Mozak s jajima

1 Potrebni sastojci
sastojci: Za broj osoba: 4
* 400 g telećeg mozga
* 100 g kuhane šunke
* 5 jaja
* 100 g narendanog ementalera
* 1 glavica crnog luka
* so
* biber
2 Priprema
Mozak ostavite kratko u hladnoj vodi i odstranite mu spoljnu opnu.
Na zagrejanoj masnoći kratko prepržite naseckani luk, dodajte na kockice narezanu kuvanu šunku i narezani mozak. Posolite i pobiberite prema ukusu i lagano promešajte.
Dodajte razmućena jaja i narendani sir.
Uz lagano mešanje ispržite do kraja i poslužite.

Јела од изнутрица


Kuvar:Teleća jetra sa šampinjonima

1 Potrebni sastojci
sastojci: Za broj osoba: 6
* 500 g teleće jetre
* 200 g šampinjona
* 100 g dimljene slanine
* 2 dl kisele pavlake
* 2 kašike maslaca
* 1 glavica crnog luka
* 1 limun
* so
* biber
2 Priprema
Jetru operite i narežite na tanke odreske.
Na zagrejanoj masnoći popržite kratko naseckani luk i dodajte očišćene i na listiće narezane šampinjone. Pirjajte oko 20 minuta, prelijte sokom od limuna, posolite i pobiberite prema ukusu.
Prelijte kiselom pavlakom i pirjajte još 10 minuta.
Na malo maslaca popržite slaninu naseckanu na kockice i dodajte jetru. Pržite 10-15 minuta, začinite prema ukusu i složite na pladanj za posluživanje. Prelijte umakom od šampinjona.

Јела од изнутрица


Водич за Пајтон 2.6/Повратак низова

А сада Вам представљамо кул трик који можете да урадите са низовима:
def узвик(низ):
for карактер in низ:
print "Дај ми " + карактер
print "'" + карактер + "'"
узвик("Изгубити")
def средњи(низ):
print "Средњи карактер је:", низ[len(низ) / 2]
средњи("абвгдђ")
средњи("Пајтон програмски језик")
средњи("Атланта")
Излаз је:
Дај ми И
'И'
Дај ми з
'з'
Дај ми г
'г'
Дај ми у
'з'
Дај ми б
'б'
Дај ми и
'и'
Дај ми т
'т'
Дај ми и
'и'
Средњи карактер је: д
Средњи карактер је: р
Средњи карактер је: а
Шта овај програм показује је да су низови слични листама на неколико начина. узвик() функција показује да се for петље могу користити са низовима као што се користе са листама. Процедура средњи показује да такав низ може такође да се користи као len() функција и индекси низова и делови. Већина карактеристика листи ради на низовима.
Следећа особина показује неке специфичне карактеристике низова:
def на_горњи(низ):
## Пребацује низ у велика слова
велико_слово = ""
for карактер in низ:
if 'a' <= карактер <= 'z':
локација = ord(карактер) - ord('a')
нови = локација + ord('A')
карактер = chr(нови)
велико_слово = велико_слово + карактер
return велико_слово
print у_целико("ово је текст")
са излазом:
ОВО ЈЕ ТЕКСТ
Ово ради зато што рачунар представља знакове низа као бројеве од 0 до 255. Паљјтон има функцију звану ord() (скраћено за редно) која враћа карактер као број. Ту је и одговарајућа функција названа chr() која преводи број у карактер. Имајући то у виду програм би требало да почне да буде јаснији. Први детаљ је линија: if 'a' <= карактер <= 'z': која проверава да види да ли је слово мало. Ако јесте онда су следеће линије коришћене. Прво се конвертује у своје место a = 0, b = 1, c = 2 и тако дање са линијом: локација = ord(карактер) - ord('a'). Следеће нова вредност је пронађена са нови = локација + ord('A'). Ова вредност се претвара назад у карактер који је сада велико слово.
Сад због неке вежбе интерактивног куцања:
>>> # Цео број у низ
>>> 2
2
>>> repr(2)
'2'
>>> -123
-123
>>> repr(-123)
'-123'
>>> `123`
'123'
>>> # Низ у цео број
>>> "23"
'23'
>>> int("23")
23
>>> "23" * 2
'2323'
>>> int("23") * 2
46
>>> # Разломак у низ
>>> 1.23
1.23
>>> repr(1.23)
'1.23'
>>> # Разломак у цео број
>>> 1.23
1.23
>>> int(1.23)
1
>>> int(-1.23)
-1
>>> # Низ у разломак
>>> float("1.23")
1.23
>>> "1.23"
'1.23'
>>> float("123")
123.0
>>> `float("1.23")`
'1.23'
Ако до сад нисте погодили да функција repr() може да пребаци цео број у низ и да функција int() може да претвори низ у цео број. Функција float() може да пребаци низ у резломак. Функција repr() враћа штампано представљање нечега. `...` претвара скоро све у низ, исто тако. Овде су неки примери тога:
>>> repr(1)
'1'
>>> repr(234.14)
'234.14'
>>> repr([4, 42, 10])
'[4, 42, 10]'
>>> `[4, 42, 10]`
'[4, 42, 10]'
Функција int() покушава да претвори низ (или разломак) у цео број. Овде је слична функција под називом float() која ће протворити цео број или низ у разломак. Друга функција коју Пајтон има је eval() функција. Функција eval() узима низ и враћа податак типа који пајтон мисли да је пронашао. На пример:
>>> v = eval('123')
>>> print v, type(v)
123 <type 'int'>
>>> v = eval('645.123')
>>> print v, type(v)
645.123 <type 'float'>
>>> v = eval('[1, 2, 3]')
>>> print v, type(v)
[1, 2, 3] <type 'list'>
Ако користите eval() функцију требало би да проверите да ће вратити тип који очекујете.
Једна корисна функција низова је split() метода. Овде је пример:
>>> "Ово је гомила речи".split()
['Ово', 'је', 'гомила', 'речи']
>>> текст = "Прва група, друга група, трећа, четврта"
>>> текст.split(",")
['Прва група', ' друга група', ' трећа', ' четврта']
Приметите како split() пребацује низ у листу низова. Низ је подељен размаком подразумевано или опционим аргументом (у овом случају зарезом).
Такође можете да додате још један аргумент који говори split() колико пута ће се сепаратор користи да подели текст. На пример:
>>> листа = text.split(",")
>>> len(листа)
4
>>> листа[-1]
' четврта'
>>> листа = текст.split(",", 2)
>>> len(листа)
3
>>> листа[-1]
' трећа, четврта'
0.1 Дељење низова (и листи)
Низови се такође могу делити — на исти начин као што смо показали за листе у претходном поглављу — коришћењем "оператора" ''одсецања''" [:]. Оператор одсецања ради на исти начин као раније: текст[први_индекс:последњи_индекс] (у веома ретким случајевима може постојати још једна колона и трећи аргумент, као примеру приказаном испод).
Да не би збунили са индексом бројева, лалше је да их видите као ''исечке'', могућности да исечете низ на делове. Овде је пример, који приказује исечке (у жутом делу) и бројеве њихових индекса (црвено и плаво) за једноставан текстуални низ:
0, 1, 2, ..., -2, -1
↓, ↓, ↓, ↓, ↓, ↓, ↓
текст =, ", С, Т, Р, И, Н, Г, "
↑, ↑
[:, :]
Имајте на уму да су црвени индекси рачунати од почетка низа и плави од краја низа, уназад. (Приметите да плави нема индекс -0, што је изгледа логично на крају низа. Зато што -0 == 0, (-0 значи "почетак низа" такође.) Сада смо спремни да користимо индексе за операцију одсецања:
текст[1:4], →, "ТРИ"
текст[:5], →, "СТРИН"
текст[:-1], →, "СТРИН"
текст[-4:], →, "РИНГ"
текст[2], →, "Р"
текст[:], →, "СТРИНГ"
текст[::-1], →, "ГНИРТС"
текст[1:4] нам даје све низове од текст између исечака 1 и 4, "ТРИ". Ако изоставите једно од [први_индекс:последњи_индекс] аргумената, добијате почетак или крај стринга као подразумевано: текст[:5] даје "СТРИН". За оба први_индекс и последњи_индекс можемо користити обе црвене и обе плаве шеме бројева: текст[:-1] даје исто као текст[:5], зато што је индекс -1 на истом месту као 5 у овом случају. Ако не користите аргументе који садрже две тачке, број се другачије третира: текст[2] даје нам један карактер праћен другим исечком, "Р". Специјална операција за дељење текст[:] значи "од почетка до краја" и ствара копију целог низа(или листе, као што је приказано у претходном поглављу).
Крајње али не мање важно, операција одсецања може имати друге две тачке и трећи аргумент, што се тумачи као "величина корака": текст[::-1] је текст од почетка до краја, са величином корака -1. -1 значи "сваки карактер, али у другом правцу, опадајућем облику". "СТРИНГ" отпозади је "ГНИРТС" (тестирајте корак величине 2, ако нисте ово схватили).
Све операције одсецања раде добро и са листама. У овом смислу низови су само посебан случај листи, где су елементи листе појединачни карактери. Само запамтите концепт ''исечака'', и индекси за одсецање ће бити мање збуњујући.
0.2 Примери
# Овај програм захтева одлично разумевање децималних бројева
def у_низ(у_инт):
"""Претвара цео број у низ"""
if у_инт < 0:
у_инт = -у_инт
while у_инт / 10 != 0:
изл_низ = chr(ord('0') + у_инт % 10) + изл_низ
у_инт = у_инт / 10
изл_низ = chr(ord('0') + у_инт % 10) + изл_низ
return префикс + изл_низ
def у_инт(у_низ):
"""Претвара низ у цео број"""
изл_бр = 0
if ул_низ[0] == "-":
множилац = -1
у_низ = у_низ[1:]
else:
множилац = 1
for x in range(0, len(у_низ)):
изл_бр = изл_бр * 10 + ord(у_низ[x]) - ord('0')
return изл_бр * множилац
print у_стр(2)
print у_стр(23445)
print у_стр(-23445)
print у_инт("14234")
print у_инт("12345")
print у_инт("-3512")
Излаз је:
2
23445
-23445
14234
12345
-3512
en:Non-Programmer's Tutorial for Python 2.6/Revenge of the Strings


Водич за Пајтон 2.6/Примери напредних функција

Неки људи сматрају овај одељак корисним, а неки збуњујућим. Ако сматрате да је збуњујући можете га прескочити (или само погледати примере.) Сада ћемо проћи кроз следећи програм:
def множ(a, b):
if b == 0:
return 0
пауза = множ(a, b - 1)
вредност = a + пауза
return вредност
решење = множ(3, 2)
print "3 * 2 = ", решење
основи овај програм ствара позитивну функцију множења
(он је далеко спорији него уграђена функција множења) и онда
демонстрира ову функцију коришћењем функције. Овај програм приказује коришћење рекурзије, то је облик понављања (понављање) у коме се налази функција која више пута себе позива док излаз услов није задовољен. Користи поновљене допуне које дају исти резултат као множење: нпр. 3 + 3 (сабирање) даје исти резултат као 3 * 2 (множење).
----
НИЗ 1
;''Питање:'' Која је прва ствар коју програм ради?
:''Одговор:'' Прва урађена ствар је функција множ дефинисана у свим линијама осим у последњој.
: Ово ствара функцију која узима два параметра и враћа вредност када се заврши. касније ова функција може бити покренута.
----; Шта се догађа следеће?
: Следећа линија после функције, резултат = множ(3, 2) је покренута.
----; Шта ради ова линија?
: Ова линија ће доделити повратну вредност множ(3, 2) променљивој резултат.
----; А шта множ(3, 2) враћа?
: Морамо да прођемо кроз функцију множ да сазнамо.
----
НИЗ 2
; Шта се догађа следеће?
: Променљива a добија вредност 3 која јој је додељена и променљива b добија вредност 2 која јој је додељена.
----; Шта онда?
: Линија if b == 0: је покренута. Откад b има вредност 2 ово је нетачно па је линија return 0 прескочена.
----; И шта онда?
: Линија пауза = множ(a, b - 1) је покренута. Ова линија поставља локалну променљиву пауза вредности множ(a, b - 1). Вредност  a је 3 и вредност  b је 2 па је позив функције множ(3,1)----; Па која је вредност множ(3, 1) ?
: Морамо да покренемо функцију  множ са параметрима 3 и 1.
----
НИЗ 3
; Шта се догађа следеће?
: Локалне променљиве у '' новом'' покретању функције су постављене тако да a има вредност 3 и  b има вредност 1. Пошто су ово локалне вредности оне не утичу на претходне вредности a и b.
----; И онда?
: Откад  b има вредност 1 ако је изјава нетачна, онда следећа линија постаје пауза = множ(a, b - 1).
----; Шта ова линија ради?
: Ова линија ће доделити вредност множ(3, 0) осталима.
----; Дакле, шта је та вредност?
: Мораћемо да покренемо ову функцију још једном да то сазнамо. Овога пута a има вредност 3 и b има вредност 0.
----; Шта се догађа следеће?
: Прва линија у функцији да је покренете је if b == 0:.  b има вредност 0 па је следећа линија за покретање return 0----; И рша ради линија return 0?
: Ова линија враћа вредност 0 ван функције.
----; Па?
: Сада знамо да множ(3, 0) има вредност 0. Сада знамо шта је линија пауза = множ(a, b - 1) урадила како смо покренули функцију множ са параметрима 3 и 0. Завршили смо покретање множ(3, 0) и сада се враћамо покретању  множ(3, 1). Променљива пауза добија вредност 0.
----; Која линија се следећа покреће?
: Линија вредност = a + пауза је покренута следећа. У овом покретању функције, a = 3 и пауза = 0 па је сада вредност = 3.
----; Шта се догађа следеће?
: Линија return вредност је покренута. ово враћа 3 из функције. Ово такође излази из враћања функције  множ(3, 1). Након што је return позвано, идемо назад на покретање  множ(3, 2).
----; Где смо били у  множ(3, 2)?
: Имали смо променљиве a = 3 и b = 2 и испитивали смо линију пауза = множ(a, b - 1).
----; Шта се догађа сада?
: Променљива пауза узима 3 што јој је додељено. Следећа линија вредност = a + пауза поставља вредност на 3 + 3 или 6.
----; Шта се сада дешава?
: Следећа линија се покреће, ово враћа 6 из функције. Сада се враћамо покретању линије резултат = множ(3, 2). Сада враћена вредност може бити додељена променљивој резултат.
----; Шта се следеће догађа?
: Следећа линија после функције, print "3 * 2 = ", резултат је покренута.
----; Шта ово ради?
: Штампа 3 * 2 =  и вредност вредности што је 6. Завршена штампана линија је 3 * 2 = 6----; Шта се свеукупно дешава?
: У суштини користили смо две чињенице да израчунамо множење два броја. Прво је да било који број који помножимо са 0 је 0 (x * 0 = 0). Друго је да је број помножен другим уствари први број плус први број пута мање него други број(x * y = x + x * (y - 1)). Шта се дешава је да је 3 * 2 преведено у  3 + 3 * 1. Затим 3 * 1 је преведено у 3 + 3 * 0. Онда знамо да било који број пута 0 је 0 па 3 * 0 је 0. Затим можемо израчунати 3 + 3 * 0 је 3 + 0 што је 3. Сада знамо шта је 3 * 1 па можемо израчунати 3 + 3 * 1 и то је 3 + 3 што је 6.
----
Ово је како цела ствар ради:
множ(3, 2)
3 + множ(3, 1)
3 + 3 + множ(3, 0)
3 + 3 + 0
3 + 3
6
Уколико и даље имате проблема са овим примером, погледајте процес уназад. Шта је последњи корак
који се догађа? Ми можемо лако препознати да је резултат множ(3, 0)0. Откад b је0, функција множ(3, 0)
ће вратити 0 и стати.
Па шта претходни корак ради? множ(3, 1) не враћа 0
зато што b није 0. Дакле, следеће линије извршавају:
пауза = множ (a, b - 1), што је пауза = множ (3, 0),
што је 0 као што смо управо урадили. Сад променљива је пауза постављена на 0.
Следећа линија додаје вредност пауза променљивој a, и како је a3 и пауза
је 0, резултат је 3.
Сада знамо да функција множ(3, 1) враћа 3. Али желимо да
знамо резултат множ(3,2). Стога, морамо да скочимо назад на
почетак програма и извршимо га још једном:
множ(3, 2) поставља пауза на резултат множ(3, 1). Знамо
из последње рунде да је овај резултат 3. Затим вредност се рачуна као a + пауза,
нпр. 3 + 3. Онда је резултат од 3 * 2 штампан као 6.
Суштина овог примера је да се функција множ(a, b) започиње сама унутар
себе. Ради ово док b не постигне 0 и онда рачуна резултат као што је изнад објашњено.
0.0.1 Рекурзија
Програмирање садржи ову врсту која се зове ''рекурзивно'' и вероватно интуитивна дефиниција ''рекурзије'' је:
----; Рекурзија
: Ако и даље не разумете, погледајте ''рекурција''.
----
Последња два дела су скорије написана. Ако имате било какве
коментаре, ако пронађете неке грешке или мислите да морам више/јасније да објасним
молим Вас пошаљите мејл. Ја сам био познат у прошлости да једноставне ствари
правим несхватљивим. Ако је остатак водича је имало смисла, али овај
део није, то је вероватно моја грешка и желео бих да знам.
Хвала.
0.1 Примери
факторијел.py
#дефинише функцију која израчунава факторијел
def факторијел(n):
if n <= 1:
return 1
return n * факторијел(n - 1)
print "2! =", факторијел(2)
print "3! =", факторијел(3)
print "4! =", факторијел(4)
print "5! =", факторијел(5)
Излаз:
2! = 2
3! = 6
4! = 24
5! = 120
одбројавање.py
def број_уназад(n):
print n
if n > 0:
return број_уназад(n-1)
број_уназад(5)
Излаз:
5
4
3
2
1
0
коментарисано_множење.py
# Коментари испод су били нумерисани као кораци, да дају лакше објашњење
# кода. Молимо вас да прочитате у складу са тим корацима.
# (корак број 1, на пример, је на дну)
def множ(a, b): # (2.) Ова функција ће понављати себе, зато што....
if b == 0:
return 0
пауза = множ(a, b - 1) # (3.) ....Једном када достигне ОВО, секвенца почиње изнова и враћа се на врх!
вредност = a + пауза
return вредност # (4.) дакле, "врати вредност" се неће десити док се не добију 3 корака изнад
print "3 * 2 = ", множ(3, 2) # (1.) Функција "множ" ће се прво покренути овде
# "return вредност" на крају се може десити само
# једном када је b једнако нули (b се смањује за 1 сваки пут када се корак 3 догоди).
# И само тада може бити приказана штампана команда на дну.
# Видите то као врсту ефекта "скакања унаоколо". У суштини, све што
# треба стварно да разумете ја да се функција поново покреће
# У СЕБИ у кораку 3. Дакле, секвенца "скаче" назад
# на врх.
коментарисани_факторијел.py
# Још један пример функције "скакања унаоколо":
def факторијел(n): # (2.) Још једном, ова функција ће се ПОНАВЉАТИ....
if n <= 1:
return 1
return n * факторијел(n - 1) # (3.) Јер се ПРЕ-покреће ОВДЕ, и иде назад на врх.
print "2! =", факторијел(2) # (1.) Функција "факторијел" је иницирана овом линијом
print "3! =", факторијел(3)
print "4! =", факторијел(4)
print "5! =", факторијел(5)
коментарисано_одбројавање.py
# Још једно "скакање унаоколо", лепо и лако:
def бројање_уназад(n): # (2.) Још једном, овај део ће понављати сам себе....
print n
if n > 0:
return бројање_уназад(n-1) # (3.) Пошто поново почиње овде, и враћа се на врх
бројање_уназад(5) # (1.) Функција "бројање_уназад" иницира овде
en:Non-Programmer's Tutorial for Python 2.6/Advanced Functions Example


Kuvar:Pašteta od pileće jetre

1 Potrebni sastojci
sastojci: Za broj osoba: 8
* 1 kg pileće jetre
* 50 g maslaca
* 5 dl belog vina
* so
* biber
2 Priprema
Vino zakuvajte i u njemu skuvajte pileću jetru. Kuvajte 5 minuta da ne potamni. Ocedite, dodajte maslac, so i biber i sve zajedno izmrvite mikserom.
Glatku smesu poslužite na hlebu kao predjelo.

Јела од изнутрица


Kuvar:Bubrezi u umaku

1 Potrebni sastojci
sastojci: Za broj osoba: 4
* 2 mala teleća bubrega
* 50 g maslaca
* 2 kašike senfa
* 2 dl pavlake
* 2 kašike konjaka
* so
* biber
2 Priprema
Bubrege narežite na kocke i ispržite na zagrejanom maslacu. Zalijte konjakom i mešajte da se otopi karamelizirana smesa na dnu posude.
Zalijte mešavinom pavlake i senfa, začinite prema ukusu i kratko pirjajte.
Poslužite s pireom od krompira.

Јела од изнутрица


Kuvar:Kroketi od mozga

1 Potrebni sastojci
sastojci: Za broj osoba: 2
* 1 dl vode
* 50 g maslaca
* 50 g brašna
* 50 g mrvica
* 200 g mozga
* 1 jaje
* so
* biber
2 Priprema
Mozak prelijte vrućom vodom i odstranite žilice. Naseckajte na sitne komadiće.
Maslac rastopite u vodi i kad zakuva postepeno dodavajte brašno uz stalno mešanje. Kad se smesa počne odvajati od dna posude ohladite je i dodajte mozak.
Umešajte mrvice, so i biber.
Oblikujte kuglice, uvaljajte ih u brašno, jaja i opet brašno i pržite na ulju.

Јела од изнутрица


Алгоритми/"Бектрекинг"

Бектрекинг је општа техника у алгоритмима која доводи у обзир све могуће комбинације како би решила проблем оптимизације. Бектрекинг је такође познат по називу прво-у-дубину или сепарација и евалуација. Имајући више знања о проблему, бинарно стабло претраге може бити упрошћено, како би се заобишли случајеви који не изгледају обећавајуће. Док је бектрекинг користан за тешке проблеме, за које не захтевамо ефикаснија решења, оно је лоше решење за свакодневне проблеме које друге технике много боље решавају. Међутим, динамичко програмирање и похлепи алгоритми се могу посматрати као оптимизација код бектрекинга, тако да општа техника бектрекинга је корисна за разумевање ових напреднијих концепата. Учење и разумевање бектрекинг технике пре свега даје добар "први корак унапред" до тих напреднијих техника, јер онда не морате да учите свих пар нових концепата одједном.
Метод бектрекинг# Сагледати узимање решења као секвенцу избора
# За сваки избор, сагледати сваку опцију рекурзивно
# Вратити најбоље пронађено решење
Ова методологија је довољно генеричка да се може применити у већини проблема. Међутим, чак и да хоћемо да унапредимо бектрекинг алгоритам, идаље би се извршавао у експоненциалном времену пре него у полиноиалном времену. Уз то, анализирање тачног времена бектрекинг алгоритма може бити јако компликовано: уместо тога, дате су једноставније горње границе које нису чврсте.
1 Најдужа заједничка подсеквенца (исцрпна верзија)
Приметити да је решење проблема најдуже заједничке подсеквенце (НЗП) није довољно ефикасан. Међутим, корисно је за разумевање динамичког програмирања.
НЗП проблем је сличан оном који Unix "diff" програм ради. Diff команда у Unix-у узима два текстуална фајла ''A'' и ''B'', као улаз и излази разликују линију по линију од ''A'' и ''B''. На пример, diff може показати да линије које недостају из фајла ''A'' треба додати у фајл ''B'' и линије приказане у фајлу ''A'' треба обрисати из фајла ''B''. Циљ је добити листу додавања и брисања која би се могла искористити како бисмо трансформисали фајл ''A'' у фајл ''B''. Превише конзервативно решење овог проблема би било да се све линије из фајла ''A'' обришу и да се све линије из фајла ''B'' додају. Док ово решава проблем на сиров начин, нас занима минималан број додавања и брисања како бисмо успешно достигли трансформацију. Сами размислите како бисте имплементирали решење овог проблема.
НЗП проблем, уместо што дели линије у текстуалним фајловима,се сматра и да проналази заједничке елементе између два различита низа. На пример,
let ''a'' := array {"The", "great", "square", "has", "no", "corners"}
let ''b'' := array {"The", "great", "image", "has", "no", "form"}
Желимо да нађемо најдужу подсеквенцу могућу од елемената које су пронашли и у низу ''a'' и у низу ''b'' у истом редоследу. НЗП од ''a'' и ''b'' је
:"The", "great", "has", "no"
Сада посматрајмо две нове секвенце:
let ''c'' := array {1, 2, 4, 8, 16, 32}
let ''d'' := array {1, 2, 3, 32, 8}
Овде постоје две најдуже заједничке подсеквенце низа ''c'' и низа ''d'':
:1, 2, 32; and
:1, 2, 8
Приметити да:
:1, 2, 32, 8
није заједничка подсеквенца, јер је валидна подсеквенца само низа ''d'', а не низа ''c'' (јер ''c'' има 8 пре 32). Тако можемо да закључимо да за неке случајеве, решења НЗП проблема нису јединствена. Ако бисмо имали више информација о доступним секвенцама, више бисмо волели једну подсеквенцу у односу на другу: на пример, ако су секвенце линије текстова у рачунарском програму, можда бисмо изабрали подсеквенцу која би задржала дефиницију функције.
На горњем нивоу, наш проблем је имплементирати следећу функцју:
// ''lcs -- враћа најдужу заједничку подсеквенцу од a и b''
function lcs(array ''a'', array ''b''): array
која узима два низа као улаз и подсеквенце низа као излаз.
Како решавате овај проблем? Можете почети од тога да приметите да ли две секвенце почињу истом речју, онда најдужа заједничка подсеквенца увек саржи ту реч. Аутоматски можете да ставите ту реч у листу и тако бисте скратили проблем налажења најдуже заједничке подсеквенце остатка двеју листи. Тако је проблем постао мањи, што је добро, јер показује да постоји неки напредак.
Али ако две листе не почињу истом речју, онда једна, или обе од првог елемента из низа или првог елемемента из низа не припадају најдужој заједничкој подсеквенци. Али ипак, један од њих може бити. Како одређујете који ћете, ако неки јесте, да додате?
Решење можете посматрати у два смисла бектрекинг методе: Пробајте ова начина и видите! Свакако, два подпроблема су манипулисање мањим листама, како бисте знали да ће се рекурзија кад тад завршити. Чији год је резултат процеса најдужа заједничка подсеквенца је победник.
Уместо што бисте "избацили" елемент брисањем из низа, користите парче низа. На пример, парче:
:''a''[1,..,5]
представља елементе:
:{''a''[1], ''a''[2], ''a''[3], ''a''[4], ''a''[5]}
низа као посебног низа. Ако Ваш програмски језик не подржава парчиће, онда морате да прођете почетак и/или крај индекса кроз цео низ. Овде су парчићи једино у форми:
:''a''[1,..]
која када користите 0 као индекс првог елемента у низу, резултира да у низу парчића не постоји нулти елемент. (Тако, верзија овог алгоритма која нема парчиће мора проћи почетак валидног индекса и вредност би требало бити одузета од целе дужине низа како бисте добили дужину псеудо-парчади.)
// ''lcs -- враћа најдужу заједничку подсеквенцу од a и b''
function lcs(array ''a'', array ''b''): array
if ''a''.length == 0 OR ''b''.length == 0:
''// ако смо на крају било било које листе, онда је lcs празан
return new array {}
else-if ''a''[0] == ''b''[0]:
''// ако је почетни елемент исти у оба низа, онда је на lcs,''
''// тако да само рекурзивно вратимо остатке обе листе.''
return append(new array {''a''[0]}, lcs(''a''[1,..], ''b''[1,..]))
else
''// не знамо која листу треба да одбацимо. Пробајте оба начина,''
''// изаберите онај који је бољи.''
let ''discard_a'' := lcs(''a''[1,..], ''b'')
let ''discard_b'' := lcs(''a'', ''b''[1,..])
if ''discard_a''.length > ''discard_b''.length:
let ''result'' := ''discard_a''
else
let ''result'' := ''discard_b''
fi
return ''result''
fi
end
2 Проблем најкраћег пута
Да се побољша Дајкстрин алгоритам у следећем поглављу.
3 Гранично претраживање
Ако сте већ нашли нешто "боље" и да ако сте на грани која никада неће бити добра као она коју сте већ видели, можете прекинути раније ту грану. (Пример за коришћење: збир бројева почевши од 1 2, а затим сваки број који следи је збир било којег броја плус проследњи број. Покажите побољшања перформанси..)
4 Ограничено 3-бојење
Овај проблем не личи непосредно на самог себе, тако да мора прбо бити уопштен. Методологија: Ако проблем не личи на самог себе, покушајте да га уопштите док не почне да личи.
5 Проблем трговачког путника
Овде је бектрекинг техника најбоље могуће решење.


LaTeX/Интернационализација

LaTeX мора бити конфигурисан и адекватно коришћен када се користи за писање докумената који нису на енглеском језику. Ово мора да се адресирати на три основна подручја:
# LaTeX мора да зна како да пише језик(е), који треба да се користи.
# Корисник треба да користи типографска правила појединих језика. На пример, у француском језику, постоји обавезан размак пре сваког карактера у новој колони (:).
# Унос специфичних карактера, посебно за језике који користе улазни систем (арапски, кинески, јапански, кореански).
Погодни је имати могућност убацивања посебних карактера, специфичних језика, диркетно са тастатуре, уместо коришћења гломазних кодоваto (на пример, куцањем ä уместо \"{a}). Ово може бити урађено тачном конфигурацијом улазних кодова. Нећемо се овде бавити таквим проблемима: погледати Посебни знакови поглавље.
Поједини језици захтевају посебне фонтове , са одговарајућим комплетом фонт кодирања. Погледати Кодирање слова.
Поједине методе, описане у овом поглављу, могу бити корисне када имате посла са ауторима (у библиографији) који немају енглеско име.
Ево неколико предлога за писање LaTeX документа, на језику који није енглески. Ако имате искуства са неким језиком који није поменут испод, слободно додајте пар белешки.
1 Предуслови
Већини језика, не укључујући енглески, је веома често потребан унос посебних карактера. За лагодно писање треба да подесите улаз кодирања и кодирање фонтова правилно.
Следећа конфигурација је оптимална за многе језике (многе латиничне језике). Водите рачуна да је Ваш документ сачуван коришћењем “UTF-8” кодирања.
За више детаља погледајте Кодирање слова и Посебни знакови.
2 Бабел
Пакет ће, који су направили Јоханес Брамс и Хавијер Безос, се побринути за све (са “XeTeX” и “LuaTeX” треба да размотрите ). Можете га учитати у вашој преамбули, давајући као аркумент име језика који желите да користите (углавном је име на енглеском, али не увек):
Треба да га ставите одмах после ), омогућује поједине команде дозвољавајући слагање слогова по стандардима бугарског, руског, српског или украјинског језика.
За сва четири језика, омогућена је конкретна инрерпункција језика: ћирилична црта за текст (мало је ужа од латиничне и окружена је ситним просторима), црта за директан говор, цитате, и команде за олакшану хипнацију:
Комбинација кључева, Радња
Нема лигатуре на овом месту.
Експлицитни знак цртице, који дозвољава хипнацију у остатку речи.
Ћирилична дуга црта у чистом тексту.
Ћирилична дуга црта у пуним именима (презименима).
Ћирилична дуга црта за за означавање директног говора.
Слично али нема знака цртице (коришћене код сложеница, нпр. или код неких други знакова, “онемогућити/омогућити”).
Знак за сложенице без знака прекида.
Знак за сложенице са тачком прекида, који дозвољава писање са цртицом у сложеници.
Мали простор за иницијале, са тачком прекида код презимена.
Немачко отварање цитата (,,).
Немачко затварање цитата (“).
Француско отварање цитата (<<).
Француско затварање цитата (>>).
Руске и украјинске опције за дефинишу се командама
које се понашају као и (команде за претварање бројева у слова, ''нпр.'' ), али дају велика и мала слова руског или украјинског алфабета (који год је од два наведена језика активан у документу).
Бугарска опција за даје команде
које “терају” и “снабдева” слова или бугарског или латиничног (енглеског) алфабета. Уобичајно понашање и .
2.1 Фински језик
Хипенација финског језика је омогућена преко:
Ово ће аутоматски мењати језик документа (имена наслова, итд.) на фински.
2.2 Француски
Можете учитати подршку за француски језик коришћењем следеће команде:
Постоји неколико опција за слагање слогова француског документа, које зависе од ароме језика: , , и за парижански француски, и и за новосветски француски. Уколико не знате или Вас није брига за ове варијанте језика, препоручено је коришћење .
Међутим, од верзије 3.0 , саветовано је да се изабере језик као глобална опција следећом командом:
Све омогућава француску хишенацију, ако сте конфигурисали Ваш LaTeX систем исправно. Све ово, такође, мења аутоматски текст на француски: штампа ''Chapitre'', штампа тренутни датум на француском и тако даље. Комплет нових команди је такође постао доступан, што омогућава лакше писање француких унесених фајлова. Погледајте следећу табелу ради инспирације:
унешен код, враћен излаз
\og наводници \fg{}, « наводници »
M\up{me}, D\up{r}, Mme, Dr1\ier{}, 1\iere{}, 1\ieres{}, 1er, 1re, 1res2\ieme{} 4\iemes{}, 2e 4es\No 1, \no 2, N° 1, n° 2
20~\degres C, 45\degres, 20 °C, 45°
Н. \bsc{Самарџић}, M. Durand
\nombre{1234,56789}, 1 234,567 89
Можда ћете желети да уносите наводнике и остала француска слова директно, ако постоје на вашој тастатури, наравно. Покретањем “Xorg” (*BSD и GNU/Linux), можда бисте желели да користите oss варијанту коју карактеришу неке симпатичне пречице, типа
Комбинација дугмића са тастатуре, Карактери
Alt Gr + w, «
Alt Gr + x, »
Alt Gr + Shift + é, É
Alt Gr + Shift + è, È
Alt Gr + Shift + ç, Ç
Биће Вам потребно T1 кодовани фонт да би се наводници правилно штампали.
За карактер степени изаћи ће Вам грешка типа:
! Package inputenc Error: Unicode char \u8:° not set up for use with LaTeX.
пакет ће то средити.
Велика предност Бабела за француски језик јесте та да ће се побринути за поједине елементе француске типографије уместо Вас, посебно неломљиве размаке пре свих дводелних знакова интерпункције. Дакле, можете писати:
Неломљиви размак пре симбола “евра” је још увек неопходан, јер симболи валута и осталих јединица нису генерално подржани (не односи се конкретно на француски).
Можете користити пакет паралелно са Бабелом. Дозволиће Вам штампање бројева на француски начин.
Приметићете да се распоред листи мења приликом пребацивања на француски језик. Ово је могуће мењати командом. За више информација о томе шта опција , пакета , ради и како можете мењати њено понашање, путем LaTeXа отворите фајл frenchb.dtx и прочитајте оно што избаци frenchb.pdf or frenchb.dvi. Можете набавити PDF верзију на .
2.3 Немачки језик
Можете учитати подршку за немачки језик коришћењем ''било које'' од две наведене команде.
За традиционални ("стари") немачки правопис, користите
или за реформативни ("нови") немачки правопис, користите
Ово омогућује немачку хипенацију, ако сте конфигурисали ваш LaTeX
систем правилно. Такође, сваки аутоматски текст мења на немачки језик, нпр.
“Chapter” постаје “Kapitel”. Комплет нових команди такође постаје доступан,
што дозвољава писање немачких унесених фајлова брже чак и када не користите “inputenc” пакет. Погледајте табелу испод.
Са “inputenc” пакетом, све ово постаје спорно, али ваш текст је, такође, закључан посебно кодираном свету.
+Посебни немачки карактери.
"A "O "U, Ä Ö Ü
"a "o "u "s, ä ö ü ß
"` or \glqq, „
"' or \grqq, “
\glq \grq"< or \flqq, «
"> or \frqq, »
\flq \frq, ‹ ›
\dq, "
In German books you sometimes find French quotation marks («guillemets»). German typesetters, however, use them differently. A quote in a German book would look like »this«. In the German speaking part of Switzerland, typesetters use «guillemets» the same way the French do. A major problem arises from the use of commands like : If you use the OT1 font encoding (which is the default) the guillemets will look like the math symbol "<math>\ll</math>", which turns a typesetter's stomach. T1 encoded fonts, on the other hand, do contain the required symbols. So if you are using this type of quote, make sure you use the T1 encoding.
Decimal numbers usually have to be written like 0{,}5 (not just 0,5). Packages like ziffer enable input like 0,5. Alternatively, one can use the command from the and (globally) set the decimal marker using
2.4 Грчки језик
Ово је уводни део који треба да напишете на грчком језику. Приметити посебан улаз кодовања.
Овај уводни део омогућава хипенацију и промену целог аутоматског текста на грчки језик. Комплет нових команди, такође, постаје доступан, што омогућава лакше писање грчких улаза. Да би се привремено пребацили на енглески и обрнуто, можете користити команде, и , које узимају један аргумент, који се затим слаже у слогове користећи тражено кодирање фонта. У супротном, можете користити команду , која је описана у претходном делу. Користите за “евро” симболе.
2.5 Мађарски језик
Користите следеће редове:
Више инфромација: .
2.6 Исландски и фарски језик
Следећи редови могу бити додати за писање текста на исландском језику:
Ово мења текст, на пример, ''Part'' у ''Hluti''. Дотупне су и додатне команде:
+Исландске посебне команде
"` or \glqq, „
\grqq, “
\TH, Þ
\th, þ
\DH, Ð
\dh, ð
Да би посебни карактери попут, ”Þ и “Æ”, постали доступни, само додајте:
Уобичајни LATEX кодирани фонт је “OT1”, али садржи само 128 карактера. “T1” кодирање садржи слова и знакове интерпункције за већину европских језика, коришћењем латиничне скрипте.
2.7 Италијански језик
Италијански је добро подржан од стране LaTeXа. Само додајте
на почетку вашег документа и излаз сви команди ће бити тачно преведен.
2.8 Јапански језик
Постоји варијанта TeX-а намерена за јапанска имена , која подржава вертикално слагање слогова.
Још један начин за писање на јапанском језику јесте коришћењем “Lualatex” и “luatex-ja” пакета. Адаптиран пример за “Luatexja” документацију:
Такође, можете користити способности обезбеђене од стране “Fontspec” пакета и оне које је обезбедио “Luatexja-fontspec”, да потврдите фонт који желите да користите у Вашем раду. Ево примера:
Користите “UTF-8” за своје кодирање. У случају да не знате како ово да користите, баците поглед на “Texmaker”, LaTeX едитор који користи UTF-8 као подразумевано.
Још једна (али стара) јапанска подршка је обезбеђена, захваљујући колекцији пакета. Ако користите менаџер пакета или преносно стабло, “CJK” колекција је углавном у одвојеном пакету због своје величине (већински због фонтова).
Проверите да ли је Ваш документ сачуван “UTF-8” карактерним кодирањем. Погледајте текст Посебни знакови за још детаља.
Делове које желите да пишете на јапанском, ставите у окружење.
Последњи аргумент ставља фонт у главну улогу. Мора да пасује жељеном језику, јер се фонтови разликују на јапанском, кинеском и корејском језику. је пример јапанског.
2.9 Кореански језик
Два најраспрострањенија кодирања за кореанске текстове су “EUC-KR” и његов навише компатибилан додатак коришћен на кореанском Виндоусу, “CP949/Windows-949/UHC”. У овом кодовању сваки “US-ASCII” претставља свој нормалан “ASCII” карактер, сличан осталим “ASCII” комбатибилним кодирањима каква су “ISO-8859-x”, “EUC-JP”, “Big5”, или “Shift_JIS”. Са друге стране, Хангул слогови, Хањас (кинески карактери коришћени на кореанском), Хангул Јамо, Хираганас, Катаканас, грчки и ћирилични карактери и остали симболи и слова извучена из “KS X 1001” су претстављени уз два узастопна октета. Први има свој “MSB” комплет. Средином деведесетих година прошлог века, требало је доста времена и труда за намештање коренски-способног окружења на нелокализованом (некорејском) оперативном систему. Можете бацити поглед на сада већ превазиђени да макар малло видите како је било користити кореански језик на некореанском оперативном систему, средином деведесетих.
TeX и LaTeX су оригинално написани за скрипте које немају више од 256 карактера у свом алвабету. Да би оне радиле на језицима са много више карактера као што су кореански или кинески, развијен је потфонт механизам. Он дели један “CJK” фонт са хиљаду или десет или сто глифова у комплет потфонта са 256 глифова у сваком.
За кореански језик, постоје три широко распрострањена пакета.
* “HLATEX” од “UN Koaunghi”
* “hLATEXp” од CHA Jaechoon
* “CJK” пакет од Вернер Лемберга
“HLATEX” и “hLATEXp” су карактеристични за кореански и дају кореанску лолакизацију на врху фонт подршке. Оба могу да процесирају кореански унесене текстове који су енкодовани у “EUC-KR”. “HLATEX” чак може и да процесуира унешене текстове енкодоване у “CP949/Windows-949/UHC” и “UTF-8”, када се користе уз Λ, Ω.
“CJK” пакет није карактеристичан за кореански језик. Може да обради унешене фајлове у “UTF-8”, као и у различитим “CJK” кодовањима укључујући “EUC-KR” и “CP949/Windows-949/UHC”, може бити коришћено за слагање слогова докумената са вишејезичним садржајем (посебно на кинеском, јапанском и кореанском језику). “CJK” пакет нема кореанску локализацију као ону понуђену код “HLATEX”-а и нема толико посебних кореанских фонтова као “HLATEX”.
Главни разлог коришћења програма за куцање какви су TeX и LaTeX јесте добијање укуцанух докумената на ''естетски'' задовољавајућем начину. Најбитнији елемент у писаљу докумената јесте комплет добро дизајнираних фонтова. HLATEX дистрибуција укључује “UHC” постскрипт фонтове 10 различитих породица и “Munhwabu” фонотве (истинит тип) 5 различитих породица. “CJK” пакет ради са комплетом фонтова коришћеним од стране ранијих верзија HLATEXа и може да користи “Bitstream's cyberbit True-Type” фонт.
Да бисте користили “HLATEX” пакет за писање кореанског текста, ставите следећу декларацију на почетак вашег документа:
Ова команда пали кореанску локализацију. Наслови поглавља, одељака, пододељака, садржаја и слика су сви преведени на кореански и форматирање докумената је промењен да прати кореанску конвенцију. Пакет такође обезбеђује аутоматску ''деону слекцију''. У кореанском језику, постоје парови пост-поправљених делова који су граматички еквивалентни али другачији у форми. Који од датих парова је тачан зависи од тога да ли се претходни слог завршава самогласником или сугласником. (Мало је комплексније од овога, али би ово требало да вам да праву слику.) Матерњи кореански говорници немају проблем у бирању правог дела, али не може се утврдити који од делова користити за референце и остали аутоматски текст који ће се променити док ви мењате Ваш документ. Потребан је мукотрпан труд за ручно стављање одговарајућих делова сваки пут када додате/избаците референце или кад једноставно мењате распоред документа. HLATEX ослобађа своје кориснике од овог досадног процеса, склоном грешкамма.
У случају да Вам нису потребне особине кореанске локализације већ само желите да укуцате кореански текст, можете следећи ред уписати у уводу.
За више детаља о писању на кореанском језику у HLATEXу, погледајте HLATEX упутства. Баците поглед на интернет страницу .
У “FAQ” наслову “KTUG”-а препоручено је коришћење “kotex” пакета
2.10 Персијска скрипта
За персијански језик, постоји пакет под именом “XePersian” који користи “XeLaTeX” као мотор за куцање. Само убаците следећи код у увод:
Погледати
Штавише, арапска скрипта се може користити за писање на персијском језику.
2.11 Пољски језик
Ако планирате да пишете на пољском језику Ваш “UTF-8” кодован документ, користите следећи код
Наведени код само дозвољава коришћење пољских слова и преводи аутоматски текст на пољски, тако да "поглавље" постаје "rozdział".
Постоји пар додатних ствари које треба запамтити.
2.11.1 Везници
Пољски језик има доста једнословних везника: "a", "o", "w", "i", "u", "z", итд., граматика и типографска правила не дозвољавају да њима буде завршен штампани ред.
Да осигурате да их LaTeX неће видети као последња слова у реду, мораћете да користите “неломљиви” размак:
2.11.2 Бројеви
По пољским правилима граматике, морате стављати тачке после бројева у поглављу, одељку, пододељку, итд. наслову.
Ово се постиже поновним дефинисањем неколико LaTeX макро наредби.
За књиге:
За чланке:
Алтернативно, можете користити посвећене класе докумената:
* уместо ,
* уместо
* and уместо .
Те класе имају много више европска типографска подешавања али ''не'' захтевају коришђење пољског бабела или карактерног кодовања.
Једноставна употреба:
Потпуна документација ових класа доступна је на (Polish).
2.11.3 Увлачење
Може бити уобичајно (зависи од издавача) увући први параграф у одељцимаи насловима:
2.11.4 Хипенација и типографија
Много је више неодобрено поставити странице са хипенацијом између страница него што је природно у америчком куцању.
Како бисте смањили казну ширења страница, користите ову команду:
За смањење казни за напуштање прозора и сирочића (клубофи у TeX номенкултури) користите ове команде:
2.11.5 Запете у математици
По пољским типографским правилима, фракционе делове бројева треба одвојити запетом, а не тачком.
Како бисте натерали LaTeX да не убаци додатан простор у математичком моду после запете (наравно, осим ако има простора после запете), користите пакет.
Нажалост, делимично је некомпатибилан са пакетом.
Морате или користити тачке у колонама са нумеричким подацима у изворном коду и натерати да их пребаци у запете ''или'' дефинишите колону као:
Алтернатива је коришћење пакета, али то је много неугодније.
2.11.6 Додатне информације
Упутите се на (на пољском језику) за додатне информације о пољској граматици и типографским правилима.
Добар додатак је доступан на (на пољском језику).
2.12 Португалски језик
Додајте следећи код у увод:
Можете променити језик на бразилски португалски језик коришћењем или .
2.13 Словачки језик
Основна подешавања су добра, ако користите само чешки језик, али словачком су потребни посебни знаци за 'ď', 'ť', 'ľ'. Како бисте могли да их укуцавате преко тастатуре, користите следећи код:
2.14 Српски језик
За српски језик писан ћирилицом довољно је да убацимо следећи кôд:
Ако пишемо латиницом, користићемо следеће:
Подразумевано је коришћен екавски дијалекат. Ако желимо ијекавски дијалекат, тада ћемо додати атрибут , и то на следећи начин:
односно
Доступни атрибути за српски језик су и и . Атрибут промени подразумеване називе месеца „јун“ и „јул“ у „јуни“ и „јули“. Атрибут мења кобинацију за затворене наводнике из у . Можемо да користимо и више атрибута истовремено, на пример
Команда исписује датум на српском језику. Алтернативно, команда исписује датум без тачке након године (користи се када након датума иде неки интерпункцијски знак, попут запете). Такође, за српски језик постоје команде и које исписују датум са римским бројем месеца.
За писање полусложеница уместо цртице боље је да користимо како би се цртица у случају прелома речи поновила и у доњем реду; на пример
2.15 Шпански језик
Укључите одговарајућу бабел опцију:
Трик је у томе да шпански језик има неколико одвојених опција и команди за контролу изгледа. Опције могу бити учитане или позивом на бабел, или пре, дефинисањем команде . Отуда, следеће команде су еквивалентне:
Просечно, претходна синтакса је препоручљива, пошто је слово одступање од стандардног понашања Бабела, и тиме могу да омету друге програме (LyX, latex2rtf) који интерагују са LaTeXом.
Шпански, такође, дефинише стенографију за тачку и << >> тако да се користе као логичне ознаке: претходник се користи као децимални маркер у математичком моду, и излаз је, типично, или запета или тачка; овај други се користи за циирани текст, и излаз је, углавном, или «» или “”. Ово дозвољава различите типографске конвенције, са истим улазом, као и подешавања која могу бити другачија од, рецимо, Шпаније и Мексика.
Две посебно корисне опције су : поједини пакети и класе могу да се сударе са шпанским, у начину на којем се носе са активним карактерима, и ове опције онемогућују начин рада шпанског језика, како би се омогућило превазилажење ове уобичајене замке. Штавише, ове опције могу поједноставити начин на који LyX прилагођава неке особине шпанског изгледа унутар GUIа.
Опције пружају подршку за локалне обичаје у Мексику: претходник користи децималну тачку, као уобичајну, и следећи дозвољава децималну запету, као што је захтевано од “Mexican Official Norm (NOM) of the Department of Economy for labels in foods and goods”. Више локализација се тренутно производи.
Остале опције модификују шпански изглед након учитавања бабела. Две посебно корисне команде су и .
Макро наредба


Трагедија

Drama je književni rod. Deli se na više književnih vrsta , kao na primer : komedija , tragedija , drama u užem smislu.
Poznati pisci drama su Šekspir , Molijer , Rosin , Kornej , Vajld , Čehov itd.
Tragedija je književna vrsta koja se uvek završava tragično , najčešće smrću glavnih junaka , kao i sporednih junaka (primer je Šekspirova tragedija "Romeo i Julija"). Tragedija je proslavila Šekspira , Rosana i mnoge druge dramske pisce.
Komedija je smešno delo (književna vrsta) u kojoj se na smešan način putem često pogrešno shvaćenog dijaloga ismeva neka društvena pojava (kao na primer: slepo verovanje u nešto neznano) , ili nečijeg karakteta ("Izbiračica" Koste Trifkovića). Komedija se deli na : komediju karaktera , situacije i naravi.


Kuvar:Pohovani pileći želudci

1 Potrebni sastojci
* 1kg pilećih želudaca
* 4 jaja
* brašna po potrebi
* malo soli
* ulje za prženje
2 Priprema
Pileće želudce dobro očistiti i oprati. Staviti u pretis da se kuvaju. Dodati so sa začinskim povrćem i nekoliko zrna bibera. Kuvati da budu mekani.
Kuvane želudce izvaditi iz tečnosti u kojoj su se kuvali i ostaviti da se dobro ocede.
Jaja umutiti, dodati brašna po potrebi (da bude dovoljno gusto), malo soli i sve dobro sjediniti. Oceđene želudce umakati u pripremljenu smesu za pohovanje i stavljati na zagrejano ulje. Pržiti da fino porumene.
Vaditi ih i stavljati na papirni ubrus da upiju višak ulja.

Јела од изнутрица


Kuvar:Teleći jezik u renu

1 Potrebni sastojci
sastojci: Za broj osoba: 4
* 1 teleći jezik
* 2 dl kisele pavlake
* 1 veza zeleni za supu
* 1 glavica crnog luka
* 1 kašika narendanog rena
* 1 limun
* so
* biber u zrnu
2 Priprema
Jezik dobro operite i ostavite u hladnoj vodi oko 2 sata. Uvaljajte ga u krupnu so i ostavite na hladnom preko noći.
Operite ga i obrišite i pristavite u lonac sa hladnom vodom. Dodajte narezano povrće za supu i biber u zrnu. Kuvajte da svi sastojci omekšaju.
Kuvani jezik izvadite iz vode, ogulite i narežite na tanke listove.
Na pladanj složite kuvano povrće, preko njega narezani jezik i sve zalijte kiselom pavlakom u koju ste umešali ren i limunov sok.
Poslužite uz pire od krompira.

Јела од изнутрица


Увод у екологију

Увод у екологију
0.1 Екологија
Екологија је наука која проучава међусобне односе живих бића и околине у којој се та бића налазе.
Назив ове науке потиче од две грчке речи које у преводу значе: дом и наука. Појам ''екологија'' увео је немачки зоолог Ернест Хекел у свом делу под називом ''Општа морфологија организама'' године 1866. Утемељивачем екологије као науке сматра се ,енглески научник, Чарлс Дарвин
1 Подела екологије
Према организмима који су у центру изучавања екологија се дели на више подврста.Неке од главних подврста су:
*''екологија биљака''*''екологија гљива''*''екологија микроорганизама''*''екологија човека''
2 Значај екологије
Екологија је једна од најзначајнијих наука. Знања која нам нуди екологија важна су за опстанак живог света на Земљи. У данашњем убрзаном развитку индустрије , екологија је та која нам може дати одговоре на кључна питања за заштиту природне средине , која је врло оштећена због индустрије и урбанизације.
Екологија је подстакла развој других наука, као што су ''космичка екологија'' и егзобиологија.