Code C simplissime

surame -  
Gorgo13 Messages postés 12 Statut Membre -
Bonjour,
Veuillez excuser une question simplissime d'un apprenti en C, mais celle-ci me tracasse.
Le programme de rangement de nombre ci-dessous fonctionne très bien, mais j'ai constaté
que la déclaration du tableau A comporte 6 éléments alors qu'on ne traite que 5 nombres.

Si on fait A[5] ce qui me paraît logique, le programme ne fonctionne pas et renvoie une
suite de nombres dont je vois pas la signification.

Donc je me pose la question: pourquoi doit-on déclarer 6 éléments dans le tableau?

/* Le programme suivant permet d'inverser l'orde de 5 nombres entiers déclarés dans un tableau A */

#include <stdio.h>
int main()
{
int A[6] = {1,2,3,4,5};
int i, j;
int aide;

for(j=0; A[j]; j++);
j--;
for(i=0; i<j; i++, j--)
{
aide=A[i];
A[i]=A[j];
A[j]= aide;
}

printf("\n\nNombres inverses:\n " );
for(i=0; i<5; i++)
printf("%d ", A[i]);

printf("\n\n");
return 0;
}
Configuration: Windows XP
Internet Explorer 6.0

13 réponses

  1. Gorgo13 Messages postés 12 Statut Membre 23
     
    surame a ecrit:
    Oui, le programme fonctionne correctement si on déclare un tableau avec 6 éléments, donc A[6].
    Par contre il ne fonctionne pas si on déclare A[5].

    Si tu ne cree ton tableau qu'avec 5 elements, A[4] sera non nul, et donc dans ta boucle:

    for(j=0; A[j]; j++);

    A[4] est non nul (car il vaut 5) et donc la boucle continue d'incrementer "j=5". Donc A[5] pointe sur une memoire non affectee. Pour terminer cette boucle correctement, il faut que le dernier element du tableau (Nmax-1 si tu declare A[Nmax]={....};) soit bien a 0.

    Si tu fais un depassement de tableau, il y a fort a parier que ton programme plante de maniere plus ou moins aleatoire a un moment ou a un autre.

    Donc dubcek a raison, il faut declarer:

    int A[5] = {1,2,3,4,0};
    1
  2. oxkao Messages postés 5 Statut Membre
     
    il y a quelque chose qui me turlupine aussi dans ton programme c'est :

    for(j=0; A[j]; j++);

    la 2eme condition du for est assez louche et le fait qu'il y ai un ; juste après est aussi bizarre logiquement (a moin que je ne me trompe ) il faudrait
    A[j] != ...
    A[j] < ...
    A[j] > ...
    A[j] = ...
    etc

    as tu tester le programme?
    (n'etant pas chez mois je ne peux pas le tester )

    peut tu me dire les valeur de A[] et j a ce moment là

    merci
    0
  3. surame
     
    Bonjour

    Oui, le programme fonctionne correctement si on déclare un tableau avec 6 éléments, donc A[6].
    Par contre il ne fonctionne pas si on déclare A[5].

    La boucle for(j=0 ; A[j] ; j++); permet de parcourir le tableau A et d'incrémenter j tant qu'il y
    a des élements dans ce tableau.C'est normale donc qu'elle se termine par un ;.
    0
  4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    if faut écrire ca:
    int A[6] = {1,2,3,4,5,0};
    pour définir la fin du tableau. il ne faut jamais assumer qu'une variable (A[5] ici) est à 0 au démarrage.

    ou bien : int A[5] = {1,2,3,4,0};
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. surame
     
    salut

    Définir la fin d'un tableau avec un zéro?
    A part le cad d'un tableau de caratères qui se termine par un '\0' automatiquement
    je ne vois pas pourquoi.
    0
  7. surame
     
    D'accord j'ai compris tes explications.
    Il n'en reste pas moins que je n'ai jamais vu dans aucun cours sur les tableaux que
    la dernière valeur déclarée ( dans un tableau de type int) doit être obligatoirement 0
    pour indiquer que c'est la fin du tableau.

    A moins que ( peut être) cette façon est spécifique lorsqu'on veut déterminer
    le nombre d'éléments d'un tableau avec une boucle for.

    Est -ce bien cela?

    Merci.
    0
  8. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    c'est ton code qui teste un zéro pour terminer la boucle: (j=0; A[j]; j++);
    on est bien d'accord que ce n'est pas la bonne méthode, sauf pour les strings
    0
  9. Gorgo13 Messages postés 12 Statut Membre 23
     
    surame,

    comme a dit dubcek, c'est ton code qui determine la fin de la boucle. En d'autres termes, le fait qu'il faille terminer ton initialisation de tableau par un zero n'a rien a voir avec une obligation de programmation (ou une convention ou je ne sais quoi). C'est simplement que TON code ne marche QUE si la derniere valeur du tableau est zero.
    0
  10. surame
     
    C'est effectivement ce que j'ai compris d'après toutes les explications qui m'ont été
    données dans ce forum. C'est Ok.
    J'ajouterai que ce n'est pas evident de comprendre ça tout seul. Et dans les livres, cours , tutoriaux
    et autre exercices, il est très rare qu'on trouve l'analyse de certaines instructions ou parties
    de code qui mériteraient pourtant un minimum d'explications.

    Encore merci à tous pour votre aide.

    Bye.
    0
  11. Gorgo13 Messages postés 12 Statut Membre 23
     
    No problem... tu peux peut etre mettre "resolu" pour ce topic ;)
    0
  12. surame
     
    Oui, c'est exact.
    Mais j'ai cherché et je n'ai pas réussi à le faire!
    Alors si tu veux bien m'indiquer.
    0
  13. Gorgo13 Messages postés 12 Statut Membre 23
     
    Euh... je sais pas non plus. Peut etre que ce sont les moderateurs qui font ca...
    0