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. fprintf(stderr, "DEBUG: valor passado: [%s]\n", str);
  62. if (*str == '-') str++;
  63. if (!isdigit((unsigned char)*str)) return 0; /* empty strings return false */
  64. while (*str) {
  65. if (!isdigit((unsigned char)*str)) return 0;
  66. str++;
  67. }
  68. return 1;
  69. }
  70.  
  71. int validar_limite(char* str){
  72. if(isdigit(str[0]) == 1){
  73. int i=1;
  74. for(i = 1; str[i]!='\0' ; i++){
  75. if(isdigit(str[i])==0){
  76. return 0;
  77. }
  78. }
  79. }
  80. return 1;
  81. }
  82.  
  83. int validar_movimento (char * mov){
  84. if (mov[0] == 0){
  85. printf ("Transferencia.\n");
  86. }
  87. else if (mov[0] == 1){
  88. printf ("Deposito.\n");
  89. }
  90. else if (mov[0] == 2){
  91. printf ("Levantamento.\n");
  92. }
  93. else{
  94. return 0;
  95. }
  96. return 0;
  97. }
  98.  
  99. void transferencia ( Conta* a , char id[] , char id2[] , char valor[] ){
  100. int i=0;
  101. int j=0;
  102. int valor1;
  103. int valor2;
  104.  
  105. for ( i; i<contas_validas ; i++){
  106. if(strcmp( a[i].id , id ) == 0)
  107. break;
  108. }
  109.  
  110. for ( j ; j<contas_validas ; j++){
  111. if(strcmp( a[j].id , id2) == 0)
  112. break;
  113. }
  114.  
  115. valor1 = atoi(a[i].saldo);
  116. valor1 -= atoi(valor);
  117. valor2 = atoi(a[j].saldo);
  118. valor2 += atoi(valor);
  119.  
  120. snprintf( a[i].saldo , sizeof(a[i].saldo) , "%d" , valor1);
  121. snprintf( a[j].saldo , sizeof(a[j].saldo) , "%d" , valor2);
  122. }
  123.  
  124. void deposito ( Conta* a , char id[] , char valor[] ){
  125. int valor1;
  126. int i=0;
  127.  
  128. for ( i ; i<contas_validas ; i++ ){
  129. if(strcmp( a[i].id , id ) == 0)
  130. break;
  131. }
  132.  
  133. valor1 = atoi(a[i].saldo);
  134. valor1 += atoi(valor);
  135. snprintf( a[i].saldo , sizeof(a[i].saldo) , "%d" , valor1);
  136. }
  137.  
  138. void levantamento ( Conta* a , char id[] , char valor[] ){
  139. int valor1;
  140. int i=0;
  141.  
  142. for ( i ; i<contas_validas ; i++ ){
  143. if(strcmp( a[i].id , id ) == 0)
  144. break;
  145. }
  146.  
  147. valor1 = atoi(a[i].saldo);
  148. valor1 -= atoi(valor);
  149. snprintf( a[i].saldo , sizeof(a[i].saldo) , "%d" , valor1);
  150. }
  151. /* ATENÇÃO!!!!!!!!!!!!!!!!!!!
  152. void movimentos (){
  153.  
  154.   FILE * fp = fopen ("movimentos.txt", "r");
  155.  
  156.   if (fp != NULL){
  157.  
  158. char temp[255+1];
  159.   char * componentes;
  160.   int contador = 0;
  161. char id_origem[11];
  162. char id_destino[11]
  163. char valor[1000000];
  164.  
  165.   while (fgets(temp, 255+1, fp) != NULL){
  166. printf ("\n-> %s\n\n", temp);
  167. contador = 0;
  168.  
  169. int last = strlen (temp);
  170.   if (temp[last-1] == '\n')
  171. temp[last-1] = '\0';
  172.  
  173.   componentes = strtok (temp, " ");
  174. /* FALTA MERDAS
  175.  
  176. if (contador == 0 ){
  177. int i = 0;
  178. transferencia(guarda_conta , id_origem , id_destino , valor);
  179. }
  180. else if(contador == 1){
  181. deposito();
  182. }
  183. else if(contador == 2{
  184. levantamento();
  185. }
  186. }
  187.  
  188.   fclose(fp);
  189.   }
  190. }
  191. */
  192. void contas (Conta* a){
  193.  
  194. FILE* fp = fopen ("contas.txt", "r"); //"r" -> leitura (modo texto) ou "b" -> leitura (modo binario)
  195. FILE* fp2 = fopen ("stats.txt", "w");
  196.  
  197.  
  198. if (fp != NULL){
  199.  
  200. char tmpid[11];
  201. char tmpsaldo[1000000];
  202. char tmplimitecredito[1000000];
  203. char contas[255+1];
  204. char* temp_id[11+1];
  205. char* componentes;
  206. int contador = 0;
  207. int val1;
  208. int val2;
  209. int val3;
  210.  
  211. printf ("As contas existentes no ficheiro sao:\n");
  212.  
  213. while (fgets(contas, 255+1, fp) != NULL){
  214. printf ("\n-> %s\n\n", contas);
  215. contador = 0;
  216.  
  217. int last = strlen (contas);
  218. if (contas[last-1] == '\n')
  219. contas[last-1] = '\0';
  220.  
  221. componentes = strtok (contas, " ");
  222.  
  223. while (componentes != NULL){
  224.  
  225. if (contador == 0) {
  226.  
  227. printf ("- ID = %s\n", componentes);
  228. strcpy(tmpid , componentes);
  229. int valido = validar_id (componentes);
  230. int valido2 = validar_id2 (componentes);
  231.  
  232. if (valido == 1 && valido2 == 1){
  233. printf ("ID valido!\n");
  234. val1 = 1;
  235. }
  236. else {
  237. printf ("ID invalido!\n");
  238. val1 = 0;
  239. }
  240. }
  241. else if (contador == 1){
  242. strcpy(tmpsaldo , componentes);
  243. int valido = validar_saldo(componentes);
  244. if (valido == 1){
  245. printf ("- Saldo: %s\n", componentes);
  246. val2 = 1;
  247. }
  248. else{
  249. printf ("Saldo invalido!\n");
  250. val2 = 0;
  251. }
  252. }
  253. else if (contador == 2){
  254. strcpy(tmplimitecredito , componentes);
  255. int valido = validar_limite(componentes);
  256. /* ATENÇÂO AO FACTO DE NÃO HAVER COMPONENTE) */
  257. if (valido == 1){
  258. printf ("- Limite de credito: %s\n", componentes);
  259. val3 = 1;
  260. }
  261. else{
  262. printf ("Limite de credito invalido!\n");
  263. val3 = 0;
  264. }
  265. }
  266.  
  267. componentes = strtok (NULL, " ");
  268. contador++;
  269.  
  270. }
  271.  
  272. if (val1 == 1 && val2 == 1 && val3 == 1){
  273.  
  274. strcpy(a[contas_validas].id , tmpid);
  275. strcpy(a[contas_validas].saldo , tmpsaldo);
  276. strcpy(a[contas_validas].limite_saldo , tmplimitecredito);
  277. contas_validas++;
  278. if((contas_validas%MAX)==0){
  279. Conta* ptr;
  280. ptr=(Conta*)realloc(a,sizeof(Conta)*(contas_validas+MAX));
  281. if(ptr!=NULL){
  282. a=ptr;
  283. ptr=NULL;
  284. }
  285. }
  286. }
  287. else if (val1 == 0 || val2 == 0 || val3 == 0){
  288. contas_invalidas++;
  289. }
  290. }
  291.  
  292. fclose(fp);
  293.  
  294. printf ("\nNumero de contas validas: %d\n", contas_validas);
  295. printf ("\nNumero de contas invalidas: %d\n", contas_invalidas);
  296. }
  297. else{
  298. printf ("Erro!\n");
  299. }
  300. }
  301. /*
  302. int compara_conta (Conta * c1, Conta * c2) {
  303.   if (c1 -> saldo > c2 -> saldo)
  304.   return 1;
  305.   if (c1 -> saldo = c2 -> saldo)
  306.   return 0;
  307.   if (c1 -> saldo < c2 -> saldo)
  308.   return -1;
  309. }
  310. */
  311. int main() {
  312.  
  313. FILE * fp = fopen("contas-final.txt" , "w+");
  314. Conta* guardar_conta=(Conta*)malloc(sizeof(Conta)*MAX);
  315. contas(guardar_conta);
  316. long int somatorioInicial = 0;
  317. int i = 0;
  318. for ( i ; i< contas_validas ; i++){
  319. somatorioInicial += atoi(guardar_conta[i].saldo);
  320. }
  321. printf("\n%d", somatorioInicial); /* ATENÇÂO AO COMENTÁRIO DE CIMA */
  322. printf("\n");
  323. /* movimentos(); */
  324. int n;
  325. for ( n=0 ; n<contas_validas ; n++){
  326. fprintf(fp , "%s %s %s\n" , guardar_conta[n].id , guardar_conta[n].saldo ,guardar_conta[n].limite_saldo);
  327. }
  328. fclose(fp);
  329.  
  330. return 0;
  331. }
Runtime error #stdin #stdout 0s 23336KB
stdin
Standard input is empty
stdout
Standard output is empty