Entier négatif en C
eya
-
Utilisateur anonyme -
Utilisateur anonyme -
Bonjour,
ce programme ne fonctionne pas avec les entiers negatifs pourquoi !! j'ai voulue affiche l’entier négatif et non nul le plus récurrent dans le
tableau et son nombre d’occurrences. Si le tableau ne contient pas un entier strictement
négatif, l’algorithme affichera -1.
ce programme ne fonctionne pas avec les entiers negatifs pourquoi !! j'ai voulue affiche l’entier négatif et non nul le plus récurrent dans le
tableau et son nombre d’occurrences. Si le tableau ne contient pas un entier strictement
négatif, l’algorithme affichera -1.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int Der_oc,I=0,J, NbCh,nbrec,NPR ;
int T[8];
for(J=0;J<8;J++)
{
printf (" donner un entier ");
scanf("%i",&T[I]);
I=I+1;
}
printf (" donner un entier a chercher");
scanf("%i",&NbCh);
Der_oc= (-1) ;
I=0;
do {
if (T[I] == NbCh)
{
Der_oc= I ;
}
I=I+1;
}while(I!=8);
NPR=-1;
nbrec=0;
for(I=0;I<=8;I++)
{
if(T[I] < 0)
{
for(J=0;J<=I;I++)
{
if (J==(I))
{
NPR=I;
nbrec= nbrec+1;
}}}}
printf (" l’indice de la dernière occurrence de %i est : %i \n",NbCh, Der_oc);
if (NPR!=(-1))
printf (" l’entier négatif et non nul le plus récurrent dans le tableau est %i et son nombre d’occurrences. %i ", nbrec, NPR);
else
printf ("nombre d’occurrences d'entier negatif. %i ", NPR);
return 0;
}
| EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI Merci d'y penser dans tes prochains messages. |
1 réponse
-
Bonjour
je ne suis pas un spécialiste de C, mais plusieurs choses m'interpellent dans ton code.
D'abord, par convention, les noms de variables commencent par une minuscule.
Icifor(J=0;J<8;J++) { printf (" donner un entier "); scanf("%i",&T[I]); I=I+1; }
j varie forcément de 0 à 7, puisque c'est ce qu'un for fait, et toi tu refais la même chose avec i.
Cecifor(j=0;j<8;j++) { printf (" donner un entier "); scanf("%i",&T[j]);//utilisation de j comme indice du tableau }
fonctionne pareil, mais avec une variable de moins.
Plus loin tu utilises un do while, dans lequel tu fais varier i, un for est plus adapté.for(i=0; i<8; i++) { if (T[i] == NbCh) Der_oc = i; }
Au fait, le i++ dans le for, ça veut dire i = i + 1, et ça marche partout, pas juste dans la déclaration du for.
Et ceci ne cherche pas le négatif le plus récurrent, ça compte le nombre de fois ou j == i (et encore chez moins ur visual studio, ça plante)for (i = 0; i <= 8; i++) une boucle de { if (T[i] < 0) { for (j = 0; j <= i; i++) { if (j == (i)) { NPR = i; nbrec = nbrec + 1; } } } }
Je te conseille de prendre un papier et un crayon, d'écrire 8 nombres, de définir les étapes qui te permettent de définir quel est le négatif le plus récurent et ensuite de le traduire en algorithmie afin d'en faire du C
-
Cela peut planter pour plusieurs raisons :
for(I=0;I<=8;I++) { if(T[I] < 0)
ce code tente d'accéder à la dernière itération à T[8], qui déborde la mémoire allouée au tableau T, dont les indices valables ne vont que de 0 à 7. Donc, la condition d'arrêt devrait êtreI < 8
et pasI <= 8
...
La boucle imbriquée suivante peut aussi être en cause :for(J=0;J<=I;I++)
elle va de l'indice 0 représenté parJ
à l'indice courant inclus représenté parI
, mais ne fait jamais varierJ
, qui reste à 0, alors queI
est incrémenté et augmente donc de plus en plus... Il faudrait corriger cette boucle.
Bien sûr, comme le dit exactement Whismeril le test if(j == (i))
n'est pas pertinent, il faut tester les valeurs du tableau, et pas leurs indices. De plus, il faudra conserver le nombre négatif et son nombre d'occurrences dans des variables de traitement, permettant de comparer, en fin de boucle, le résultat obtenu par rapport aux comparaisons précédentes stockées dans des variables de résultats.
Enfin, il faudrait décider comme traiter (ou si on traite) le cas où plusieurs nombres négatifs différents sont saisis un même nombre de fois et correspondent au nombre maximum d'occurrences. -
oui, c'est ce que j'ai indiqué ci-dessus :
La boucle imbriquée suivante peut aussi être en cause : for(J=0;J<=I;I++) elle va de l'indice 0 représenté par J à l'indice courant inclus représenté par I, mais ne fait jamais varier J, qui reste à 0, alors que I est incrémenté et augmente donc de plus en plus... Il faudrait corriger cette boucle.
:-) -
-