Matrice creuse

Soyez le premier à donner votre avis sur cette source.

Vue 9 328 fois - Téléchargée 422 fois

Description

une matrice creuse c'est une matrice qui ne stock dans la mémoire que les valeurs non nulle d'une façon dynamique .

Source / Exemple :


#include<conio.h>
#include<stdio.h>
#include<iostream.h>
class noeud;
//////////////////////////////////STRUCT TABLEAU
struct tabs
{
noeud *add;
};
typedef struct tabs tabs;
//////////////////////////////////CLASS MATRICE
class matrice
{
public:
matrice();
int get_nbrLi(void);
int get_nbrCo(void);
void matcreus(int **,tabs *,tabs *);
int lecture_fichier(char*);
int ecriture_fichier(char*);
void del(int,int);
int modi(int,int,int);
void cadr(int ,int);
~matrice();
void aff(int ,int);
void ajout(int ,int ,int);
private:
int nbrLi,nbrCo;
tabs tabH[10],tabV[8];
int **mat;
};
//////////////////////////////////return nbr Li && Co
int matrice::get_nbrLi(void)
{
return nbrLi-1;
}
int matrice::get_nbrCo(void)
{
return nbrCo-1;
}
//////////////////////////////////CLASS NOEUD
class noeud
{
private:
int val,nli,nco;
noeud *sh,*sv;
public:
friend matrice::~matrice();
friend matrice::matrice();
void friend matrice::matcreus(int **,tabs *,tabs *);
int  friend matrice::lecture_fichier(char*);
int  friend matrice::ecriture_fichier(char*);
void friend matrice::del(int,int);
int  friend matrice::modi(int,int,int);
void friend matrice::aff(int ,int);
void friend matrice::ajout(int ,int ,int);
void friend matrice::cadr(int,int);
noeud()
{
sh=NULL;
sv=NULL;
}
};
//////////////////////////////////DELETE
void matrice::del(int i,int j)
{
noeud *bal,*prec;
bal=tabV[i].add;
if(bal->nco==j)
	{
	tabV[i].add=bal->sh;
	delete bal;
	}
else
	do
	{
	if(bal->nco==j)
		{
		prec->sh=bal->sh;
		}
	prec=bal;
	bal=bal->sh;
	}while(bal);
bal=tabH[j].add;
if(bal->nli==i)
	{
	tabH[j].add=bal->sv;
	delete bal;
	}
else
	do
	{
	if(bal->nli==i)
		{
		prec->sv=bal->sv;
		delete bal;
		}
	prec=bal;
	bal=bal->sv;
	}while(bal);
}
//////////////////////////////////MODIFICATION DU VAL
int matrice::modi(int v,int i,int j)
{
noeud *bal;
bal=tabV[i].add;
do
{

if(bal->nco==j)
	{
	bal->val=v;
	return 1;
	}
bal=bal->sh;
}while(bal);
return 0;
}
//////////////////////////////////AJOUT De NOEUD
void matrice::ajout(int v,int i,int j)
{
noeud *nd;
nd=new noeud;
nd->val=v;
nd->nli=i;
nd->nco=j;
if(tabV[i].add)  //HORIZONTALEMENT
	{
	noeud* bal;
	noeud* prec;
	bal=tabV[i].add;
	if(bal->nco>j)
		{
		tabV[i].add=nd;
		nd->sh=bal;
		}
	else
	{
		do
		{
		prec=bal;
		bal=bal->sh;
		}while(bal && bal->nco<j);
		prec->sh=nd;
		if(bal)
		nd->sh=bal;
	}
	}
else
	tabV[i].add=nd;
/*if(tabH[j].add)  //VERTICALEMENT
	{
	noeud* bal;
	noeud* prec;
	bal=tabH[j].add;
	if(bal->nli>i)
		{
		tabH[j].add=nd;
		nd->sv=bal;
		}
	else
	{
		do
		{
		prec=bal;
		bal=bal->sv;
		}while(bal && bal->nli<i);
		prec->sv=nd;
		if(bal)
		nd->sv=bal;
	}
	}
else
	tabH[j].add=nd;*/
}
//////////////////////////////////AFFICHEUR
void matrice::aff(int l,int c)
{
int a=8,z=8;
gotoxy(a,z);
for(int i=l;i<7+l && i<nbrLi;i++)       //Zero
{	for(int j=c;j<7+c && j<nbrCo;j++)
	{
		gotoxy(a,z);
		textcolor(WHITE);
		cprintf("0");
		a+=8;
		}
		a=8;
		z+=6;
	}
	noeud *bal;
	for(i=l;i<7+l&&i<nbrLi;i++)
	{
		bal=tabV[i].add;
		{
		while(bal->nco<c)
			bal=bal->sh;
		if(bal)
		do
		{
		gotoxy(8+8*(bal->nco-c),8+6*(i-l));
		textcolor(5);
		if(bal->nco<c+7)
			cprintf("%d",bal->val);
		bal=bal->sh;
		}while(bal && bal->nco<7+c && bal->nco<nbrCo);
		}
	}
}
/////////////////////////////////////////CONSTRUCTEUR
matrice::matrice()
{
lecture_fichier("fichier.txt");
for(int i=0;i<nbrCo;i++)
	{
	tabH[i].add=NULL;
	}
	for(i=0;i<nbrLi;i++)
	{
	tabV[i].add=NULL;
	}
matcreus(mat,tabH,tabV);
}
//////////////////////////////////////////DESTRUCTEUR
matrice::~matrice()
{
for(int i=0;i<nbrLi;i++)
delete mat[i];
delete *mat;
noeud *bal,*prec;
for( i=0;i<nbrLi;i++)
	{
	if(bal)
		{

		bal=tabV[i].add;
		tabV[i].add=NULL;
		bal=bal->sh;
		do
		{
		prec=bal;
		bal=bal->sh;
		delete prec;
		}while(bal);
		}
	}
}
//////////////////////////////////LECTURE FICHIER
int matrice::lecture_fichier(char* nom_fichier)
    {
    FILE* f=fopen(nom_fichier,"r");
    if (f != NULL)
    {
       fscanf(f,"%d%d",&nbrCo,&nbrLi);
    }
   else
	 return 0;
   mat = new int* [nbrCo];
   for(int i=0;i<nbrLi;i++)
   mat[i]=new int[nbrCo];

   for(int j=0;j<nbrLi;j++)
   {
	  for (i=0;i<nbrCo;i++)
	  {
		fscanf(f,"%d",&mat[j][i]);
	  }
   }
   return 1;
   }
