Author: Not specified Language: text
Description: Not specified Timestamp: 2013-05-21 18:27:46 +0000
View raw paste Reply
  1.  
  2. #include "stdafx.h"
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <malloc.h>
  6.  
  7. const int SIZE = 10;
  8. typedef struct Item
  9. {      
  10.         int key;
  11.         char *info;
  12. };
  13.  
  14. typedef struct Table
  15. {
  16.         Item mas[SIZE];
  17.         int busy;
  18. };
  19.  
  20. char *getStr();        
  21. int getInt();  
  22. int insert(Table *, int, char *);
  23. int delItem(Table *, int);             
  24. int find(Table, int);
  25. void putTable(Table);          
  26. void delTable(Table *);
  27.  
  28. const char *msgs[] = {"0. Quit", "1. Add", "2. Find", "3. Delete", "4. Show"};
  29. const int NMsgs = sizeof(msgs) / sizeof(msgs[0]);
  30.  
  31. int dialog(const char *msgs[], int);
  32. int D_Add(Table *),            
  33.         D_Find(Table *),               
  34.         D_Delete(Table *),     
  35.         D_Show(Table *);       
  36.  
  37. int (*fptr[])(Table *) = {NULL, D_Add, D_Find, D_Delete, D_Show};
  38.  
  39. int main()
  40. {
  41.         Table table = {NULL};
  42.         int rc;
  43.         while(rc = dialog(msgs, NMsgs))
  44.                 if(!fptr[rc](&table))
  45.                         break; 
  46.         printf("That's all. Bye!\n");
  47.         delTable(&table);
  48.         return 0;
  49. }
  50.  
  51. int dialog(const char *msgs[], int N)
  52. {
  53.         char *errmsg = "";
  54.         int rc;
  55.         int i, n;
  56.  
  57.         do{
  58.                 puts(errmsg);
  59.                 errmsg = "You are wrong. Repeate, please!";
  60.  
  61.                 for(i = 0; i < N; ++i)
  62.                         puts(msgs[i]);
  63.                 puts("Make your choice: --> ");
  64.  
  65.                 rc = getInt();
  66.         } while(rc < 0 || rc >= N);
  67.  
  68.         return rc;
  69. }
  70.  
  71. void delTable(Table *ptab)
  72. {
  73.         int i;
  74.         for(i=0; i<ptab->busy; i++)
  75.                 free(ptab->mas[i].info);
  76. }
  77.  
  78. int getInt()
  79. {
  80.         int res;
  81.         while(!scanf("%d", &res))
  82.                 scanf("%*c");
  83.         scanf("%*c");
  84.         return res;
  85. }
  86.  
  87. char *getStr()
  88. {
  89.         char buf[21];
  90.         char *ptr=(char*)malloc(1);
  91.         int len=0, cutlen, n;
  92.         *ptr='\0';
  93.         do {
  94.                 n=scanf("%20[^\n]", buf);
  95.                 if(n<0)
  96.                 {
  97.                         free(ptr);
  98.                         ptr=NULL;
  99.                         continue;
  100.                 }
  101.                 if(n>0)
  102.                 {
  103.                         cutlen=strlen(buf);
  104.                         len+=cutlen;
  105.                         ptr=(char*)realloc(ptr,len+1);
  106.                         strcat(ptr, buf);
  107.                 }
  108.                 else
  109.                         scanf("%*c");
  110.         }while(n>0);
  111.         return ptr;
  112. }
  113.  
  114. int find(Table *ptab, int k)
  115. {
  116.         int j, i=0, m=ptab->busy-1;
  117.         while(i<=m)
  118.         {
  119.                 j=(m+i)/2;
  120.                 if(ptab->mas[j].key==k)
  121.                         return j;
  122.                 if(ptab->mas[j].key<k)
  123.                         i=j+1;
  124.                 else
  125.                         m=j-1;
  126.         }
  127.         return -1;
  128. }
  129.  
  130. int insert(Table *ptab, int k, char *info)
  131. {
  132.         int i;
  133.         if(find(ptab, k)!=-1)
  134.                 return 0;
  135.         if(ptab->busy==SIZE)
  136.                 return -1;
  137.         i=ptab->busy-1;
  138.         while(i>=0 && ptab->mas[i].key>k)
  139.         {
  140.                 ptab->mas[i+1]=ptab->mas[i];
  141.                 i=i-1;
  142.         }
  143.         ptab->mas[i+1].key=k;
  144.         ptab->mas[i+1].info=info;
  145.         ptab->busy=ptab->busy+1;
  146.         return 1;
  147. }
  148.  
  149. int D_Add(Table *ptab)
  150. {
  151.         int k, rc, n;
  152.         char *info = NULL;
  153.         puts("Enter key: -->");
  154.         do
  155.         {
  156.                 k = getInt();
  157.         }while(k<=0);
  158.         puts("Enter info:");
  159.         info = getStr();
  160.         if(info == NULL)
  161.                 return 0;
  162.  
  163.         rc = insert(ptab, k, info);
  164.        
  165.         if(rc && rc!=-1)
  166.                 puts("Ok\n");
  167.         else if(!rc)
  168.                 printf("Duplicate key: %d\n", k);
  169.         else
  170.                 puts("Table if full");
  171.         return 1;
  172. }
  173.  
  174. int FindAndInsert(Table *ptab, int k1, int k2)
  175. {
  176.         Table newtab = {NULL};
  177.         int rc;
  178.         if(k1>k2)
  179.         {
  180.                 rc=k1;
  181.                 k1=k2;
  182.                 k2=rc;
  183.         }
  184.         while(k1<=k2)
  185.         {
  186.                 if((rc=find(ptab, k1))!=-1)
  187.                         insert(&newtab,ptab->mas[rc].key,ptab->mas[rc].info);
  188.                 k1++;
  189.         }
  190.         putTable(newtab);
  191.         return 1;
  192. }
  193.  
  194. int D_Find(Table *ptab)
  195. {
  196.         int key1,key2, rc;
  197.         puts("Enter first key: ");
  198.         do
  199.         {
  200.                 key1 = getInt();
  201.         }while(key1<=0);
  202.         puts("Enter second key: ");
  203.         do
  204.         {
  205.                 key2 = getInt();
  206.         }while(key2<=0);
  207.         rc=FindAndInsert(ptab, key1, key2);
  208.         return 1;
  209. }
  210.  
  211. int D_Delete(Table *ptab)
  212. {
  213.         int k, rc;
  214.         puts("Enter key: -->");
  215.         do
  216.         {
  217.                 k = getInt();
  218.         }while(k<=0);
  219.         if((rc=find(ptab, k))==-1)
  220.         {
  221.                 puts("not found");
  222.                 return 1;
  223.         }
  224.         for(;rc<ptab->busy;rc++)
  225.                 ptab->mas[rc]=ptab->mas[rc+1];
  226.         ptab->busy=ptab->busy-1;
  227.         puts("OK");
  228.         return 1;
  229. }
  230.  
  231. void putTable(Table ptab)
  232. {
  233.         int i;
  234.         for(i=0; i<ptab.busy; i++)
  235.                 printf("Key: %d. Info: %s\n",ptab.mas[i].key, ptab.mas[i].info);
  236.         if(!i)
  237.                 puts("Empty table");
  238. }
  239.  
  240. int D_Show(Table *ptab)
  241. {
  242.         putTable(*ptab);
  243.         return 1;
  244. }
View raw paste Reply