/* 						P R O M P T R I X v0.2.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 correction : 29 septembre 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.
					  
    Voir en bas de la source pour les corrections des différentes versions.

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

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


// *****************************************************************************
int choice() // Propose un menue
{
    char choix;

	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' :
                            creation(1);
							transposee();
							getchar();
							break;
				case '2' :
							creation(2);
							add_sous();
							break;
				case '3' :
                            creation(2);
                            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 || largeur1>10 || hauteur1>10)
    	           printf("\n\n!! Erreur de saisie sur les dimensions de la matrice !!");
        }
        while(largeur1<=0 || hauteur1<=0 || largeur1>10 || hauteur1>10);
    	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 || largeur2>10 || hauteur2>10)
	                printf("\n\n!! Erreur de saisie sur les dimensions de la matrice !!");
         }
         while(largeur2<=0 || hauteur2<=0 || largeur2>10 || hauteur2>10);

		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;
	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':
                        calcul_add(1,1);
                        getchar();
                        break;
			   case '2':
                        calcul_add(1,-1);
                        getchar();
                        break;
			   case '3':
                        calcul_add(-1,1);
                        getchar();
                        break;
			   case '4':
                        calcul_add(-1,-1);
                        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;
    int matrice3[10][10];
    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;
}

/*----------------- Historique des versions -----------------

v0.2 :  29/09/2004
        Mise en place de mesures de contrôles de la taille des matrices dans le cas où elles
        feraient plus de 10 lignes/colones dans la fonction CREATION.
        Economie de la variable "nombre" (car inutile) dans la fonction CHOICE.
        Economie de 2 variables "un" et "deux" (car inutiles) dans la fonction ADD_SOUS.
        La variable "matrice3" a trouvée sa place dans la fonction MULTIPLI et n'est donc plus
        globale.
        
v0.1 : 08/07/2004
        Première version.
*/

