Petite aide C

Résolu/Fermé
CpTn_lAw - 5 févr. 2010 à 16:24
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 - 7 févr. 2010 à 19:59
Bonjour, Je suis étudiant en L3 Physique, mais j'ai une matière de première année à repasser : Algo. Il y a une grande partie de programmation en C, et je voudrais si possible que quelqu'un puisse m'aider sur un petit programme mettant en oeuvre un algorithme de tri. (minimum et maximum).
Seulement voila, Nous n'avons pas vu encore les pointeurs, et le programme que j'ai trouvé sur ce meme site utilisait des pointeurs. J'ai compris comment il fonctionnait, mais je ne saurais en aucun cas le reproduire si nécessaire. Voici mon code, qui ne compile pas d'ailleurs... Je n'ai eu qu'un cours d'algorithmique en francais, avec très peu d'exemples en C, j'ai donc fait de mémoire...

Je demande si l'utilisateur veut rentrer un nombre, si oui, il le saisi, si ce nombre est positif, je met a jour la liste des nombres deja rentrés, j'affiche le min et le max ainsi que toutes les valeurs deja rentrées. Si le nombre est negatif, j'affiche juste les max et min et je repose la question "voulez vous entrer un nombre"; quand la réponse a cette question est negative, le programme s'arrete en affichant min, max et les valeurs...voila, dans ma tete c'est ca...

#include <stdio.h>
#include <stdlib.h>
#define DIM 10

int main(void){
char r,y,n;
int taille,i,nombre,tab[DIM];

printf("\n Voulez-vous entrer un nombre?(y/n) \n");
scanf("%c",&r);
switch(r){
case y :
printf("\n rentrez votre nombre. \n");
scanf("%d",&nombre);
if(nombre>=0){

int min=tab[0];
for(i=1;i<taille;++i){
if (tab[i]<min){
min=tab[i];
}
}
printf("\n Le minimum est: %d", min);
}



int max=tab[0];
for(i=1;i<taille;++i){
if (tab[i]>max){
max=tab[i];
}
}
printf("\n Le maximum est: %d", max);
}
}
else{
printf("\n Le minimum est: %d", min);
printf("\n Le maximum est: %d", max);
printf("%d",tab[i]);
case n : printf("\n Le minimum est: %d", min);
printf("\n Le maximum est: %d", max);
printf("%d",tab[i]);
}
}


Merci beaucoup a quiconque prendra le teps de me répondre :)

15 réponses

Voila trouvé! merci a tous!!
#include <stdio.h>
#include <stdlib.h>

int taille;
int maxmin(int t[], int taille, int min, int max);           // Declaration de la fonction maxmin

int main(void){
	int i,j,t[taille];
	int max=0,min=1000000;
	printf("\n Combien de nombres souhaitez-vous comparer? \n");
	scanf("%d",&taille);
	
	
	for(i=0;i<taille;i++){                                  
		printf("Nombre %d: ", i+1);
		scanf("%d",&t[i]);
		
	}
	maxmin(t,taille,min,max);
														/* tant que la taille n'est pas atteinte, on
														  incrémente, en demandant d'entrer le nombre 
													     Puis on appelle la fonction maxmin qui trie les
														 valeurs entrées. */
	return EXIT_SUCCESS;
	
}

int maxmin (int t[], int taille, int min, int max){
	int i,j;
	
	for (i = 0; i < taille; ++i){
		if (t[i] > max){
			max = t[i];
		}
	}
	for(j=0;j<taille;++j){
		if (t[j] < min){
			min = t[j];
		}
	}


	printf ("min = %d et max = %d\n", min, max);
}
1
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
5 févr. 2010 à 16:30
quand tu postes du code, n'oublies pas d'utiliser la conservationde la mise en forme. c'est plus simple à lire pour nous

ta variable taille n'est pas initialisée.

tu devrais mettre un
taille=DIM ;

j'ai pas lu tout le reste car je suis au boulot, et que sans indentation du code, c'est trop long à lire
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
5 févr. 2010 à 16:32
Salut,

Quelques petites remarques :

1) utilise les balises < code > pour poster ton code dans le forum (bouton à droite de italique gras souligné), ceci conservera les espace de début de ligne

