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

	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 : 14 novembre 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>

    struct matrice
    {
        int mat[10][10];
        int largeur,hauteur;
    };


// *****************************************************************************
int choice() // Propose un menue
{
    char choix;
    struct matrice matrice1,matrice2;

	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,&matrice1);
							transposee(&matrice1);
							getchar();
							break;
				case '2' :
							creation(2,&matrice1,&matrice2);
							add_sous(&matrice1,&matrice2);
							break;
				case '3' :
                            creation(2,&matrice1,&matrice2);
                            multipli(&matrice1,&matrice2);
                            getchar();
                            break;
                case '0' :
                            break;
                default :
                            printf("\n\nErreur de saisie.");
                            break;
		}
	}
	while(choix!='0');

	return 0;
}

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

int creation(int nombre , struct matrice *matrice1 , struct matrice *matrice2)
// Fonction de creation des matrices
{
	int i,j;
        do
    	{
             printf("\n\nEntrer les dimensions de votre matrice1 :\nlargeur : ");
    	     scanf("%d",&matrice1->largeur);
    	     printf("hauteur : ");
    	     scanf("%d",&matrice1->hauteur);
    	     if(matrice1->largeur<=0 || matrice1->hauteur<=0 || matrice1->largeur>10 || matrice1->hauteur>10)
    	           printf("\n\n!! Erreur de saisie sur les dimensions de la matrice !!");
        }
        while(matrice1->largeur<=0 || matrice1->hauteur<=0 || matrice1->largeur>10 || matrice1->hauteur>10);
    	printf("\n\nEntrez les valeurs de votre matrice1 ligne par ligne :\n\n");
    	for(i=0;i<matrice1->hauteur;i=i+1)
    	{
    		for(j=0;j<matrice1->largeur;j=j+1)
    		{
    			printf("\t");
    			scanf("%d",&matrice1->mat[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",&matrice2->largeur);
	          printf("hauteur : ");
	          scanf("%d",&matrice2->hauteur);
	          if(matrice2->largeur<=0 || matrice2->hauteur<=0 || matrice2->largeur>10 || matrice2->hauteur>10)
	                printf("\n\n!! Erreur de saisie sur les dimensions de la matrice !!");
         }
         while(matrice2->largeur<=0 || matrice2->hauteur<=0 || matrice2->largeur>10 || matrice2->hauteur>10);

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

	return 0;
}

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

int transposee(struct matrice *matrice1) // 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<matrice1->largeur;j=j+1)
	{
		for(i=0;i<matrice1->hauteur;i=i+1)
			printf("\t%d",matrice1->mat[i][j]);
		printf("\n");
	}


    return 0;
}

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

int add_sous(struct matrice *matrice1 , struct matrice *matrice2) // Affiche le resultat de l'addition/soustraction
{
	char choix;
	int i,j;
	if(( matrice1->largeur==matrice2->largeur) && (matrice1->hauteur==matrice2->hauteur) )
	{
		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,&matrice1,&matrice2);
                        getchar();
                        break;
			   case '2':
                        calcul_add(1,-1,&matrice1,&matrice2);
                        getchar();
                        break;
			   case '3':
                        calcul_add(-1,1,&matrice1,&matrice2);
                        getchar();
                        break;
			   case '4':
                        calcul_add(-1,-1,&matrice1,&matrice2);
                        getchar();
                        break;
			   case '0':
                        break;
               default :
                        printf("\n\n!! Erreur de saisie !!\n");
                        break;
               }
   
		}
		while(choix!='0');
	}
	else
	if(matrice1->largeur!=matrice2->largeur || matrice1->hauteur!=matrice2->hauteur)
		printf("\n\nOn ne peut additionner ou soustraire ces deux matrices.\n");

    return 0;
}

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

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

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

int multipli(struct matrice *matrice1, struct matrice *matrice2) // Fais la multiplication des deux matrice si possible
{
    int i,j,k;
    struct matrice matrice3;

    if(matrice1->largeur!=matrice2->hauteur) // test si les matrices peuvent multipliees
    {
        printf("\n\n!! Erreur! Les dimensions des matrices ne correspondent pas !!");
        printf("\n!! Impossible de les multiplier!!");
    }
    else
    {
         for(i=0;i<matrice1->hauteur;i=i+1) // initialisation de la matrice3 = matrice1 * matrice2
             for(j=0;j<matrice2->largeur;j=j+1)
                     matrice3.mat[i][j]=0;
                
         for(i=0;i<matrice1->hauteur;i=i+1) // Calcul de la matrice3
             for(j=0;j<matrice1->largeur;j=j+1)
                     for(k=0;k<matrice2->largeur;k=k+1)
                           matrice3.mat[i][k] = matrice3.mat[i][k] + matrice1->mat[i][j] * matrice2->mat[j][k];
         
         printf("\n\nLe resultat de la multiplication donne :\n\n");
                      
         for(i=0;i<matrice1->hauteur;i=i+1) // Affichage de la matrice3 une fois calculee
         {
             for(j=0;j<matrice2->largeur;j=j+1)
                     printf("\t%d",matrice3.mat[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.4 :  14/11/2004
        Elimination des matrices en tant que variables globales. Elles sont maintenant locales
        à la fonction choix et sont passees par adresse.
        Modification de la structure.
        
v0.3 :  03/11/2004
        Mise en place de structure pour les matrices.

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.
*/

