IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

formule à expliquer ?


Sujet :

C

  1. #1
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut formule à expliquer ?
    Bonjour,

    Voilà un nouvel exercice que je cherche à comprendre

    Soit P un pointeur qui 'pointe' sur un tableau A :
    int A[]={12,23,34,45,56,67,78,89,90};
    int *P;
    P=A;

    quelle valeur ou adresse fournit cette expression :
    *(P+*(P+8)-A[7])
    En solution on me donne : la valeur 23

    J'aimerais comprendre le mécanisme et le pourquoi de cette réponse ?

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Avec de simples équivalences:
    • P = A
    • *(P+x) = P[x]

    L'expression peut être transformée:
    *(P+*(P+8)-A[7])
    = *(P+ P[8]-P[7])
    = P[ P[8]-P[7] ]
    = P[ 90-89 ]
    = P[1]
    = 23
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Merci

    Encore un nouvel exercice que je n'arrive pas à comprendre . Je dois inverser un tableau avec l'aide de 2 pointeurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #include<stdio.h>
     
    main()
    {
    	int A[50];
    	int N,AIDE,*P1,*P2;
     
    	printf("dimension du tableau(max.50) : ");
    	scanf("%d",&N);
        for(P1=A;P1<A+N;P1++)
    	{
           printf("element %d : ",P1-A);
    	   scanf("%d",P1);
    	}
     
    	for(P1=A;P1<A+N;P1++)
    		printf("%d",*P1);
    	printf("\n");
     
    	for(P1=A,P2=A+(N-1);P1<P2;P1++,P2--)
    	{
    		AIDE=*P1;
    		*P1=*P2;
    		*P2=AIDE;
    	}
     
    	for(P1=A;P1<A+N;P1++)
    		printf("%d",*P1);
    	printf("\n");
     
    	return 0;
    }
    C'est cette formule que je ne comprends pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for(P1=A,P2=A+(N-1);P1<P2;P1++,P2--)
    	{
    		AIDE=*P1;
    		*P1=*P2;
    		*P2=AIDE;
    	}
    Pour moi quand je prends un tableau de dimension 4 avec les valeurs respectives de P1 : 0, 1 ,5 et 7 .

    Je fais au premier passage AIDE=0 ,*P1=7 *P2=0 .
    ensuite AIDE=1,*P=5, et *P2=1 .

    mais la boucle s'arrête là puisque P1 n'est plus inféruieur à P2 (P1=2 et P2=1)
    Donc je me retrouve avec les valeurs 5 et 7 pour *P1 ?
    Je ne vois pas où mon raisonnement est mauvais ?

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    C'est pourtant simple:
    • P1 commence au début du tableau et va vers la fin
    • P2 commence à la fin du tableau et va vers le début
    • Le corps de la boucle échange les valeurs pointées par P1 et P2
    • La boucle s'arrête quand P1 et P2 se rencontrent.

    C'est l'algorithme classique d'inversion d'un tableau sur-place en un seul passage.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    ça je comprends mais ce que je n'arrive pas à assimiler c'est que en fait la boucle s'arrête au 2ème rang sur mon exemple . Donc pour moi les 2 derniers rangs quand *P1=5 et 7 ne sont pas mofifiés ? Ce qui voudrait dire que le tableau résultat devrait donner 7 5 5 7 ?
    C'est ça que je n'arrive pas à comprendre. Pourquoi les valeurs de P1 changent alors que la boucle s'arrête au milieu du tableau c'est à dire quand P1 et P2 se rencontrent ?

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Regarde la ligne du for:
    • Initialisation: P1 au début, P2 à la fin
    • Condition: Tant que P1 est strictement inférieur à P2
    • Incrément: Incrémenter P1, décrémenter P2

    Quand les deux se rencontreront, P1 ne sera plus strictement inférieur à P2...

    Si on part de {0, 1, 5, 7}, on a donc:
    • Itération 0: Inversion du 0 et du 7, tableau = {7, 1, 5, 0}
    • Itération 1: Inversion du 1 et du 5, tableau = {7, 5, 1, 0}
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Merci

    En fait pour moi je ne faisais pas d'inversion , juste des remplacements .

    Je comprends mieux maintenant et ça va beaucoup m'aider dans mon apprentissage . Encore merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Crystal] Formules ...
    Par Antichoc dans le forum Formules
    Réponses: 3
    Dernier message: 25/11/2003, 10h52
  2. [][Excel] Comment ne pas détruire les formules ?
    Par flyangelNext dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/07/2003, 11h38
  3. évaluateur de formule mathématique
    Par lyrau dans le forum Générateurs de compilateur
    Réponses: 5
    Dernier message: 28/03/2003, 22h50
  4. [Formule] Lever et coucher du soleil
    Par psl dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 21/10/2002, 16h37
  5. [reseaux] Comment creer un compte user à partir d'un formul avec perl
    Par oulai_evado dans le forum Programmation et administration système
    Réponses: 4
    Dernier message: 01/10/2002, 19h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo