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