Code C simplissime
surame
-
Gorgo13 Messages postés 12 Statut Membre -
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;
}
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;
}
A voir également:
- Code C simplissime
- Code ascii - Guide
- Code puk bloqué - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
- Code activation windows 10 - Guide
- Scanner qr code pc - Guide
13 réponses
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};
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};
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
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
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 ;.
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 ;.
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};
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};
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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.
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.
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.
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.
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
on est bien d'accord que ce n'est pas la bonne méthode, sauf pour les strings
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.
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.
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.
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.