Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #include <time.h>
- #include <Windows.h>
- #define Max 100
- //today
- #define day 19
- #define month 1
- #define year 2018
- typedef struct content{
- struct date{
- int d,m,y;
- }date;
- //thành phần còn lại trên hàng đó nhét vào 1 chuỗi luôn
- char whatLeft[Max];
- };
- content list[Max];
- int laNamNhuan(int y){
- if ((y%4==0 && year%100!=0) || year%400==0 )
- return 1;
- return 0;
- }
- //https://www.youtube.com/watch?v=hSLW_lb9EeQ
- int DistanceOFtime(int d, int m, int y){
- int x=0;
- while (year>=y){
- if (y==year && m==month){
- x+=day-d;
- //day-d phòng trường hợp như 14/12/2017 và 20/12/2017 thì dist=20-14;
- break;
- }
- else {
- if (m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12)
- x+=31-d;
- //31-d là trường hợp bắt đầu từ ngày d, tháng m, năm y
- else if (m==4 || m==6 || m==9 || m==1)
- x+=30-d;
- else if (m==2){
- if (laNamNhuan(y))
- x+=29-d;
- else x+=28-d;
- }
- m++;
- d=0;
- // qua lần đầu tiên thì d=0
- if (m==13){
- //m vuợt quá 12 thì có nghĩa là đã sang năm mới
- m=1;
- y++;
- }
- }
- }
- return x;
- }
- //ngoại trừ cách trên, ta có thể lấy 1 mốc ngày nào đó như 1/1/year, tính khoảng cách giữa 1 ngày với ngày này khá easy
- //sau đó lấy khoảng cách ngày lớn - khoảng cách ngày bé sẽ đc khoảng cách giữa 2 ngày
- //cơ mà cách trên tối ưu hơn :v
- int main(){
- FILE *fin=fopen("C:\\LIST.TXT","r");
- //nếu = null nghĩa là k0 mở đc :v
- if (fin==NULL){
- printf("FILE nay khong mo duoc !");
- return 0;
- }
- //đếm số hàng của file
- char temp[100];
- int line=0;
- while (!feof(fin)){
- fgets(temp,300,fin);
- line++;
- }
- //n là số hàng có chứa thông tin về ngày tháng
- int n=line-7;
- //reset lại con trỏ để làm việc
- rewind(fin);
- //cho con trỏ đến hàng thứ 6
- line=0;
- while (line<5){
- fgets(temp,300,fin);
- line++;
- }
- //nhập thông tin từ FILE vào struct
- for(int i=0;i<n;i++)
- fscanf(fin,"%d/%d/%d%[^\n]\n",&list[i].date.d,&list[i].date.m,&list[i].date.y,list[i].whatLeft);
- fclose(fin);
- //làm việc với file mới
- FILE *fout=fopen("C:\\NEW.TXT","w");
- //nếu thỏa điều kiện thì sẽ in vào file mới này
- int box[Max], b=0;
- int min=DistanceOFtime(list[0].date.d,list[0].date.m,list[0].date.y);
- //lấy min là k/c ngày đầu tiên để so sánh với các ngày #
- for(int i=0;i<n;i++){
- int dist=DistanceOFtime(list[i].date.d,list[i].date.m,list[i].date.y);
- //nếu dist<min thì sẽ tạo mới giá trị của min và mảng box sẽ bỏ các giá trị đã lưu trước đó với giá trị min cũ
- if (dist<min){
- min=dist;
- b=0;
- }
- //nếu dist=min thì mảng box sẽ chứa các chỉ số phần tử i
- else if (dist==min)
- box[b++]=i;
- }
- //in ra vào file NEW.TXT
- for(int i=0;i<b;i++)
- fprintf(fout,"%d/%d/%d%s\n",list[box[i]].date.d,list[box[i]].date.m,list[box[i]].date.y,list[box[i]].whatLeft);
- fclose(fout);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement