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 :

Petit problème main()


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 47
    Par défaut Petit problème main()
    Bonjour à tous,
    J'ai un petit soucis avec le code suivant qui est censé mettre à 0 les éléments de la diagonale principale d'une matrice carrée.
    Il fonctionne jusqu'à l'affichage de la matrice carrée, mais je ne comprend pas pourquoi il ne veut pas exécuter la suite du code.
    Voici ce que j'ai fait :

    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
    #include <stdio.h>
     
     
     
    int main()
    {
    	int tab[50][50];
    	int i,j,k,l,somme;
    	somme=0;
    	/*dimension*/
    	printf("taper les dimensions (ligne puis colonne)\n");
    		scanf("%d",&i);
    		scanf("%d",&j);
    	/*remplissage*/
    for (k=1;k<=i;k++)
    { for (l=1;l<=j;l++)
    	{
    		printf("taper element ligne %d et colonne %d\n",k,l);
    		scanf("%d",&tab[k][l]);
    	}
    }
    	/*affichage*/
    for (k=1;k<=i;k++)
    { for (l=1;l<=j;l++)
    	{
    		somme=somme+tab[k][l];
    	printf("%2d",tab[k][l]);
    	}
    printf("\n");
    }
    printf("la somme est : %d\n",somme);
    printf("\n");
    /*mise à 0 de la diagonale*/
     
    for (k=1;k<=i;k++)
    {
    	for (l=1;l<=j;l++)
    	{
    		if (l=k)
    			tab[l][k]=0;
    	}
    }
    /*ré affichage (le code ne ré affiche plus la matrice)*/
    for (k=1;k<=i;k++)
    { for (l=1;l<=j;l++)
    	{
    	printf("%2d",tab[k][l]);
    	}
    printf("\n");
    }
     
    }
    Merci de votre aide

  2. #2
    Membre expérimenté Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    Par défaut
    Quelques remarques preliminaires sur ton code :
    1- Il serait bon d'avoir des noms de variable plus explicites...i, j, k, l, ca crée vite des confusions (meme si j'admets qu'il ya aussi des conventions mathematiques la dedans)
    2- Pourquoi n'utilises tu pas l'index 0 de tes tableaux ? Un tableau [50][50] a des indices allant de 0,0 a 49,49. Or toutes tes boucles for commencent à l'indice 1.
    3- Si tu manipules des matrices carrées, pourquoi demande tu à l'utilisateur 2 dimensions ? Mes cours de maths remontent a quelques années mais i = j si je ne m'abuse ? Les variables inutiles, ca ne sert a rien à part risquer de provoquer des bugs.
    4- Pareil lors de ta mise à 0...tu parcours tout ton tableau, alors qu'il te suffit simplement de mettre à 0 les valeurs de tab[k][k] pour k allant de 1 à i.

    Sinon, ca plante pour toutes les matrices ? ou seulement dans certains cas ? Est ce que ca marche avec des matrices 2x2 ou 1x1 ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 47
    Par défaut
    Salut Ksempac
    Si je n'ai pas utiliser l'index 0 des tableaux, c'est pour simplifier ce printf:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("taper element ligne %d et colonne %d\n",k,l);
    Sinon j'avais taper élément ligne 0 et colonne 0

    Par contre pour l'affichage de la première matrice, ça fonctionne, mais j'ai l'impression que le code ne s'exécute plus après avoir fait la somme des éléments...

  4. #4
    Membre expérimenté Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    Par défaut
    Attention, melanger IHM (ce que tu affiches a l'usager) et algorithme interne, c'est dangereux.

    C'est sur tu gagnes 1 dixieme de seconde maintenant en ecrivant "k" au lieu de "k+1" lors de tes affichages, mais quand ton programme aura grandit, ce genre d'incoherence risque de te couter cher en debuggage.
    Exemple bateau : Si un jour tu cherches a rentrer une matrice de 50x50, ca ne va pas marcher, tu vas regarder ton code et penser naivement "mais pourtant je mets bien un tab[50][50]".

    Travaille avec des matrices commencant a 0, et ecris tes printf avec des indices augmentés de 1, ca te coutera pas grand chose maintenant, et ca te simplifiera la vie plus tard.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("taper element ligne %d et colonne %d\n",k+1,l+1);
    A part ca, je suis bete...en realisant ton code attentivement, ton erreur etait evidente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		if (l=k)
    			tab[l][k]=0;
    Tu as mis un = au lieu d'un ==. Du coup tu reassignes l a chaque fois et ne sors pas de ta boucle.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 47
    Par défaut
    Merci beaucoup pour tes conseils, ça marche maintenant.
    Par contre je ne comprend pas vraiment pourquoi il faut mettre un if (l==k)
    ça change quoi exactement ?

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    l = k donne à l lavaleur de k
    l == k compare l et k et vaut "vrai" si les deux sont égaux

  7. #7
    Membre expérimenté Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    Par défaut
    L'operateur = assigne une valeur

    Signifie : La variable i vaut maintenant 42. D'une part, ca modifie ta variable, et d'autre part, si tu fais un if(i = 42) l'expression est evaluée comme un if(42) (je dis ca de memoire, c'est a verifier, mais de toute facon a ne pas utiliser, car ca prete vite a confusion).

    L'operateur == effectue une comparaison

    Signifie : Est ce que la variable i vaut 42 ? La variable i n'est pas modifiée, et if(i==42) évalue si les 2 valeurs sont bien identiques.

    Dans ton cas, tu voulais savoir si k etait egal a l, pour savoir si tu etais sur la diagonale (mais la encore, si tu avais directement fait une boucle tab[k][k] tu n'aurais jamais eu ce probleme). Or tu mettais l = k. Donc tu donnais a l la valeur de k.
    A la premiere iteration sur k, k vaut 1, donc a chaque iteration de l, tu repassais dans ton if(l=k), et tu remettais l a la valeur de k, donc 1. Donc l valait en permanence 1 apres le if, puis 2 apres le l++ (fin de boucle de for), puis revenait a 1, etc... => tu ne sortais jamais de ta boucle.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. un petit problème d'algo
    Par supertramp dans le forum Algorithmes et structures de données
    Réponses: 22
    Dernier message: 12/10/2004, 20h13
  2. Petit problème de décimales !
    Par ridan dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/09/2004, 21h24
  3. Réponses: 17
    Dernier message: 13/07/2004, 20h37
  4. petit problème premier plan, arrière plan
    Par gros bob dans le forum OpenGL
    Réponses: 4
    Dernier message: 19/04/2004, 12h00
  5. [jointure] Petit problème sur le type de jointure...
    Par SteelBox dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/02/2004, 18h55

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