Skip to main content Link Search Menu Expand Document (external link)
  1. Compilation
    1. C++ compilation flags
  2. Tests
  3. Graphviz
    1. Version OCaml

Compilation

Pour un fichier A.cpp

make A

La commande officielle est :

g++ -x c++ -Wall -Wextra -O2 -std=gnu++20 -static -pipe A.cpp -o A

C++ compilation flags

If we take a obviously bad code:

#include <bits/stdc++.h>
#include <iostream>
using namespace std;

int main(void) {
    int t[5];
    cout << t[6] << endl;
    return 0;
}

If your compiler flags contain (i.e. the “args” of your tasks.json config file in VSCode/Codium):

            "-fsanitize=address",
            "-fsanitize=undefined",
            "-std=c++20",

Then you should have some nice error message:

bad.cpp:7:16: runtime error: index 6 out of bounds for type 'int [5]'
bad.cpp:7:16: runtime error: load of address 0x7fffffffd5d8 with insufficient space for an object of type 'int'

Tests

Pour exécuter un fichier de tests :

./A < A.in

Pour exécuter un tas de fichiers de tests :

for x in *in; do ./A < $x; done
cat *out  # Pour comparer

You may want to check cph competitive programming helper. There are browser extensions to import the testcases in VSCode or other IDEs.

I am impressed by the notebook of KTH which is tested, like any notebook should be.

If you want to troll, you should learn about policy-based data structures.

Graphviz

Pour visualiser un graphe, la syntaxe est la suivante :

digraph G {
    rankdir=LR;
    s -> 1 [label=1];
    s -> 2;
    1 -> 3;
    1 -> 4 [label=1];
    2 -> 4;
    3 -> t;
    4 -> t [label=1];
}

Et la commande :

dot -Tpng graph.dot > graph.png

Donne le graphe suivant :

Par exemple, ce code C++ peut faire l’affaire :

void graphviz() {
    cout << "digraph G {" << endl;
    int v;
    for(int u = 0; u < 2 * n + 2; ++u) {
        for(int i = 0; i < graph[u].size(); ++i) {
            v = graph[u][i];
            cout << u << " -> " << v << "[label=" << flow[u * SIZE + v] << "];" << endl;
        }
    }
    cout << "}" << endl;
}

En remplaçant éventuellement flow par capacity.

Version OCaml

Merci à Clémence Réda pour cette version.

(* La fonction prend en argument un graphe non orienté sous forme de liste *)
(* d'adjacence et affiche le graphe correspondant sous forme d'un code DOT *)

type graphe = int*int list array;;

let print = Printf.printf;;

let grapheno g = 
  let n=Array.length g in
  print "graph g { \n";
  for i=0 to (n-1) do
     let rec affiche liste = match liste with
      |[] -> ()
      |(b,c)::q -> print "%d -- %d [label=%d]; \n" i b c;affiche q
     in affiche g.(i);
  done;print " } \n";;

(* version orientée *)

let grapheo g = 
  let n=Array.length g in
  print "digraph g { \n";
  for i=0 to (n-1) do
     let rec affiche liste = match liste with
      |[] -> ()
      |(b,c)::q -> print "%d -> %d [label=%d]; \n" i b c;affiche q
     in affiche g.(i);
  done; print " } \n";;

(* version avec liste d'arêtes, non orienté *)

let graphelno g =
   print "graph g { \n";
   let rec affiche liste = match liste with
     |[] -> print " } \n"
     |(i,j,poids)::q -> print "%d -- %d [label=%d]; \n" i j poids;affiche q
   in affiche g;;

(* version avec liste d'arêtes, orienté *)

let graphelo g =
   print "digraph g { \n";
   let rec affiche liste = match liste with
     |[] -> print " } \n"
     |(i,j,poids)::q -> print "%d -> %d [label=%d]; \n" i j poids;affiche q
   in affiche g;;

let graphe = [(1,2,0);(3,1,0);(4,5,0);(4,8,0);(1,7,0);(1,4,0);(7,1,0);(2,4,0)];;
graphelno graphe;;