Skip to content
Snippets Groups Projects
Commit 0e929278 authored by Vincent Nivoliers's avatar Vincent Nivoliers
Browse files

MAJ sujet

parent 0115c6b7
No related branches found
No related tags found
No related merge requests found
Images/gitlab_buttons.png

31 KiB

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="svg2"
width="913"
height="226"
viewBox="0 0 913 226"
sodipodi:docname="gitlab_buttons.svg"
inkscape:version="0.92.2 5c3e80d, 2017-08-06">
<metadata
id="metadata8">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs6">
<marker
inkscape:isstock="true"
style="overflow:visible;"
id="marker1145"
refX="0.0"
refY="0.0"
orient="auto"
inkscape:stockid="Arrow2Mend">
<path
transform="scale(0.6) rotate(180) translate(0,0)"
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#cc0000;stroke-opacity:1;fill:#cc0000;fill-opacity:1"
id="path1143" />
</marker>
<marker
inkscape:stockid="Arrow2Mend"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow2Mend"
style="overflow:visible;"
inkscape:isstock="true"
inkscape:collect="always">
<path
id="path850"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#cc0000;stroke-opacity:1;fill:#cc0000;fill-opacity:1"
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
transform="scale(0.6) rotate(180) translate(0,0)" />
</marker>
<marker
inkscape:stockid="Arrow2Lend"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow2Lend"
style="overflow:visible;"
inkscape:isstock="true">
<path
id="path844"
style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#cc0000;stroke-opacity:1;fill:#cc0000;fill-opacity:1"
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
transform="scale(1.1) rotate(180) translate(1,0)" />
</marker>
</defs>
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview4"
showgrid="false"
inkscape:zoom="1.2179628"
inkscape:cx="447.37924"
inkscape:cy="206.9894"
inkscape:current-layer="svg2" />
<image
width="913"
height="226"
preserveAspectRatio="none"
xlink:href="file:///tmp/gitlab_buttons.png"
id="image10"
x="0"
y="0"
sodipodi:absref="/tmp/gitlab_buttons.png" />
<path
style="opacity:1;fill:none;fill-opacity:1;stroke:#cc0000;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#Arrow2Mend)"
d="M 148.60881,66.717626 165.85072,168.52698"
id="path817"
inkscape:connector-curvature="0" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:200px;font-family:'Linux Libertine';-inkscape-font-specification:'Linux Libertine';letter-spacing:0px;word-spacing:0px;fill:#cc0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;"
x="68.146584"
y="50.296764"
id="text821"><tspan
sodipodi:role="line"
id="tspan819"
x="68.146584"
y="50.296764">Dupliquer le dépôt</tspan></text>
<path
inkscape:connector-curvature="0"
id="path1137"
d="M 669.15018,60.149281 583.7617,172.63219"
style="opacity:1;fill:none;fill-opacity:1;stroke:#cc0000;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#marker1145)"
sodipodi:nodetypes="cc" />
<text
id="text1141"
y="50.296764"
x="591.97211"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:22.5px;line-height:200px;font-family:'Linux Libertine';-inkscape-font-specification:'Linux Libertine';letter-spacing:0px;word-spacing:0px;fill:#cc0000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
y="50.296764"
x="591.97211"
id="tspan1139"
sodipodi:role="line">Adresse du dépôt</tspan></text>
</svg>
Images/liste.png

