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

/*exemplos de subprogramas de comparação (vetores) e de inversão (string)
refletindo a utilização de vetores e strings em subprogramas, 
alocação dinâmica de vetores e ponteiro duplo como parâmetro*/

/*observe que, quando tem-se duas funções de igual nome mas
com parametrização diferente (diferentes tipos dos parâmetros e/ou retorno
a linguagem C escolhe a que se adequa a uma específica chamada */

#define absoluto(x) ((x)>0)?(x):-(x)

#define max_char 255

double absolut(double x)
{
   if (x < 0.0) return -x;
   else return x;
}


typedef int boolean;

#define TRUE 1
#define dim_l 10
#define dim_c 5

int cont_comp(double *v, int n, double value)
{
 int i;
 int c=0;
 for (i=0;i<n;i++)
 {
    if ((absolut(v[i]-value))<0.001) c++;
 }
 return c;
    
}



void inverte_string(char *c)
/*inverte a própria string enviada como parâmetro*/
{
 int i;
 char c_aux;
 int n=strlen(c);
 for (i=0;i<(n/2);i++)
 {
    c_aux=c[i];
    c[i] = c[n-i-1];
    c[n-i-1] = c_aux;
 }
    
}

char * invertida(char *c)
/*inverte a string de entrada, criando uma outra 
string */
{
 int i;
 char *c_aux;
 c_aux = (char *) malloc (max_char*sizeof(char));
 int n=strlen(c);
 for (i=0;i<n;i++)
 {
    c_aux[n-i-1]=c[i];
 }
 c_aux[n] = '\0';
 return c_aux;

}



 void invertida(char *c,char **c_aux)
/*inverte a string de entrada, criando uma outra 
string */
{
 int i;
 *c_aux = (char *)malloc (max_char*sizeof(char));
 int n=strlen(c);
 for (i=0;i<n;i++)
 {
    (*c_aux)[n-i-1]=c[i];
 }
 (*c_aux)[n] = '\0';
}

int main(void) {

  int n1,n2; boolean ok;
  int i,j;
  double v[10] = {1.0003,1.002,1.0004,1.03,
  1.0002,1.0005,0.998,0.9999};
  int *p_mat;
  for (i=0;i<8;i++) printf ("%f  ", v[i]);
  printf("\ncontagem = %d\n", cont_comp(v,8,1.0));
  
  char s[max_char];
  
  printf ("digite uma string:\n");
  gets(s);
  inverte_string (s);
  puts(s);
  
  
  char c[]="abracadabra";
  puts(invertida(c));
  
  char * s1; 
  invertida(c,&s1);
  puts(c);
  puts(s1);
  
  
 // putchar(s1[4]);
  
  
  
  while(1){};
  

}

