Advertisement
fabis_sparks

LenaKurs_pureC

May 23rd, 2017
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.25 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <stdlib.h>
  6. #include <locale>
  7. // Задаём стуктуру для данных
  8. typedef struct {
  9.     char
  10.         name[15],
  11.         firstname[15],
  12.         year[15],
  13.         phone[15],
  14.         mail[30];
  15. } adbook;
  16.  
  17. typedef struct {
  18.     adbook* list;
  19.     unsigned count;
  20. } database;
  21.  
  22. void adddatabase(database &db); // Добавим человека в бд
  23.  
  24. void readdarabase(database &db); // Чтение БД из файла
  25.  
  26. void showdatabase(database &db); // Вывод БД на экран
  27.  
  28. void editdatebase(database &db); // Редактируем БД
  29.  
  30. void deletedatabase(database &db); // Удаляем конкретного человека из бд
  31.  
  32. void searchman(database &db); // Поиск по бд по фамилии
  33.  
  34. void writedatabase(database &db); // Сохраняем БД на диск
  35.  
  36. void sortDb(database &db); // Сортируем бд
  37.  
  38.  
  39. int main()
  40. {
  41.     setlocale(LC_ALL, "Russian"); // Установим русскую кодировку для отображения
  42.     database db;
  43.     int a, b; // счетчики для case
  44.     db.list = NULL;
  45.     db.count = 0;
  46.     do
  47.     { // Выбираем как действовать
  48.         printf("\n1 - создать новую базу данных\n2 - открыть существующую\n3 - выход\n");
  49.         scanf("%d", &a);
  50.         switch (a)
  51.         {
  52.         case 1: adddatabase(db); break;
  53.         case 2: readdarabase(db); break;
  54.         case 3: exit(0);
  55.         }
  56.     } while (a < 0 || a > 3);
  57.     do
  58.     {
  59.         printf("1 - Посмотреть базу данных\n2 - редактировать данные\n3 - добавить\n4 - удалить человека полностью\n5 - Сохранить\n6 - Поиск\n7 - Выход\n");
  60.         scanf("%d", &b);
  61.         switch (b)
  62.         { // брейк для выхода из кейса после вызова функции
  63.         case 1: showdatabase(db); b = 0; break;
  64.         case 2: editdatebase(db); b = 0; break;
  65.         case 3: adddatabase(db); b = 0; break;
  66.         case 4: deletedatabase(db); b = 0; break;
  67.         case 5: writedatabase(db); b = 0; break;
  68.         case 6: searchman(db); b = 0;
  69.  
  70.         }
  71.     } while (b != 7);
  72.     free(db.list); // освобождаем память
  73.     return 0;
  74. }
  75.  
  76. void adddatabase(database &db)
  77. {
  78.     printf("\nВведите кол-во студентов:\n");
  79.     int n;
  80.     scanf("%d", &n);
  81.     if ((db.list = (adbook *)realloc(db.list, (n + db.count) * sizeof(adbook))) == NULL) // Проверяем выделилась ли память
  82.     {
  83.         printf("невозможно выделить память");
  84.         exit(0);
  85.     }
  86.     for (int i = db.count; i < (n + db.count); i++)
  87.     {
  88.         printf("Фамилия: ");
  89.         scanf("%s", db.list[i].name);
  90.         printf("Имя: ");
  91.         scanf("%s", db.list[i].firstname);
  92.         printf("Год рождения: ");
  93.         scanf("%s", db.list[i].year);
  94.         printf("Номер телефона: ");
  95.         scanf("%s", db.list[i].phone);
  96.         printf("Почта: ");
  97.         scanf("%s", db.list[i].mail);
  98.         printf("_____________________\n");
  99.     }
  100.     db.count += n;
  101. }
  102.  
  103. void readdarabase(database &db)
  104. {
  105.     FILE *f = fopen("database.txt", "r"); // Открываем файл для чтения
  106.     db.count = 0;
  107.     unsigned size;
  108.     fseek(f, 0, SEEK_END); // Получаем верный размер файла
  109.     size = ftell(f); //присваиваем данные о размере
  110.     db.count = size / sizeof(adbook); // определяем количество записей
  111.     fseek(f, 0, SEEK_SET);
  112.     if (!(db.list = (adbook *)malloc(size)))
  113.     { // Проверяем выделилась ли память
  114.         printf("невозможно выделить память");
  115.         exit(0);
  116.     }
  117.     for (int i = 0; i < db.count; i++)
  118.     {
  119.         fread(&db.list[i], sizeof(adbook), 1, f); // считываем из файла  в структуру
  120.     }
  121.     fclose(f);
  122. }
  123.  
  124.  
  125. void showdatabase(database &db)
  126. {
  127.     int i = 0;
  128.     sortDb(db); // Сортируем БД перед выводом на экран
  129.     while (i < db.count)
  130.     { // выводим бд пока не закончатся записи
  131.         printf("%s|%s|%s|%s|%s|\n", &db.list[i].name, &db.list[i].firstname, &db.list[i].year, &db.list[i].phone, &db.list[i].mail);
  132.         printf("_________________________________________________\n");
  133.         i++;
  134.     }
  135. }
  136.  
  137.  
  138. void editdatebase(database &db)
  139. {
  140.     char name[24];
  141.     int b;
  142.     printf("Введите фамилию для редактирования\n");
  143.     scanf("%s", name);
  144.     for (int i = 0; i < db.count; ++i)
  145.     {
  146.         if ((strcmp(name, db.list[i].name)) == 0) // Найдём то, что будет редактировать
  147.         {
  148.             do
  149.             {
  150.                 printf("что менять?\n1 - Имя\n2 - Год рождения\n3 - Телефон\n4 - Почта\n5 - назад\n");
  151.                 scanf("%d", &b);
  152.                 switch (b)
  153.                 {
  154.                 case 1:
  155.                     printf("Имя: ");
  156.                     scanf("%s", db.list[i].firstname);
  157.                     break;
  158.                 case 2:
  159.                     printf("Год рождения: ");
  160.                     scanf("%s", db.list[i].year);
  161.                     break;
  162.                 case 3:
  163.                     printf("Телефон: ");
  164.                     scanf("%s", db.list[i].phone);
  165.                     break;
  166.                 case 4:
  167.                     printf("Почта: ");
  168.                     scanf("%s", db.list[i].mail);
  169.                     break;
  170.                 }
  171.             } while (b < 0 || b > 4);
  172.         }
  173.     } // Если не найдём, то скажем об этом
  174.     printf("Нет такого человека в базе данных\n");
  175. }
  176.  
  177. void searchman(database &db)  // Поиск человека в базе по фамилии
  178. {
  179.     char name[24];
  180.     printf("Введите фамилию для поиска:\n");
  181.     scanf("%s", name); // введём фамилию для поиска
  182.     for (int i = 0; i < db.count; i++)
  183.     {
  184.         if ((strcmp(name, db.list[i].name)) == 0)
  185.         { // Если найден человек, то выводим
  186.             printf("%s|%s|%s|%s|%s|\n", db.list[i].name, db.list[i].firstname, db.list[i].year, db.list[i].phone, db.list[i].mail);
  187.             break;
  188.         }
  189.         else if ((strcmp(name, db.list[i].name)) != 0)  printf("нет такого человека\n");
  190.  
  191.     }
  192. }
  193.  
  194. void deletedatabase(database &db)
  195. {
  196.     char name[24];
  197.     printf("Введите фамилию для удаления:\n");
  198.     scanf("%s", name);
  199.     for (int i = 0; i < db.count; i++)
  200.     { // Удаляем человека по фамилии. После удаления перераспределим память
  201.         if ((strcmp(name, db.list[i].name)) == 0)
  202.         {
  203.             db.list[i] = db.list[i + 1];
  204.             db.list = (adbook *)realloc(db.list, sizeof(adbook) * (--db.count));
  205.             return;
  206.         }
  207.     }
  208.     printf("нет такого человека\n");
  209. }
  210.  
  211. void writedatabase(database &db)
  212. {
  213.     FILE *f;
  214.     int i = 0;
  215.     f = fopen("database.txt", "w"); // открываем файл для записи
  216.     while (i < db.count)
  217.     { // запишем данные из структуры в файл
  218.         fwrite(&db.list[i], sizeof(adbook), 1, f);
  219.         i++;
  220.     }
  221.     fclose(f);
  222. }
  223.  
  224.  
  225. void sortDb(database &db)
  226. {
  227.     adbook cur;
  228.     //Отсортируем Бд по фамилии
  229.     int k;
  230.     for (int i = 0; i < (db.count - 1); ++i)
  231.     {
  232.         for (int j = (i + 1); j < db.count; ++j)
  233.         {
  234.             k = 0;
  235.             if (db.list[i].name != db.list[j].name)
  236.             {
  237.                 while (db.list[i].name[k] == db.list[j].name[k]) k++;
  238.                 if (db.list[i].name[k] > db.list[j].name[k])
  239.                 {
  240.                     cur = db.list[i];
  241.                     db.list[i] = db.list[j];
  242.                     db.list[j] = cur;
  243.  
  244.                 }
  245.             }
  246.         }
  247.     }
  248. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement