Maximum d'un tableau en c [Résolu/Fermé]

Signaler
-
Messages postés
16151
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
14 janvier 2021
-
Bonjour,

je suis debutante en algorithmique.L'exercice que je veux resoudre est assez facile mais une fois executé, je trouve une erreur.
L'exercice est le suivant:Ecrire le programme qui recherche la maximum ainsi que son nombre d'occurences dans un tableau t.
voici le programme que j'ai realisé:

#include<stdio.h>
#include<stdlib.h>
main()
{
int max,i,n,s,tab[50];
max=0;
s=0;
printf("introduisez la taille du tableau");
scanf("%d",&n);

for(i=1;i<=n;i++)
{
printf("tab[%d]=",i);
scanf("%d",&tab[i]);
if(max<tab[i])

max=tab[i];
}
for(i=1;i<=n;i++)
{
if (max==tab[i])
s=s++;
}
printf("le nombre max est %d\n",max);
printf("son nombre d'occurence est:%d\n",s);
system("pause");
}

le probleme se trouve dans le nombre d'occurence, a chaque fois que j'execute, il me donne zero!

aidez moi s'il vous plait et merci d'avance.

A voir également:

5 réponses

Messages postés
16151
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
14 janvier 2021
2 767
Moi je n'ai pas de problème, j'ai juste rajouté int au point d'entrée : int main() et le return 0; qui va avec, et dès que je test ça marche :

introduisez la taille du tableau6
tab[1]=5
tab[2]=3
tab[3]=1
tab[4]=5
tab[5]=9
tab[6]=2
le nombre max est 9
son nombre d'occurence est:1
Appuyez sur une touche pour continuer...

Quelques remarques malgré tout :
Il serait bon après ton scanf de n, de vérifier que n n'est pas supérieur à 50
Mais plus important, les indices d'un tableau en C commence à 0, donc ta boucle devrait être for (i=0; i<n; i++) et non pas for (i=1; i<=n; i++)
De plus il y a plus efficace que de reparcourir le tableau pour compter le nombre d'occurrence, tu peux faire ça en même temps que la recherche du max...
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63550 internautes nous ont dit merci ce mois-ci

bon certes je comprend rien en C, moi c'est plutôt pascal et assembleur, mais de ce que j'y comprends, le programme demande le nombre d'entrées puis les valeurs de chaque entrée, chaque nouvelle entrée étant directement comparée au dernier maxima... On relit ensuite le tableau en comptant le nombre de valeur à Max;
Je suppose que max est correct en sortie,
et donc il reste pour moi une bizarrerie -printf("tab[%d]=",i) - Où je ne comprend pas l'indexation de Tab par %d...
Désolé, je fais avec mes moyens !
Messages postés
16151
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
14 janvier 2021
2 767
printf("tab[%d]=",i) est équivalent en C à ce qu'on aurait en Pascal avec write('tab[',i,']=');

Ici il ne s'agit pas d'afficher tab[i], qui s'écrirait printf("%d",tab[i]); mais de demander à l'utilisateur d'entrer la valeur de tab[i] grâce au scanf("%d",atab[i]) qui est la ligne juste en dessous...
hé oui c'est ça qui m'échappe en C, les lignes suivantes sont implicitement dépendantes, sans structure visualisant la dépendance... Je comprend mieux, merci pour l'explication KX !
Messages postés
75
Date d'inscription
samedi 18 juin 2011
Statut
Membre
Dernière intervention
5 octobre 2011
1
En fait en c, le %d veut dire "ici on affiche un entier", et cette entier c'est le i, donc en gros c'est juste pour que l'utilisateur sache dans quel case du tableau il rentre une valeur.
On aurait pu mettre : "printf("Valeur pour la case %d : ",i);" par exemple.

kx: merci beaucoups pour m'avoir repondue! je n'ai pas bien compris pourquoi vous avez ajouté le return(0), pouvez-vous m'expliquer svp?

nicocorico: ça ne fait rien!merci comme meme XD
Messages postés
16151
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
14 janvier 2021
2 767
Parce que normalement main renvoie une valeur : un int qui vaut 0 si tout se passe bien ou autre chose en cas d'erreur.

Comme mon compilateur est exigeant, il n'a pas aimé d'avoir main() tout seul, j'ai donc rajouté int, et le return 0 à la fin pour dire que tout s'était bien passé...

Le corps de ton programme devrait donc être :

int main()
{

   //...

   system("PAUSE");
   return 0;
}
C'était juste pour dépanner par curiositée... si j'avais su que KX et sa polyvalence étaient par là j'aurais laissé faire !

OK! merci beaucoups.
D'apres ce que j'ai compris, mon programme est donc juste, non?
ce que je ne comprend pas c'est pourquoi le programme ne s'execute pas correctement? ce probleme m'est arrivé avec plusieurs autres programmes que j'ai fait.

merci encore pour m'avoir repondue!!-^_^-
Messages postés
16151
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
14 janvier 2021
2 767
Si ça t'es arrivé avec d'autres programmes c'est peut-être que tu utilisais main sans le int...
En fait ça peux marcher ça dépend de ton compilateur...

De là à dire que ton programme est juste, pas totalement, il y a quand même deux ou trois points à revoir sur les indices de tableau comme je l'ai indiqué plus haut.
Messages postés
75
Date d'inscription
samedi 18 juin 2011
Statut
Membre
Dernière intervention
5 octobre 2011
1
trouvé :p tu remplace s au lieu de l'incrémenter (tu a oublié un +)

edit : j'ai répondu trop vite :/

Llama: je n'ai pas bien compris, pouvez vous mieux expliquer??
Moi non plus ! et dans le programme il y à bien déjà S=S++...
Messages postés
75
Date d'inscription
samedi 18 juin 2011
Statut
Membre
Dernière intervention
5 octobre 2011
1
bah, j'ai vu ça en cours et on a bien insister dessus, en fait quand tu fais "s=s++" tu fait deux opération en même temps, une affectation et une incrémentation, et selon la position du "++" y'en a une qui se fait avant l'autre.
Après si tu veux juste faire une incrémentation, tu peux juste noté s++, ça équivaut a s = s + 1.
Messages postés
16151
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
14 janvier 2021
2 767
En effet, si tu as a=5 par exemple
b=a donne a=5, b=5 (normal)
b=a++ donne d'abord a++ d'où a=6 puis b=a donc b=6
b=++a donne d'abord b=a d'où b=5 puis a++ donc a=6

Par contre si on fait a=a++ on a donc d'abord a++ d'où a=6 puis a=a soit a=6
Et pour a=++a on a d'abord a=a d'où a=5 puis ++a donc a=6

Donc ici il n'y a pas de problème s=s++ ça marche... mais s++ est quand même moins prise de tête ;)
Messages postés
75
Date d'inscription
samedi 18 juin 2011
Statut
Membre
Dernière intervention
5 octobre 2011
1
OUIIIIN je trouverais jamais ce bug :(

Merci beaucoups!!la solution etait de remplacer s++ par s+1 ou ++s!^_^ merci beaucoups encore!
Messages postés
16151
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
14 janvier 2021
2 767
Ce n'était pas la peine mais si ça te fait plaisir... par contre ce n'est pas s+1 mais s=s+1