fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. #define MAX 10
  6.  
  7. int contas_validas = 0;
  8. int contas_invalidas = 0;
  9.  
  10. typedef struct conta {
  11. char saldo[1000000];
  12. char limite_saldo[1000000];
  13. char id[11];
  14. struct conta * prox;
  15. } Conta;
  16.  
  17. typedef struct movimento {
  18. int tipo_movimento;
  19. int opcao;
  20. } Movimento;
  21.  
  22. int validar_id(char* id){
  23.  
  24. if (id[3] == '-' && id[9] == '-' && id[11] == '\0'){
  25.  
  26. int i = 0;
  27.  
  28. for(i = 0; i < 11; i++){
  29. if(i != 3 && i != 9){
  30. if(isdigit(id[i]) == 0){
  31. return 0;
  32. }
  33. }
  34. }
  35. }
  36. else{
  37. return 0;
  38. }
  39. return 1;
  40. }
  41.  
  42. int validar_id2 (char* id) {
  43.  
  44. int componente_a = ((id[0]-'0')+ (id[1]-'0')+(id[2]-'0'));
  45. int componente_b = ((id[4]-'0')+ (id[5]-'0')+(id[6]-'0')+(id[7]-'0')+(id[8]-'0'));
  46. int componente_c = (id[10]-'0');
  47.  
  48. int soma1 = componente_a;
  49. int soma2 = componente_a + componente_b;
  50. int resto = soma2 % soma1;
  51.  
  52. if (resto == componente_c) {
  53. return 1;
  54. }
  55. else {
  56. return 0;
  57. }
  58. }
  59.  
  60. int validar_saldo(char* str){
  61. if(str[0] == '-' || isdigit(str[0]) == 1){
  62. int i=1;
  63. for(i = 1; str[i]!='\0' ; i++){
  64. if(isdigit(str[i])==0){
  65. return 0;
  66. }
  67. }
  68. }
  69. return 1;
  70. }
  71.  
  72. int validar_limite(char* str){
  73. if(str[0] == '-' || isdigit(str[0]) == 1){
  74. int i=1;
  75. for(i = 1; str[i]!='\0' ; i++){
  76. if(isdigit(str[i])==0){
  77. return 0;
  78. }
  79. }
  80. }
  81. return 1;
  82. }
  83.  
  84. void contas (Conta* a){
  85.  
  86. FILE* fp = fopen ("contas.txt", "r"); //"r" -> leitura (modo texto) ou "b" -> leitura (modo binario)
  87. FILE* fp2 = fopen ("stats.txt", "w");
  88.  
  89.  
  90. if (fp != NULL){
  91.  
  92. char tmpid[11];
  93. char tmpsaldo[1000000];
  94. char tmplimitecredito[1000000];
  95. char contas[255+1];
  96. char* temp_id[11+1];
  97. char* componentes;
  98. int contador = 0;
  99. int val1;
  100. int val2;
  101. int val3;
  102.  
  103. printf ("As contas existentes no ficheiro sao:\n");
  104.  
  105. while (fgets(contas, 255+1, fp) != NULL){
  106. printf ("\n-> %s\n\n", contas);
  107. contador = 0;
  108.  
  109. int last = strlen (contas);
  110. if (contas[last-1] == '\n')
  111. contas[last-1] = '\0';
  112.  
  113. componentes = strtok (contas, " ");
  114.  
  115. while (componentes != NULL){
  116.  
  117. if (contador == 0) {
  118.  
  119. printf ("- ID = %s\n", componentes);
  120. strcpy(tmpid , componentes);
  121. int valido = validar_id (componentes);
  122. int valido2 = validar_id2 (componentes);
  123.  
  124. if (valido == 1 && valido2 == 1){
  125. printf ("ID valido!\n");
  126. val1 = 1;
  127. }
  128. else {
  129. printf ("ID invalido!\n");
  130. val1 = 0;
  131. }
  132. }
  133. else if (contador == 1){
  134. strcpy(tmpsaldo , componentes);
  135. int valido = validar_saldo(componentes);
  136. if (valido == 1){
  137. printf ("- Saldo: %s\n", componentes);
  138. val2 = 1;
  139. }
  140. else{
  141. printf ("Saldo invalido!\n");
  142. val2 = 0;
  143. }
  144. }
  145. else if (contador == 2){
  146. strcpy(tmplimitecredito , componentes);
  147. int valido = validar_limite(componentes);
  148. /* ATENÇÂO AO FACTO DE NÃO HAVER COMPONENTE) */
  149. if (valido == 0){
  150. printf ("Limite de credito invalido!\n");
  151. val3 = 0;
  152. }
  153. else{
  154. printf ("- Limite de credito: %s\n", componentes);
  155. val3 = 1;
  156. }
  157. }
  158. else if (contador != 2){
  159. val3 = 0;
  160. }
  161.  
  162. componentes = strtok (NULL, " ");
  163. contador++;
  164.  
  165. }
  166.  
  167. if (val1 == 1 && val2 == 1 && val3 == 1){
  168.  
  169. strcpy(a[contas_validas].id , tmpid);
  170. strcpy(a[contas_validas].saldo , tmpsaldo);
  171. strcpy(a[contas_validas].limite_saldo , tmplimitecredito);
  172. contas_validas++;
  173. if((contas_validas%MAX)==0){
  174. Conta* ptr;
  175. ptr=(Conta*)realloc(a,sizeof(Conta)*(contas_validas+MAX));
  176. if(ptr!=NULL){
  177. a=ptr;
  178. ptr=NULL;
  179. }
  180. }
  181. }
  182. else if (val1 == 0 || val2 == 0 || val3 == 0){
  183. contas_invalidas++;
  184. }
  185. }
  186.  
  187.  
  188. fclose(fp);
  189.  
  190. printf ("\nNumero de contas validas: %d\n", contas_validas);
  191. printf ("\nNumero de contas invalidas: %d\n", contas_invalidas);
  192. }
  193. else{
  194. printf ("Erro!\n");
  195. }
  196. }
  197.  
  198. /*
  199. int compara_conta (Conta * c1, Conta * c2) {
  200.   if (c1 -> saldo > c2 -> saldo)
  201.   return 1;
  202.   if (c1 -> saldo = c2 -> saldo)
  203.   return 0;
  204.   if (c1 -> saldo < c2 -> saldo)
  205.   return -1;
  206. }
  207. */
  208.  
  209. int main() {
  210.  
  211. Conta* guardar_conta=(Conta*)malloc(sizeof(Conta)*MAX);
  212. contas(guardar_conta);
  213. long int somatorioInicial = 0;
  214. int i = 0;
  215. for ( i ; i< contas_validas ; i++){
  216. somatorioInicial += atoi(guardar_conta[i].saldo);
  217. }
  218. printf("\n%d", somatorioInicial); /* ATENÇÂO AO COMENTÁRIO DE CIMA */
  219. printf("\n");
  220. /* movimentos(); */
  221.  
  222.  
  223. return 0;
  224. }
  225.  
  226. // ordenar as contas por saldo utilizando o "qsort"
  227. // "qsort" recebe 4 argumentos - qsort ( ptr para inicio do array, (tamanho do array), nº de bytes por elemento (sizeof), funçao comparaçao)
  228. // a funcao de comparacao tem de respeitar 3 condicoes: tem de receber 2 elemenntos a comparar
  229. // o tipo de dados tem de ser o mesmo
  230. // tem de devolver um inteiro: e1>e2 (devolve 1), e1=e2 (devolve 0), e1<e2 (devolve -1)
  231.  
Success #stdin #stdout 0s 24400KB
stdin
Standard input is empty
stdout
Erro!

0