Advertisement
Guest User

Untitled

a guest
May 24th, 2017
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.38 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5. #define BIN_FILENAME "bin.dat"
  6.  
  7. typedef struct{
  8.     char tax_registry_number[14];
  9.     char name[41];
  10.     float earnings[5];
  11.     char date_of_registration[11];
  12.     struct Firm* next;
  13. }Firm;
  14. Firm* head = NULL;
  15.  
  16. //PROTOTYPNING
  17. //primary functions
  18. void add_new_firm();
  19. void update_firm();
  20. void show_information_for_firm_by_tax_registration_number();
  21. void show_info_for_firms_in_interval();
  22. //end primary functions
  23.  
  24. //secondary functions
  25. void save_a_firm_into_a_text_file_by_address(Firm* address);
  26. char* get_date(const char* type_of_date);
  27. void input_info_on_address(Firm* address);
  28. void print_info_by_address(Firm* address);
  29. void free_list();
  30. void reconstruct_list();
  31. void read_list_from_bin_file(char* filename);
  32. void save_list_to_bin_file(const char* filename);
  33. int get_size();
  34. void save_all_firms_into_text_files();
  35. char* add_txt_at_the_end_of_the_file(char* filename);
  36. int get_current_year();
  37. int check_format_of_date(char* year);
  38. char* get_reversed_date(char* date);
  39. int menu();
  40. //end secondary functions
  41.  
  42. //END PROTOTYPING
  43.  
  44. char* get_reversed_date(char* date){
  45.     char* reversed_date = (char*)malloc(sizeof(11));
  46.     reversed_date[0] = date[0];
  47.     reversed_date[1] = date[1];
  48.     reversed_date[2] = date[2];
  49.     reversed_date[3] = date[3];
  50.     reversed_date[8] = date[5];
  51.     reversed_date[9] = date[6];
  52.     reversed_date[5] = date[8];
  53.     reversed_date[6] = date[9];
  54.     reversed_date[4] = '.';
  55.     reversed_date[7] = '.';
  56.     reversed_date[10] = '\0';
  57.     //printf("date: %s\n",date);
  58.     //printf("reversed date: %s\n",reversed_date);
  59.    
  60.     return reversed_date;
  61. }
  62.  
  63. int get_current_year(){
  64.     time_t now;
  65.     if ( time(&now) != (time_t)(-1) )
  66.     {
  67.       struct tm *mytime = localtime(&now);
  68.       if ( mytime )
  69.       {
  70.          char year [ 5 ];
  71.          if ( strftime(year, sizeof year, "%Y", mytime) )
  72.          {
  73.             return atoi(year);
  74.          }
  75.       }
  76.     }
  77.     return 0;
  78. }
  79.  
  80. void read_list_from_bin_file(char* filename){
  81.     FILE* fp = fopen(filename,"rb");
  82.     int number_of_elements;
  83.     int i;
  84.     if(fp!=NULL){
  85.         fread(&number_of_elements,4,1,fp);
  86.         Firm* temp = head;
  87.         for(i = 0;i<number_of_elements;i++){
  88.             temp->next = (struct Firm*)malloc(sizeof(Firm));
  89.             temp = (Firm*)(temp->next);
  90.             fread(temp,sizeof(Firm),1,fp);
  91.         }
  92.         temp -> next = NULL;
  93.     }else{
  94.         printf("\t---file open error!---\n");
  95.     }
  96. }
  97.  
  98. void save_list_to_bin_file(const char* filename){
  99.     FILE* fp = fopen(filename,"wb");
  100.     int number_of_elements = get_size();
  101.     if(fp!=NULL){
  102.         fwrite(&number_of_elements,4,1,fp);
  103.         Firm* temp = head;
  104.         while(temp->next!=NULL){
  105.             temp = (Firm*)(temp->next);
  106.             fwrite(temp,sizeof(Firm),1,fp);
  107.         }
  108.     }else{
  109.         printf("\t---File can\'t be created! :(---\n");
  110.     }
  111. }
  112. char* add_txt_at_the_end_of_the_file(char* filename){
  113.     char* new_name = (char*)malloc(18);
  114.     int i;
  115.     for(i=0;filename[i]!='\0';i++){
  116.         new_name[i] = filename[i];
  117.     }
  118.     new_name[i] = '.';
  119.     i++;
  120.     new_name[i] = 't';
  121.     i++;
  122.     new_name[i] = 'x';
  123.     i++;
  124.     new_name[i] = 't';
  125.     i++;
  126.     new_name[i] = '\0';
  127.     return new_name;
  128. }
  129.  
  130. void save_a_firm_into_a_text_file_by_address(Firm* address){
  131.     int i;
  132.     int current_year = get_current_year();
  133.     printf("%s \n",address->tax_registry_number);
  134.     /*char*  filename = add_txt_at_the_end_of_the_file(address->tax_registry_number);
  135.     FILE* fp = fopen(filename,"w");
  136.     if(fp!=NULL){
  137.         fprintf(fp,"%s\n",address->name);
  138.         for(i=0;i<5;i++){
  139.             current_year--;
  140.             fprintf(fp,"earning for %d year = %.2f\n",current_year,(address->earnings)[i]);
  141.         }
  142.         fprintf(fp,"date of registration: %s\n",(address->date_of_registration));
  143.         fclose(fp);
  144.         free(filename);
  145.     }else{
  146.         printf("\t---File can\'t be created! :(---\n");
  147.     }*/
  148. }
  149.  
  150. void save_all_firms_into_text_files(){
  151.     Firm* temp = head;
  152.     while(temp->next!=NULL){
  153.         temp = (Firm*)(temp->next);
  154.         save_a_firm_into_a_text_file_by_address(temp); 
  155.     }
  156. }
  157.  
  158. int get_size(){
  159.     Firm* temp = head;
  160.     int size = 0;
  161.    
  162.     while(temp->next!=NULL){
  163.         temp = (Firm*)temp->next;
  164.         ++size;
  165.     }
  166.     return size;
  167. }
  168. void free_list(){
  169.     Firm* temp = head;
  170.     Firm* next;
  171.     while(head->next!=NULL){
  172.         temp = (Firm*)(temp->next);
  173.         next = (Firm*)(temp->next);
  174.         free(temp);
  175.         head->next = (struct Firm*)next;
  176.     }
  177.     free(head);
  178.     head = NULL;
  179. }
  180. void reconstruct_list(){
  181.     if(head != NULL){
  182.         free_list();
  183.     }
  184.     head = (Firm*)malloc(sizeof(Firm));
  185.     head->next = NULL;
  186. }
  187.  
  188. int check_format_of_date(char* date){
  189.     if(!((date[0]<='9')&&(date[0]>='0'))){
  190.         return 0;
  191.     }
  192.     if(!((date[1]<='9')&&(date[1]>='0'))){
  193.         return 0;
  194.     }
  195.     if(!((date[2]<='9')&&(date[2]>='0'))){
  196.         return 0;
  197.     }
  198.     if(!((date[3]<='9')&&(date[3]>='0'))){
  199.         return 0;
  200.     }
  201.     if(date[4]!='.'){
  202.         return 0;
  203.     }
  204.     if(!((date[5]<='9')&&(date[0]>='0'))){
  205.         return 0;
  206.     }
  207.     if(!((date[6]<='9')&&(date[0]>='0'))){
  208.         return 0;
  209.     }
  210.     if(date[7]!='.'){
  211.         return 0;
  212.     }
  213.     if(!((date[8]<='9')&&(date[0]>='0'))){
  214.         return 0;
  215.     }
  216.     if(!((date[9]<='9')&&(date[0]>='0'))){
  217.         return 0;
  218.     }
  219.     return 1;
  220. }
  221.  
  222. char* get_registry_tax_number(){
  223.     char* tax_number = (char*)malloc(13);
  224.     int first_time = 1;
  225.     do{
  226.         if(!first_time){
  227.             printf("\t---tax registry number must be 13 chars---\n");
  228.         }
  229.         printf("\t Enter tax registry number: ");
  230.         fflush(stdin);
  231.         scanf("%s",tax_number);
  232.         first_time = 0;
  233.     }while(strlen(tax_number)<13);
  234.     return tax_number;
  235. }
  236. void add_new_firm(){
  237.     char* tax_number;
  238.     printf("\tadding new firm\n");
  239.     Firm* temp = head;
  240.     while(temp->next!=NULL){
  241.         temp = (Firm*)(temp->next);
  242.     }
  243.     tax_number = get_registry_tax_number();
  244.     strcpy(temp->tax_registry_number,tax_number);
  245.     free(tax_number);
  246.     temp->next = (struct Firm*)malloc(sizeof(Firm));
  247.     temp = (Firm*)(temp->next);
  248.     temp -> next = NULL;
  249.    
  250.     input_info_on_address(temp);
  251.     save_list_to_bin_file(BIN_FILENAME);
  252.     save_all_firms_into_text_files();
  253. }
  254.  
  255. void input_info_on_address(Firm* address){
  256.     printf("\t Enter new firm name: ");
  257.     fflush(stdin);
  258.     fgets(address->name,41,stdin);
  259.     //printf("%s",address->name);
  260.    
  261.     char* date;
  262.     date = get_date(" ");
  263.     strcpy(address->date_of_registration,date);
  264.     free(date);
  265.     int current_year;
  266.     int i;
  267.     current_year = get_current_year();
  268.     for(i = 0;i < 5;i++){
  269.         current_year--;
  270.         printf("\t Enter new average earnings for %d year: ",current_year);
  271.         fflush(stdin);
  272.         scanf("%f",&((address->earnings)[i]));//(address->earnings)+i;
  273.     }
  274. }
  275.  
  276. void update_firm(){
  277.     char tax_registry_number[14];
  278.     printf("\tupdate firm\n");
  279.     printf("\t enter tax registry number of the firm you want update: ");
  280.     fflush(stdin);
  281.     scanf("%s",tax_registry_number);
  282.     int if_found_firm = 0;
  283.     Firm* temp = head;
  284.     while(temp->next!=NULL){
  285.         temp = (Firm*)(temp->next);
  286.         if(strcmp(tax_registry_number,temp->tax_registry_number)==0){
  287.             input_info_on_address(temp);
  288.             if_found_firm = 1;
  289.         }
  290.     }
  291.     if(!if_found_firm){
  292.         printf("\t---firm not found---\n");
  293.     }
  294.     save_list_to_bin_file(BIN_FILENAME);
  295.     save_all_firms_into_text_files();
  296. }
  297. void show_information_for_firm_by_tax_registration_number(){
  298.     int if_found_firm = 0;
  299.     char tax_registry_number[14];
  300.     printf("\tshow info for firm by tax registration number\n");
  301.     printf("\t enter tax registry number of the firm you want search for: ");
  302.     fflush(stdin);
  303.     scanf("%s",tax_registry_number);
  304.     Firm* temp = head;
  305.     while(temp->next!=NULL){
  306.         temp = (Firm*)(temp->next);
  307.         if(strcmp(temp->tax_registry_number,tax_registry_number)==0){
  308.             if_found_firm = 1;
  309.             print_info_by_address(temp);   
  310.         }
  311.     }
  312.     if(!if_found_firm){
  313.         printf("\t---firm not found---\n");
  314.     }
  315. }
  316. char* get_date(const char* type_of_date){
  317.     char* date = (char*)malloc(11);
  318.     int first_time = 1;
  319.     do{
  320.         if(first_time==0){
  321.             printf("\t---Date format error, the format must be \"YYYY.DD.MM\"!---\n");
  322.         }
  323.         printf("\t Enter%sdate [YYYY.DD.MM]: ",type_of_date);
  324.         fflush(stdin);
  325.         scanf("%s",date);
  326.         first_time = 0;
  327.     }while(!check_format_of_date(date));
  328.     return date;
  329. }
  330.  
  331. void show_info_for_firms_in_interval(){
  332.     int i;
  333.     int if_all_earnings_are_positive;
  334.     printf("\tprinting all firms with earnings for all 5 years in custom interval!\n");
  335.     char* start_date = get_date(" start ");
  336.     char* final_date = get_date(" final ");
  337.     char* reversed_start_date = get_reversed_date(start_date);
  338.     char* reversed_final_date = get_reversed_date(final_date);
  339.     free(start_date);
  340.     free(final_date);
  341.     char* reversed_current_date;
  342.     Firm* temp = head;
  343.     int something_found = 0;
  344.     while(temp->next!=NULL){
  345.         temp = (Firm*)(temp->next);
  346.         if_all_earnings_are_positive = 1;
  347.         reversed_current_date = get_reversed_date(temp->date_of_registration);
  348.         if((strcmp(reversed_start_date,reversed_current_date)<=0)&&(strcmp(reversed_final_date,reversed_current_date)>=0)){
  349.             //printf("\tstart = %s; current = %s; final = %s\n",reversed_start_date,reversed_current_date,reversed_final_date);
  350.             for(i = 0;i<5;i++){
  351.                 if((temp->earnings)[i]<=0){
  352.                     if_all_earnings_are_positive = 0;
  353.                 }
  354.             }
  355.             if(if_all_earnings_are_positive){
  356.                 print_info_by_address(temp);   
  357.             }
  358.             something_found = 1;
  359.         }
  360.         free(reversed_current_date);
  361.     }
  362.     if(!something_found){
  363.         printf("\t---not found firms in interval [%s;%s]---\n",reversed_start_date,reversed_final_date);
  364.     }
  365.     free(reversed_start_date);
  366.     free(reversed_final_date);
  367. }
  368. void print_info_by_address(Firm* address){
  369.     Firm* temp = head;
  370.     while(temp->next!=NULL){
  371.         temp = (Firm*)(temp->next);
  372.         if(temp==address){
  373.             printf("\n\t tax registry number: %s\n",temp->tax_registry_number);
  374.             printf("\t firm name: %s\n",temp->name);
  375.             printf("\t date of registration: %s\n",temp->date_of_registration);
  376.    
  377.            
  378.             int current_year;
  379.             int i;
  380.             current_year = get_current_year();
  381.             for(i = 0;i < 5;i++){
  382.                 current_year--;
  383.                 printf("\t earnings for %d year: %f\n",current_year,temp->earnings[i]);
  384.             }
  385.         }
  386.     }
  387. }
  388. int menu(){
  389.     printf("MENU\n");
  390.     printf("1. add_new_firm();\n");
  391.     printf("2. update_firm();\n");
  392.     printf("3. show_info_for_firms_in_interval();\n");
  393.     printf("4. show_information_for_firm_by_tax_registration_number();\n");
  394.     printf("5. exit\n");
  395.     char option;
  396.     fflush(stdin);
  397.     scanf("%c",&option);
  398.     switch(option){
  399.         case '1':add_new_firm();return 0;
  400.         case '2':update_firm();return 0;
  401.         case '3':show_info_for_firms_in_interval();return 0;
  402.         case '4':show_information_for_firm_by_tax_registration_number();return 0;
  403.         default:return -1;
  404.     }
  405. }
  406.  
  407.  
  408. int main(){
  409.     char c;
  410.     reconstruct_list();
  411.     read_list_from_bin_file(BIN_FILENAME);
  412.     while(menu()==0){
  413.         printf("\t===press enter to return menu===\n");
  414.         fflush(stdin);
  415.         scanf("%c",&c);
  416.     }
  417.    
  418.     return 0;
  419. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement