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