Partage
  • Partager sur Facebook
  • Partager sur Twitter

Projet en langage C

7 décembre 2019 à 18:50:15

mugen54 a écrit:

Bonjour et merci pour votre réponse , le prof a dit que c'était mieux si on ne faisait pas de fonctions après c'est pas interdit .

C'est tout à fait navrant.

Dès les années 50, dès que les ordinateurs ont eu des mémoires de quelques kilo-octets,  on s'est rendu compte que programmer, c'était pas aligner des instructions les unes derrière les autres, mais décomposer ce qu'on a à faire en petits morceaux qui ont un rôle bien défini. Et les fonctions sont un moyen de définir et délimiter ces petits morceaux.

C'est ce qu'on appelle la programmation procédurale.  Et normalement, quand on en est arrivé aux listes chainées, on doit avoir largement eu le temps d'écrire des fonctions dans tous les sens (pour ceux qui font leurs exos eux-mêmes).

En C, normalement, on ne devrait pas avoir trop de difficultés à présenter les fonctions aux élèves parce que, dès leurs premiers programmes

  • ils en écrivent obligatoirement une (main)
  • ils en employent forcément (printf, scanf)

en se farcissant de plus le passage d'adresses, obligatoire pour  scanf("%d", & n).

-
Edité par michelbillaud 7 décembre 2019 à 18:58:37

  • Partager sur Facebook
  • Partager sur Twitter
8 décembre 2019 à 2:25:06

mugen54 a écrit:

Bonjour et merci pour votre réponse , le prof a dit que c'était mieux si on ne faisait pas de fonctions après c'est pas interdit .

Bin dit à ton prof qu'avant de donner des exercices de programmation il faut soi-même apprendre à programmer.

Découper un gros problème en petits problèmes simples est la base de toute programmation voire même de la civilisation moderne. Quand on crée une structure, on crée dans la foulée toutes les fonctions de gestion de cette structure comme l'allouer, la renseigner, la manipuler, l'extraire ou la mettre dans un ficher, l'afficher, la libérer et tout le barda.

Bonne continuation.

  • Partager sur Facebook
  • Partager sur Twitter

Bonhomme !! | Jeu de plateforme : Prototype.

8 décembre 2019 à 7:12:26

Salut,
Je pourrais ajouter que de séparer le code en fonctions permet plus de facilité pour la compréhension et la mise au point.
Après seulement, si on veut et croit pouvoir le faire, on peut éliminer certaines fonctions pour intégrer leur code dans le code qui les appelle, et non commencer par l'inverse.
Dans des projets comme celui-ci, le temps d'exécution n'est pas vraiment critique.
Ce n'est pas comme essayer de vérifier la conjecture de Goldbach jusqu'à un milliard.
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

8 décembre 2019 à 8:56:54

Le compilateur se charge de remplacer les appels par du code "inline", si on lui demande gentiment d'optimiser. Et qu'on n'a pas eu l'idée stupide de compiler séparément des fonctions fortement couplées.  Mais par définition, des endroits vraiment critiques dans le code, il y en a très peu.

Mais bon, peut être que le prof est conscient qu'il a raté son cours sur l'usage des fonctions, et que ce qu'il a raconté n'a fait qu'embrouiller ses élèves, au lieu de les aider ?

  • Partager sur Facebook
  • Partager sur Twitter
8 décembre 2019 à 16:38:46

Je vais effectivement en faire je pense ( des fonctions ) mais il a dit qu'ils préféraient un code sans fonctions qui marche plutôt qu'un code avec fonction qui fonctionne pas.

Mais quand vous dites "qui font eux mêmes leurs exos " ou encore " il faut apprendre soi même à programmer" , ça m'est destiné?

Car moi comme je vous l'ai dit j'ai un niveau très faible en programmation et donc je posais simplement quelques questions...

-
Edité par mugen54 8 décembre 2019 à 16:42:29

  • Partager sur Facebook
  • Partager sur Twitter
8 décembre 2019 à 17:23:24

C'est beaucoup plus facile de faire marcher un programme découpé en fonctions parce qu'on peut tester chaque fonction independamment, au lieu d'avoir un gros merdier qui mélange tout.

