Partage
  • Partager sur Facebook
  • Partager sur Twitter

Refonte du cours C

31 mai 2018 à 16:33:18

Il est clair qu'un programmeur C doit savoir programmer (en C), et maitriser un certain nombre de choses.

Mais apprendre le langage C, et apprendre à programmer, c'est pas évident de mettre ça dans le même sac. Il est certainement plus efficace d'apprendre d'abord à programmer avec un langage décent, et ensuite d'apprendre le C si on en a vraiment besoin.

  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2018 à 7:25:53

Un langage décent ??? qu'est ce que tu appelles un laquage décent stp ??? java, python ??? non sans décorner apprendre sur un langage exigent permet de prendre de bon reflexes

-
Edité par ox223252 1 juin 2018 à 8:13:28

  • Partager sur Facebook
  • Partager sur Twitter

la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

Mon GitHub

1 juin 2018 à 7:47:05

Un langage exigent c’est plutôt un langage qui ne laisse passer aucune erreur. En C, ton programme peut parfaitement avoir l’air de fonctionner et pourtant avoir de gros problèmes. Plus encore, le réflexe que la plupart des débutants tirent du C, c’est celui de réinventer la roue carrée.

  • Partager sur Facebook
  • Partager sur Twitter
Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
1 juin 2018 à 9:24:18

ox223252 a écrit:

Un langage décent ??? qu'est ce que tu appelles un laquage décent stp ??? java, python ??? non sans décorner apprendre sur un langage exigent permet de prendre de bon reflexes

-
Edité par ox223252 il y a environ 1 heure


Ca serait bien que

  • tu détailles lesquels, de "bons réflexes", parce que sinon on en reste au niveau des incantations magiques genre "c'est formateur"
  • et que tu nous montres du code de débutants en C qui montre qu'ils les prennent réellement !

Parce qu'avec les questions posées dans ce forum (*), et le code qu'on y voit, c'est pas tout à fait la conclusion qu'on peut en tirer.  On y voit surtout du code mal structuré, des considérations complètement fausses sur "l'optimisation" ("je prends une liste chainée parce que c'est plus efficace"), une obsession pour faire (et refaire) le code à bas niveau par manque d'abstraction, au lieu de découper en modules, etc.

 (*) pas que. Y a qu'à voir les questions de débutants sur StackExchange, c'est pareil.

-
Edité par michelbillaud 1 juin 2018 à 9:34:57

  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2018 à 9:46:37

Le C n'est pas un langage exigeant. Programmer en C nécessite d'être exigeant avec soi-même, mais le langage est l'un des moins exigeant qui soient. Ce qui en fait un des pires langages pour débuter du coup.

  • Partager sur Facebook
  • Partager sur Twitter

Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

1 juin 2018 à 10:30:20

Après on peut discuter des vertus pédagogiques de l'approche masochiste "je commence à programmer avec un langage où il faut tout faire à la main et où tout peut me péter à la gueule sans l'aide du compilateur".  Un meilleur outil serait l'assembleur dans ce cas.  Ou mieux le codage en binaire/hexa d'instructions soigneusement assemblées à la main.

Le principal résultat de ce genre d'approche, c'est que ça dégoûte irrémédiablement la très grande majorité des débutants, qui ne sont pas passionnés par l'écriture de programmes qui font la somme d'éléments d'un tableau, et qui seraient plus motivés si on leur donnait d'emblée les moyens de faire un programme qui fait un truc rigolo.

Exemple avec Processing (Java)  : une balle qui se dirige vers l'endroit où on clique.

void setup() {
  size(400, 400);
}

int xc = 0, yc = 0;   // position du cercle
int xd = 200, yd = 200;  // destination

void draw() {
  deplacement_vers_destination();
  background(0);
  fill(255,0,0);
  ellipse(xd, yd, 10, 10);  // la destination
  fill(0,255,0);
  ellipse(xc, yc, 20, 20); // le cercle
}

void deplacement_vers_destination() { 
  xc = rapprocher(xc, xd);
  yc = rapprocher(yc, yd);
}

int rapprocher(int a, int b) {
  return a + ( a<b ? 1 
             : a>b ? -1 
             : 0);
}

void mousePressed() {
  xd = mouseX;
  yd = mouseY;
}



Combien de jours de formation C pour envisager de faire quelque chose d'équivalent ?

-
Edité par michelbillaud 1 juin 2018 à 10:31:00

  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2018 à 11:02:54

J'ai commencé à apprendre le C avec le cours d'OC, et je trouve avec le recul que la chapitre sur les pointeurs est mal conçu, car il apprend juste qu'il faut passer l' adresse d'un type T lorsque le type de la fonction est un pointeur sur ce type T et.... c'est tout. Ce qui fait que quand je voyais un pointeur dans une fonction je pensais que c'était un passage par adresse. Ce qui fait que dans le code suivant (où il y a un bug, je vous laisse le trouver) :

