IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

cas particulier agaçant


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 49
    Points : 25
    Points
    25
    Par défaut cas particulier agaçant
    Bonsoir à tous! Encore avec mon programme de combinaisons formés avec n chiffres.Il marche très bien avec des chiffres differents.Mais lorsqu'on fait entrer des chiffres qui se répétent ,mon programme plante.
    S'il vous plait dites moi qu'est-ce qui cloche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    #include<stdio.h>
    #include<stdlib.h>
    int fact(int n);
    void main()
    {
     
    	int t[100],m[1000][100],i,j,aux,different,stop,ligne,n;
     
     
    	do
    	{
    		printf("Donner le nombre d'entiers à entrer:\n");
    		scanf("%d",&n);
    	}
    	while(n<=0 || n>100);
    		printf("Le nombre de combinaisons est %d\n",fact(n));
    	for(i=0;i<n;i++)
    	{
    		printf("Donner le %d%s element ",(i+1),(i)?"eme":"er");
    		scanf("%d",&t[i]);
     
     
    	}
     
    	ligne=0;
    		do
    		{
    		/*générer un nouveau tableau T*/
    		i=rand()%n;
    		do
    		{
    			j=rand()%n;}
    		while(i==j);
    		if(t[i]!=t[j])
    		{
    		aux=t[i];
    		t[i]=t[j];
    		t[j]=aux;
    		}
    		/*chercher T dans la matrice m*/
    		j=0;stop=0;
    		while(j<ligne && stop==0)
    		{	different=0;
    			i=0;
    			while(i<n && different==0)
    			{	
    				if(t[i]!=m[j][i])
    					different=1;
    				else
    					i++;
    			}
    			if(different==1)
    				j++;
    			else
    				stop=1;
    		}
     
     
    		if(stop==0)
    		{
    			/*ajouter t dans m*/
    			for(j=0;j<n;j++)
    				m[ligne][j]=t[j];
    				ligne++;
    		}
     
     
    		}
    		while(ligne<fact(n));
     
     
    	/*affichage des combinaisons*/
    	for(j=0;j<fact(n);j++)
    	{
    		for(i=0;i<n;i++)
    			printf("%d",m[j][i]);
    		printf("-");
    	}
    }
    int fact(int n)
    {
    	int i;int f;
    	f=1;
    	for(i=1;i<=n;i++)
    		f=f*i;
    	return f;
    }

  2. #2
    Nouveau membre du Club
    Inscrit en
    Novembre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 49
    Points : 25
    Points
    25
    Par défaut cas particulier agaçant
    Bon pour suivre les règlesje ne vais pas écrire ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    #include<stdio.h>
    #include<stdlib.h>
    int fact(int n);
    int main()
    {
     
    	int t[100],m[1000][100],i,j,aux,different,stop,ligne,n;
     
     
    	do
    	{
    		printf("Donner le nombre d'entiers à entrer:\n");
    		scanf("%d",&n);
    	}
    	while(n<=0 || n>100);
    		printf("Le nombre de combinaisons est %d\n",fact(n));
    	for(i=0;i<n;i++)
    	{
    		printf("Donner le %d%s element ",(i+1),(i)?"eme":"er");
    		scanf("%d",&t[i]);
     
     
    	}
     
    	ligne=0;
    		do
    		{
    		/*générer un nouveau tableau T*/
    		i=rand()%n;
    		do
    		{
    			j=rand()%n;}
    		while(i==j);
    		if(t[i]!=t[j])
    		{
    		aux=t[i];
    		t[i]=t[j];
    		t[j]=aux;
    		}
    		/*chercher T dans la matrice m*/
    		j=0;stop=0;
    		while(j<ligne && stop==0)
    		{	different=0;
    			i=0;
    			while(i<n && different==0)
    			{	
    				if(t[i]!=m[j][i])
    					different=1;
    				else
    					i++;
    			}
    			if(different==1)
    				j++;
    			else
    				stop=1;
    		}
     
     
    		if(stop==0)
    		{
    			/*ajouter t dans m*/
    			for(j=0;j<n;j++)
    				m[ligne][j]=t[j];
    				ligne++;
    		}
     
     
    		}
    		while(ligne<fact(n));
     
     
    	/*affichage des combinaisons*/
    	for(j=0;j<fact(n);j++)
    	{
    		for(i=0;i<n;i++)
    			printf("%d",m[j][i]);
    		printf("-");
    	}
    return 0;
    }
    int fact(int n)
    {
    	int i;int f;
    	f=1;
    	for(i=1;i<=n;i++)
    		f=f*i;
    	return f;
    }

  3. #3
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Bon pour suivre les règlesje ne vais pas écrire
    C'est bien

    Lorsqu'il y a une répétition de nombres dans ton tableau de départ, le nombre d'arrangement n'est pas égal à n!

    Donc forcèment, ta condition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while(ligne<fact(n));
    Sera toujours vraie...

    Jc

  4. #4
    Nouveau membre du Club
    Inscrit en
    Novembre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 49
    Points : 25
    Points
    25
    Par défaut cas particulier agaçant
    Mais s'il vous plait comment puis-je rectifier ceci?

  5. #5
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Mais s'il vous plait comment puis-je rectifier ceci?
    Tout ton algorithme est basé sur le fait que tu sais à l'avance combien d'arrangements tu vas avoir... Il faut arriver à calculer le nombre d'arrangement en fonction du tableau de départ...

    En supposant que tu as [b]n[b] éléments, on peut les diviser en sous groupes à répétitions...

    Soient n1, n2 ... np les nombres que se répètent dans ton tableau.
    Soient r1, r2 ... rp le nombre de fois que les nombres n1, n2 ... np se répètent respectivement.

    Le nombre de permutation devient alors: n! / (r1! r2! ...... rp!)

  6. #6
    Nouveau membre du Club
    Inscrit en
    Novembre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 49
    Points : 25
    Points
    25
    Par défaut cas particulier agaçant
    Merci de m'avoir clarifier le problème.Je vais tout de suite essayer de le résoudre.Je vous remercie Fearyourself énormement pour votre attention.

  7. #7
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Bravo pour le int main(), ca fait plaisir...

    Par contre tu ne t'es toujours pas decide a renoncer a ton scanf() pour la saisie...
    C'est mal.

    Sinon j'ai bien aime ca dans le genre porc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int t[100],m[1000][100],i,j,aux,different,stop,ligne,n;
     
     
       do
       {
          printf("Donner le nombre d'entiers à entrer:\n");
          scanf("%d",&n);
       } 
       while(n<=0 || n>100);
    Il faut donner des noms parlants a ses variables, et la condition de sortie de boucle c'est vraiment crade...

    On n'utilise pas scanf() pour des saisies utilisateur.
    On lit une ligne, on verifie que ce n'est pas de la merde, puis seulement on convertit.
    Je sais, c'est chiant. Mais c'est propre.

    Evite de faire des fonctions trop longues, et de tasser ton code.
    Ca le rend illisible.

    Enfin, le plus important: prends en compte les conseils des autres. Et pas seulement les solutions.
    Ici je ne parle pas de moi, etant arrive assez recemment sur ce forum.

    Mais j'ai fouille un peu l'historique de tes posts et tout les conseils que je tai donne ton deja ete files une douzaine de fois par des posteurs experimentes. Alors par pitie essaie de coder un peu plus proprement.

    C'est pour ton bien.
    Don't worry, be serious.
    La vie est courte. Prenez votre temps.

    Jack.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Novembre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 49
    Points : 25
    Points
    25
    Par défaut cas particulier agaçant
    Merci pour vos conseils Jack serious et merci pour tous ceux qui m'ont donner des conseils.J'avoue que c'est dans ce forum que je sentais que je suis entrain de progresser et aimer de plus en plus la programmation vu que c'est ma première année d'études en informatique.
    Pour le scanf,c'est drôle qu' on nous a habitué à l'utiliser dans la saisie.
    Je vous serai reconnaissant si vous me rappeliez comment faire.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Novembre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 49
    Points : 25
    Points
    25
    Par défaut cas particulier agaçant
    Comment peut-on traduire l'idée de Fearyourself algorithmiquement?

  10. #10
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Comment peut-on traduire l'idée de Fearyourself algorithmiquement?
    C'est une question à demander dans la section algorithmique bien que c'est un bon exercice de tenter de le faire toi-même...

    Tu apprendras plus si tu y arrives même avec une version bourrine que si on te donne la réponse... Proposes et on donnera notre idée..

    Pour des pistes:

    Il faut parcourir ton tableau
    Compter le nombre d'éléments en doublon et savoir combien y en a...

    Décompose le problème en sous-problèmes...

    Jc

  11. #11
    Nouveau membre du Club
    Inscrit en
    Novembre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 49
    Points : 25
    Points
    25
    Par défaut cas particulier agaçant
    Bon voilà qu'est ce que j'ai ajouté et toujours le même problème.
    S'il vous plait corrigez moi!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    #include<stdio.h>
    #include<stdlib.h>
    int fact(int n);
    int recherche(int v[],int taille,int k);
    void main()
    {
     
    	int t[100],v[100],m[1000][100],i,j,aux,different,stop,ligne,n,k,p,x;
     
     
    	do
    	{
    		printf("Donner le nombre d'entiers à entrer:\n");
    		scanf("%d",&n);
    	}
    	while(n<=0 || n>100);
    		printf("Le nombre de combinaisons est %d\n",fact(n));
    	for(i=0;i<n;i++)
    	{
    		printf("Donner le %d%s element ",(i+1),(i)?"eme":"er");
    		scanf("%d",&t[i]);
    	}
     
    	k=0;
    	for(i=0;i<n-1;i++)
    	{	x=recherche(t,n,i);
    		v[k]=1;
    		if(x==0)
    		{
    		for(j=i+1;j<n;j++)
    		{
    			if(t[i]==t[j])
    			{
    				v[k]=v[k]+1;
    				k++;
    			}
    		}
    		}
    	}
    	p=1;
    	for(i=0;i<k;i++)
    		p=p*fact(v[k]);
     
    	ligne=0;
    		do
    		{
    		/*générer un nouveau tableau T*/
    		i=rand()%n;
    		do
    		{
    			j=rand()%n;}
    		while(i==j);
    		if(t[i]!=t[j])
    		{
    		aux=t[i];
    		t[i]=t[j];
    		t[j]=aux;
    		}
    		/*chercher T dans la matrice m*/
    		j=0;stop=0;
    		while(j<ligne && stop==0)
    		{	different=0;
    			i=0;
    			while(i<n && different==0)
    			{	
    				if(t[i]!=m[j][i])
    					different=1;
    				else
    					i++;
    			}
    			if(different==1)
    				j++;
    			else
    				stop=1;
    		}
     
     
    		if(stop==0)
    		{
    			/*ajouter t dans m*/
    			for(j=0;j<n;j++)
    				m[ligne][j]=t[j];
    				ligne++;
    		}
     
     
    		}
    		while(ligne<(fact(n)/p));
     
     
    	/*affichage des combinaisons*/
    	for(j=0;j<fact(n);j++)
    	{
    		for(i=0;i<n;i++)
    			printf("%d",m[j][i]);
    		printf("-");
    	}
    }
    int fact(int n)
    {
    	int i;int f;
    	f=1;
    	for(i=1;i<=n;i++)
    		f=f*i;
    	return f;
    }
    int recherche(int v[],int taille,int k)
    {
    	int j;int trouve;
    	trouve=0;
    	j=k-1;
    	while(j>=0 && trouve==0)
    	{	if(v[k]==v[j])
    			trouve=1;
    		else
    			j--;
    	}
    	return trouve;
    }

  12. #12
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    S'il vous plait corrigez moi!!!
    Mets des commentaires dans ton code et indente le correctement et je regarderais...

  13. #13
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: cas particulier agaçant
    Citation Envoyé par devdébuto
    Pour le scanf,c'est drôle qu' on nous a habitué à l'utiliser dans la saisie.
    Non, c'est pas drôle. Ca révèle le faible niveau de l'enseignement du C...
    Je vous serai reconnaissant si vous me rappeliez comment faire.
    Déjà indiqué...

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers
    Pas de Wi-Fi à la maison : CPL

  14. #14
    Nouveau membre du Club
    Inscrit en
    Novembre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 49
    Points : 25
    Points
    25
    Par défaut cas particulier agaçant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    #include<stdio.h>
    #include<stdlib.h>
    int fact(int n);
    int recherche(int v[],int taille,int k);/*fonction qui recherche si le chiffre a été déja entré ou non*/
    void main()
    {
     
    	int t[100],v[100],m[1000][100],i,j,aux,different,stop,ligne,n,k,p,x;
     
     
    	do
    	{
    		printf("Donner le nombre d'entiers à entrer:\n");
    		scanf("%d",&n);
    	}
    	while(n<=0 || n>100);
    		printf("Le nombre de combinaisons est %d\n",fact(n));
    	for(i=0;i<n;i++)
    	{
    		printf("Donner le %d%s element ",(i+1),(i)?"eme":"er");
    		scanf("%d",&t[i]);
    	}
     
    	k=0;
    	for(i=0;i<n-1;i++)
    	{	x=recherche(t,n,i);
    		v[k]=1;
    		if(x==0)/*si on passe à une nouvelle colonne et le chiffre ne se répète pas dans les colonnes qui précédent*/
    		{/*calculer le nombre de répétion du chiffre dans les colonnes qui suivent et les mettre dans un nouveau tableau*/
    		for(j=i+1;j<n;j++)
    		{
    			if(t[i]==t[j])
    			{
    				v[k]=v[k]+1;
    				k++;
    			}
    		}
    		}
    	}
            /*calculer le produit des factorielles v[i]*/
    	p=1;
    	for(i=0;i<k;i++)
    		p=p*fact(v[k]);
     
    	ligne=0;
    		do
    		{
    		/*générer un nouveau tableau T*/
    		i=rand()%n;
    		do
    		{
    			j=rand()%n;}
    		while(i==j);
    		if(t[i]!=t[j])
    		{
    		aux=t[i];
    		t[i]=t[j];
    		t[j]=aux;
    		}
    		/*chercher T dans la matrice m*/
    		j=0;stop=0;
    		while(j<ligne && stop==0)
    		{	different=0;
    			i=0;
    			while(i<n && different==0)
    			{	
    				if(t[i]!=m[j][i])
    					different=1;
    				else
    					i++;
    			}
    			if(different==1)
    				j++;
    			else
    				stop=1;
    		}
     
     
    		if(stop==0)
    		{
    			/*ajouter t dans m*/
    			for(j=0;j<n;j++)
    				m[ligne][j]=t[j];
    				ligne++;
    		}
     
     
    		}
    		while(ligne<(fact(n)/p));
     
     
    	/*affichage des combinaisons*/
    	for(j=0;j<fact(n);j++)
    	{
    		for(i=0;i<n;i++)
    			printf("%d",m[j][i]);
    		printf("-");
    	}
    }
    int fact(int n)
    {
    	int i;int f;
    	f=1;
    	for(i=1;i<=n;i++)
    		f=f*i;
    	return f;
    }
    int recherche(int v[],int taille,int k)
    {
    	int j;int trouve;
    	trouve=0;
    	j=k-1;
    	while(j>=0 && trouve==0)
    	{	if(v[k]==v[j])
    			trouve=1;
    		else
    			j--;
    	}
    	return trouve;
    }

  15. #15
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: cas particulier agaçant
    Citation Envoyé par devdébuto
    S'il vous plait corrigez moi!!!
    Pas de Wi-Fi à la maison : CPL

  16. #16
    Nouveau membre du Club
    Inscrit en
    Novembre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 49
    Points : 25
    Points
    25
    Par défaut cas particulier agaçant
    je m'excuse Emmenuel.On nous a appris cette mauvaise habitude mais je te promet que je me rappellerai de tes remarques dans tous mes prochains programmes.D'ailleurs j'ai corrigé cette faute dans ce même sujet.Mais puisque j'ai fait copier coller une autre fois il ya eu ( void main())
    Pour te faire plaisir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main()
    {
     
     
     return 0;
    }

  17. #17
    Nouveau membre du Club
    Inscrit en
    Novembre 2005
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 49
    Points : 25
    Points
    25
    Par défaut cas particulier agaçant
    Après quelques changement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
     
    #include<stdio.h>
    #include<stdlib.h>
    int fact(int n);
    int recherche(int v[],int taille,int k);
    int main()
    {
     
    	int t[100],v[100],m[1000][100],i,j,aux,different,stop,ligne,n,k,p,x;
     
     
    	do
    	{
    		printf("Donner le nombre d'entiers à entrer:\n");
    		scanf("%d",&n);
    	}
    	while(n<=0 || n>100);
    		printf("Le nombre de combinaisons est %d\n",fact(n));
    	for(i=0;i<n;i++)
    	{
    		printf("Donner le %d%s element ",(i+1),(i)?"eme":"er");
    		scanf("%d",&t[i]);
    	}
     
    	k=0;
    	for(i=0;i<n-1;i++)
    	{	x=recherche(t,n,i);
    		v[k]=1;
    		if(x==0)
    		{
    		for(j=i+1;j<n;j++)
    		{
    			if(t[i]==t[j])
    				v[k]=v[k]+1;
    		}
    		k++;
    		}
    	}
    	p=1;
    	for(i=0;i<=k;i++)
    		p=p*fact(v[k]);
     
    	ligne=0;
    		do
    		{
    		/*générer un nouveau tableau T*/
    		i=rand()%n;
    		do
    		{
    			j=rand()%n;}
    		while(i==j);
    		if(t[i]!=t[j])
    		{
    		aux=t[i];
    		t[i]=t[j];
    		t[j]=aux;
    		}
    		/*chercher T dans la matrice m*/
    		j=0;stop=0;
    		while(j<ligne && stop==0)
    		{	different=0;
    			i=0;
    			while(i<n && different==0)
    			{	
    				if(t[i]!=m[j][i])
    					different=1;
    				else
    					i++;
    			}
    			if(different==1)
    				j++;
    			else
    				stop=1;
    		}
     
     
    		if(stop==0)
    		{
    			/*ajouter t dans m*/
    			for(j=0;j<n;j++)
    				m[ligne][j]=t[j];
    				ligne++;
    		}
     
     
    		}
    		while(ligne<(fact(n)/p));
     
     
    	/*affichage des combinaisons*/
    	for(j=0;j<fact(n);j++)
    	{
    		for(i=0;i<n;i++)
    			printf("%d",m[j][i]);
    		printf("-");
    	}
    	return 0;
    }
    int fact(int n)
    {
    	int i;int f;
    	f=1;
    	for(i=1;i<=n;i++)
    		f=f*i;
    	return f;
    }
    int recherche(int v[],int taille,int k)
    {
    	int j;int trouve;
    	trouve=0;
    	j=k-1;
    	while(j>=0 && trouve==0)
    	{	if(v[k]==v[j])
    			trouve=1;
    		else
    			j--;
    	}
    	return trouve;
    }

  18. #18
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    C'est inutile de dire que ton programme ne marche pas et que ton calcul de p est faux...

    Toi tu fais ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
       k=0;
       for(i=0;i<n-1;i++)
       {   x=recherche(t,n,i);
          v[k]=1;
          if(x==0)
          {
          for(j=i+1;j<n;j++)
          {
             if(t[i]==t[j])
                v[k]=v[k]+1;
          }
          k++;
          }
       }
       p=1;
       for(i=0;i<=k;i++)
          p=p*fact(v[k]);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int recherche(int v[],int taille,int k)
    {
       int j;int trouve;
       trouve=0;
       j=k-1;
       while(j>=0 && trouve==0)
       {   if(v[k]==v[j])
             trouve=1;
          else
             j--;
       }
       return trouve;
    }
    Maintenant il y a deux genres de problèmes en informatique (en généralisant...) Les problèmes de programmation (erreur dans le code embetant, mauvaise connaissance d'une fonction...) et les problèmes d'algo...

    Ici c'est typiquement un problème d'algo... En oubliant tout ce qu'il y a à côté et donc en supposant que ceci est tout ce qu'il y a dans ton projet, est-ce que ce code fait ce que tu veux?

    Est-ce que pour le tableau [1,2,3,4] il te rend que p = 1?

    Ensuite, est-ce que p a la bonne valeur pour le tableau [1,2,2,3] (p=2) ou [1,4,3,3] (p=2) ou encore [1,5,3,3,3] (p=6) ? *

    C'est en répondant à ces questions et en sachant pourquoi ca ne marche pas que tu arriveras à progresser et c'est tout ce que je te souhaite...

    Jc

    * Petit indice, la réponse est non (du moins pas pour tous...)

Discussions similaires

  1. [PB] Générics - cas particulier
    Par ®om dans le forum Langage
    Réponses: 3
    Dernier message: 22/06/2006, 16h56
  2. Effacer (cas particulier) d'un champ de formulaire
    Par frog43 dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 17/05/2006, 18h29
  3. Réponses: 27
    Dernier message: 12/01/2006, 11h04
  4. Enregistrement courant après refresh [cas particulier]
    Par say dans le forum Bases de données
    Réponses: 8
    Dernier message: 02/08/2005, 15h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo