Skip to content
Snippets Groups Projects
Commit 3dac0f53 authored by orestis.malaspin's avatar orestis.malaspin
Browse files

first commit. nothing done yet

parents
No related branches found
No related tags found
No related merge requests found
Makefile 0 → 100644
OPTIONS = --filter=pandoc-numbering
OPTIONS += --filter=pandoc-crossref
PDFOPTIONS = --highlight-style kate
PDFOPTIONS += --pdf-engine pdflatex
PDFOPTIONS += --number-sections
PDFOPTIONS += --template=./default.latex
HTMLOPTIONS += -t html5
HTMLOPTIONS += -c css/styling.css
HTMLOPTIONS += --self-contained
HTMLOPTIONS += --mathjax=MathJax.js
MD=$(wildcard *.md)
HTML=$(MD:%.md=%.html)
PDF=$(MD:%.md=%.pdf)
all: $(HTML) $(PDF)
%.pdf: %.md Makefile
pandoc -s $(OPTIONS) $(PDFOPTIONS) -o $@ $<
%.html: %.md Makefile
pandoc -s $(OPTIONS) $(HTMLOPTIONS) -o $@ $<
deploy: all
mkdir -p prog_seq_c_tp/matrices_intro
cp matrices_intro.html prog_seq_c_tp/matrices_intro/index.html
cp matrices_intro.pdf prog_seq_c_tp/matrices_intro/matrices_intro.pdf
clean:
rm -rf *.html *.pdf prog_seq_c_tp
var fileref=document.createElement('script')
fileref.setAttribute("type","text/javascript")
fileref.setAttribute("src", "https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML")
document.getElementsByTagName("head")[0].appendChild(fileref)
---
author:
- Tableaux unidimensionnels
title: Cours de programmation séquentielle
autoSectionLabels: false
autoEqnLabels: true
eqnPrefix:
- "éq."
- "éqs."
chapters: true
numberSections: false
chaptersDepth: 1
sectionsDepth: 3
lang: fr
documentclass: article
papersize: A4
cref: false
urlcolor: blue
toc: false
---
# Les matrices
## Buts
Utilisation de pointeurs sur des pointeurs en `C`.
## Énoncé
Écrire des fichiers `matrix.h` et `matrix.c` pour manipuler des matrices de nombres à virgule flottantes.
Le contenu de la matrice devra être alloué dans une zone contiguë de la mémoire, tout en restant accessible par l'opérateur `[]`.
## Cahier des charges
Pour manipuler des matrices, vous devrez implémenter les fonctions suivantes
* création d'une nouvelle matrice de `row` lignes et `col` colonnes
```language-c
m_double* matrix_alloc(unsigned int row, unsigned int col);
```
* calcul de la transposée de la matrice en paramètre
```language-c
m_double* matrix_transpose(m_double* m);
```
* addition des 2 matrices en paramètre (retourne `NULL`{.language-c} si l'opération est impossible)
```language-c
m_double* matrix_add(m_double* m1, m_double* m2);
```
* multiplication des 2 matrices en paramètre (retourne `NULL`{.language-c} si l'opération est impossible)
```language-c
m_double* matrix_mult(m_double* m1, m_double* m2);
```
* libération de la matrice en paramètre
```language-c
void matrix_free(m_double* m);
```
Le type matrice sera défini en `C` de la manière suivante
```language-c
typedef struct m_double {
unsigned int row, col;
double** content;
} m_double;
```
Voici une illustration d'une matrice avec `row=5` et `col=4`.
Il faut d'abord allouer la zone mémoire des éléments et le tableau de pointeurs content,
puis faire pointer chaque pointeur de content au bon endroit dans la zone mémoire des éléments
(c'est-à-dire sur chaque élément de début de ligne, voir @fig:matrix).
![Les éléments de `content` pointent sur l'élément de début des lignes de la matrice.](figs/matrix.svg){#fig:matrix width=100%}
Écrire un programme de test `matrix_compute.c` utilisant vos fichiers de manipulation de matrices.
Les matrices avec lesquelles on effectuera les opérations doivent être stockées dans des fichiers
structurés en un format spécifique (voir plus bas). Le programme lit donc les matrices depuis des
fichiers et écrit le résultat de l'opération à l'écran dans le même format.
## Format d’un fichier matrices
* La première ligne du fichier indique la dimension de la matrice. Le format est
```language-c
<nombre de ligne> <un espace> <nombre de colonne>
```
* Les lignes suivantes définissent les lignes de la matrice. Le format est
```language-c
<valeur1> <un espace> <valeur2> <un espace> … <valeurN>
```
* Aucune valeur ne doit contenir de zéros terminaux (sauf la valeur `0`); par exemple la valeur `1.0` doit être écrite 1, la valeur `7.450` doit être écrite `7.45`, la valeur `0.000` doit être écrite `0`, etc. (cf. plus bas pour voir comment réaliser ceci en `C`).
A titre d’exemple, soit la matrice A ci-dessous
\begin{equation}
\underline{\underline{A}} =
\begin{pmatrix}
2.2 & 1.3 & -1.2 & -2.2 \\
3.0 & 1.2 & 1.3 & 3.3 \\
1.0 & 4.0 & -1.3 & -1.0 \\
\end{pmatrix}.
\end{equation}
sera représentée par le contenu du fichier suivant
```
3 4
2.2 1.3 -1.2 -2.2
3 1.2 1.3 3.3
1 4 -1.3 -1
```
La fonction `printf` du langage `C` permet d’afficher des nombres de type double dans le format correct avec le formatteur `%g`.
Par exemple, pour afficher le double `x=9.230` dans le bon format (sans zéros terminaux), on écrira
```language-c
printf("%g", x);
```
Voici maintenant un exemple plus complet d’addition de matrices
\begin{equation}
\underline{\underline{A}} =
\begin{pmatrix}
2.2 & 1.3 & -1.2 & -2.2 \\
3.0 & 1.2 & 1.3 & 3.3 \\
1.0 & 4.0 & -1.3 & -1.0 \\
\end{pmatrix}
\mbox{ et }
\underline{\underline{B}} =
\begin{pmatrix}
1.2 & 2.3 & 3.2 & -1.2 \\
2.0 & 0.2 & 2.3 & 3.0 \\
1.0 & 3.2 & 1.3 & -1.0 \\
\end{pmatrix}.
\end{equation}
donne comme résultat
\begin{equation}
\underline{\underline{A}}+\underline{\underline{B}} =
\begin{pmatrix}
3.4 & 3.6 & 2.0 & -3.4 \\
5.0 & 1.4 & 3.6 & 6.3 \\
2.0 & 7.2 & 0.0 & -2.0 \\
\end{pmatrix}.
\end{equation}
Les éléments des matrices `A` et `B` doivent être stockés selon le format décrit auparavant dans des fichiers nommés par exemple `matA.dat` et `matB.dat`.
Voici le contenu du fichier `matA.dat` correspondant à la matrice `A` ci-dessus
```
3 4
2.2 1.3 -1.2 -2.2
3 1.2 1.3 3.3
1 4 -1.3 -1
```
Le calcul doit pouvoir être lancé avec la commande
```
./matrix_compute add matA.dat matB.dat
```
et le résultat s'affiche à l'écran suivant le même format que décrit auparavant
```
3 4
3.4 3.6 2 -3.4
5 1.4 3.6 6.3
2 7.2 0 -2
```
Si le calcul est impossible, rien n'est affiché.
De même, on effectuera respectivement multiplication et transposition avec les commandes
```
./matrix_compute mult matA.dat matB.dat
./matrix_compute transpose matA.dat
```
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment