Skip to content

Instantly share code, notes, and snippets.

@clm-a
Last active October 17, 2016 14:05
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save clm-a/97de9032745bc8c1686d94e55fba7094 to your computer and use it in GitHub Desktop.
Save clm-a/97de9032745bc8c1686d94e55fba7094 to your computer and use it in GitHub Desktop.

Algo cheatsheet

##1. Structure du fichier source

####En C : script.c

#include <stdio.h>
void main(){
  // commentaire
  // Code ici !
  printf("Hello world");
}

####En PHP : script.php

<?php

echo "Hello world";
?>

##2. Exécution du script

####En C : Compilation :

gcc script.c -o script

Exécution :

./script

####En PHP : Exécution (langage non compilé)

php script.php

##3. Définition de variables ####En C :

int a = 1;      // int = nombre entier, double = grand entier, float = nombre à virgule, char = caractère
double b = 1;
float f = 1.1;
char c = 'a';
char chaine[80] = "Hello world"; // une chaine de caractères est un tableau de caractères dont on doit allouer une taille max

####En PHP :

$a = 1; // le typage est flexible et dynamique, php devine le type et on peut réattribuer une valeur d'un autre type à la même variable.
$a = 1.1;
$a = "Hello world!";

##3. Entrées / sorties ###3.1 Lire une saisie utilisateur ####En C :

char chaine[80] = "";
scanf("%s", chaine);
int nombre ;
scanf("%d", &nombre);

####En PHP :

$chaine = fgets(STDIN);

###3.2 Ecrire une variable à l'écran ####En C :

char chaine[80] = "Coucou";
printf("%s", chaine)
int nombre = 8;
printf("%d", nombre);

####En PHP :

$ma_variable = "Hello";
echo $ma_variable;

###3.3 Interpolation (écrire une variable dans une chaine de caractères) ####En C :

double variable = 12;
printf("Ma variable est %d", variable);

####En PHP :

$ma_variable = 12;
echo "Ma variable est {$ma_variable}";

##4. Structures de code ###4.1 Si ... alors ####En C :

int note = 12;
if( note > 12 ){
  // alors
  // (assez bien)
} else if ( $note > 10 ) {
  // ou alors si
  // (passable)
} else {
  // sinon
  // (insuffisant)
}

####En PHP (c'est pareil, sauf l'écriture de la variable --normal--) :

$note = 12;
if( $note > 12 ){
  // alors
  // (assez bien)
} else if ( $note > 10 ) {
  // ou alors si
  // (passable)
} else {
  // sinon
  // (insuffisant)
}

###4.2 Cas ... alors ####En C :

char c = 'a';
switch(c){
  case 'a' :
    // du code qui s'exécute si c == 'a'
    break;
  case 'b' :
    // du code qui s'exécute si == 'b'
    // note : Si on a pas mis de break dans le cas précédent, le code ici s'exécute aussi
    break;
  default:
    // du code qui s'execute dans tous les cas
    // note : Si on a pas mis le break dans les cas précédents, le code ici s'exécute aussi
}

####En PHP, c'est pareil (sauf l'écriture des variables comme ci-avant) !

###4.3 Pour i allant de 0 à 4 par pas de 1 ####En C :

for(int i = 0 ; i < 5 ; i ++){  // i ++ est un raccourci pour i = i + 1 ou
  printf("%d", i);
}

####En PHP, c'est pareil

for($i = 0 ; i < 5 ; i ++){
  echo $i
}

####Variante pour i allant de 0 à 8 par pas de 2

// En C, mais c'est pareil en php
for(int i = 0 ; i < 9 ; i = i + 2){
  printf("%d", i);
}

###4.4 Tant que la condition est vraie, faire ... ####En C (c'est pareil en PHP) :

int c = 0;
while( c < 5 ){
  // le code est exécuté et répété autant de fois que la condition est vraie
  c = c + 1;
}
// Strictement équivalent à :
for(int c = 0 ; c < 5 ; c++){
  // Et pour cause, un for c'est un juste while raccourci
}

###4.5 Faire ... tant que la condition est vraie

do{
  // ici, le code s'exécute au moins une fois, puisque le test est effectué plus bas
} while( condition );

##5 Les tableaux ###5.1 une dimensions ####En C :

  int tab[3] = {1, 12, 15}; // un tableau d'entiers de trois cases
  tab[1]; // vaut 12

####En PHP :

  $tab = [1, 12, 15];
  $tab[1]; // vaut 12 aussi

###5.2 deux dimensions ####En PHP (c'est pareil en C)

  $tab = [[1, 12, 15],[5, 56, 24]];
  $tab[0][1]; // vaut 12 : valeur dans la 1ème case de la deuxième dimension de la 0ème case de la première dimension
              // autrement dit, 1ère ligne, 2è colonne
  $tab[1][2]; // vaut 24 (2è ligne, 3è colonne)

####On peut avoir autant de dimensions qu'on veut ###5.3 Parcours d'un tableau à deux dimensions (exemple en PHP)

  $tab = [[12, 54],[25, 48],[1, 24]]
  for($ligne = 0 ; $ligne < 3 ; $ligne++){
    for($colonne = 0 ; $colonne < 2 ; $colonne ++){
      echo "({$ligne, $colonne}) : {$tab[$ligne][$colonne]} \n";
    }
  }
  /* va afficher
   (0,0) : 12
   (0,1) : 54
   (1,0) : 25
   (1,1) : 48
   (2,0) : 1
   (2,1) : 24
  La boucle sur $colonne aura été elle-même 3 fois parcourue par la boucle $ligne ($colonne valant successivement 0 puis 1 à chaque tour de boucle $ligne) */

###5.3 Parcours d'un tableau avec foreach

  $tab = [[12, 54],[25, 48],[1, 24]]
  foreach($tab as $value_tab ){
    foreach($sous_tab as $value_sous_tab){
      echo $value_sous_tab. ", ";
    }
  }
  // si on veut connaitre l'index :
  foreach($tab as $key_tab => $sous_tab ){
    foreach($sous_tab as $key_sous_tab => $value_sous_tab){
      echo "({$key_tab}, {$key_sous_tab}) : {$value_sous_tab}\n";
    }
  }
  /* va afficher :
  (0, 0) : 12
  (0, 1) : 54
  (1, 0) : 25
  (1, 1) : 48
  (2, 0) : 1
  (2, 1) : 24 */

##6 Données structurées ####En C

typedef struct ELEVE ELEVE;
struct ELEVE{
  char prenom[80];
  int age;
}

ELEVE roger; // roger est une variable de type ELEVE
roger.prenom = "Roger";
roger.age = 22;

####Pseudo-équivalent en PHP non-objet (ici : dictionnaire)

