Author: Not specified Language: text
Description: Not specified Timestamp: 2013-05-21 18:26:11 +0000
View raw paste Reply
  1. #include "stdafx.h"
  2.  
  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. } Item;
  13.  
  14. typedef struct Table
  15. {
  16.         Item mas[SIZE];
  17.         int busy;
  18.         FILE *filetab;
  19.         char *filename;
  20. } Table;
  21.  
  22. char *getStr();        
  23. int getInt();  
  24. int insert(Table *, int, char *);
  25. int delItem(Table *, int);             
  26. int find(Table *, int);
  27. void putTable(Table *);        
  28. void delTable(Table *);
  29.  
  30. int readFile(struct Table *ptab);
  31. void addFile(struct Table *, int , const char *);
  32. void saveFile(struct Table *);
  33.  
  34. const char *msgs[] = {"0. Quit", "1. Add", "2. Find", "3. Delete", "4. Show"};
  35. const int NMsgs = sizeof(msgs) / sizeof(msgs[0]);
  36.  
  37. int dialog(const char *msgs[], int);
  38. int D_Add(Table *),            
  39.         D_Find(Table *),               
  40.         D_Delete(Table *),     
  41.         D_Show(Table *);       
  42.  
  43. int (*fptr[])(Table *) = {NULL, D_Add, D_Find, D_Delete, D_Show};
  44.  
  45. int main()
  46. {
  47.         Table table = {NULL};
  48.         int rc;
  49.         puts("Enter name of file: ");
  50.         (table.filename)=getStr();
  51.         if(!readFile(&table))
  52.                 puts("Your data is damaged. File will be rewrited. \n");
  53.         while(rc = dialog(msgs, NMsgs))
  54.                 if(!fptr[rc](&table))
  55.                         break; 
  56.         saveFile(&table);
  57.         printf("That's all. Bye!\n");
  58.         delTable(&table);
  59.         return 0;
  60. }
  61.  
  62. int readFile(struct Table *ptab){
  63.         int key, len;
  64.         char *info;
  65.         if(ptab->filetab = (fopen(ptab->filename, "rb")))
  66.         {
  67.                 while(fread(&key, sizeof(int), 1, ptab->filetab)!=-1 && !feof(ptab->filetab))
  68.                 {
  69.                         if(fread(&len, sizeof(int), 1, ptab->filetab)==-1)
  70.                                 return 0;
  71.                         info = (char*)malloc(sizeof(char)*(len+1));
  72.                         if(fread(info, sizeof(char), len, ptab->filetab)!=len)
  73.                                 return 0;
  74.                         *(info + len) ='\0';
  75.                         insert(ptab, key, info);
  76.                 }
  77.                 fclose(ptab->filetab);
  78.         }
  79.         ptab->filetab=fopen(ptab->filename, "ab");
  80.         return 1;
  81. }
  82.  
  83. void saveFile(struct Table *ptab)
  84. {
  85.         int i;
  86.  
  87.         fclose(ptab->filetab);
  88.         ptab->filetab=fopen(ptab->filename,"wb+");
  89.         for(i=0; i<ptab->busy; i++)
  90.         {
  91.        
  92.                 addFile(ptab, ptab->mas[i].key, ptab->mas[i].info);
  93.         }
  94.         fclose(ptab->filetab);
  95. }
  96.  
  97. void addFile(struct Table *ptab, int key, const char *inf)
  98. {
  99.         int len=strlen(inf);
  100.         fwrite(&key,sizeof(int), 1, ptab->filetab);
  101.         fwrite(&len, sizeof(int), 1, ptab->filetab);
  102.         fwrite(inf, sizeof(char), len, ptab->filetab);
  103.        
  104. }
  105.  
  106.  
  107. int dialog(const char *msgs[], int N)
  108. {
  109.         char *errmsg = "";
  110.         int rc;
  111.         int i, n;
  112.  
  113.         do{
  114.                 puts(errmsg);
  115.                 errmsg = "You are wrong. Repeate, please!";
  116.  
  117.                 for(i = 0; i < N; ++i)
  118.                         puts(msgs[i]);
  119.                 puts("Make your choice: --> ");
  120.  
  121.                 rc = getInt();
  122.         } while(rc < 0 || rc >= N);
  123.  
  124.         return rc;
  125. }
  126.  
  127. void delTable(Table *ptab)
  128. {
  129.         int i;
  130.         for(i=0; i<ptab->busy; i++)
  131.                 free(ptab->mas[i].info);
  132. }
  133.  
  134. int getInt()
  135. {
  136.         int res;
  137.         while(!scanf("%d", &res))
  138.                 scanf("%*c");
  139.         scanf("%*c");
  140.         return res;
  141. }
  142.  
  143. char *getStr()
  144. {
  145.         char buf[21];
  146.         char *ptr=(char*)malloc(1);
  147.         int len=0, cutlen, n;
  148.         *ptr='\0';
  149.         do {
  150.                 n=scanf("%20[^\n]", buf);
  151.                 if(n<0)
  152.                 {
  153.                         free(ptr);
  154.                         ptr=NULL;
  155.                         continue;
  156.                 }
  157.                 if(n>0)
  158.                 {
  159.                         cutlen=strlen(buf);
  160.                         len+=cutlen;
  161.                         ptr=(char*)realloc(ptr,len+1);
  162.                         strcat(ptr, buf);
  163.                 }
  164.                 else
  165.                         scanf("%*c");
  166.         }while(n>0);
  167.         return ptr;
  168. }
  169.  
  170. int find(Table *ptab, int k)
  171. {
  172.         int j, i=0, m=ptab->busy-1;
  173.         while(i<=m)
  174.         {
  175.                 j=(m+i)/2;
  176.                 if(ptab->mas[j].key==k)
  177.                         return j;
  178.                 if(ptab->mas[j].key<k)
  179.                         i=j+1;
  180.                 else
  181.                         m=j-1;
  182.         }
  183.         return -1;
  184. }
  185.  
  186. int insert(Table *ptab, int k, char *info)
  187. {
  188.         int i;
  189.         if(find(ptab, k)!=-1)
  190.                 return 0;
  191.         if(ptab->busy==SIZE)
  192.                 return -1;
  193.         i=ptab->busy-1;
  194.         while(i>=0 && ptab->mas[i].key>k)
  195.         {
  196.                 ptab->mas[i+1]=ptab->mas[i];
  197.                 i=i-1;
  198.         }
  199.         ptab->mas[i+1].key=k;
  200.         ptab->mas[i+1].info=info;
  201.         ptab->busy=ptab->busy+1;
  202.         return 1;
  203. }
  204.  
  205. int D_Add(Table *ptab)
  206. {
  207.         int k, rc, n;
  208.         char *info = NULL;
  209.         puts("Enter key: -->");
  210.         do
  211.         {
  212.                 k = getInt();
  213.         }while(k<=0);
  214.         puts("Enter info:\n");
  215.         info = getStr();
  216.         if(info == NULL)
  217.                 return 0;
  218.  
  219.         rc = insert(ptab, k, info);
  220.        
  221.         if(rc && rc!=-1)
  222.                 puts("Ok\n");
  223.         else if(!rc)
  224.                 printf("Duplicate key: %d\n", k);
  225.         else
  226.                 puts("Table if full");
  227.         addFile(ptab, k, info);
  228.         return 1;
  229. }
  230.  
  231. int FindAndInsert(Table *ptab, int k1, int k2)
  232. {
  233.         Table newtab = {NULL};
  234.         int rc;
  235.         if(k1>k2)
  236.         {
  237.                 rc=k1;
  238.                 k1=k2;
  239.                 k2=rc;
  240.         }
  241.         while(k1<=k2)
  242.         {
  243.                 if((rc=find(ptab, k1))!=-1)
  244.                         insert(&newtab,ptab->mas[rc].key,ptab->mas[rc].info);
  245.                 k1++;
  246.         }
  247.         putTable(&newtab);
  248.         return 1;
  249. }
  250.  
  251. int D_Find(Table *ptab)
  252. {
  253.         int key1,key2, rc;
  254.         puts("Enter first key: ");
  255.         do
  256.         {
  257.                 key1 = getInt();
  258.         }while(key1<=0);
  259.         puts("Enter second key: ");
  260.         do
  261.         {
  262.                 key2 = getInt();
  263.         }while(key2<=0);
  264.         rc=FindAndInsert(ptab, key1, key2);
  265.         return 1;
  266. }
  267.  
  268. int D_Delete(Table *ptab)
  269. {
  270.         int k, rc;
  271.         puts("Enter key: -->");
  272.         do
  273.         {
  274.                 k = getInt();
  275.         }while(k<=0);
  276.         if((rc=find(ptab, k))==-1)
  277.         {
  278.                 puts("not found");
  279.                 return 1;
  280.         }
  281.         for(;rc<ptab->busy;rc++)
  282.                 ptab->mas[rc]=ptab->mas[rc+1];
  283.         ptab->busy=ptab->busy-1;
  284.         puts("OK");
  285.         return 1;
  286. }
  287.  
  288. void putTable(Table *ptab)
  289. {
  290.         int i;
  291.         for(i=0; i<ptab->busy; i++)
  292.                 printf("Key: %d. Info: %s\n",ptab->mas[i].key, ptab->mas[i].info);
  293.         if(!i)
  294.                 puts("Empty table");
  295. }
  296.  
  297. int D_Show(Table *ptab)
  298. {
  299.         putTable(ptab);
  300.         return 1;
  301. }
  302.  
  303.  
View raw paste Reply