Guest User

Untitled

a guest
Jul 20th, 2018
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.77 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAX_CAR 60
  5. #define MAX_DATAS 1000
  6. #define MAX_INDICES 100
  7.  
  8. typedef struct {
  9. int valorMov;
  10. int data;
  11. int periodo;
  12. char tipoMov;
  13. char descMov[MAX_CAR];
  14. int orcamento;
  15. } movimento;
  16.  
  17. void novoMov (movimento vec[][MAX_INDICES], int valor, int data, int periodo, char tipo, char descricao[], int contador[])
  18. { /*Guarda um novo movimento no vector vec*/
  19. int indice, controlPeriodo, aux;
  20. indice = contador[data];
  21. vec[data][indice].valorMov = valor; /*Guarda as informacoes sobre o movimento no indice*/
  22. vec[data][indice].data = data;
  23. vec[data][indice].periodo = periodo;
  24. vec[data][indice].tipoMov = tipo;
  25. strcpy(vec[data][indice].descMov, descricao);
  26. if (tipo == 'd') /*Se o tipo for d (despesa)*/
  27. vec[data][indice].orcamento = (0 - valor);
  28. else
  29. vec[data][indice].orcamento = valor;
  30. contador[data] = contador[data]+1; /*Incrementa-se o contador*/
  31. if(vec[data][indice].periodo != 0) /*Caso o movimento tenha periodo*/
  32. {
  33. for(controlPeriodo = (data+periodo); controlPeriodo < MAX_DATAS; controlPeriodo = (controlPeriodo+periodo))
  34. {/*Cria um ciclo que insere automaticamente movimentos equivalentes em datas com intervalos iguais ao periodo inserido.*/
  35. aux = contador[controlPeriodo];
  36. vec[controlPeriodo][aux].valorMov = valor;
  37. vec[controlPeriodo][aux].data = data+controlPeriodo;
  38. vec[controlPeriodo][aux].periodo = periodo;
  39. vec[controlPeriodo][aux].tipoMov = tipo;
  40. strcpy (vec[controlPeriodo][aux].descMov, descricao);
  41. if (tipo == 'd')
  42. vec[controlPeriodo][aux].orcamento = (0 - valor);
  43. else
  44. vec[controlPeriodo][aux].orcamento = valor;
  45. contador[controlPeriodo] = contador[controlPeriodo]+1;
  46. }
  47. }
  48. }
  49.  
  50. int mostraBalanco (movimento vec[][MAX_INDICES], int data, int contador[])
  51. { /*Mostra o balanco numa data inserida*/
  52. int indice = 0;
  53. int datasinferiores = 0;
  54. int valor = 0;
  55. while (datasinferiores <= data)
  56. {
  57. while (indice < contador[datasinferiores] && contador[datasinferiores] <= MAX_INDICES)
  58. {
  59. valor = valor + vec[datasinferiores][indice].orcamento;
  60. ++indice; /*Soma-se os orcamentos em cada indice da data*/
  61. }
  62. ++datasinferiores; /*Incrementa-se as datas para verificar as proximas datas*/
  63. indice = 0; /*Reinicia-se os indices para verificarmos todos os indices das proximas datas*/
  64. }
  65. return valor;
  66. }
  67.  
  68.  
  69. void mostraMov(movimento vec[][MAX_INDICES], int data, int contador[])
  70. {/*Mostra todos os indices dos movimentos de uma determinada data*/
  71. int indice = 0;
  72. while (indice < contador[data] && contador[data] <= MAX_INDICES)
  73. {
  74. printf("%d %d %c %s\n", indice, vec[data][indice].valorMov, vec[data][indice].tipoMov, vec[data][indice].descMov);
  75. ++indice; /*Verifica-se todos os indices para a data*/
  76. }
  77. }
  78.  
  79. int veValidade (movimento vec[][MAX_INDICES], int minimo, int contador[])
  80. { /*Permite saber se um orcamento e valido ate a ultima data inserida*/
  81. int data = 0;
  82. int contagem=0;
  83. int indice = 0;
  84. int resultado = 1;
  85. while (data < MAX_DATAS)
  86. {
  87. while (indice < contador[data])
  88. {
  89. contagem=vec[data][indice].orcamento + contagem; /*Vai somando os valores em cada indice*/
  90. if(contagem < minimo)
  91. {
  92. resultado = 0; /*Caso algum resultado seja inferior ao minimo, o programa para e devolve invalido(Ver main)*/
  93. break;
  94. }
  95. ++indice; /*Verifica-se o proximo indice*/
  96. }
  97. indice=0; /*Reinicia-se o indice para se verificar nas outras datas*/
  98. ++data; /*Verifica-se a proxima data*/
  99. }
  100. return resultado;
  101. }
  102.  
  103. void removeMov (movimento vec[][MAX_INDICES], int data, int indice, int contador[])
  104. { /*Remove um movimento de indice i de uma data*/
  105. while(indice<contador[data])
  106. {
  107. vec[data][indice].valorMov = vec[data][indice+1].valorMov; /*As posicoes sao movidas todas para a direita*/
  108. vec[data][indice].data = vec[data][indice+1].data;
  109. vec[data][indice].periodo = vec[data][indice+1].periodo;
  110. vec[data][indice].tipoMov = vec[data][indice+1].tipoMov;
  111. strcpy(vec[data][indice].descMov, vec[data][indice+1].descMov);
  112. vec[data][indice].orcamento = vec[data][indice+1].orcamento;
  113. indice++;
  114. }
  115. contador[data]--;/*O contador das datas e decrementado ate o ciclo parar*/
  116. }
  117.  
  118. void dataComportavel (movimento vec[][MAX_INDICES], int primeiraData, int valorDespesa, int minimo, int contador[])
  119. { /*Devolve a primeira data a seguir a data introduzida em que e possivel introduzir uma despesa
  120. sem invalidar o orcamento*/
  121. int aux = 0;
  122. int auxContagem = 0;
  123. int dataComportavel = -1;
  124. while (primeiraData < MAX_DATAS)
  125. {
  126. while (aux < contador[primeiraData])
  127. {
  128. auxContagem = (mostraBalanco(vec, primeiraData, contador) - valorDespesa);
  129. if (auxContagem >= minimo)
  130. {
  131. int periodicidade = 0;
  132. int indiceAuxiliar = contador[primeiraData];
  133. char tipo = 'd';
  134. char descricao[MAX_CAR] = "Teste";
  135. novoMov(vec, valorDespesa, primeiraData, periodicidade, tipo, descricao, contador);
  136. if(veValidade(vec, minimo, contador) == 1)
  137. {
  138. dataComportavel = primeiraData;
  139. removeMov(vec, primeiraData, indiceAuxiliar, contador);
  140. printf("%d\n", dataComportavel);
  141. break;
  142. }
  143. else
  144. removeMov(vec, primeiraData, indiceAuxiliar, contador);
  145. }
  146. ++aux;
  147. }
  148. aux = 0;
  149. ++primeiraData;
  150. if(dataComportavel != -1)
  151. break;
  152. }
  153. if (dataComportavel == -1)
  154. printf("Incomportavel\n");
  155. }
  156.  
  157. int main ()
  158. {
  159. char comando, tipo, descricao[MAX_CAR];
  160. int valor, data, periodo, contador[MAX_DATAS], n, minimo = 0;
  161. movimento vec[MAX_DATAS][MAX_INDICES]; /* Duplo vector para as datas e indices*/
  162. for(n = 0;n <= MAX_DATAS; n++) /*Ciclo que coloca o contador a zero*/
  163. contador[n] = 0;
  164. printf("Introduza o(s) comando(s) que pretende:\n");
  165. scanf("%c", &comando);
  166. while (comando != EOF)
  167. {
  168. if (comando == 'i')
  169. {
  170. scanf("%d %d %d %c %s", &valor, &data, &periodo, &tipo, descricao);
  171. novoMov(vec, valor, data, periodo, tipo, descricao, contador);
  172. }
  173. if (comando == 'm')
  174. {
  175. int novoMin;
  176. scanf("%d", &novoMin);
  177. minimo = novoMin;
  178. }
  179. if (comando == 'b')
  180. {
  181. int data;
  182. scanf("%d", &data);
  183. printf("%d\n", mostraBalanco(vec, data, contador));
  184. }
  185. if (comando == 'l')
  186. {
  187. int data;
  188. scanf("%d", &data);
  189. mostraMov(vec, data, contador);
  190. }
  191. if (comando == 'v')
  192. {
  193. if(veValidade(vec, minimo, contador) == 1)
  194. printf("Valido\n");
  195. else
  196. printf("Invalido\n");
  197. }
  198. if (comando == 'r')
  199. {
  200. int data, indice;
  201. scanf("%d %d", &data, &indice);
  202. removeMov(vec, data, indice, contador);
  203. }
  204. if (comando == 'w')
  205. {
  206. int data, valor;
  207. scanf("%d %d", &data, &valor);
  208. dataComportavel (vec, data, valor, minimo, contador);
  209. }
  210. scanf("%c", &comando);
  211. }
  212. return 0;
  213. }
Add Comment
Please, Sign In to add comment