/* 						P R O M P T R I X v0.1

	Programe de calculs sur les matrices : Additions, soustractions, multiplications et calculs de transposees

	language utilise		: C
	Date de debut de programation	: 08 juillet 2004
	Date de fin de programation	: 
	
	License 			: Ce programme est distribue sous licence GPL, toutes les modifications partielles
					  ou completes sont permises à condition d'en informer l'auteur et de mettre à
					  disposition les sources modifiees.

	Auteur				: Ice
	Mail				: ice13om@aol.com
	Site web			: http://www.ice13om.fr.fm
*/
// *****************************************************************************
#include <stdio.h>

int matrice1[10][10],matrice2[10][10],matrice3[10][10];
int largeur1,largeur2,hauteur1,hauteur2;


// *****************************************************************************
int choice() // Propose un menue
{
    char choix;	
    int nombre;
	do
	{
		printf("\n\n\n\n\t\t\t................................\n");
		printf("\nQue voulez-vous faire?");
        printf("\n\n1 : Calcul de la transposee d'une matrice.\n");
		printf("2 : Addition/soustraction de deux matrices.\n");
		printf("3 : Multiplication de deux matrices.\n");
		printf("0 : Quitter\n\n");
		printf("Choix : ");
		scanf("%c",&choix);
		getchar(); // Elimination de la saisie dans le buffer
		switch (choix)
		{
				case '1' :
							nombre=1;
							creation(nombre);
							transposee();
							getchar();
							break;
				case '2' :
							nombre=2;
							creation(nombre);
							add_sous();
							break;
				case '3' :
                            nombre=2;
                            creation(nombre);
                            multipli();
                            getchar();
                            break;
                case '0' :
                            break;
                default :
                            printf("\n\nErreur de saisie.");
                            break;
		}
	}
	while(choix!='0');

	return 0;
}

// *****************************************************************************


int creation(int nombre) // Fonction de creation des matrices
{
	int i,j;
	do
	{
         printf("\n\nEntrer les dimensions de votre matrice1 :\nlargeur : ");
	     scanf("%d",&largeur1);
	     printf("hauteur : ");
	     scanf("%d",&hauteur1);
	     if(largeur1<=0 || hauteur1<=0)
	           printf("\n\n!! Erreur de saisie sur les dimensions de la matrice !!");
    }
    while(largeur1<=0 || hauteur1<=0);
	printf("\n\nEntrez les valeurs de votre matrice1 ligne par ligne :\n\n");
	for(i=0;i<hauteur1;i=i+1)
	{
		for(j=0;j<largeur1;j=j+1)
		{
			printf("\t");
			scanf("%d",&matrice1[i][j]);
			getchar(); // A enlever si cela gene la saisie
		}
		printf("\n");
	}



	if(nombre==2)
	{
	     do
	     {
              printf("\n\nEntrer les dimensions de votre matrice2 :\nlargeur : ");
	          scanf("%d",&largeur2);
	          printf("hauteur : ");
	          scanf("%d",&hauteur2);
	          if(largeur2<=0 || hauteur2<=0)
	                printf("\n\n!! Erreur de saisie sur les dimensions de la matrice !!");
         }
         while(largeur2<=0 || hauteur2<=0);

		printf("\n\nEntrez les valeurs de votre matrice2 ligne par ligne :\n\n");
		for(i=0;i<hauteur2;i=i+1)
		{
			for(j=0;j<largeur2;j=j+1)
			{
				printf("\t");
				scanf("%d",&matrice2[i][j]);
				getchar(); // A enlever si cela gene la saisie
			}
			printf("\n");
		}
	}

	return 0;
}

// *****************************************************************************

int transposee() // Affichage de la transposee de la matrice 1
{
	int i,j;
	printf("\n\nCalcul de la tranposee de la matrice1 : \n\n");
	for (j=0;j<largeur1;j=j+1)
	{
		for(i=0;i<hauteur1;i=i+1)
			printf("\t%d",matrice1[i][j]);
		printf("\n");
	}


    return 0;
}

// *****************************************************************************

int add_sous() // Affiche le resultat de l'addition/soustraction
{
	char choix;
	int i,j,un,deux;
	if(( largeur1==largeur2) && (hauteur1==hauteur2) )
	{
		do
		{
            printf("\n\n\n\nQue voulez-vous faire?");
			printf("\n\n1 : Faire matrice1 + matrice2.");
			printf("\n2 : Faire matrice1 - matrice2.");
			printf("\n3 : Faire matrice2 - matrice1.");
			printf("\n4 : Faire -matrice1 - matrice2.");			
			printf("\n0 : Revenir au menu precedent.");
			printf("\n\nChoix : ");
			scanf("%c",&choix);
			getchar();
			switch (choix)
			{
			   case '1':
                        un=1;
                        deux=1;
                        calcul_add(un,deux);
                        getchar();
                        break;
			   case '2':
                        un=1;
                        deux=-1;
                        calcul_add(un,deux);
                        getchar();
                        break;
			   case '3':
                        un=-1;
                        deux=1;
                        calcul_add(un,deux);
                        getchar();
                        break;
			   case '4':
                        un=-1;
                        deux=-1;
                        calcul_add(un,deux);
                        getchar();
                        break;
			   case '0':
                        break;
               default :
                        printf("\n\n!! Erreur de saisie !!\n");
                        break;
               }
   
		}
		while(choix!='0');
	}
	else
	if(largeur1!=largeur2 || hauteur1!=hauteur2)
		printf("\n\nOn ne peut additionner ou soustraire ces deux matrices.\n");

    return 0;
}

// *****************************************************************************

calcul_add(int un,int deux) // Fais le calcul de soustraction/addition
{
    int i,j;
    printf("\n\n");
    for(i=0;i<hauteur1;i=i+1)
    {
        for(j=0;j<largeur1;j=j+1)
                printf("\t%d",un*matrice1[i][j]+deux*matrice2[i][j]);
        printf("\n");
        }
    return 0;
}

// *****************************************************************************

int multipli() // Fais la multiplication des deux matrice si possible
{
    int i,j,k;
    if(largeur1!=hauteur2)
    {
        printf("\n\n!! Erreur! Les dimensions des matrices ne correspondent pas !!");
        printf("\n!! Impossible de les multiplier!!");
    }
    else
    {
         for(i=0;i<hauteur1;i=i+1) // initialisation de la matrice3 = matrice1 * matrice2
             for(j=0;j<largeur2;j=j+1)
                     matrice3[i][j]=0;
                
         for(i=0;i<hauteur1;i=i+1) // Calcul de la matrice3
             for(j=0;j<largeur1;j=j+1)
                     for(k=0;k<largeur2;k=k+1)
                           matrice3[i][k] = matrice3[i][k] + matrice1[i][j] * matrice2[j][k];
         
         printf("\n\nLe resultat de la multiplication donne :\n\n");
                      
         for(i=0;i<hauteur1;i=i+1) // Affichage de la matrice3 une fois calculee
         {
             for(j=0;j<largeur2;j=j+1)
                     printf("\t%d",matrice3[i][j]);
             printf("\n");
         }
    }
    
    return 0;
}

// *****************************************************************************

int main()
{
    system("cls");
//    system("clear");    // Pour effacer l'ecrans sous linux
    printf("\t\t\tP R O M P T R I X v0.1\n");
    printf("\t..Programme de calculs simples sur les matrices..\n");
	choice();

	return 0;
}

