Colocar Resposta 
 
Avaliação do Tópico:
  • 0 votos - 0 Média
  • 1
  • 2
  • 3
  • 4
  • 5
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 ();

}
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
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 Wink
Agradeço ao Chrome o facto de os meus posts nao terem acentos Evil
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
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
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
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 Wink
Agradeço ao Chrome o facto de os meus posts nao terem acentos Evil
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
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
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
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
Procurar todas as mensagens deste utilizador
Citar esta mensagem numa resposta
Colocar Resposta 


Saltar Fórum:


Utilizadores a ver este tópico: 3 Visitante(s)