4.08 KiB

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="svg2"
xml:space="preserve"
width="239.49333"
height="17.905333"
viewBox="0 0 239.49333 17.905333"
sodipodi:docname="liste.svg"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"><metadata
id="metadata8"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
id="defs6" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview4"
showgrid="false"
inkscape:zoom="1.1607839"
inkscape:cx="-20.675682"
inkscape:cy="9.8141532"
inkscape:current-layer="g10" /><g
id="g10"
inkscape:groupmode="layer"
inkscape:label="liste"
transform="matrix(1.3333333,0,0,-1.3333333,0,17.905333)"><g
id="g12"
transform="translate(14.162,6.715)"
style=""><g
id="g14"
style=""><g
id="g16"
style=""><g
id="g18"
style=""><g
id="g20"
style="" /><path
d="M 9.97804,6.51535 H -9.97804 c -2.20095,0 -3.98511,-1.78416 -3.98511,-3.98511 v -5.06048 c 0,-2.20095 1.78416,-3.98511 3.98511,-3.98511 H 9.97804 c 2.20095,0 3.98511,1.78416 3.98511,3.98511 v 5.06048 c 0,2.20095 -1.78416,3.98511 -3.98511,3.98511 z m -7.14212,0 v -13.0307"
style="fill:none;stroke:#000000;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path22"
inkscape:connector-curvature="0" /><g
id="g24"
transform="translate(-10.643,-3.196)"
style=""><g
id="g26"
style=""><g
id="g28"
transform="translate(-3.519,-3.519)"
style=""><text
transform="matrix(1,0,0,-1,3.519,3.519)"
style="font-variant:normal;font-weight:normal;font-size:9.96259975px;font-family:SFRM1000;-inkscape-font-specification:SFRM1000;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text32"><tspan
x="0 4.9803038"
y="0"
sodipodi:role="line"
id="tspan30"
style="-inkscape-font-specification:'Linux Biolinum';font-family:'Linux Biolinum';font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal">15</tspan></text>
<g
id="g34"
transform="translate(3.519,3.519)"
style="" /></g></g><g
id="g36"
transform="translate(10.643,3.196)"
style="" /></g><g
id="g38"
transform="translate(6.355,-2.145)"
style=""><g
id="g40"
style="" /><g
id="g42"
transform="translate(-6.355,2.145)"
style="" /></g></g><g
id="g44"
style=""><g
id="g46"
transform="translate(7.081)"
style=""><g
id="g48"
style="" /><g
id="g50"
transform="translate(-7.081)"
style="" /></g></g><g
id="g52"
style=""><g
id="g54"
style="" /><path
d="M 66.64966,6.51535 H 46.69357 c -2.20094,0 -3.9851,-1.78416 -3.9851,-3.98511 v -5.06048 c 0,-2.20095 1.78416,-3.98511 3.9851,-3.98511 h 19.95609 c 2.20094,0 3.98511,1.78416 3.98511,3.98511 v 5.06048 c 0,2.20095 -1.78417,3.98511 -3.98511,3.98511 z m -7.14212,0 v -13.0307"
style="fill:none;stroke:#000000;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path56"
inkscape:connector-curvature="0" /><g
id="g58"
transform="translate(46.028,-3.196)"
style=""><g
id="g60"
style=""><g
id="g62"
transform="translate(-60.19,-3.519)"
style=""><text
transform="matrix(1,0,0,-1,60.19,3.519)"
style="font-variant:normal;font-weight:normal;font-size:9.96259975px;font-family:SFRM1000;-inkscape-font-specification:SFRM1000;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text66"><tspan
x="0 4.9803038"
y="0"
sodipodi:role="line"
id="tspan64"
style="-inkscape-font-specification:'Linux Biolinum';font-family:'Linux Biolinum';font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal">22</tspan></text>
<g
id="g68"
transform="translate(60.19,3.519)"
style="" /></g></g><g
id="g70"
transform="translate(-46.028,3.196)"
style="" /></g><g
id="g72"
transform="translate(63.026,-2.145)"
style=""><g
id="g74"
style="" /><g
id="g76"
transform="translate(-63.026,2.145)"
style="" /></g></g><g
id="g78"
style=""><g
id="g80"
transform="translate(63.752)"
style=""><g
id="g82"
style="" /><g
id="g84"
transform="translate(-63.752)"
style="" /></g></g><g
id="g86"
style=""><g
id="g88"
style="" /><path
d="m 118.34111,6.51535 h -14.97592 c -2.20094,0 -3.98511,-1.78416 -3.98511,-3.98511 v -5.06048 c 0,-2.20095 1.78417,-3.98511 3.98511,-3.98511 h 14.97592 c 2.20094,0 3.98511,1.78416 3.98511,3.98511 v 5.06048 c 0,2.20095 -1.78417,3.98511 -3.98511,3.98511 z m -7.14211,0 v -13.0307"
style="fill:none;stroke:#000000;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path90"
inkscape:connector-curvature="0" /><g
id="g92"
transform="translate(102.699,-3.196)"
style=""><g
id="g94"
style=""><g
id="g96"
transform="translate(-116.861,-3.519)"
style=""><text
transform="matrix(1,0,0,-1,116.861,3.519)"
style="font-variant:normal;font-weight:normal;font-size:9.96259975px;font-family:SFRM1000;-inkscape-font-specification:SFRM1000;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text100"><tspan
x="0"
y="0"
id="tspan98"
style="-inkscape-font-specification:'Linux Biolinum';font-family:'Linux Biolinum';font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal">3</tspan></text>
<g
id="g102"
transform="translate(116.861,3.519)"
style="" /></g></g><g
id="g104"
transform="translate(-102.699,3.196)"
style="" /></g><g
id="g106"
transform="translate(114.717,-2.145)"
style=""><g
id="g108"
style="" /><g
id="g110"
transform="translate(-114.717,2.145)"
style="" /></g></g><g
id="g112"
style=""><g
id="g114"
transform="translate(116.688)"
style=""><g
id="g116"
style="" /><g
id="g118"
transform="translate(-116.688)"
style="" /></g></g><g
id="g120"
style=""><g
id="g122"
transform="translate(154.389,-2.491)"
style=""><g
id="g124"
style=""><g
id="g126"
transform="translate(-168.551,-4.224)"
style=""><text
transform="matrix(1,0,0,-1,168.551,4.224)"
style="font-variant:normal;font-weight:normal;font-size:9.96259975px;font-family:CMSY10;-inkscape-font-specification:CMSY10;writing-mode:lr-tb;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="text130"><tspan
x="0"
y="0"
id="tspan128"
style="-inkscape-font-specification:'Linux Biolinum';font-family:'Linux Biolinum';font-weight:normal;font-style:normal;font-stretch:normal;font-variant:normal">×</tspan></text>
<g
id="g132"
transform="translate(168.551,4.224)"
style="" /></g></g><g
id="g134"
transform="translate(-154.389,2.491)"
style="" /></g></g><path
d="M 6.00519,0 H 38.92267"
style="fill:none;stroke:#000000;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path136"
inkscape:connector-curvature="0" /><g
id="g138"
transform="rotate(180,3.002595,0)"
style=""><g
id="g140"
style=""><path
d="m 0.71729,0 c 0,1.18845 -0.9634,2.15186 -2.15186,2.15186 -1.18846,0 -2.15187,-0.96341 -2.15187,-2.15186 0,-1.18845 0.96341,-2.15186 2.15187,-2.15186 1.18846,0 2.15186,0.96341 2.15186,2.15186 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path142"
inkscape:connector-curvature="0" /></g></g><g
id="g144"
transform="translate(38.92267)"
style=""><g
id="g146"
style=""><path
d="M 3.58653,0 C 2.52383,0.19925 0.797,0.797 -0.3985,1.49438 V -1.49438 C 0.797,-0.797 2.52383,-0.19925 3.58653,0"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path148"
inkscape:connector-curvature="0" /></g></g><path
d="M 62.6768,0 H 95.59428"
style="fill:none;stroke:#000000;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path150"
inkscape:connector-curvature="0" /><g
id="g152"
transform="rotate(180,31.3384,0)"
style=""><g
id="g154"
style=""><path
d="m 0.71729,0 c 0,1.18845 -0.9634,2.15186 -2.15186,2.15186 -1.18846,0 -2.15187,-0.96341 -2.15187,-2.15186 0,-1.18845 0.96341,-2.15186 2.15187,-2.15186 1.18846,0 2.15186,0.96341 2.15186,2.15186 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path156"
inkscape:connector-curvature="0" /></g></g><g
id="g158"
transform="translate(95.59428)"
style=""><g
id="g160"
style=""><path
d="M 3.58653,0 C 2.52383,0.19925 0.797,0.797 -0.3985,1.49438 V -1.49438 C 0.797,-0.797 2.52383,-0.19925 3.58653,0"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path162"
inkscape:connector-curvature="0" /></g></g><path
d="m 115.6133,0 h 31.67244"
style="fill:none;stroke:#000000;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path164"
inkscape:connector-curvature="0" /><g
id="g166"
transform="rotate(180,57.80665,0)"
style=""><g
id="g168"
style=""><path
d="m 0.71729,0 c 0,1.18845 -0.9634,2.15186 -2.15186,2.15186 -1.18846,0 -2.15187,-0.96341 -2.15187,-2.15186 0,-1.18845 0.96341,-2.15186 2.15187,-2.15186 1.18846,0 2.15186,0.96341 2.15186,2.15186 z"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1"
id="path170"
inkscape:connector-curvature="0" /></g></g><g
id="g172"
transform="translate(147.28574)"
style=""><g
id="g174"
style=""><path
d="M 3.58653,0 C 2.52383,0.19925 0.797,0.797 -0.3985,1.49438 V -1.49438 C 0.797,-0.797 2.52383,-0.19925 3.58653,0"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path176"
inkscape:connector-curvature="0" /></g></g></g></g></g></g></svg>
\ No newline at end of file
\documentclass{standalone}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[francais]{babel}
\usepackage{libertine}
\usepackage{tikz}
\usetikzlibrary{positioning, shadows, calc, shapes.multipart, chains, arrows}
\tikzset{ list/.style= {
rectangle split,
rectangle split parts = 2,
draw,
rounded corners,
rectangle split horizontal,
append after command={
let \p1 = (\tikzlastnode.east),
\p2 = (\tikzlastnode.center),
\n1 = {0.5 * (\x1 + \x2)} in
(\n1,\y2) node[inner sep = 0pt, outer sep = 0pt] (\tikzlastnode +next) {}
}
}}
\tikzset{ ptr/.style= {
draw,
*-latex,
rounded corners,
shorten <= -2.5pt
}}
\begin{document}
\begin{tikzpicture}[start chain]
\draw node[list, on chain] (c1) {15} ;
\draw node[list, on chain] (c2) {22} ;
\draw node[list, on chain] (c3) {3} ;
\draw node[on chain] (null) {$\times$} ;
\draw[ptr] (c1+next) -- (c2) ;
\draw[ptr] (c2+next) -- (c3) ;
\draw[ptr] (c3+next) -- (null) ;
\end{tikzpicture}
\end{document}
...@@ -6,18 +6,315 @@ sur les Skip-Lists qui sont une évolution des liste chaînées. ...@@ -6,18 +6,315 @@ sur les Skip-Lists qui sont une évolution des liste chaînées.
## Index ## Index
1. [Récupérer le code](#recuperer_le_code)
* [Forge de l'université](#forge)
* [Duplication du dépôt](#fork)
* [Sauvegarder votre travail](#git_base)
* [Intégration continue](#integration_continue)
1. [Listes chaînées](#listes_chainees) 1. [Listes chaînées](#listes_chainees)
* [Cellules](#classe_cellule)
* [Liste](#classe_liste)
* [Fonctionnalités](#fonctionnalites)
* [Recopie](#recopie)
* [Ajout en queue](#ajout_en_queue)
* [Serpent](#serpent)
1. [Rappels de `C++`](#rappels) 1. [Rappels de `C++`](#rappels)
1. [Commentaires](#commentaires) * [Commentaires](#commentaires)
1. [Types primitifs](#types_primitifs) * [Types primitifs](#types_primitifs)
1. [Case mémoire](#case_memoire) * [Case mémoire](#case_memoire)
1. [Tableau](#tableau) * [Tableau](#tableau)
1. [Structures de contrôle](#structures_de_controle) * [Structures de contrôle](#structures_de_controle)
1. [Références](#references) * [Références](#references)
1. [Passage par valeur](#passage_par_valeur) * [Passage par valeur](#passage_par_valeur)
1. [Adresses](#adresses) * [Adresses](#adresses)
1. [Allocation dynamique](#allocation_dynamique) * [Allocation dynamique](#allocation_dynamique)
1. [Classes et structures](#classes_et_structures) * [Classes et structures](#classes_et_structures)
<a name="recuperer_le_code"></a>
## Récupérer le code
Ce TP vous est fourni sous la forme d'un dépôt utilisant un *outil de
versionnement* : git. Les outils de versionnement sont incontournables dans le
monde de la programmation. Ils permettent d'éviter la perte de données, de
suivre l'avancée du travail, de collaborer facilement à plusieurs sur un même
code.
<a name="forge"></a>
### Forge de l'université
L'université met à votre disposition une [forge](https://forge.univ-lyon1.fr)
sur laquelle vous vous trouvez, via le logiciel [gitlab](https://gitlab.com). La
forge est un outil en ligne pour gérer des dépôts git. Elle vous fournit en plus
la possibilité de consulter le dépôt en ligne, des outils de suivi de bugs, etc.
Sur cette forge, vous avez la possibilité de créer autant de dépôts que vous le
souhaitez, pour vos codes, vos rapports, ou vos projets personnels. Par rapport
à [github](https://github.com), vous pouvez avoir gratuitement autant de projets
privés que vous le voulez et expérimenter sans que tout soit public.
<a name="fork">
### Duplication du dépôt
![Interface Gitlab](Images/gitlab_buttons.png)
Vous pouvez vous contenter de cloner le dépôt, ou de le dupliquer sur la forge
pour avoir votre propre version que vous pouvez faire évoluer et sauvegarder.
Pour dupliquer le projet, utilisez le petit bouton <kbd>Fork</kbd> sous le titre
du projet. Cette action créera un nouveau dépôt dans votre espace personnel.
Une fois le dépôt cloné, sous le nom du projet, vous avez une adresse. À gauche
de cette adresse, sélectionnez HTTPS plutôt que SSH, sauf si vous avez
l'habitude de configurer d'utiliser SSH et de configurer des clés. Copiez
l'adresse proposée.
Dans votre terminal, naviguez là où vous souhaitez travailler, et utiliser la
commande
```bash
git clone <adresse>
```
Un dossier sera créé et vous pouvez commencer à travailler.
<a name="git_base"></a>
### Sauvegarder votre travail
Git est un outil permettant de *versionner* votre travail. À tout moment,
lorsque vous le souhaitez (et de préférence souvent), vous pouvez créer un
instantanné de l'état de votre travail. Quoi que vous fassiez par la suite, il
vous sera toujours possible de revenir à cet version. Cet instantanné est un
*commit*, et se génère avec la commande du même nom.
Commencez par choisir les fichiers dont vous voulez sauvegarder l'état. Vous
pouvez ajouter un fichier au commit via la commande
```bash
git add <votre fichier>
```
Une fois les fichiers choisis, vous pouvez taper
```bash
git status
```
pour avoir un récapitulatif de ce qui sera sauvegardé au prochain commit. Une
fois tous les fichiers sélectionnés, il vous reste à créer le commit :
```bash
git commit -m "Message du commit"
```
Votre commit est créé, vous pouvez continuer à travailler. Faites en sorte que
le message soit explicite, car il vous permettra d'identifier le commit si vous
avez besoin d'y revenir.
Vos commits sont des sauvegardes *locales*. Les autres personnes ayant accès à
votre dépôt ne peuvent pour l'instant pas les voir. Si votre disque dur crame,
votre travail reste perdu. Pour envoyer vos commits sur la forge, et ainsi les
rendre disponibles aux autres, et les sauvegarder plus solidement, vous pouvez
ensuite réaliser un *push* via :
```bash
git push
```
Cette commande vous demandera éventuellement de répondre à quelques questions la
première fois pour renseigner votre identiré, et dans tous les cas vous
demandera vos identifiants universitaires. Une fois votre travail poussé sur la
forge, vous pouvez vérifier sur l'interface que vos fichiers ont bien été mis à
jour.
<a name="integration_continue">
### Intégration continue
Si vous êtes déjà dépassé par ce qui précède, passez à la suite. Sinon, le dépôt
que vous venez de cloner est configuré pour l'*intégration continue*. C'est une
technique qui consiste à définir une batterie de tests sur votre code qui sera
lancée à chaque nouvelle version, pour s'assurer que rien n'a été cassé. À
chaque fois que vous pousserez votre travail sur la forge, les tests seront
lancés, et vos commits seront annotés avec le résultat (réussite ou échec). Vous
pouvez trouver les informations sur ces tests en cliquant sur "CI / CD" dans e
menu de gauche. Actuellement, deux tests sont configurés : la compilation et
l'éxécution. Vous pouvez en ajouter à votre guise.
<a name="listes_chainees"></a>
## Listes chaînées
Une liste chaînée est une structure de données dont le but est de stocker une
séquence de valeurs. La liste est composée d'un ensemble de *cellules*. Chaque
cellule contient une valeur, ainsi que l'adresse de la cellule suivante. Une
liste est généralement représentée par le schéma ci dessous.
![Liste chaînée](/Images/liste.png)
L'intérêt de cette structure de données est de pouvoir facilement rajouter des
valeurs en tête de liste.
<a name="classe_cellule"></a>
### Classe cellule
Une cellule d'une liste chaînée contient une valeur et l'adresse de la cellule
suivante. Par convention, lorsque la cellule est la dernière de sa liste, vous
utiliserez l'adresse `nullptr` comme adresse de cellule suivante.
Dans le cadre de ce TP de remise en forme, vous considérerez que la valeur
contenue dans la cellule est un entier.
<a name="classe_liste"></a>
### Classe liste
La classe liste n'est pas forcément nécessaire selon l'implémentation des listes
chaînées. Elle est utile lorsque vous souhaitez conserver des informations
globales sur la liste, comme le nombre d'éléments insérés par exemple. Pour la
suite, il vous sera utile d'avoir une telle classe. La classe liste contiendra
donc pour l'instant l'adresse de la première cellule de la liste, ainsi que le
nombre d'éléments de la liste.
<a name="fonctionnalites"></a>
### Outils sur les listes
Votre implémentation des listes chaînées devra fournir :
* la construction par défaut (liste vide) ;
* l'ajout d'un nouvel élément en tête de la liste ;
* la suppression d'un élément en tête de liste ;
* la consultation de la taille de la liste ;
* la consultation de la tête de la liste ;
* la recherche d'un élément dans la liste ;
* l'affichage de toute la liste ;
* la destruction d'une liste et de tout son contenu.
<a name="recopie"></a>
### Recopie
Votre liste manipule des cellules, dont elle se condière comme propriétaire. En
particulier, lors de sa destruction ou du retrait d'éléments, votre liste
supprime toutes ses cellules avec elle.
Ce comportement vous posera problème si vous tentez de recopier votre liste. Par
exemple :
```Cpp
Liste l1;
l1.ajouter_en_tete(10) ;
Liste l2 = l1 ;
l2.ajouter_en_tete(20) ;
l1.supprimer_en_tete() ;
```
Étudiez cet exemple, et déterminez si ce programme risque de poser problème par
la suite. Plus subtil encore :
```Cpp
void supprimer_tete(Liste l) {
l.supprimer_en_tete() ;
}
...
Liste l ;
l.ajouter_en_tete(10) ;
supprimer_tete(l) ;
```
Si vous ne voyez pas le problème, appelez votre encadrant pour vous aider à le
comprendre. Si vous pensez avoir compris les problèmes, vérifiez auprès de votre
encadrant.
#### Constructeur par copie
Le constructeur par copie est un constructeur appelé pour créer une *nouvelle*
liste en recopiant une liste existante. La syntaxe est la suivante :
```Cpp
class Liste {
public :
Liste(const Liste& autre) ;
}
```
Notez bien le mot clé `const` et la référence `&`. Le premier assure que la
liste fournie en paramètre ne sera pas modifiée. Le second fait que la liste
fournie en paramètre n'est pas recopiée, mais simplement passée par référence.
Une fois cette fonction écrite, vérifiez qu'elle est bien appelée lorsque vous
réalisez le test suivant :
```Cpp
Liste l1 ;
l1.ajouter_en_tete(10) ;
Liste l2 = l ;
Liste l3(l) ;
```
#### Opérateur d'affectation
L'opérateur d'affectation sert à permettre à une liste *déjà créée* de remplacer
son contenu par celui d'une autre liste fournie. La syntaxe de cet opérateur est
la suivante :
```Cpp
class Liste {
public :
Liste& operator=(const Liste& autre) ;
}
```
Une fois cette fonction écrite, vérifiez qu'elle est bien appelée lorsque vous
réalisez le test suivant :
```Cpp
Liste l1 ;
l1.ajouter_en_tete(10) ;
Liste l2 ;
l2.ajouter_en_tete(20) ;
l2 = l1 ;
```
#### Règle de trois
En `C++`, il existe une règle de bonne pratique pour du code sain appelée la
[règle de trois](https://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming))
(de cinq avec C++11) En résumé cette règle stipule que lorsque vous estimez
nécessaire d'écrire un destructeur pour votre structure de données, c'est que
votre structure de données est probablement propriétaire de ressources (ici les
cellules) et que la gestion de ces ressources implique très probablement la
nécessité d'écrire un constructeur par copie et un opérateur d'affectation (avec
les deux variantes par déplacement en C++11 d'où le 5).
Il est également possible de s'astreindre à une *régle du zéro* en utilisant des
fonctionnalités fine de gestion de mémoire du `C++`, documentez vous pour en
savoir plus.
<a name="ajout_en_queue"></a>
### Ajout en queue
Les listes chaînées simples permettent facilement l'ajout et la suppression en
tête. Ici, *facilement* signifie que ces opérations ne nécessitent pas de
parcourir toute la liste, mais simplement de réaliser un nombre constant
d'opérations, qui ne dépend donc pas de la taille de la liste.
L'ajout en queue de liste par contre n'est possible qu'en parcourant toute la
liste jusqu'à trouver le dernier élément. Une fois cet élément trouvé, il est
alors possible de rajouter un nouvel élément en queue.
Modifiez votre structure de données pour rendre l'ajout en queue également en
temps constant. Attention à gérer correctement les cas particuliers, par exemple
lorsque la liste est vide.
<a name="serpent"></a>
### Serpent
Avec les opérations d'ajout en tête et d'ajout en queue, les listes chaînées
sont adaptées pour réaliser un jeu de *serpent*. Une base vous est fournie, à
vous de l'étendre pour ajouter l'apparition de bonus à manger, des niveaux plus
complexes, l'éventuel changement de niveau, le score, ...
<a name="rappels"></a> <a name="rappels"></a>
## Rappels ## Rappels
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment