#include <stdio.h>
#include <stdlib.h>

int multiplo;

int round_integer(float arg){
  float arg_residual;
  int arg_int;

  arg_residual = arg-((int)arg);
  if(arg_residual != 0){
    if (arg_residual >= 0.5){
      arg_int = 1+(int)arg;	
    }else{
      arg_int = (int)arg;	
  }
  
  printf("Argumento %f no es entero, redondeando a %d\n", arg, arg_int);
  }else{
    arg_int = (int)arg;
  }
  
  return arg_int;
}

int check_multiple(int m1, int m2, int multiple){
  int resid1 = multiple%m1;
  int resid2 = multiple%m2;
  
  if (resid1 == 0 && resid2 == 0){
    return 1;
  }else{
    return 0;
  }
}

void fill_matrix (int **mat, int rows, int cols){
  printf("Llenando matriz... ");
  for (int r = 0; r<rows; r++){
    for (int c = 0; c<cols; c++){
      mat[r][c] = multiplo/(r+1)*(c+1);
    }
  }
  printf("terminado.\n");
}

int main(int argc, char **argv){
  
  //Verificando que hayan exactamente tres argumentos
  if(argc < 4 || argc > 4){
    printf("Error: debes darme 3 argumentos.\n");
    return 2; //si no, termina programa con codigo de error 2: error de argumentos
  }
  
  float arg1 = atof(argv[1]);
  float arg2 = atof(argv[2]);
  float arg3 = atof(argv[3]);
  
  //Verificando que sean enteros
  int arg1_int = round_integer(arg1);
  int arg2_int = round_integer(arg2);
  int arg3_int = round_integer(arg3);
  
  //Verificando que el tercer argumento sea multiplo de los primeros dos
  if (check_multiple(arg1_int,arg2_int,arg3_int)){
    printf("Exito: SI es multiplo.\n");
    multiplo = arg3_int;
    
    //Creando matriz
    int **mat;
    mat = malloc(arg1_int*sizeof(int *));
    for(int r = 0; r<arg1_int; r++){
      mat[r] = malloc(arg2_int*sizeof(int));
    }
    
    //Llenando matriz de valores
    fill_matrix(mat,arg1_int,arg2_int);
    
    //Mostrando valores de matriz
    for (int r = 0; r<arg1_int; r++){
      for (int c = 0; c<arg2_int; c++){
        printf("mat[%d][%d] : %d\n",r,c,mat[r][c]);
      }
    }
  }else{
    printf("Error: NO es multiplo.\n");
  }
  
  printf("Fin de programa.\n");
  return 1; //codigo de error 1: programa exitoso
}