2) Tu dis avoir des erreurs à la compilation, copie-les ici, par exemple moi je n'ai pas de compilateur sous la main au moment où je t'écris, mais j'aurai pu t'expliquer vite fait les erreurs. ( et là je ne les vois pas d'un coup à cause entre autres de la mise en page)

3)scanf("%c",&r);
attention à ça. utiliser scanf pour saisir un caractère n'est pas conseillé. voir par exemple https://c.developpez.com/faq/?page=Gestion-du-clavier-et-de-l-ecran-en-mode-console#CONS_lire_sans_entree
0
Merci de vos deux rpéonses très rapide, je ne savais pas pour les balises de code, alors j'ai deja corrigé des erreurs au niveau des singletons de blocs...
voici une version un peu corrigée qui ne fonctionne toujours pas cela dit ^^
#include <stdio.h>
#include <stdlib.h>
#define DIM 10

int main(void){
	char r,y,n;
	int taille,i,nombre,tab[DIM];

	printf("\n Voulez-vous entrer un nombre?(y/n) \n");
	scanf("%c",&r);
	switch(r){
		case y :
			printf("\n rentrez votre nombre. \n");
			scanf("%d",&nombre);
			if(nombre>=0){
				
				int min=tab[0];
				for(i=1;i<taille;++i){
					if (tab[i]<min){
							min=tab[i];
						}
					}
					printf("\n Le minimum est: %d", min);
			


				
				int max=tab[0];
				for(i=1;i<taille;++i){
					if (tab[i]>max){
						max=tab[i];
						}
					}
					printf("\n Le maximum est: %d", max);
			}	
			
			else{
				printf("\n Le minimum est: %d", min);
				printf("\n Le maximum est: %d", max);
				printf("%d",tab[i]);
			}
		case n :	printf("\n Le minimum est: %d", min);
					printf("\n Le maximum est: %d", max);
					printf("%d",tab[i]);
	}
}


Les erreurs de compilations sont exo8.c: In function ‘main’:
exo8.c:12: error: case label does not reduce to an integer constant
exo8.c:38: error: ‘min’ undeclared (first use in this function)
exo8.c:38: error: (Each undeclared identifier is reported only once
exo8.c:38: error: for each function it appears in.)
exo8.c:39: error: ‘max’ undeclared (first use in this function)
exo8.c:42: error: case label does not reduce to an integer constant
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
5 févr. 2010 à 16:37
ah oui pour le switch c'est pas possible d'utiliser des variables.

Par contre tu voulais dire "le caractère y", alors c'est 'y', c'est tout. Pas besoin de le déclarer. Ce n'est pas une variable. (Comme tu n'as pas besoin de dire int 10 opur déclarer 10.)
0
Alors cette fois c'est bon j'ai compilation, sans erreur, mais il va faloir que je fasse une boucle parce qu'a l'entrée du premier nombre, le programme se termine. le voici corrigé :
#include <stdio.h>
#include <stdlib.h>
#define taille 10