#define ARRAY_SIZE 16

void allocateArray(int *array)
{
    array = malloc(ARRAY_SIZE * sizeof(int) );
}

int main()
{
   int *array = NULL;
   allocateArray(array);
   
   if( array )
   {
       //On arrive jamais dans cette condition
   }
}

En fait le cours d'OC n'explique pas qu'on peut passer un pointeur par valeur/copie si le type de la fonction dans laquelle on passe le pointeur est du même type que le pointeur (l'adresse est copiée). Je pense que si le cours d'OC exposait plusieurs cas de figure différents où les pointeurs sont utilisés , cela serait plus formateur pour les débutants.

  • Partager sur Facebook
  • Partager sur Twitter

Mon site web de jeux SDL2 entre autres : https://www.ant01.fr

1 juin 2018 à 14:43:22

C'est que le cours ne présente pas clairement (ou pas du tout)  la différence entre les niveaux

  • un niveau conceptuel, dans lequel on parle du découpage d'un programme en actions qui agissent sur des données indiquées en paramètres, certains étant passés par valeur (le paramètre reçu contient une copie de la valeur), et d'autre par référence (le paramètre désigne la donnée elle-même)
  • le moyen de le faire en C, où n'existe fondamentalement que le passage de copie (on ne parle pas des macros, hein), et si on veut _simuler_ un passage par référence, on transmet une adresse (par copie) qui arrive dans un paramètre formel qui est alors un pointeur (une variable contenant une adresse).

Il faudrait être beaucoup plus précis : en C "passer une variable comme paramètre" ça n'existe pas. Ce qu'on passe, c'est soit son contenu (par copie), soit son adresse (par copie).

Et si on passe un tableau, c'est encore une copie de l'adresse de son premier élément. C'est le bordel, les tableaux. C'est normal, c'est un truc recollé de travers lors de la conception de C (pourquoi t1 = t2, ça copie pas t2 quand c'est des tableaux/chaines alors que ça le fait avec les autres types, hein ? Quel langage de daube !)

---

Pour introduire ça, il faudrait plus d'exemples du genre

void demander_date_naissance( int * adr_annee, 
                              int * adr_mois, 
                              int * adr_jour) {
    printf("Jour de naissance : ");
    scanf("%d", adr_jour);
     ....
}


int jour, mois, annee;
demander_date_naissance( & annee, & mois, & jour);  // appel


Une fois qu'on aura compris que scanf prend comme paramètre une adresse, que cette adresse est reçue par un paramètre qui contient une adresse (on dit que c'est un pointeur), et que ce pointeur a été initialisé à partir d'une adresse (d'une donnée contenue dans une variable) ça ira mieux.

Inutile d'aller chercher l'allocation dynamique pour illustrer ça.  Le découpage en fonctions suffit pour fournir des exemples.

-
Edité par michelbillaud 1 juin 2018 à 14:50:12

  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2018 à 15:52:03

michelbillaud a écrit:

Il faudrait être beaucoup plus précis : en C "passer une variable comme paramètre" ça n'existe pas. Ce qu'on passe, c'est soit son contenu (par copie), soit son adresse (par copie)

J'ai aussi souvent remarqué ces raccourcis fautifs "retourner une variable", "passe la variable", etc.

Mais la notion de copie elle-même n'est pas terrible. En fait, il n'y a que des expressions qui produisent des valeurs typées.

  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2018 à 15:59:35

Il y a une embrouille avec la terminologie adoptée, pour classifier les modes de passages de paramétre, du temps d'Algol.  call by value, call by name, call by reference, call by result, call by value result.....

