fork download
  1. #include <stdio.h>
  2.  
  3. // chamar função com array de 0 elementos é Comportamento Não Definido
  4. int analisa(int *v, size_t n) {
  5. if (n == 1) return 2; // um array com um elemento é "constante"
  6. int tmp = analisa(v, n - 1); // analisa array mais pequeno recursivamente
  7. switch (tmp) {
  8. case 0: // array mais pequeno desordenado
  9. return 0;
  10. break;
  11. case 1: // array mais pequeno crescente
  12. if (v[n - 2] > v[n - 1]) return 0; // desordenado
  13. return 1;
  14. break;
  15. case 2: // array mais pequeno constante
  16. if (v[n - 2] < v[n - 1]) return 1; // crescente
  17. if (v[n - 2] > v[n - 1]) return 3; // decrescente
  18. return 2;
  19. break;
  20. case 3: // array mais pequeno decrescente
  21. if (v[n - 2] < v[n - 1]) return 0; // desordenado
  22. return 3;
  23. break;
  24. default: // erro
  25. return -1; // erro
  26. break;
  27. }
  28. }
  29.  
  30. int main(void) {
  31. const char *pt[] = {"desordenado", "crescente", "constante", "decrescente"};
  32.  
  33. int v[] = {1, 1, 1, 2, 3, 4};
  34. int w[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
  35. int x[] = {1, 1, 1, 0, 0, 0, -1, -1};
  36. int y[] = {1, 0, 1, 0, 1};
  37. int z[] = {1};
  38.  
  39. printf("v da %s.\n", pt[analisa(v, sizeof v / sizeof *v)]);
  40. printf("w da %s.\n", pt[analisa(w, sizeof w / sizeof *w)]);
  41. printf("x da %s.\n", pt[analisa(x, sizeof x / sizeof *x)]);
  42. printf("y da %s.\n", pt[analisa(y, sizeof y / sizeof *y)]);
  43. printf("z da %s.\n", pt[analisa(z, sizeof z / sizeof *z)]);
  44. return 0;
  45. }
Success #stdin #stdout 0s 2156KB
stdin
Standard input is empty
stdout
v da crescente.
w da constante.
x da decrescente.
y da desordenado.
z da constante.