int main(void){
	int r,y,n,min,max;
	int i,nombre,tab[taille];

	printf("\n Voulez-vous entrer un nombre?(1=oui/2=non) \n");
	scanf("%d",&r);
	switch(r){
		case 1 :
			printf("\n rentrez votre nombre. \n");
			scanf("%d",&nombre);
			if(nombre>=0){
				
				int min=tab[0];
				for(i=1;i<taille;++i){
					if (tab[i]<min){
							min=tab[i];
						}
					}
					printf("\n Le minimum est: %d", min);
			


				
				int max=tab[0];
				for(i=1;i<taille;++i){
					if (tab[i]>max){
						max=tab[i];
						}
					}
					printf("\n Le maximum est: %d", max);
			}	
			
			else{
				printf("\n Le minimum est: %d", min);
				printf("\n Le maximum est: %d", max);
				printf("%d",tab[i]);
			}
		case 2 :	printf("\n Le minimum est: %d", min);
					printf("\n Le maximum est: %d", max);
					printf("%d",tab[i]);
	}
}
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
5 févr. 2010 à 16:40
ensuite, à un moment tu déclares ta variable "min" (et pareil pour max) dans un bloc {}. Ceci est mauvais, car lorsque le bloc où la variable est déclaré se termine, alors la variable est détruite. (elle est locale au bloc où elle est déclarée). Déclare-là simplement au début de ton programme.
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
5 févr. 2010 à 16:41
attention, tu as corrigé en mettant une déclaration de min et max au début, mais tu as laissé "int min" dans le bloc. Ce qui signifie qu'il y a une autre variable min, locale au bloc, qui "cache" celle de départ : donc à la fin ça n'affiche pas la valeur que tu souhaitais.
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
5 févr. 2010 à 16:43
PS : ton indentation est un peu hasardeuse :

				for(i=1;i<taille;++i){
					if (tab[i]<min){
							min=tab[i];
						}
					}
					printf("\n Le minimum est: %d", ...


devrait être
				for(i=1;i<taille;++i) {
					if (tab[i]<min) {
						min=tab[i];
					}
				}
				printf("\n Le minimum est: %d",... 



(je chipote mais ça aide à éviter d'autres erreurs)
0
Ok donc j'ai déclarer mes "min" et "max" en haut avant le bloc main. Je fais quand meme toujours n'importe quoi, il faudrait que j'implémente un boucle while quelque part pour me proposer apres l'affichage si je veux re-rentrer un nombre...Je ne sais pas trop comment faire, Je ne sais pas comment vous codez, personnelement j'ai une feuille a coté ou je dessine le programme de manière très visuelle pour avoir une meilleure représentation, mais malheureusement, ma mauvaise maitrise du langage et mon peu d'expérience font que...le dessin ne représente pas le code, et vice-versa XD
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
5 févr. 2010 à 16:56
lol

oui bien sûr pas de problème.

le mieux, pour éviter de t'empêtrer dans ton propre code, est de séparer ton programme en modules.

Par exemple, tu peux créer une petite fonction "int min(int t[], int taille) { ... } qui fait le travail de chercher le minimum. Idem pour le maximum. Ainsi ton main() sera épuré, et si tu souhaites juste modifier la présentation et l'ordre des choses qui se passent, tu y verras plus clair.

(je ne sais pas si tu te souviens comment créer et utiliser des fonctions)
0
Ces fonctions min et max, par exemple, je les creer avant le main? Comme ca je n'ai qu'a les appeler dans la fonction main? Je ne me rappelle plus bien, mais google est mon ami. J'essai et je vous tiens au courant. Merci beaucoup de votre aide rapide!
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
5 févr. 2010 à 17:00
voilà c'est ça.

Ou pour plus de clarté, tu les déclares (prototype) avant le main, et tu les codes après.

int f(int, char);

int main (void) {

    int A;
    A = f(25, 's');

    return EXIT_SUCCESS; // normalement à rajouter la fin de ton main aussi ...
}

int f(int premierParametre, char deuxiemeParametre) {
    instruction;
    instruction;
    return unInt;
}
0
Bon alors j'ai repris de zéro., j'ai fait l'economie de 30% de lignes de code, et l'exécution est plus propre, celà dit il reste un soucis, quelles que soient les valeurs rentrées, le min reste toujours "0". Le max fonctionne. J'ai repris la fonction maxmin(long *t, long n, long min, long max) d'un post précédent, mais j'ai changé le pointeur en tableau, et les "long" en "int" . Une idée pour le minimum resté zero?
#include <stdio.h>
#include <stdlib.h>

int taille,min,max;
int maxmin(int t[], int taille, int min, int max);


int main(void){
	int i,j,nombre,t[taille];
	
	printf("\n Combien de nombres souhaitez-vous comparer? \n");
	scanf("%d",&taille);
	
	
		for(i=0;i<taille;i++){
			printf("Nombre %d: ", i+1);
			scanf("%d",&t[i]);
		}
		maxmin(t, taille,min,max);
	
				
	return EXIT_SUCCESS;
	
}

int maxmin (int t[], int taille, int min, int max){
	int i;
	for (i = 0; i < taille; ++i){
		if (t[i] > max)
			max = t[i];
		if (t[i] < min)
			min = t[i];
	}
	printf ("min = %ld et max = %ld\n", min, max);
}
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
7 févr. 2010 à 19:59
La prochiane fois, n'oublies pas de passer ton sujet en résolu

@+
0