(A l'époque, ça expérimentait dans tous les sens).

https://courses.cs.washington.edu/courses/cse341/04wi/lectures/22-parameter-passing.html

(qui raconte des blagues avec @ au lieu de &. Bonjour la référence.)

La flemme de vérifier où exactement, mais dans la norme C elle-même, il y a aussi un certain flottement quant à l'usage de "pointeur" pour ce qui est une adresse.

-
Edité par michelbillaud 1 juin 2018 à 16:02:49

  • Partager sur Facebook
  • Partager sur Twitter
1 juin 2018 à 16:00:57

Mais enfaite concrètement il n'y a qu'une façon de passer une variable à une fonction :

"par copie".

Et là soit tu passe la variable elle même et sa valeur sera "copié" dans la variable de la fonction.

Soit tu passe l'adresse de ta variable et cette adresse sera "copié" dans la variable de la fonction.

Je trouve ça beaucoup plus simple, et ça justifie directement l'utilisation des adresses, et de choses tels que des doubles ou des triples pointeurs.

Un grand nombre de débutant comprennent la partie 1 mais pas la partie 2 :

struct s_s1 {
 int a;
 int b;
};

// Compris
// Il faut passer un pointeur à la fonction pour modifier les champs de la structure
int f1 (struct s_s1 * s) {
  s->a = 42;
}

// Pas compris
// Modifier le pointeur dans la fonction ne le modifie pas dans la fonction appelante.
int f2(struct s_s1 *s) {
   s = malloc(sizeof(struct s_s1));
}



  • Partager sur Facebook
  • Partager sur Twitter
Si debugger, c’est supprimer des bugs, alors programmer ne peut être que les ajouter - Edsger Dijkstra
1 juin 2018 à 16:08:30

damjuve a écrit:

Mais enfaite concrètement il n'y a qu'une façon de passer une variable à une fonction

Le truc c'est que "passer une variable" c'est déjà un gros abus de langage, c'est bien une valeur qui est "transmise" (qui peut déjà être vu comme un abus de langage) à la fonction.

  • Partager sur Facebook
  • Partager sur Twitter

Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

1 juin 2018 à 16:26:37

Ksass`Peuk a écrit:

damjuve a écrit:

Mais enfaite concrètement il n'y a qu'une façon de passer une variable à une fonction

Le truc c'est que "passer une variable" c'est déjà un gros abus de langage, c'est bien une valeur qui est "transmise" (qui peut déjà être vu comme un abus de langage) à la fonction.


En effet, je penses que plus on est précis dans les termes qu'on utilise, et plus on s'approche du comportement réèl, plus on réduit les risques de mauvais interprétations des débutants. Quitte à les forcers à lire et relire des passages expliquant en détails le fonctionnement.

Pour moi apprendre le C, c'est également apprendre une partie du fonctionnement de l'ordinateur. On ne peut pas faire un tutoriel sur le C en occultant ce côté très proche de la machine inhérant au C. Et c'est selon moi le principal défaut du tuto d'OC, être trop débutant friendly.

Si non, puisqu'on est nombreux à vouloir voir ce cours évoluer, pourquoi ne pas le faire ensemble ? Je veux dire on a tous passé pas mal de temps à expliquer les concepts du C aux débutants, on sait ce sur quoi il bloque et comment on arrive à leur faire avoir le déclic.

Si vous êtes intéressé on peut organiser ça sous forme d'un petit forum ou d'un wiki pour avoir des sujets de discussions en fonction des différentes parties.

  • Partager sur Facebook
  • Partager sur Twitter
Si debugger, c’est supprimer des bugs, alors programmer ne peut être que les ajouter - Edsger Dijkstra
1 juin 2018 à 16:38:59

damjuve a écrit:

Si vous êtes intéressé on peut organiser ça sous forme d'un petit forum ou d'un wiki pour avoir des sujets de discussions en fonction des différentes parties.

Bof. Au choix, je pense que contribuer au cours sur Zeste de Savoir qui est déjà très complet et plutôt bien réalisé serait plus profitable.

  • Partager sur Facebook
  • Partager sur Twitter

Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

8 juin 2018 à 21:17:29 - Message modéré pour le motif suivant : Message complètement hors sujet


11 juin 2018 à 9:00:56

Ksass`Peuk a écrit:

damjuve a écrit:

Si vous êtes intéressé on peut organiser ça sous forme d'un petit forum ou d'un wiki pour avoir des sujets de discussions en fonction des différentes parties.

Bof. Au choix, je pense que contribuer au cours sur Zeste de Savoir qui est déjà très complet et plutôt bien réalisé serait plus profitable.


Participer au Tuto de zeste du savoir pk pas, mais il n'en reste pas moins que celui d'OC existe est qu'il n'est pas adapté, donc autant le changer car faire évoluer celui de zeste mais pas celui d'OC, ne va pas améliorer le schmilblick pour les gens ne lisant que celui d'OC.

Par contre le fait de l'écrire ensemble, est une idée qui  serai pas mal, à condition que l'écriture soit... très très bien organisé, sinon ça va vite devenir le bordel :colere:.

Une solution serait : un groupe de personnes qui prévoit l'architecture globale, validé par la communauté. Puis des petits groupes qui travaillent sur diffèrent points, et enfin une mise en commun.

Par expérience, si on demande à tout le monde faire tout, on arrive à rien :-°.

-
Edité par ox223252 11 juin 2018 à 9:01:39

  • Partager sur Facebook
  • Partager sur Twitter

la connaissance est une chose qui ne nous appauvrit pas quand on la partage.

Mon GitHub

11 juin 2018 à 9:20:25

De toute façon, de ce côté c'est réglé, OC n'accepte plus les contributions sans mise sous contrat avec eux.

  • Partager sur Facebook
  • Partager sur Twitter

Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

11 juin 2018 à 9:51:16

Une autre solution pour faire réagir OC (qui semble avoir complètement oublié ce sujet) :

Pour tout les contributeur régulier de ce forum, placer un lien dans notre signature vers le tuto de ZDS.

Quelque chose comme : Apprenez le C correctement avec un tutoriel à jour !

Si on a tous la même ça peut interpeller les débutants

  • Partager sur Facebook
  • Partager sur Twitter
Si debugger, c’est supprimer des bugs, alors programmer ne peut être que les ajouter - Edsger Dijkstra
11 juin 2018 à 13:43:12

en attendant une mlse à jour des conditions d'utilisation : promotion d'un autre site => dehors.

  • Partager sur Facebook
  • Partager sur Twitter
11 juin 2018 à 14:28:34

michelbillaud a écrit:

en attendant une mlse à jour des conditions d'utilisation : promotion d'un autre site => dehors.


On ne promeux pas réèlement un autre site mais un autre tuto. Et c'est pas faute de leurs demander de faire quelque chose pour le tuto d'OC...

Si on le fait tous, ça les fera peut etre enfin agir :-/

  • Partager sur Facebook
  • Partager sur Twitter
Si debugger, c’est supprimer des bugs, alors programmer ne peut être que les ajouter - Edsger Dijkstra
3 juillet 2018 à 16:51:48

Salut a tous, un chapitre dans les notions avancees sur les pointeurs sur fonctions serait top exemple pour maper les touches d'un jeu avec la sdl :)
  • Partager sur Facebook
  • Partager sur Twitter
3 juillet 2018 à 17:10:59

Voilà pour les pointeurs de fonctions. Quant à savoir si c'est une bonne idée de lest utiliser comme tu le proposes avec la SDL, je suis dubitatif, mais c'est une bonne idée de discussion à avoir sur le forum.

  • Partager sur Facebook
  • Partager sur Twitter
Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
10 août 2018 à 12:22:29

damjuve a écrit:

Une autre solution pour faire réagir OC (qui semble avoir complètement oublié ce sujet) :

Pour tout les contributeur régulier de ce forum, placer un lien dans notre signature vers le tuto de ZDS.

Quelque chose comme : Apprenez le C correctement avec un tutoriel à jour !

Si on a tous la même ça peut interpeller les débutants


Merci beaucoup en tant que débutant c’est toujours bien de multiplier les sources d’apprentissage, après les différentes facons de faire sont bonnes à prendre à condition qu’elles ne diffèrent pas énormémen.
  • Partager sur Facebook
  • Partager sur Twitter
23 août 2018 à 1:52:47 - Message modéré pour le motif suivant : Message complètement hors sujet


Anonyme
27 septembre 2018 à 17:07:35

Du coup, où en est cette refonte ? Quelqu'un a des nouvelles ? Et les autres langages abordés ?
  • Partager sur Facebook
  • Partager sur Twitter
24 octobre 2018 à 1:51:51

J'ai compris le principe des tableaux mais j'arrive pas à faire les exercices quelqu'un peut me passer la correction pour comprendre comment faire ?

Lien : https://openclassrooms.com/en/courses/19980-apprenez-a-programmer-en-c/15540-les-tableaux

PS: les exercices sont tout en bas?

Merci!

  • Partager sur Facebook
  • Partager sur Twitter
24 octobre 2018 à 7:50:25

Si tu n'arrives pas à faire les exercices, c'est que tu n'as pas compris.

Si on te donnait des solutions, tu aurais l'impression de les comprendre. Et ca serait complètement faux : tu ne sauras pas  comment chercher et trouver des solutions. 

-
Edité par michelbillaud 24 octobre 2018 à 7:51:36

  • Partager sur Facebook
  • Partager sur Twitter
24 octobre 2018 à 8:47:11

+1 michelbillaud

Et surtout, ce sujet vise à discuter de la refonte du cours de C, pas à recevoir de l'aide personnelle. MehdiChaouni, je t'invite à créer ton propre sujet, en expliquant ce que tu as compris et essayé de faire de ton côté, code à l'appui, on pourra mieux t'aider. ;)

  • Partager sur Facebook
  • Partager sur Twitter

Moderateur forum || FAQ 3D || discord 3D francophone || OC Tweak script

28 novembre 2018 à 9:40:03

Bonjour à tous !

Quand es ce que le cours va il être mis à jours ?

  • Partager sur Facebook
  • Partager sur Twitter
28 novembre 2018 à 19:18:22

Nono974_974 a écrit:

Bonjour à tous !

Quand es ce que le cours va il être mis à jours ?


Je m'avance peu être, mais le projet n'aboutiras sans doute jamais.
  • Partager sur Facebook
  • Partager sur Twitter