J'ai le bonheur d'enseigner depuis fort longtemps, alors je sais qu'il y a des stratégies d'optimisation consistant à confier le boulot à quelques uns, et plus ou moins repomper après, éventuellement "en comprenant" (assez pour modifier un peu). Ca serait sympathique, mais le problème c'est que ça ne marche pas du tout en ce qui concerne la programmation, qui est un savoir faire. Si on n'a pas passé assez de temps dessus, ça n'imprime pas.

Le "niveau très faible en programmation", il ne vient pas d'autre chose. Ou alors c'est qu'il manque des neurones, ça se peut aussi.

-
Edité par michelbillaud 8 décembre 2019 à 17:24:49

  • Partager sur Facebook
  • Partager sur Twitter
8 décembre 2019 à 18:47:34

Merci à vous.

Mais nan je vous rassure il ne me manque pas de neurones c'est juste que je ne fais pas que de l'informatique nous avons plusieurs matières à travailler , en revanche je suis assez etonné de ce genre de propos de la part d'une personne qui écrit "Pour les demandes d'aide par message personnel, n'oubliez pas de joindre un chèque" en description ... ^^ 


PS : en tout cas je trouve ça dommage d'en arriver à un tel niveau d'insultes ... surtout que vous n'êtes plus un gamin (quoique...)

-
Edité par mugen54 8 décembre 2019 à 19:00:43

  • Partager sur Facebook
  • Partager sur Twitter
8 décembre 2019 à 19:11:20

Je ne comprend pas pourquoi le prof ne veut pas de fonctions. Il ne sait pas comment l'enseigner?
Michel a peut-être raison, il manque des neurones quelque part ... dans la tête du prof!
Essaies fprintf(brain, ...)
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

8 décembre 2019 à 20:26:44

L'histoire de "je ne fais pas que de l'informatique", ça tient pour chacune des matières que vous suivez, pour lesquelles il faut _aussi_ bosser.