///////////////////////////////////////////ECRITURE FICHIER
int matrice::ecriture_fichier(char* nom_fichier)
    {
    FILE *f=fopen(nom_fichier,"w");
    if (f != NULL)
    {
       fprintf(f,"%d %d\n",nbrCo,nbrLi);
    }
   else
	 return 0;
noeud *nid;
for(int i=0;i<nbrLi;i++)
{
int indi=0;
nid=tabV[i].add;
if(!tabV[i].add)
	for(int com=0;com<nbrCo;com++)
	{
	fprintf(f,"0 ");
	indi=nbrCo;
	}
else
	do
	 {
	 for(int com=indi;com<nid->nco && indi<nbrCo;com++,indi++)
		{
		 fprintf(f,"0 ");
		}
	 fprintf(f,"%d ",nid->val);
	 indi++;
	 nid=nid->sh ;
	 }while(nid);
for(;indi<nbrCo;indi++)
{
	fprintf(f,"0 ");
}
fprintf(f,"\n");
}

    fclose(f);
    return 1;
   }
//*****************************************MATCRUS
void matrice::matcreus(int **l,tabs *tabH,tabs *tabV)
{
for(int i=0;i<nbrLi;i++)
	for(int j=0;j<nbrCo;j++)
		{
		if(l[i][j])
			{
			noeud* bal;
			noeud* prec,*nd;
			nd=new noeud;
			nd->val=l[i][j];
			nd->nli=i;
			nd->nco=j;
			if(tabH[j].add!=NULL)
				{
				bal=tabH[j].add;
				do
				{
				prec=bal;
				bal=bal->sv;
				}while(bal);
				prec->sv=nd;
				}
			else
				tabH[j].add=nd;

			if(tabV[i].add!=NULL)
				{
				bal=tabV[i].add;
				do
				{
				prec=bal;
				bal=bal->sh;
				}while(bal);
				prec->sh=nd;
				}
			else
				tabV[i].add=nd;

			}
		}
}
/////////////////////////////////////CADRE
void matrice::cadr(int l,int c)
{
char cha=179;
textcolor(WHITE);
gotoxy(66,14);cprintf("0 : Suppr");
gotoxy(66,16);cprintf("int : Modifier");
gotoxy(66,18);cprintf("Esc : Quitter");
gotoxy(66,20);cprintf("Entrer : Save");
int cc=8*c+4,ll=4+6*l;
for(int i=4;i<61&&cc<8*nbrCo+5;i+=8)
	{
	for(int j=1;j<49 && j<(nbrLi-l)*6+5;j++)
		{
		gotoxy(i,j);
		cprintf("%c",cha);
		}
		cc+=8;
	}
cha=196;

for(i=5;i<49 && ll<6*nbrLi+5;i+=6)
	{
		for(int j=1;j<62 && j<(nbrCo-c)*8+4;j++)
		{
		gotoxy(j,i);
		cprintf("%c",cha);
		}
		ll+=6;
	}
textcolor(4);
if(c)   {
	gotoxy(1,1);
	cprintf("...");
	}
if(l)   {
	gotoxy(1,1);
	cprintf(".");
	gotoxy(1,2);
	cprintf(".");
	gotoxy(1,3);
	cprintf(".");
	}
for(int h=c,g=8;h<c+7 && h<nbrCo;h++)
	{
	gotoxy(g,1);
	g+=8;
	cprintf("%d",h);
	}
for(h=l,g=8;h<l+7 && h<nbrLi;h++)
	{
	gotoxy(1,g);
	g+=6;
	cprintf("%d",h);
	}

}
//////////////////////////////////ISINT&&NOT.NULL
int isint(char c){
if(c>=49 && c<=57)
	return 1 ;
else 	return 0;
}
//////////////////////////////////MAIN
main()
{
char c;
int a=8,z=8;//GOTOXY(a,z);
int i=0,j=0;//INDICE MATRICE
int w=0,x=0;//INDICE FCT AFF
clrscr();
matrice M;
M.cadr(w,x);
M.aff(w,x);
do{
gotoxy(a,z);
c=getch();
fflush(stdin);
if(isint(c))
	{
	int mo;
	mo=M.modi(c-48,i,j);
	if(!mo)
		M.ajout(c-48,i,j);
	M.aff(w,x);
	}
if(c==48)
	{
	M.del(i,j);
	M.aff(w,x);
	}
if(c==77 && a!=64)
	{
	if(j==M.get_nbrCo())
		printf("\a");
	else
		{
		j++;
		a+=8;
		gotoxy(a,z);
		}
	}
if(c==77 && a==64)
	{
	x+=7;
	a=8;
	clrscr();
	M.cadr(w,x);
	M.aff(w,x);
	}
if(c==75 && a!=0)
	{
	if(j==0)
		printf("\a");
	else
		{
		j--;
		a-=8;
		gotoxy(a,z);
		}
	}
if(c==75 && a==0)
	{
	x-=7;
	a=56;
	clrscr();
	M.cadr(w,x);
	M.aff(w,x);
	}
if(c==72 && z!=2)
	{
	if(i==0)
		printf("\a");
	else
		{
		i--;
		z-=6;
		gotoxy(a,z);
		}
	}
if(c==72 && z==2)
	{
	w-=6;
	z=38;
	clrscr();
	M.cadr(w,x);
	M.aff(w,x);
	}
if(c==80 && z!=50)
	{
	if(i==M.get_nbrLi())
		printf("\a");
	else
		{
		i++;
		z+=6;
		gotoxy(a,z);
		}
	}
if(c==80 && z==50)
	{
	w+=6;
	z=14;
	clrscr();
	M.cadr(w,x);
	M.aff(w,x);
	}
if(c==13)
	{
	M.ecriture_fichier("fichier.txt");
	}
}while(c!=27 && c!=13);
return 0;
}

