#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX 10
int contas_validas = 0;
int contas_invalidas = 0;
typedef struct conta {
char saldo[1000000];
char limite_saldo[1000000];
char id[11];
struct conta * prox;
} Conta;
typedef struct movimento {
int tipo_movimento;
int opcao;
} Movimento;
int validar_id(char* id){
if (id[3] == '-' && id[9] == '-' && id[11] == '\0'){
int i = 0;
for(i = 0; i < 11; i++){
if(i != 3 && i != 9){
if(isdigit(id[i]) == 0){
return 0;
}
}
}
}
else{
return 0;
}
return 1;
}
int validar_id2 (char* id) {
int componente_a = ((id[0]-'0')+ (id[1]-'0')+(id[2]-'0'));
int componente_b = ((id[4]-'0')+ (id[5]-'0')+(id[6]-'0')+(id[7]-'0')+(id[8]-'0'));
int componente_c = (id[10]-'0');
int soma1 = componente_a;
int soma2 = componente_a + componente_b;
int resto = soma2 % soma1;
if (resto == componente_c) {
return 1;
}
else {
return 0;
}
}
int validar_saldo(char* str){
if(str[0] == '-' || isdigit(str[0]) == 1){
int i=1;
for(i = 1; str[i]!='\0' ; i++){
if(isdigit(str[i])==0){
return 0;
}
}
}
return 1;
}
int validar_limite(char* str){
if(str[0] == '-' || isdigit(str[0]) == 1){
int i=1;
for(i = 1; str[i]!='\0' ; i++){
if(isdigit(str[i])==0){
return 0;
}
}
}
return 1;
}
void contas (Conta* a){
FILE* fp = fopen ("contas.txt", "r"); //"r" -> leitura (modo texto) ou "b" -> leitura (modo binario)
FILE* fp2 = fopen ("stats.txt", "w");
if (fp != NULL){
char tmpid[11];
char tmpsaldo[1000000];
char tmplimitecredito[1000000];
char contas[255+1];
char* temp_id[11+1];
char* componentes;
int contador = 0;
int val1;
int val2;
int val3;
printf ("As contas existentes no ficheiro sao:\n");
while (fgets(contas, 255+1, fp) != NULL){
printf ("\n-> %s\n\n", contas);
contador = 0;
int last = strlen (contas);
if (contas[last-1] == '\n')
contas[last-1] = '\0';
componentes = strtok (contas, " ");
while (componentes != NULL){
if (contador == 0) {
printf ("- ID = %s\n", componentes);
strcpy(tmpid , componentes);
int valido = validar_id (componentes);
int valido2 = validar_id2 (componentes);
if (valido == 1 && valido2 == 1){
printf ("ID valido!\n");
val1 = 1;
}
else {
printf ("ID invalido!\n");
val1 = 0;
}
}
else if (contador == 1){
strcpy(tmpsaldo , componentes);
int valido = validar_saldo(componentes);
if (valido == 1){
printf ("- Saldo: %s\n", componentes);
val2 = 1;
}
else{
printf ("Saldo invalido!\n");
val2 = 0;
}
}
else if (contador == 2){
strcpy(tmplimitecredito , componentes);
int valido = validar_limite(componentes);
/* ATENÇÂO AO FACTO DE NÃO HAVER COMPONENTE) */
if (valido == 0){
printf ("Limite de credito invalido!\n");
val3 = 0;
}
else{
printf ("- Limite de credito: %s\n", componentes);
val3 = 1;
}
}
else if (contador != 2){
val3 = 0;
}
componentes = strtok (NULL, " ");
contador++;
}
if (val1 == 1 && val2 == 1 && val3 == 1){
strcpy(a[contas_validas].id , tmpid);
strcpy(a[contas_validas].saldo , tmpsaldo);
strcpy(a[contas_validas].limite_saldo , tmplimitecredito);
contas_validas++;
if((contas_validas%MAX)==0){
Conta* ptr;
ptr=(Conta*)realloc(a,sizeof(Conta)*(contas_validas+MAX));
if(ptr!=NULL){
a=ptr;
ptr=NULL;
}
}
}
else if (val1 == 0 || val2 == 0 || val3 == 0){
contas_invalidas++;
}
}
fclose(fp);
printf ("\nNumero de contas validas: %d\n", contas_validas);
printf ("\nNumero de contas invalidas: %d\n", contas_invalidas);
}
else{
printf ("Erro!\n");
}
}
/*
int compara_conta (Conta * c1, Conta * c2) {
if (c1 -> saldo > c2 -> saldo)
return 1;
if (c1 -> saldo = c2 -> saldo)
return 0;
if (c1 -> saldo < c2 -> saldo)
return -1;
}
*/
int main() {
Conta* guardar_conta=(Conta*)malloc(sizeof(Conta)*MAX);
contas(guardar_conta);
long int somatorioInicial = 0;
int i = 0;
for ( i ; i< contas_validas ; i++){
somatorioInicial += atoi(guardar_conta[i].saldo);
}
printf("\n%d", somatorioInicial); /* ATENÇÂO AO COMENTÁRIO DE CIMA */
printf("\n");
/* movimentos(); */
return 0;
}
// ordenar as contas por saldo utilizando o "qsort"
// "qsort" recebe 4 argumentos - qsort ( ptr para inicio do array, (tamanho do array), nº de bytes por elemento (sizeof), funçao comparaçao)
// a funcao de comparacao tem de respeitar 3 condicoes: tem de receber 2 elemenntos a comparar
// o tipo de dados tem de ser o mesmo
// tem de devolver um inteiro: e1>e2 (devolve 1), e1=e2 (devolve 0), e1<e2 (devolve -1)