Je ne pense pas avoir insulté qui que ce soit ici (pour l'instant :-)). Le faible niveau en programmation, c'est pas une cause intrinsèque, c'est une conséquence, qui peut venir de plusieurs causes.

Techniquement, ça ne demande pas d'être si intelligent que ça (mais évidemment si on est un génie ça aide), donc une fois éliminé ceux qui ont des difficultés à réfléchir en général, il reste ceux qui n'ont pas travaillé suffisamment la question.  Ca peut être par manque d'intérêt (il n'y a aucune raison que programmer soit l'activité la plus passionnante qui existe pour tout le monde, même pour les génies) et souvent, pour les élèves/lycéens, c'est le fait de ne pas réaliser que ça ne s'apprend pas comme une interro d'histoire géo (pompage pour les devoirs à la maison, et bachotage la veille des exams).

---

PS, puisque vous évoquiez ce point, la dernière demande d'aide dans ma boite :

Même si j'aime bien recevoir des messages disant que je suis très très fort, je ne vois pas pourquoi ça arrive dans ma boite perso plutôt que sur les forums vers lequels je redirige, autant que tout le monde en profite. Surtout qu'en fait, pour les problèmes avec Windows, je n'y connais rien, vu que je ne l'utilise pas (la semaine dernière le technicien a dû me montrer où était le bouton fin de session sous windows 10, alors bon le WinMain qui linke pas, comment dire, je ne suis pas exactement la bonne personne).

Et ça ne date pas d'hier, j'avais commencé une collection

https://www.labri.fr/perso/billaud/depot/ressources/homework/ils-doutent-de-rien.html

(en 2003...)

-
Edité par michelbillaud 8 décembre 2019 à 20:46:53

  • Partager sur Facebook
  • Partager sur Twitter
8 décembre 2019 à 22:41:17

dire à quelqu'un qu'il lui manque des neurones, c'est en effet un manque de respect . Il faut également que vous sachiez qu'on a passé très peu de temps sur les listes chaînées (à peine 1 heure il me semble) c'est peut etre pour ça que je trouve que c'est un peu compliqué...

-
Edité par mugen54 8 décembre 2019 à 22:41:49

  • Partager sur Facebook
  • Partager sur Twitter
9 décembre 2019 à 1:53:51

Je m'excuse auprès de ton prof pour les neurones.
C'est sûr que si le cours est donné en accéléré parmi d'autres cours, ce n'est évident pour personne.
@michelbillaud:
Un autre utilisateur mentionne qu'il ne donne pas de conseils par MP dans sa signature.
D'un autre côté, si on se met à préciser ce qu'on veut ou ne veut pas dans sa signature, ça risque d'être assez long et encombrant pour le forum.
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

9 décembre 2019 à 9:51:11

Il n'y a pas besoin de passer beaucoup de temps en cours sur les listes chainees.

Par contre il faut les pratiquer, c'est pour ça qu'on vous donne des exercices à faire. Ce ne sont pas des applications directes d'un cours qu'on aurait appris (permettez moi de rêver). Mais enfin trouver soi meme comment ajouter retirer au debut a la fin avant ou apres un element de la liste, c'est pas la mer à boire non plus.

Pour ce qui est du manque de neurones, je parlais de la population en général. Je ne vous connais pas personnellement. 

-
Edité par michelbillaud 9 décembre 2019 à 9:53:22

  • Partager sur Facebook
  • Partager sur Twitter
9 décembre 2019 à 18:30:27

Pas de souci.

En faite pour les listes chaînées je suis en train de les revoir de A à Z, et on a fait aucun exercice à dessus si ce n'est ce projet qu'on doit faire soi même .

  • Partager sur Facebook
  • Partager sur Twitter
9 décembre 2019 à 19:06:59

Si c'est les exercices qui manquent, y en a la dedans https://www.labri.fr/perso/billaud/travaux/Pointeurs/pointeurs.html

Points importants

  • faire des petits dessins (*), seul moyen de suivre ce qu'on bidoulle sur les pointeurs de chainage
  • penser systématiquement aux cas des listes vides, du premier et du dernier.

(*) l'expérience montre que les apprentis programmeurs ne tiennent aucun compte de cette recommandation, sortir un crayon et un bout de papier étant peut être au dessus de leurs forces. Non je blague, en fait les jeunes Padawians présompteux pensent être capables de garder en tête une représentation mentale de la situation en programmant.

-
Edité par michelbillaud 11 décembre 2019 à 9:46:25

  • Partager sur Facebook
  • Partager sur Twitter
9 décembre 2019 à 19:22:18

C'est à ce point vrai que même moi qui suis aveugle, J'ai besoin de m'écrire de petits shémas rudimentaires pour m'y comprendre.
Il est vrai que pour les listes chaînées, je n'en suis pas à mes premiers balbutiements.
  • Partager sur Facebook
  • Partager sur Twitter

Le Tout est souvent plus grand que la somme de ses parties.

9 décembre 2019 à 19:31:55

Merci Michel Billaud pour votre lien

Je n'en suis pas encore là mais (forcément ça viendra un jour) 

votre lien ne fonctionne pas mais je vais le recopier 

  • Partager sur Facebook
  • Partager sur Twitter
11 décembre 2019 à 9:46:42

Lien corrigé.

Histoire de ne pas poster pour rien, un extrait :

-
Edité par michelbillaud 11 décembre 2019 à 9:50:45

  • Partager sur Facebook
  • Partager sur Twitter
13 décembre 2019 à 23:04:01

Bonsoir, vous n'auriez pas un lien avec plus d'exercices?

Car j'ai du mal à trouver un site avec un exercice , sur openclassroom l'article sur les listes chaînées ne contient pas vraiment d'exercice 

merci à vous.

Ou sinon voilà ce que j'ai fait pour l'instant , je buge sur le reste si quelqu'un peut m'aider ce serait top 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int min;
int centieme;
int seconde;
char Nom[20];
int Num_dossard;


struct temps
{

	int min;
	int seconde;
	int centieme;
};



struct maillon
{
	int data;
	struct suivant *maillon;
};



typedef struct Skieur Skieur;
struct Skieur
{
	char Nom[20];
	int Num_dossard;
	struct temps temps_1_manche;
	struct temps temps_2_manche;
	int temps;
	Skieur *suivant;

};

typedef struct Liste Liste;
struct Liste
{
	Skieur *premier;

};

typedef struct Abandon Abandon;
struct Abandon
{
	Skieur abandon;
	Abandon *suivant;

};


void main(void)
{

	Skieur ski;
	Liste *p;
	Liste *premier;
	Abandon *abcr;
	Abandon *abc;
	
	p = malloc(sizeof(*p));
	printf("Entrez un nom de skieur");
	scanf("%s", &Nom[20]);

	while (Nom[20] != "oui")
	{

		printf("Donnez le temps en minute");
		scanf("%d", &min);
		printf("Donnez le temps en seconde du skieur");
		scanf("%d", &seconde);
		printf("Donnez le temps en centieme de seconde du skieur");
		scanf("%d", &centieme);
		printf("Donnez le numero de dossard");
		scanf("%d", Num_dossard);

	}

}



-
Edité par mugen54 13 décembre 2019 à 23:21:28

  • Partager sur Facebook
  • Partager sur Twitter
18 décembre 2019 à 14:30:36


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 20

typedef struct Temps Temps; //Nous definissons ici notre structure temps qu'on remplacera par temps
struct Temps
{

	int min; // le temps en minute
	int seconde; // le temps en seconde
	int centieme; // le temps en centieme de seconde
};


typedef struct Skieur Skieur; //Nous definissons la structure skieur , car un skieur est caracterise par son numero de dossard, son nom, ses temps de 1er et 2e manche et son temps total
struct Skieur
{
	char Nom[N]; //le nom du joueur
	int numero_dossard; // le numero de dossard du joueur
	struct Temps temps_1_manche; //le temps de la premiere manche du joueur
	struct Temps temps_2_manche; //le temps de la seconde manche du joueur
	struct Temps temps_total

};

typedef struct Liste Liste; //Il s'agit ici de définir un maillon comme nous l'avons vu
struct Liste
{
	Skieur premier;
	Liste *suivant;
};


int main()
{
    Liste *joueurs; //La liste des skieurs qui ont skié
    Liste *abandons, *nouveau_joueur; //La liste des skieurs qui ont abandonné
    int continuer;
    int joueurBon;
    int joueurAbandon;
    int memoNum;
    int compareNom;
    int premierMaillon;
    Skieur *precedent;
    Liste *p, *tmp;

    //Initialisation des variables

    continuer =1; //On initialise continuer si on veut continuer a rentrer de nuoveaux skieurs
    memoNum = 1; //
    joueurs = NULL, abandons = NULL; //On initialise les pointeurs

    printf("\n\n");
    printf("Voici la premiere manche d une course de ski");
    printf("\n\n");
    do
    {
        nouveau_joueur = (Liste*)malloc(sizeof(Liste)); //On alloue dynamiquement nouveau_joueur

        printf("Donnez le nom d'un nouveau joueur");
        printf("\n\n");

        do
        {
            printf("Attention! On ne peut pas avoir deux memes noms");
            printf("Entrez le nom d un nouveau joueur");
            scanf("%s", &nouveau_joueur->premier.Nom);

            compareNom = strcasecmp(nouveau_joueur->premier.Nom, p->premier.Nom);
        }while(compareNom = 0);

        do
        {
            printf("Entrez le numero de dossard du joueur, il faut que ce soit superieur a 0");
            scanf("%s",&nouveau_joueur->premier.numero_dossard);
            if (nouveau_joueur->premier.numero_dossard = memoNum || nouveau_joueur->premier.numero_dossard)
            {
                printf("Veuillez verifier que le numero du dossard entre ne correspond pas au numero d'un autre joueur");
            }
        }while(nouveau_joueur->premier.numero_dossard = memoNum);
        memoNum = nouveau_joueur->premier.numero_dossard;
        printf("\n\n");

        do
        {
            printf("Concernant le joueur");
            printf("\n Tapez 1 si le joueur a abandonne et 0 s'il n'a pas abandonne/n");
            scanf("%d", &joueurAbandon);
            printf("\n\n");
        }while (joueurAbandon != 1 && joueurAbandon !=0);

        if (joueurAbandon = 1)
        {
            nouveau_joueur->premier.temps_1_manche.min = 0;
            nouveau_joueur->premier.temps_1_manche.seconde = 0;
            nouveau_joueur->premier.temps_1_manche.centieme = 0;
            nouveau_joueur->premier.temps_total.min = 0;
            nouveau_joueur->premier.temps_total.sec=0;
            nouveau_joueur->premier.temps_1_manche.centieme = 0;
            nouveau_joueur->suivant= abandons;
            abandons=nouveau_joueur;
        }
        else
        {
            do
            {
                printf("\n\n");

                do
                {
                    printf("Entrez le temps en minute du joueur");
                    scanf("%d", &nouveau_joueur->premier.temps_1_manche.min);
                }while (nouveau_joueur->premier.temps_1_manche.min<0);

                do
                {
                    printf("Entrez le temps en seconde du joueur");
                    scanf("%d", &nouveau_joueur->premier.temps_1_manche.seconde);
                }while(nouveau_joueur->premier.temps_1_manche.seconde)<0;

                do
                {
                    printf("Entrez le temps en centieme de seconde du joueur");
                    scanf("%d", &nouveau_joueur->premier.temps_1_manche.centieme);
                }while (nouveau_joueur->premier.temps_1_manche.centieme) < 0;
            }while()
        }
    }while()

    Skieur *initialisation()
{
    Skieur *skieur = (sizeof(*liste));
    Liste *liste = malloc(sizeof(*liste));

    if (skieur == NULL || liste == NULL)
    {
        exit(EXIT_FAILURE);
    }

    liste->nombre = 0;
    liste->suivant = NULL;
    skieur->premier = liste;

    return liste;
}

}


voilà ce que j'ai fait en ayant revu le cours et les TDs

-
Edité par mugen54 8 janvier 2020 à 19:35:45

  • Partager sur Facebook
  • Partager sur Twitter
18 décembre 2019 à 15:05:43

Tu seras moins perdu quand tu auras fait un découpage logique de ton main (une centaine de lignes) en fonctions qui ont un rôle bien clair.

Et quand tu sauras ce que tu veux faire après.

  • Partager sur Facebook
  • Partager sur Twitter
18 décembre 2019 à 16:11:28

en faite je préfère ne pas faire de fonctions car le prof a dit qu'il préférait sans fonctions lol mais oui je suis d'accord avec fonction ce serait plus simple

  • Partager sur Facebook
  • Partager sur Twitter
18 décembre 2019 à 17:56:48

A défaut de fonction, tu peux découper ton main en paragraphes, avec un commentaire au début de chaque paragraphe.

Et puis il n'a absolument pas dit qu'il ne voulait pas de fonction, relis-toi (8 décembre)

> il a dit qu'ils préféraient un code sans fonctions qui marche plutôt qu'un code avec fonction qui fonctionne pas.

Je suppose que c'était en réponse à une question "faudra faire des fonctions Monsieur ?"

Il se trouve que faire des fonctions, c'est pas un boulot supplémentaire, mais au contraire un moyen d'avoir plus rapidement, et à moindre effort, du code qui marche. Parce que les programmes découpés en fonctions, ça se teste et ça se met au point plus facilement, par petits bouts.

 Comme tu le dis "c'est plus simple" Alors fais le.

Maintenant, moi, un étudiant me pose la question "faut faire des fonctions ?" alors que je lui ai déjà  expliqué 3 fois en quoi ça facilite le travail, je vais pas le redire une fois de plus, je le laisse patiner à essayer de faire son programme sans fonction. Ca lui fera trois plus de boulot, mais il finira (peut être) par constater par lui-même.

-
Edité par michelbillaud 18 décembre 2019 à 18:13:36

  • Partager sur Facebook
  • Partager sur Twitter
18 décembre 2019 à 19:03:57

Mias les fonctions, au départ, ça rebute. Combien n'y-a-t-il pas de messages de débutants qui ne comprennent pas pourquoi leur programme sans fonction fonctionne, et avec fonctions ne fonctionne pas ? Et simplement car ils ne comprennent pas le mécanisme de la bête.
  • Partager sur Facebook
  • Partager sur Twitter

On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

18 décembre 2019 à 22:09:59

Quand on en arrive aux allocations dynamiques + chainage, normalement on a largement dépassé l'étape écriture de fonctions + passage d'adresses en parametres.

Ou alors c'est que la progression du cours est délirante.

  • Partager sur Facebook
  • Partager sur Twitter
18 février 2022 à 9:31:45 - Message modéré pour le motif suivant : Merci d'utiliser le bouton code du forum pour insérer votre code


18 février 2022 à 10:09:27

@Maitre ajmk 😊✌😎😎😎😎😎 Bonjour, merci de ne pas déterrer d'ancien sujet.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

-
Edité par AbcAbc6 18 février 2022 à 10:09:46

  • Partager sur Facebook
  • Partager sur Twitter