Ĺadny brzuch
Takie pytanie... Mam plik, w którym podane są w takim formacie dane:
09-16-2005 09:07:43
09-16-2005 09:07:50
09-16-2005 09:07:52
09-16-2005 09:07:57
09-16-2005 09:07:57
itp.
I mam napisać program, który będzie obliczał ile razy w ciągu kolejnych pięciu minut zostały wpisane dane... Tylko jak zamienić datę na format, którym będę mógł spokojnie operować??
Jak rozwiązać ten problem?? Ale prosiłbym o nie pisanie całych programów... Chodzi mi tylko o ten jeden konkretny problem... :P
Może przekonwertować na string'i? A potem odwoływać się do konkretnej litery.
:)
Już o tym myślałem, ale trochę roboty będzie... No ale chyba sobie poradzę..:D
Może niezbyt eleganckie rozwiązanie, ale działa:
#include <stdlib.h> #include <stdio.h> struct element { Â char czas[9]; Â struct element *next, *prev; }; int main(int argc, char **argv) { Â struct element *poczatek, *act; Â char tmp[11]; Â FILE *plik = fopen(argv[1], "r"); Â poczatek = malloc(sizeof(struct element)); Â fscanf(plik, "%s %s", tmp, poczatek->czas); Â fgetc(plik); Â act = poczatek; Â act->next = NULL; Â act->prev = NULL; Â while (!feof(plik)) Â { Â Â act->next = malloc(sizeof(struct element)); Â Â act->next->prev = act; Â Â act = act->next; Â Â fscanf(plik, "%s %s", tmp, act->czas); Â Â fgetc(plik); Â Â fgetc(plik); Â Â act->next = NULL; Â } Â int ile = 0; Â int godzina = (act->czas[0]-'0')*10+(act->czas[1]-'0'); Â int minuta = (act->czas[3]-'0')*10+(act->czas[4]-'0'); Â int sekundy = (act->czas[6]-'0')*10+(act->czas[7]-'0'); Â int roznica = 0; Â int kiedy = godzina*3600 + minuta*60 + sekundy; Â while (roznica < 300 && act->prev) Â { Â Â act = act->prev; Â Â godzina = (act->czas[0]-'0')*10+(act->czas[1]-'0'); Â Â minuta = (act->czas[3]-'0')*10+(act->czas[4]-'0'); Â Â sekundy = (act->czas[6]-'0')*10+(act->czas[7]-'0'); Â Â roznica = kiedy - (godzina*3600 + minuta*60 + sekundy); Â Â ile++; Â } Â printf("Plik zmieniono %i razy.\n", ile); Â return 0; }
UWAGA: Nie uwzględnia zmiany dnia, ale to można dopisać analogicznie do sekund, minut i godzin.
UWAGA 2: Wypadałoby na końcu zwolnić pamięć dla listy. ;)
UWAGA 3: Nie ma obsługi błędnej zawartości pliku albo jego niepodania.
Użytkownik Chmurek edytował ten post 11 marzec 2006, 21:42
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
09-16-2005 09:07:43
09-16-2005 09:07:50
09-16-2005 09:07:52
09-16-2005 09:07:57
09-16-2005 09:07:57
itp.
I mam napisać program, który będzie obliczał ile razy w ciągu kolejnych pięciu minut zostały wpisane dane... Tylko jak zamienić datę na format, którym będę mógł spokojnie operować??
Jak rozwiązać ten problem?? Ale prosiłbym o nie pisanie całych programów... Chodzi mi tylko o ten jeden konkretny problem... :P
Może przekonwertować na string'i? A potem odwoływać się do konkretnej litery.
:)
Już o tym myślałem, ale trochę roboty będzie... No ale chyba sobie poradzę..:D
Może niezbyt eleganckie rozwiązanie, ale działa:
#include <stdlib.h> #include <stdio.h> struct element { Â char czas[9]; Â struct element *next, *prev; }; int main(int argc, char **argv) { Â struct element *poczatek, *act; Â char tmp[11]; Â FILE *plik = fopen(argv[1], "r"); Â poczatek = malloc(sizeof(struct element)); Â fscanf(plik, "%s %s", tmp, poczatek->czas); Â fgetc(plik); Â act = poczatek; Â act->next = NULL; Â act->prev = NULL; Â while (!feof(plik)) Â { Â Â act->next = malloc(sizeof(struct element)); Â Â act->next->prev = act; Â Â act = act->next; Â Â fscanf(plik, "%s %s", tmp, act->czas); Â Â fgetc(plik); Â Â fgetc(plik); Â Â act->next = NULL; Â } Â int ile = 0; Â int godzina = (act->czas[0]-'0')*10+(act->czas[1]-'0'); Â int minuta = (act->czas[3]-'0')*10+(act->czas[4]-'0'); Â int sekundy = (act->czas[6]-'0')*10+(act->czas[7]-'0'); Â int roznica = 0; Â int kiedy = godzina*3600 + minuta*60 + sekundy; Â while (roznica < 300 && act->prev) Â { Â Â act = act->prev; Â Â godzina = (act->czas[0]-'0')*10+(act->czas[1]-'0'); Â Â minuta = (act->czas[3]-'0')*10+(act->czas[4]-'0'); Â Â sekundy = (act->czas[6]-'0')*10+(act->czas[7]-'0'); Â Â roznica = kiedy - (godzina*3600 + minuta*60 + sekundy); Â Â ile++; Â } Â printf("Plik zmieniono %i razy.\n", ile); Â return 0; }
UWAGA: Nie uwzględnia zmiany dnia, ale to można dopisać analogicznie do sekund, minut i godzin.
UWAGA 2: Wypadałoby na końcu zwolnić pamięć dla listy. ;)
UWAGA 3: Nie ma obsługi błędnej zawartości pliku albo jego niepodania.
Użytkownik Chmurek edytował ten post 11 marzec 2006, 21:42