Advertisement
Guest User

bài 5

a guest
Jan 19th, 2018
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.60 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <time.h>
  5. #include <Windows.h>
  6. #define Max 100
  7. //today
  8. #define day 19
  9. #define month 1
  10. #define year 2018
  11.  
  12. typedef struct content{
  13.     struct date{
  14.         int d,m,y;
  15.     }date;
  16.  
  17.     //thành phần còn lại trên hàng đó nhét vào 1 chuỗi luôn
  18.     char whatLeft[Max];
  19. };
  20. content list[Max];
  21.  
  22. int laNamNhuan(int y){
  23.     if ((y%4==0 && year%100!=0) || year%400==0 )
  24.         return 1;
  25.     return 0;
  26. }
  27.  
  28. //https://www.youtube.com/watch?v=hSLW_lb9EeQ
  29. int DistanceOFtime(int d, int m, int y){
  30.     int x=0;
  31.     while (year>=y){
  32.         if (y==year && m==month){
  33.             x+=day-d;
  34.  
  35.             //day-d phòng trường hợp như 14/12/2017 và 20/12/2017 thì dist=20-14;
  36.             break;
  37.         }
  38.         else {
  39.             if (m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12)
  40.                 x+=31-d;
  41.  
  42.             //31-d là trường hợp bắt đầu từ ngày d, tháng m, năm y
  43.             else if (m==4 || m==6 || m==9 || m==1)
  44.                 x+=30-d;
  45.             else if (m==2){
  46.                 if (laNamNhuan(y))
  47.                     x+=29-d;
  48.                 else x+=28-d;
  49.             }
  50.             m++;
  51.             d=0;
  52.  
  53.             // qua lần đầu tiên thì d=0
  54.             if (m==13){
  55.  
  56.             //m vuợt quá 12 thì có nghĩa là đã sang năm mới
  57.                 m=1;
  58.                 y++;
  59.             }
  60.         }
  61.     }
  62.     return x;
  63. }
  64. //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
  65. //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
  66. //cơ mà cách trên tối ưu hơn :v
  67.  
  68. int main(){
  69.     FILE *fin=fopen("C:\\LIST.TXT","r");
  70.  
  71.     //nếu = null nghĩa là k0 mở đc :v
  72.     if (fin==NULL){
  73.         printf("FILE nay khong mo duoc !");
  74.         return 0;
  75.     }
  76.  
  77.     //đếm số hàng của file
  78.     char temp[100];
  79.     int line=0;
  80.     while (!feof(fin)){
  81.         fgets(temp,300,fin);
  82.         line++;
  83.     }
  84.  
  85.     //n là số hàng có chứa thông tin về ngày tháng
  86.     int n=line-7;
  87.  
  88.     //reset lại con trỏ để làm việc
  89.     rewind(fin);
  90.  
  91.     //cho con trỏ đến hàng thứ 6
  92.     line=0;
  93.     while (line<5){
  94.         fgets(temp,300,fin);
  95.         line++;
  96.     }
  97.  
  98.     //nhập thông tin từ FILE vào struct
  99.     for(int i=0;i<n;i++)
  100.         fscanf(fin,"%d/%d/%d%[^\n]\n",&list[i].date.d,&list[i].date.m,&list[i].date.y,list[i].whatLeft);
  101.     fclose(fin);
  102.  
  103.     //làm việc với file mới
  104.     FILE *fout=fopen("C:\\NEW.TXT","w");
  105.  
  106.     //nếu thỏa điều kiện thì sẽ in vào file mới này
  107.     int box[Max], b=0;
  108.     int min=DistanceOFtime(list[0].date.d,list[0].date.m,list[0].date.y);
  109.  
  110.     //lấy min là k/c ngày đầu tiên để so sánh với các ngày #
  111.     for(int i=0;i<n;i++){
  112.         int dist=DistanceOFtime(list[i].date.d,list[i].date.m,list[i].date.y);
  113.  
  114.         //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ũ
  115.         if (dist<min){
  116.             min=dist;
  117.             b=0;
  118.         }
  119.  
  120.         //nếu dist=min thì mảng box sẽ chứa các chỉ số phần tử i
  121.         else if (dist==min)
  122.             box[b++]=i;
  123.     }
  124.  
  125.     //in ra vào file NEW.TXT
  126.     for(int i=0;i<b;i++)
  127.         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);
  128.  
  129.     fclose(fout);
  130.     return 0;
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement