Matrice

Fermé
sweetwink Messages postés 77 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 13 janvier 2009 - 16 nov. 2008 à 17:57
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 16 nov. 2008 à 20:40
Bonjour,
comment faire une matrice en c dont on met à zéro les deux diagonales

8 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
16 nov. 2008 à 18:12
Salut
#include <stdio.h>

int main(void){
    int tab[3][3];
    for(int i=0;i<3;i++){
            tab[i][i]=0;
            tab[2-i][i]=0;
    }
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++)
            printf("%d ",tab[i][j]);
        puts("");
    }
    return 0;
}

Attention, je t'ai juste rempli les diagonales avec des zéros. A toi de remplir les autres à ton gré.
Cdlt
0
sweetwink Messages postés 77 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 13 janvier 2009 6
16 nov. 2008 à 18:29
merci d'étre tjr là pour m'aider
mais tu penses pas que il faut faire condition (si le nombre de colonne est différent du nombre de lignes là on peu pasmettre méme les diagonales en 0 )n'est ce pas
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
16 nov. 2008 à 18:37
Tout dépend de ton programme. Je t'ai juste donné l'algorithme pour remplir les diagonales.
Dans mon exemple, la taille de la matrice est codée en dure, donc il n'y a pas de souci. Mais, si tu dois récupérer la taille de la matrice à l'exécution du programme. Tu devras vérifier que la matrice est carrée. Ou alors tout simplement, tu pars du principe que ta matrice est carrée et donc tu ne demandes à l'utilisateur que la taille d'un côté ;)
Cdlt
0
sweetwink Messages postés 77 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 13 janvier 2009 6
16 nov. 2008 à 18:35
est ce que on peu faire comme ça si on veu remplir le diagonale qui commence de la derniere colonne :
t[i++][i--]=0
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
16 nov. 2008 à 18:40
Faut tester par toi même, c'est comme ça qu'on progresse rapidement ;).
Mais sinon pour répondre à la question, non. Tu peux pas, tu risques surtout de faire une boucle récursive si tu mets ça dans un while. Incrémenter i puis le décrémenter revient au point de départ. Donc i restera constant à la fin de l'instruction.
0
sweetwink Messages postés 77 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 13 janvier 2009 6
16 nov. 2008 à 18:45
ok je vais le faire maintenenten
0

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

Posez votre question
sweetwink Messages postés 77 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 13 janvier 2009 6
16 nov. 2008 à 19:27
#include <stdio.h>
void main ()
{
int tab[100][50]; ///* là j'en suis pa sur comment faire tab [100][50]et pui dire si nc=nl*///
int i,j,nl,nc;


for (j=0;j<nc;j++)
{printf ("saisir le nombre de colonnes",nc);}
for (i=0;i<nl;i++)
{printf("saisirle nombre delignes",nl);}
for ( i=0;i<nl;i++)
{ if (nl==nc)
{t[i][i]=0
t[2-i][i]=0}}
for(i=0;i<nl;i++)
{for (j=0;j<nc;j++)
{printf("%i",t[i][j]);}
puts("")} //*les autres cases sont vides*//
}
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
16 nov. 2008 à 20:18
Salut.
Quand tu postes sur le forum, utilise la balise "code" à droite de souligner. Sinon c'est illisible et ça donne pas envie de lire.
Sinon, comment faire ? Allocation dynamique ;).
Ce qui donnerait :
#include <stdio.h>
#include <stdlib.h>

int main(void){
    int **tab;
    int lin,col;
    printf("nombre de lignes: ");
    scanf("%d",&lin);

    printf("nombre de colonnes : ");
    scanf("%d",&col);

    if(lin<=0 || col<=0) exit(-1);

    if( (tab=malloc(lin*sizeof(*tab)) )==0) exit(-1);
    for(int i=0;i<lin;i++)
        if( (tab[i]=malloc(col*sizeof(**tab)) )==0) exit(-1);

    //remplissage de la matrice
    //...
    //...

    //mise à zéro des diagonales si matrice carrée
    if(lin==col){
        for(int i=0;i<lin;i++){
            tab[i][i]=0;
            tab[lin-i-1][i]=0;
        }
    }

    for(int i=0;i<lin;i++){
        for(int j=0;j<col;j++)
            printf("%d\t",tab[i][j]);
        puts("");
    }

    return 0;
}


Cdlt
0
sweetwink Messages postés 77 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 13 janvier 2009 6
16 nov. 2008 à 20:34
if(lin<=0 || col<=0) exit(-1);

if( (tab=malloc(lin*sizeof(*tab)) )==0) exit(-1);
for(int i=0;i<lin;i++)
if( (tab[i]=malloc(col*sizeof(**tab)) )==0) exit(-1);

je doi avoir honte, mais on peu pas faire autre chose plus simple que ça,pourquoi cette instruction?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
16 nov. 2008 à 20:40
Je répète encore. Quand tu postes, utilise la balise code (à droite du bouton souligner).

Et oui, c'est obligatoire et il n'y a pas plus simple. Il s'agit d'allocations dynamiques conformes.
malloc permet d'allouer en mémoire un tableau d'une taille obtenue à l'exécution (bien sûr la dimension doit être positive, d'où mon if). Et il faut tester également la valeur du retour du malloc pour vérifier que l'allocation a bien réussi.
Cdlt
0