Author: Not specified Language: c
Description: Not specified Timestamp: 2013-05-11 18:47:39 +0000
View raw paste Reply
  1.  
  2. typedef struct Item
  3. {
  4.     int key;
  5.     int release;
  6.     char *info;
  7. }Item ;
  8.  
  9. // ??????? ?????
  10. char *getStr();
  11. int getInt(int *N);
  12. char* antispace(char *str);
  13. //?????????? ???????
  14. int dialog(const char *msgs[], int N);
  15. int D_Add(Item *table, int *ntab),           // ??????? ???????? ? ???????
  16.     D_Find(Item *table, int *ntab),         // ????? ???????? ? ???????
  17.     D_Delete(Item *table, int *ntab),      // ???????? ???????? ?? ???????
  18.     D_Show(Item *table, int *ntab);       // ????? ??????????? ???????
  19. int (*fptr[])(Item *table, int *ntab) = {NULL,D_Add,D_Find,D_Delete,D_Show};
  20.  
  21. //????????? ???????
  22. int insert(Item *table, int *n, int key, char *info);
  23. int find(Item* table, int n, int key);
  24.  
  25. int main()
  26. {
  27.     int i, ntab;
  28.     Item *table=(Item*)malloc(SIZE*sizeof(Item));
  29.     ntab=0;
  30.     int rc;
  31.     while(rc = dialog(msgs, Nmsgs))
  32.     {
  33.  
  34.         fptr[rc](table, &ntab);
  35.       //  for (i=0;i<20;i++)
  36.       //      printf("number %d is %s\n",i,table[i].info);
  37.     }
  38.     return 0;
  39.  
  40. }
  41.  
  42. char* antispace(char* str)
  43. {
  44.     for(;*str!='\0';str++)
  45.         if (*str != ' ' && *str != '\t')
  46.             return str;
  47.     return NULL;
  48. }
  49.  
  50. char* getstr()
  51. {
  52.  
  53.     char *ptr = (char *)malloc(1);
  54.     char buf[21];
  55.     int n, len = 0;
  56.     *ptr = '\0';
  57.     do
  58.     {
  59.         n = scanf("%20[^\n]", buf);
  60.         if(n < 0)
  61.         {
  62.  
  63.             free(ptr);
  64.             ptr = NULL;
  65.             break;
  66.  
  67.         }
  68.         if(n == 0)
  69.             scanf("%*c");
  70.  
  71.  
  72.         else
  73.         {
  74.             len += strlen(buf);
  75.             ptr = (char *) realloc(ptr, len + 1);
  76.             strcat(ptr, buf);
  77.         }
  78.  
  79.     }
  80.  
  81.     while(n > 0);
  82.     return ptr;
  83. }
  84.  
  85. int getInt(int *N)
  86. {
  87.     int n;
  88.     n=scanf("%d",N);
  89.  
  90.         if (n < 0)
  91.         {
  92.             *N=0;
  93.             return 0;
  94.         }
  95.  
  96.         if( (n == 0) || (scanf("%[a-z]") == 1) )
  97.         {
  98.             *N=-1;
  99.             fflush(stdin);
  100.             return*N;
  101.         }
  102.         else
  103.         {
  104.             fflush(stdin);
  105.             return n;
  106.         }
  107.  
  108.  
  109. }
  110.  
  111.  
  112. int dialog(const char *msgs[], int N)
  113. {
  114.     int rc=1, i;
  115.     do
  116.     {
  117.         if (rc < 0 || rc >= N)
  118.             puts("Sorry, your request is wrong. Please, try again");
  119.         else
  120.             puts("Please put the number of selected action:");
  121.         for (i=0;i<N;i++)
  122.             puts(msgs[i]);
  123.  
  124.         getInt(&rc);
  125.     }
  126.     while (rc < 0 || rc >= N) ;
  127.     return rc;
  128. }
  129.  
  130.  
  131. int D_Add(Item *table, int *ntab)
  132. {
  133.     int k,n=1;
  134.     char *info = NULL;
  135.     info=(char*)malloc(sizeof(char));
  136.  
  137.     do
  138.     {
  139.         if(n<0 || k<0)
  140.             puts("Your key is wrong. Please try again:");
  141.         else
  142.             puts("Enter key:");
  143.         n=getInt(&k);
  144.     }
  145.     while (n<0 || k<0);
  146.  
  147.     if(n == 0)
  148.         return 0;
  149.     do
  150.     {
  151.         if (info == NULL)
  152.             puts("Info is empty. Please try again:");
  153.         else
  154.             puts("Enter info:");
  155.  
  156.         info = getstr();
  157.         if (info != NULL)
  158.         info = antispace(info);
  159.             else
  160.         return 0;
  161.     }
  162.     while (info == NULL);
  163.  
  164.  
  165.     insert(table,ntab,k,info);
  166.     return 1;
  167. }
  168.  
  169. int D_Find(Item *table, int *ntab)
  170. {
  171.     int i,j,k,rel=0,n=1,nnew=0;
  172.     Item *newtable;
  173.  
  174.     do
  175.     {
  176.         if(n<0 || k<0)
  177.             puts("Your key is wrong. Please try again:");
  178.         else
  179.             puts("Enter key:");
  180.         n=getInt(&k);
  181.     }
  182.     while (n<0 || k<0);
  183.  
  184.     if(n == 0)
  185.         return 0;
  186.  
  187.     n=0;
  188.         do
  189.     {
  190.         if(n<0 || rel<0)
  191.             puts("Your release is wrong. Please try again:");
  192.         else
  193.             puts("Enter release[if necessary] or <0>");
  194.         n=getInt(&rel);
  195.     }
  196.     while (n<0 || rel<0);
  197.  
  198.     if(n == 0)
  199.         return 0;
  200.  
  201.     if (find(table,*ntab,k) >= 0)
  202.     {
  203.         j=i=find(table,*ntab,k);
  204.         if (rel<=0)
  205.         {
  206.             for(;table[j].key == k;j++,nnew++);
  207.  
  208.             newtable=(Item *)malloc(nnew*sizeof(Item));
  209.             for(j=i;table[j].key == k;j++)
  210.                 newtable[j-i]=table[j];
  211.  
  212.         }
  213.  
  214.         else
  215.             for(j=i;table[j].key == k;j++)
  216.             {
  217.                 if(table[j].release == rel)
  218.                 {
  219.                     nnew++;
  220.                     newtable=(Item *)malloc(sizeof(Item));
  221.                     newtable[0]=table[j];
  222.                 }
  223.  
  224.             }
  225.  
  226.     }
  227.     if(nnew>0)
  228.         D_Show(newtable,&nnew);
  229.     else
  230.         puts("Item not found");
  231.  
  232.     return 1;
  233. }
  234.  
  235. int D_Show (Item *table, int *ntab)
  236. {
  237.     int i;
  238.     puts("///////////////////////////");
  239.     if (*ntab>0)
  240.         for(i=0;i<*ntab;i++)
  241.             printf("Table[%d]: key - %d, release - %d, info - %s\n",i,table[i].key,table[i].release,table[i].info);
  242.     else
  243.         puts("Table is empty");
  244.     puts("///////////////////////////");
  245.     return 1;
  246. }
  247.  
  248. int D_Delete (Item *table, int *ntab)
  249. {
  250.  
  251.     int i,j;
  252.     for(i=0;i<*ntab;i++)
  253.     {
  254.         if(table[i].release>table[i-1].release)
  255.         {
  256.                 for(j=i;j<*ntab;j++)
  257.                     table[j-1]=table[j];
  258.  
  259.                 *ntab=*ntab-1;
  260.                 i--;
  261.                 table[i].release=1;
  262.         }
  263.     }
  264.     puts("Table changed");
  265.     return 1;
  266. }
  267.  
  268. int find(Item* table, int ntab, int key)
  269. {
  270.     int i;
  271.     for (i=0;i<ntab;i++)
  272.     {
  273.         if (table[i].key == key)
  274.             return i;
  275.  
  276.  
  277.     }
  278.     return -1;
  279. }
  280.  
  281. int insert(Item *table, int *ntab, int key, char *info)
  282. {
  283.     int i,j,rel;
  284.     rel=1;
  285.     if (*ntab == 0)
  286.         i=0;
  287.  
  288.    else
  289.    {
  290.        i=find(table,*ntab,key);
  291.     if (i >= 0)
  292.         {
  293.  
  294.  
  295.  
  296.             while (table[i].key == key)
  297.             {
  298.  
  299.                 i++;
  300.                 rel++;
  301.  
  302.             }
  303.             for(j=*ntab;j>i;j--)
  304.                 table[j]=table[j-1];
  305.  
  306.  
  307.  
  308.         }
  309.     else
  310.         {
  311.             i=0;j=0;
  312.             while (i<*ntab)
  313.             {
  314.  
  315.                 if(table[i].info == NULL)
  316.                 {
  317.                     table[j]=table[i];
  318.                     j++;
  319.                 }
  320.                 i++;
  321.             }
  322.             j=i;
  323.         }
  324.    }
  325.  
  326.     table[i].key=key;
  327.     table[i].info=info;
  328.     table[i].release=rel;
  329.     *ntab=*ntab+1;
  330.  
  331.     return 1;
  332. }
  333.  
View raw paste Reply