URGENTE - TRABALHO DE FACULDADE (Linguagem C)
|
29-11-2013, 00:56
Mensagem: #1
|
|||
|
|||
URGENTE - TRABALHO DE FACULDADE (Linguagem C)
Boa noite pessoal, estou com algumas dificuldades em desenvolver este código onde é suposto eu ir a um ficheiro com um milhão de linhas de código , onde cada linha se apresenta desta forma: 961401167;912304579;14/12/2010;14h 5m 40s; 15h 30m 10s; 0; 1;
onde o primeiro valor é o numero que efectua uma chamada, o segundo o numero que recebe essa chamada, o terceiro a data, o quinto as horas minutos e segundos a que a chamada é feita, o sexto as horas os minutos e os segundos a que a chamada termina e o roaming inicial e final respectivamente. Nesta função que vos apresento é suposto eu colocar um numero utilizando um scanf, que supostamente é o numero que efectua a chamada e depois a função deve ir ao ficheiro procurar esse numero e caso esse numero exista ele devolve me as linhas em que esse numero aparece (a realizar a chamada) e o numero de occorrencias. Estou com algumas dificuldades e não percebo o que tenho de errado no código, se me poderem ajudar agradeço... Obrigado e boa noite typedef struct dia { int Dia; int Mes; int Ano; } dia; typedef struct hora { int Hora; int Minuto; int Segundo; } hora; typedef struct chamada { char NumI; char NumF; int RoamI; int RoamF; hora HoraI, HoraF; dia data; } chamada; void mostrar_chamada () { int i; char op[15]; chamada a; unsigned long int contador=0; printf ("Write a number: "); scanf ("%s", &op); FILE *fp=fopen("db.txt", "r"); if(fp==NULL) { printf ("Erro na abertura do ficheiro.\n"); exit(1); } else while ((fscanf (fp, "%s;%s;%d/%d/%d;%dh %dm %ds;%dh %dm %ds;%d;%d;\n", a.NumI, a.NumF, &a.data.Dia, &a.data.Mes, &a.data.Ano, &a.HoraI.Hora, &a.HoraI.Minuto, &a.HoraI.Segundo, &a.HoraF.Hora, &a.HoraF.Minuto, &a.HoraF.Segundo, &a.RoamI, &a.RoamF))!=EOF) { if ((strcmp(op, "a.NumI"))!=0) { printf ("%s;%s;%d/%d/%d;%dh %dm %ds;%dh %dm %ds;%d;%d;\n", a.NumI, a.NumF, a.data.Dia, a.data.Mes, a.data.Ano, a.HoraI.Hora, a.HoraI.Minuto, a.HoraI.Segundo, a.HoraF.Hora, a.HoraF.Minuto, a.HoraF.Segundo, a.RoamI, a.RoamF); contador++; i++; } } printf ("The number you choose has: %ld occurrences\n", contador); if((strcmp(op, "a.NumI"))==0) { printf ("The number you choose doesn't exist\n"); } fclose (fp); } void menu () { int op; printf (" Call Analysis\n"); printf ("0 - Exit the program\n"); printf ("1 - Show calls performed by a number\n"); printf ("2 - Write the calls received by a number in a file\n"); printf ("3 - Total conversation time initiated by a number\n\n"); printf ("4 - Calls performed by a telephone and cost of one of them\n"); printf ("5 - Histogram of the calls of a telephone by hour\n\n"); printf ("6 - Total cost of calls by a telephone\n"); printf ("7 - Histogram of the calls made by a telephone\n\n"); printf ("Choose one option: "); scanf ("%d", &op); switch (op) { case 0: printf ("It was a pleasure!\n"); exit (1); case 1: mostrar_chamada (); default: exit(1); } } main () { menu (); } |
|||
29-11-2013, 10:02
Mensagem: #2
|
|||
|
|||
RE: URGENTE - TRABALHO DE FACULDADE (Linguagem C)
Dois comentários:
- Usa as tags de [ code ] para o código ficar mais legivel. Assim todo encostado à esquerda torna-se dificil ver a estrutura do programa. - Estás com dificuldades mas não indicas quais. Tendo em conta que provavelmente ninguém irá sequer tentar compilar e executar o programa, devias dizer quais os problemas que tens para ser mais fácil de receberes ajuda. Pedidos de ajuda via PM serão ignorados Acordo ortográfico? Desconheço, obrigado Agradeço ao Chrome o facto de os meus posts nao terem acentos |
|||
29-11-2013, 11:39
Mensagem: #3
|
|||
|
|||
RE: URGENTE - TRABALHO DE FACULDADE (Linguagem C)
Bom dia
Olhando na diagonal para o código, não me parece que haja erros, parece-me sim que está em falta algo... tem ali a condição while, e pelo que ali li, o while está a entrar em loop, logo, ao while tem que acrescentar o do, onde o que se pretende é, vais fazer isto (do { e por baixo comando ou acção pretendida) enquanto (while{) esta condição não for satisfeita. Como foi dito em comentário anterior, eu poderia até compilar o código e corrigi-lo postando aqui a solução, mas assim não estará a aprender. Por isso prefiro deitar axas para a fogueira, errando, fica sempre conhecimento extra. Espero ter ajudado Respeitosos cumprimentos Damnation |
|||
29-11-2013, 11:43
Mensagem: #4
|
|||
|
|||
RE: URGENTE - TRABALHO DE FACULDADE (Linguagem C)
Ele está a usar um while (condição) {}, e embora a condição não seja fácil de ler por ser muito comprida, reduzidamente é um while (fscanf(....) != EOF) {}
Não será aqui (em princípio) que estará o problema. Além disso, um ciclo do {} while () executa sempre pelo menos uma vez e não há qualquer garantia que o ficheiro que está a ser lido tenha qualquer conteudo. Pedidos de ajuda via PM serão ignorados Acordo ortográfico? Desconheço, obrigado Agradeço ao Chrome o facto de os meus posts nao terem acentos |
|||
30-11-2013, 12:29
Mensagem: #5
|
|||
|
|||
RE: URGENTE - TRABALHO DE FACULDADE (Linguagem C)
Bom dia
Seguindo esse raciocinio, com o do{ pode executar ou repetir o pedido de consulta: por exemplo, solicita o 912345678, ele faz o match de acordo com o ficheiro, então a instrução do pode solicitar que seja repetido o pedido de consulta, evitando assim o fecho do ciclo, e consequentemente o fecho do programa. Melhor ainda, pode inverter o ciclo dizendo que While{ condição x não for satisfeita, do{ pesquisa do nro pretendido. Pode ainda adicionar uma regra em que ao fim de x consultas erradas, o programa regressa ao menu inicial. Espero ter ajudado Respeitosos cumprimentos Damnation |
|||
30-11-2013, 18:29
(Esta mensagem foi modificada pela última vez a: 30-11-2013 18:30 por xupista.)
Mensagem: #6
|
|||
|
|||
RE: URGENTE - TRABALHO DE FACULDADE (Linguagem C)
Ol'a
So uma pequena sugestao. Da forma como estas a pensar implementar isso cada vez que fizeres uma pesquisa de um numero vais ter que varrer o ficheiro todo o que nao e muito boa ideia. Sugiro que ao inicio carregues todo o conteudo do ficheiro para mem'oria. Cria uma tabela de dispers'ao para a estrutura chamada com base na chave NumL, que contem uma lista de chamadas efectuadas a partir do mesmo numero. Assim quando pesquisas na tabela de dispersao vais encontrar logo todas as chamadas efectuadas a partir daquele numero. Espero que as minhas sugestoes te ajudem, Desta forma vais gastar mais memoria, mesmo assim pouca,,, e o programa vai ser muito, mas muito mais rapido. Para alem disso depois vai ser mais facil implementares as alineas 2-7. Cumprimentos |
|||
« Mais Antigo | Mais Recente »
|
Utilizadores a ver este tópico: 3 Visitante(s)