Author: Not specified Language: c
Description: Not specified Timestamp: 2013-05-26 16:31:59 +0000
View raw paste Reply
  1. //#include <locale>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. //#include <iostream>
  7. //using namespace std;
  8.                                                                                                                                                                                      
  9. void AddElement(void);
  10. void DelElement(void);
  11. void SearchRange(void);
  12. void OutTable(void);
  13. void Exit(void);
  14. int GetNum(void);
  15. const int   SIZE = 10;
  16. typedef struct Item
  17. {
  18.    int      key;      //???? ????????
  19.    char   *info;      //????????? ?? ??????????
  20.    Item   *next;      //????????? ?? ????. ???????
  21. }ITEM;
  22. char *mesMain[] =      //????????? ????
  23. {
  24.    "Vkluchit noviy element",
  25.    "Ydalit element",
  26.    "Naiti element iz diapozona kluchey",
  27.    "Vivesti tablicy",
  28.    "Vixod"
  29. };
  30. //?????????? ??????? ????
  31. int MesMainCount = sizeof( mesMain ) / sizeof( mesMain[0] );
  32. //??????? ????????? ??????? ????
  33. void ( *funcMain[] )()={AddElement,
  34.                   DelElement,
  35.                   SearchRange,
  36.                   OutTable,
  37.                   Exit};
  38. ITEM   *table[SIZE];   //???????-??????
  39. //????? ???????? ? ?????, ???? ????????
  40. //?????????? ??? ?????????? ?????? ????????
  41. //?????????: ???? ? ????? ????????? ? ??????? next, ???? ??????? ????? ???????
  42. //??? NULL, ???? ??????? ?????
  43. //?????????? true, ???? ??????? ?????? ? false, ???? ?? ??????
  44. bool Find(int num, ITEM **ppItem)
  45. {
  46.    ITEM   *pItem;
  47.    int      i = num%SIZE;   //??????? ??????????? - ??????? ?? ??????? ?? SIZE=10
  48.                      //????????? - ??????????? ????
  49.    
  50.    //??????, ???? ?? ??? ???????? ????
  51.    //*ppItem ? ????? ????? ????????? ?? ?????????? ????????? ???????,
  52.    //????? ???????? ?? ??????? ?????
  53.    for (*ppItem=NULL,pItem=table[i]; pItem!=NULL; pItem=pItem->next)
  54.    {
  55.       *ppItem = pItem;   //?????????? ????????? ??????????? ??????????
  56.       //???? ??????? ????
  57.       if (pItem->key == num)   //???? ?????!
  58.          return true;   //???????
  59.    }
  60.    return false;         //?? ?????, ? *ppItem ????? ????????? ?????????? (??? NULL)
  61. }
  62. //????? ?? ???? ??????? ????????? ? ?????? ? ???????? ????????? [min, max]
  63. //??? ??????? ?????? ?????????? ?????? *idx = -1
  64. //????? ??????? ?????? ?? ???? ??????? ????? ???????????? ?????? ? ??????? ? ?????
  65. //???????????????? ??????? ????????.
  66. //????????? ????? ????? ????????? ? ???? ?? ?????.
  67. //?.?., ????? ????? ??? ???????? ? ?????
  68. bool FindRange(int min, int max, int *idx, ITEM **ppItem)
  69. {
  70.    ITEM   *pItem;
  71.    int      i;
  72.    if (min > max)      //?? ?????? ??????, ???????? min < max
  73.    {
  74.       i = min;
  75.       min = max;
  76.       max = i;
  77.    }
  78.    if (*idx == -1)      //?????? ??????
  79.    {
  80.       i = 0;         //???????? ? 0-?? ???????
  81.       pItem=table[0];
  82.    }
  83.    else            //??????????? ??????
  84.    {
  85.       i = *idx;      //??????
  86.       pItem = (*ppItem)->next;   //????????? ?? ????????????!
  87.    }
  88.    while (i<SIZE)      //?? ???? ???????
  89.    {
  90.       for(; pItem; pItem=pItem->next)   //?? ????????? ????? ???????
  91.       {
  92.          //????????? ??????? ????????? ????? ? ????????
  93.          if ((pItem->key >= min) && (pItem->key <= max))
  94.          {                     //?????
  95.             *idx = i;            //????????? ??????
  96.             *ppItem = pItem;      //? ????????? ?? ???????
  97.             return true;         //?????!
  98.          }
  99.       }
  100.       pItem=table[++i];            //?? ?????? ??????? ????????? ???????
  101.                               //??? ????????? ????? ?????????????? ?????
  102.                               //?? ?? ?????? ?? while(i<SIZE) !
  103.    }
  104.    return false;                  //?????? ???
  105. }
  106. //?????????? ???????? ? ???????
  107. void AddElement()
  108. {
  109.    int      num;      //?????? ?????? ????????
  110.    char   str[80];
  111.    ITEM   *pItem;      //????????? ?? ??????? ???????
  112.    ITEM   *pItemPrev;   //????????? ?? ???????, ????? ???????? ???????
  113.    printf("Vvedite kluch elementa: ");
  114.    num = GetNum();      //?????? ????
  115.    if(Find(num, &pItemPrev))
  116.    {
  117.       printf("Element s takim kluchom yze est\n");
  118.       return;
  119.    }
  120.    pItem = (ITEM *) malloc(SIZE * sizeof(ITEM));
  121.    //pItem = new ITEM;            //??????? ????? ???????
  122.                            //????????? ????
  123.    pItem->key = num;            //????
  124.    pItem->next = NULL;            //??????? ?????????? ???????? ? ???????
  125.    printf("Vvedite stroku: ");
  126.    //cin.ignore();
  127.    //scanf("%[^\n]");
  128.    //cin.getline(str, 80);
  129.    //scanf("%80s%[^\n]", str);
  130.    gets(str);
  131.    gets(str);
  132.    pItem->info = (char *) malloc(strlen(str)+1 * sizeof(char));
  133.    //pItem->info = new char[strlen(str)+1];
  134.    strcpy(pItem->info, str);      //????????? ??????
  135.                            //??????????? ?? ??????? ?? ??? ???????
  136.    if (pItemPrev != NULL)         //???? ??????????? ?? ? ?????? ???????
  137.       pItemPrev->next = pItem;   //?? ?????????? ????? ?? ???? ?????????
  138.    else
  139.       table[num%SIZE] = pItem;   //???? ?????? ???????, ?? ?????????? ?????? ? ??????? table
  140.    printf("Element dobavlen\n");
  141. }
  142. //????? ????????? ?? ????????? ??????
  143. void SearchRange()
  144. {
  145.    int      i = -1;            //??? ?????? ? ?????? ???????
  146.    ITEM   *pItem;
  147.    int      count, min, max;
  148.    printf("min key: ");
  149.    min = GetNum();      //?????? ????
  150.    printf("max key: ");
  151.    max = GetNum();      //?????? ????
  152.    
  153.    count = 0;         //?????????, ????? ?????????? ????? ??? ???
  154.    while (FindRange(min, max, &i, &pItem))
  155.    {                     //???????
  156.       printf("key = %d, info = %s\n", pItem->key, pItem->info);
  157.       count++;                           //???????
  158.    }
  159.    if (0==count)               //??????? ?????????, ???? ?? ?????
  160.       printf("Elementi ne naudeni\n");
  161. }
  162. //???????? ???????? ? ???????? ??????
  163. void DelElement()
  164. {
  165.    int      i, num;
  166.    ITEM   *pItemPrev, *pItem, *pItemNext;
  167.    printf("Vvedite kluch: ");
  168.    num = GetNum();      //?????? ????
  169.    i = num%SIZE;      //??????? ??????????? - ??????? ?? ??????? ?? SIZE=10
  170.                   //????????? - ??????????? ????
  171.    //?? ???? ????????? ??????? ??? ???????????? ?????
  172.    for (pItemPrev=NULL,pItem=table[i]; pItem; pItem=pItemNext)
  173.    {
  174.       pItemNext = pItem->next;      //????????? ?? ??????????
  175.       //?????????? ????
  176.       if (pItem->key == num)
  177.       {                        //??????? ??????? ?? ??????? ??????????
  178.          if (pItemPrev == NULL)      //?????? ??????? ? ????????
  179.             table[i] = pItemNext;   //????? ? ?????? table ????? ??????????
  180.          else                  //?????, ?????????? ?????????
  181.             pItemPrev->next = pItemNext;   //?? ??????????
  182.          delete [] pItem->info;      //??????? ??????
  183.          delete pItem;            //? ??? ???????
  184.          printf("Element ydalen\n");
  185.          return;
  186.       }
  187.       pItemPrev=pItem;            //???????? ????????? ?? ?????????? ???????
  188.    }
  189.    //?????? ??? ???????, ?????? ?? ?????
  190.    printf("Element ne nauden\n");
  191. }
  192. //????? ???? ???????
  193. void OutTable()
  194. {
  195.    int      i, count = 0;   //????????? ????? ?????????
  196.    ITEM   *pItem;
  197.    for(i=0; i<SIZE; i++)   //?? ???? ????????? ???????
  198.    {
  199.       //?? ???? ????????? ???????
  200.       for (pItem = table[i]; pItem; pItem=pItem->next)
  201.       {
  202.                  printf("key = %d, info = %s\n", pItem->key, pItem->info);
  203.          count++;
  204.       }
  205.    }
  206.    if (0 == count)         //????????? ??? ?????? ???????
  207.       printf("Tablica pysta\n");
  208. }
  209. //?????, ?????? ??? ????????
  210. void Exit()
  211. {
  212.    ITEM   *pItem, *pItemNext;
  213.    for (int i=0; i<SIZE; i++)
  214.    {
  215.       for (pItem=table[i]; pItem; pItem=pItemNext)
  216.       {
  217.          pItemNext = pItem->next;      //???????? ???????? ?? ??????????
  218.          delete [] pItem->info;         //??????? ????????
  219.          delete pItem;
  220.       }
  221.    }
  222. }
  223. //???? ?????
  224. int GetNum()
  225. {
  226.    int      a;
  227.    bool b = false;
  228.    scanf("%d", &a);
  229.    while ( !b ) // !( cin.good() || cin.eof() ) || ( a < 0 )
  230.    {
  231.           if (a > 0)
  232.           {
  233.                   b = true;
  234.                   break;
  235.           }
  236.           printf( "Vvedite chislo!\n ");
  237.       //cin.clear();
  238.       //cin.ignore();
  239.       scanf("%d", &a);
  240.    }
  241.    return a;
  242. }
  243. //????? ???? ? ?????? ?????? ??????
  244. int ViewMenu(char** mes, int max)
  245. {
  246.    int ret, i;
  247.    do
  248.    {
  249.       //????
  250.       for ( i = 0; i < max; i++ )
  251.                  printf("%d. %s\n", i+1, mes[i]);
  252.       printf( "Vash vibor: ");
  253.       //?????? ?????
  254.       ret = GetNum();
  255.    }
  256.    //???????? ?? ????????????
  257.    while ( ret < 1 || ret > max );
  258.    //?????? ????? ??????
  259.    return ret;
  260. }
  261. int main()
  262. {
  263.    int ret;
  264.    //system("chcp 1251 >> nul");
  265. //    locale::global(locale("Russian_Russia.866")); //????? ???????? ??-??????
  266.    do
  267.    {
  268.       ret = ViewMenu(mesMain, MesMainCount);   //??????? ????, ?????? ????? ??????
  269.       funcMain[ret-1]();                  //???????????? ????? ????
  270.       printf("--------------------------------\n");
  271.       if (ret == MesMainCount)            //????????? - ?????
  272.          break;
  273.    }
  274.    while ( ret );
  275.    return 0;
  276. }
View raw paste Reply