jorge618 Posted December 31, 2016 at 10:47 PM Report Share #601643 Posted December 31, 2016 at 10:47 PM (edited) Problema 1:depois de listar o novo elemento a sua idade é de 2016, sendo suposto fazer a diferença entre 2016(ano atual) com o ano introduzido na data pedida ao utilizador void Inserir_Pessoas(bd *bdv) { int i = 0; char ano[5],dt[20]; ano[0] = dt[6]; ano[1] = dt[7]; ano[2] = dt[8]; ano[3] = dt[9]; int anoAtual = devolveAno(); char nnome[MAX_NOME], nlocalidade[MAX_CIDADE], ndata[MAX_DATA]; //Variaveis para guardar os Novos Dados pedidos aos utilizador printf("\nIntroduza os dados do novo cidadao\n"); printf("\nNome: "); scanf(" %[^\n]s", nnome); printf("\nData de nascimento:(formato dd-mm-aaaa): "); scanf(" %s", ndata); printf("\nCidade: "); scanf(" %[^\n]s", nlocalidade); //Acrescenta na estrutura uma nova pessoa bdv->vp[bdv->npessoas].codigo = bdv->npessoas + 1; strcpy(bdv->vp[bdv->npessoas].datanasc, ndata); strcpy(bdv->vp[bdv->npessoas].nome, nnome); strcpy(bdv->vp[bdv->npessoas].localidade, nlocalidade); strcpy(ano, ""); bdv->vp[bdv->npessoas].idade = anoAtual - atoi(ano); bdv->npessoas++; printf("\nAdicionado com SUCESSO!\n"); system("pause"); } void listar_tudo(bd * bdv) { int i; for (i = 0; i <bdv->npessoas; i++) { printf("%d, %s, %d %s %s\n", bdv->vp[i].codigo, bdv->vp[i].nome, bdv->vp[i].idade, bdv->vp[i].datanasc, bdv->vp[i].localidade); } }; void completa_struct(bd * bdv) { int cod = 0; char dt[20]; char linha[max_linha]; char loc[MAX]; int res = 0; int i = 0; char ano[5]; int idadePessoa = 0; int anoAtual = devolveAno(); FILE *g = fopen("cod_dataN_cidade.txt", "r"); if (g == NULL) { printf("\nImpossivel abrir o ficheiro"); system("pause"); return; } //enquanto não chegar ao fim do ficheiro, ler while (!feof(g)) { strcpy(ano, ""); fgets(linha, max_linha, g); res = sscanf(linha, "%d %s %[^\n]s", &cod, &dt, &loc); i = procurar_cidadao(*bdv, cod); strcpy(bdv->vp[i].datanasc, dt); strcpy(bdv->vp[i].localidade, loc); ano[0] = dt[6]; ano[1] = dt[7]; ano[2] = dt[8]; ano[3] = dt[9]; bdv->vp[i].idade = anoAtual - atoi(ano); } fclose(g); printf("\t\t\t\t\t\tFicheiros carregado com sucesso!\n\n"); }; int devolveAno() { int ano = 0; time_t now; if (time(&now) != (time_t)(-1)) { struct tm *mytime = localtime(&now); if (mytime) { char year[5]; if (strftime(year, sizeof year, "%Y", mytime)) { ano = atoi(&year); return ano; } } } return 0; }; void preenche(bd * bdv) { FILE *f = fopen("cod_nome.txt", "r"); if (f == NULL) { printf("\nImpossivel abrir o ficheiro"); system("pause"); return; } int numlinhas = 0, res = 0; char linha[max_linha]; //enquanto não chegar ao fim do ficheiro, ler while (!feof(f)) { numlinhas++; fgets(linha, max_linha, f); } fclose(f); bdv->vp = (pessoa *)malloc(numlinhas * sizeof(pessoa)); f = fopen("cod_nome.txt", "r"); if (f == NULL) { printf("\nImpossivel abrir o ficheiro"); system("pause"); return; } float cod = 0; char nomes[200] = "";////// numlinhas = 0, res = 0; //enquanto não chegar ao fim do ficheiro, ler while (!feof(f)) { fgets(linha, max_linha, f); res = sscanf(linha, "%f %[^\n]s", &cod, &nomes); bdv->vp[numlinhas].codigo = cod; strcpy(bdv->vp[numlinhas].nome, nomes); numlinhas++; } bdv->npessoas = numlinhas - 1; fclose(f); }; #define MAX_NOME 200 #define MAX_CIDADE 100 #define MAX_DATA 11 typedef struct { int codigo; char nome[MAX_NOME]; char localidade[MAX_NOME]; char datanasc[11]; int idade; }pessoa; typedef struct { pessoa *vp; int npessoas; }bd; Problema 2: Media de idades é sempre a mesma void media_idade(bd*bdv) { int i, n = 0, soma = 0; float media = 0; char cidade_user[MAX_CIDADE]; printf("Introduza a cidade:\n"); scanf("%s", &cidade_user); for (i = 0; i<bdv->npessoas; i++) { if (stricmp(cidade_user, bdv->vp[i].localidade)) // compara a cidade introduzida pelo utilizador com as do ficheiro { n++; soma = bdv->vp[i].idade+soma; } } media = soma / n; printf("A media de idades da cidade %s e %.2f \n", cidade_user, media); } Edited December 31, 2016 at 10:48 PM by jorge618 Link to comment Share on other sites More sharing options...
Xendro Posted January 1, 2017 at 04:54 PM Report Share #601646 Posted January 1, 2017 at 04:54 PM verifica melhor o retorno de "stricmp" http://www.cprogrammingexpert.com/C/Tutorial/strings/stricmp.aspx Link to comment Share on other sites More sharing options...
jorge618 Posted January 1, 2017 at 06:14 PM Author Report Share #601648 Posted January 1, 2017 at 06:14 PM A única diferença que eu encontrei foi a falta de ponteiro no char cidade_user, mas pondo o ponteiro o erro persiste. Link to comment Share on other sites More sharing options...
Xendro Posted January 1, 2017 at 06:55 PM Report Share #601649 Posted January 1, 2017 at 06:55 PM qual ponteiro ? a variavel e um array de chars, não um apontador. viste a funcao "stricmp" ? que retorno tem e que retorno estas a testar ? Link to comment Share on other sites More sharing options...
jorge618 Posted January 1, 2017 at 07:13 PM Author Report Share #601650 Posted January 1, 2017 at 07:13 PM (edited) testei assim char *cidade_user[MAX_CIDADE]; mas o resultado é o mesmo. Vi.o retorno é o mesmo, ou seja, se eu introduzir uma cidade retorna essa cidade,tal coma na imagem que postei em baixo do problema 2. Se eu excluir o dividir por n na media, ou seja fazer o somatório das idades de uma cidade, o resultado parece-me correto. https://gyazo.com/ca723d491c8d5360565849d28cb6af27 Edited January 1, 2017 at 07:24 PM by jorge618 Link to comment Share on other sites More sharing options...
Xendro Posted January 1, 2017 at 07:29 PM Report Share #601651 Posted January 1, 2017 at 07:29 PM stricmp é a funcao de C usada na tua funcao "media_idade" se tiveses verificado o retorno ( enviei-te um link) verias que esta devolve "0" quando ambas as strings são iguais. da forma que fazes a comparação estas a usar todos os que são diferentes da cidade escolhida para para fazer a media sobre esses! Link to comment Share on other sites More sharing options...
jorge618 Posted January 1, 2017 at 08:38 PM Author Report Share #601652 Posted January 1, 2017 at 08:38 PM void media_idade(bd*bdv) { int i=0,a, n = 0, soma = 0; float media = 0; char cidade_user[MAX_CIDADE]; printf("Introduza a cidade:\n"); scanf("%s", &cidade_user); a = stricmp(cidade_user,bdv->vp->localidade); for (i;i<bdv->npessoas; i++) { if (a == 0) { n++; soma = bdv->vp[i].idade + soma; } else { printf("Cidade nao encontrada\n"); return 0; } } getch(); return 0; media = soma/ n; printf("A media de idades da cidade %s e %.2f \n", cidade_user, media); } Agora aparece sempre cidade não encontrada. O return 0 esta bem onde está ou tem que estar dentro do if ==0 ? Link to comment Share on other sites More sharing options...
Xendro Posted January 1, 2017 at 11:33 PM Report Share #601654 Posted January 1, 2017 at 11:33 PM /* Isso vai muito mau a nivel de logica */ for (i;i<bdv->npessoas; i++) { a = stricmp(cidade_user,bdv->vp[i].localidade) ; if (a == 0) { n++; soma = bdv->vp[i].idade + soma; } } if ( n == 0 ) { printf("Cidade nao encontrada\n"); return 0; } /* vp e nao vp*/ Link to comment Share on other sites More sharing options...
jorge618 Posted January 1, 2017 at 11:55 PM Author Report Share #601656 Posted January 1, 2017 at 11:55 PM Nunca tive logica amigo :s copiando o seu código depois de inserir uma cidade o programa não faz rigorosamente nada. Se eu meter o segundo if dentro do ciclo for aparece sempre cidade não encontrada. Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted January 2, 2017 at 05:40 PM Report Share #601676 Posted January 2, 2017 at 05:40 PM ninguem disse para meter o segundo if dentro do ciclo se a mensagem aparece é porque a cidade teallmente não foi encontrada na lista de pessoas IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now