Entier négatif en C

Fermé
eya - Modifié le 9 nov. 2018 à 16:49
 Utilisateur anonyme - 12 nov. 2018 à 19:01
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.

#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

Utilisateur anonyme
10 nov. 2018 à 10:07
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.

Ici
for(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.
Ceci
for(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
1
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 094
Modifié le 12 nov. 2018 à 10:27
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 être
I < 8
et pas
I <= 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é 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.

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.
0
Utilisateur anonyme > [Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024
12 nov. 2018 à 11:20
Salut Dal, je n'ai pas cherché à comprendre pourquoi ça plante, vu que l'algorithme en soi n'est pas le bon.
Il y a un autre truc qui d'une façon ou d'une autre risque de merdouiller
for(J=0;J<=I;I++)
c'est un for ou J commence à 0, qu'il doit être inférieur à I et I augmente.
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 094
12 nov. 2018 à 14:01
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.

:-)
0
Utilisateur anonyme
12 nov. 2018 à 19:01
Ha oups j’ai mal lu...my bad
0