Conclusion :


n'oublier pas de donner une note à ce code source . Aaaaaaaaaaaaaara liyya

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
69
Date d'inscription
dimanche 24 décembre 2006
Statut
Membre
Dernière intervention
9 février 2012

mmmmm donc moi jai dit "le pure c++" just par hasard :P srry.
vecchio56 :je propose pas aux gens le Turbo aahhhh la je suis mal compris j'ai just remarque ke matt67 est interesse au code et il a des erreures due a son compilateur en fet due a mon code pr?historique lol.
ahhh encors une fois mal juge :( je programme avec des fenetres j'utilise le C#,vb.NET!!!! j'ai just vouler partager avec vous ce code source .

salam,paix,Peace
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Oui je sais, on peut m?me l'?crire sur un bout de papier si on veut
Ce que je voulais dire c'est que comme le compilateur respecte les normes, tu devra ?crire du code correct (par exemple tu peux pas ?crire #include )
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010

Vecchio56 : Avec le bloc note, je pense que l'on peut ecrire du code de bonne qualit? aussi...
Belhauss : Non merci, j'ai ce qui faut ? la maison.

Bonne Journ'e,

Matt...
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Turbo C++ c'est un compilateur pr?historique, personne ne l'utilise plus (ou plut?t personne ne devrait plus l'utiliser).
Le "pure C++" t'a dit ?a pour plaisanter, mais il existe quand m?me ce qu'on appelle une norme, et quand on la respecte, le code qu'on ?crit va pouvoir ?tre compil? par tout compilateur qui respecte la norme (c'est a peu pr?s le cas de tous les compilateurs r?cents).
Puisque tu proposes aux gens d'utiliser Turbo C++, je te propose d'essayer a ton tour Visual C++ Express qui est gratuit et qui te permettra d'?crire du code de meilleure qualit?.
Messages postés
69
Date d'inscription
dimanche 24 décembre 2006
Statut
Membre
Dernière intervention
9 février 2012

Re:
hahaha le pure C++,bah ?a ete just une metaphore oublions sa .
oui sa marche tr?s bien avec le turbo C++, si tu le veux passe moi ton email dans msg priv? (meme pas 6Mb).

Paix,Peace,Salam ...
Afficher les 14 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.