$roger= [] ;
$roger['nom'] = "Roger";
$roger['age'] = 22;
// équivalent raccourci :
$roger = [
 'nom' => 'Roger',
 'age' => 22
];
echo $roger['nom'// affiche 22

####Équivalent en PHP objet (bonus !)

class Eleve{
  public $prenom; // public permet d'exposer la variable d'instance $prenom à l'extérieur de la classe
  public $age;
}
$roger = new Eleve(); // $roger est une variable qui stocke une instance d'élève
$roger->prenom = "Roger";

echo $roger->prenom; // affiche "Roger"

##9. Quelques tâches courantes en PHP ####Concaténation

$a = "Hello" . " " . "world";
// $a vaut "Hello world";

####Transtypage

$a = "1";
$b = intval($a);
// $b vaut 1 (et non pas "1")
$c = "1.9";
$d = intval($c);
// $d vaut aussi 1
$e = floatval($c);
// $e vaut 1.9

On peut aussi caster les variables :

$a = (string) 6.8 ; // $a vaut la chaine de caractère "6.8" et non pas le nombre
$b = (int) $a ; // $b vaut le nombre 6
$c = (float) $b ; // $c vaut également 6 (les décimales ont été perdues dans le cast précédent)
$d = (float) $a ; // $d vaut le nombre 6.8 ; normal, on le cast dans sont propre type..

####Spliter et joindre, et faire des traitements de tableaux Exemple statique 1

$ma_chaine = "Roger;Robert;Bernadette";
$mon_tableau = split(";", $ma_chaine);
// $mon_tableau vaut ["Roger", "Robert", "Bernadette"]
$noms_joints = join(" -- ", $mon_tableau);
// $noms_joints vaut "Roger -- Robert -- Bernadette"

Exemple avec une saisie utilisateur

define("MON_SEPARATOR", ';');
echo "Entrez les notes séparées par des ". MON_SEPARATOR ." : " ;
$notes_saisies = fgets(STDIN);

$notes = split(MON_SEPARATOR, $notes_saisies);
// $notes est un nouveau tableau contenant les différentes notes sous forme de petites chaines de caractères.

// On va parcourir le tableau pour convertir les petites chaines en vrais nombres mathématiques :
$somme = 0;
for($i = 0 ; $i < count($notes) ; $i++){
  $note = floatval($notes[$i]);
  $notes[$i]= $note;
  $somme += $note;
}
echo "Moyenne : " . ($somme / count($notes));
var_dump($notes);

Variante en utilisant array_map() pour convertir les petites chaines en vrais nombres.

function convertisseur_en_float($nombre){
  return intval($nombre);
}

$notes = array_map("convertisseur_en_float", $notes_saisies);

On aurait donc aussi pu appeler inval() directement ainsi :

$notes = array_map("intval", $notes_saisies);

Pour faire la somme, on peut appeler array_sum($tableau) ou utiliser reduce($tableau, "nom_de_fonction", valeur_initiale_de_memo)

function ma_somme($memo, $note){
  return $memo + $note; // on envoie la valeur de return dans le "$memo" suivant
}
$somme = array_reduce($notes, "ma_somme", 0); // on initialise ce qui sera envoyé à $memo au premier appel à 0, toutes les cases successives du tableau seront consécutivement attribuées à $note

####Un peu plus loin avec map / reduce On peu imaginer écrire notre propre fonction array_map()

function mon_array_map( $nom_de_la_fonction, $tab ){
  for($i = 0 ; $i < $tab ; $i ++){
    $tab[$i] = call_user_func( $nom_de_la_fonction, $tab[$i]);
  }
  return $tab ;
}
// variante qui modifie le tableau directement sans en faire une copie :
// (bien noter le &)
function mon_array_map_agressif( $nom_de_la_fonction, &$tab ){
  for($i = 0 ; $i < $tab ; $i ++){
    $tab[$i] = call_user_func(  $nom_de_la_fonction, $tab[i] );
  }
}
$tableau_inverse = mon_array_map("intval", $tab);
mon_array_map_agressif("intval", $tab);

Et également notre propre array_reduce()

function oppose($nombre){
  return -1 * $nombre;
}


function mon_array_reduce( $tab, $callback, $initial){
  $memo = $initial;
  for($i = 0 ; $i < $tab ; $i ++){
    $memo = call_user_func(  $nom_de_la_fonction, $memo, $tab[i] );
  }
  return $memo ;
}
// version agressive :
function mon_array_reduce_agressif( &$tab, $callback, $initial){
  $memo = $initial;
  for($i = 0 ; $i < $tab ; $i ++){
    $memo = call_user_func(  $nom_de_la_fonction, $memo, $tab[i] );
  }
  $tab = $memo ;
}


$tableau_oppose = mon_array_reduce($tab, "oppose", 0);
mon_array_reduce_agressif($tab, "oppose", 0);

####9 Un serveur web

<?php

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_bind($socket,"0.0.0.0", 80) or die('Impossible de lier le socket');
socket_listen($socket, 5);
socket_set_nonblock($socket);
while(true){
  $client = socket_accept($socket);
  $output = "Hello world " . strftime("%x %T");
  socket_write($client, $output, strlen ($output));
  socket_close($client);
}
?>

##0. Quelques remarques ###0.1 Façon d'écrire les variable ou les noms de fonctions, ou des identifiants : snake_case on_sépare_les_mots_avec_des_soulignés (lowdashes) : variable et fonctions en C, PHP, Ruby, Python...

SCREAMING_SNAKE_CASE ON_SEPARE_LES_MOTS_EN_MAJUSCULES_AVEC_DES_LOWDASHES : constantes en C, PHP, Ruby, Python

CamelCase OnSépareLesMotsAvecDesMajuscules : classes en Java, PHP, Ruby ...

dromedaryCase onSépareLesMotsAvecDesMajuscules : variables et fonctions en Javascript, java, ...

kebab-case on-sépare-les-mots-avec-des-tirets (hyphens) : Sélecteurs CSS

Train-Case On-Sépare-Les-Mots-Avec-Des-Tirets-Et-Des-Majuscules : jamais rencontré.

###0.2 Indentation Quand on rentre dans une accolade, on met un tab. C'est pour être plus lisible en C ou en PHP mais en Python, il n'y a pas d'accolade et c'est ce qui délimite les structures de code :

En C si je fais une erreur d'indentation c'est pas grave :

if(condition)
  a = 1 ; // Je ne m'exécute que si la condition est vraie
  a = 2 ; // C'est mal indenté, je m'exécute après le if

En Python si je fais la même erreur d'indentation, c'est pluus problématique :

if( condition )
  a = 1 # Je m'éxécute si la condition est vraie
  a = 2 # Je m'exécute aussi si la condition est vraie
a = 3 # Je m'exécute ensuite

###0.2 Liens utiles ####0.2.1 Gravité avec scratch : https://scratch.mit.edu/projects/125269357

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment