Сортировка базы данных - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, есть база данных, которая полностью рабочая, ода только проблема не понимаю, как к ней дописать сортировку, если у кого есть идеи или кто знает, как можно сделать буду признателен.
Листинг программы
  1. #include "stdafx.h"
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include <io.h>
  6. #define M [10];
  7. #ifndef _lab11_cpp
  8. #define _lab11_cpp
  9. typedef struct TExport
  10. {
  11. char name_tov[50];
  12. char kor_opis[50];
  13. char country[50];
  14. float rubl;
  15. }str;
  16. //----------------------------------------
  17. //Прототипы функция
  18. int create(char *name);//Создание базы данных
  19. int add(char *name);//Новый товар
  20. int print(char *name);//Показать базу данных
  21. int find(char *name, char *tovar);//нахождение элемента
  22. int del(char *name, int k);//удаление
  23. int change(char *name, int n);//Изменение товара
  24. void displayE(str E);
  25. void input(str *pE);
  26. int displayN(char *name, int n);
  27. void sort();//сортировка по алфавиту
  28. //-----------------------------------------
  29. int _tmain(int argc, _TCHAR* argv[])
  30. {
  31.  
  32. char number M;
  33. char name[] = "D:\\base.dat";
  34. int k, n;
  35. char tovar[20];
  36. while(1)
  37. {
  38. printf("\n\t1.Create newbase\n");
  39. printf("\n\t2.Add new tovar\n");
  40. printf("\n\t3.Delete tovar\n");
  41. printf("\n\t4.Find tovar\n");
  42. printf("\n\t5.Change tovar\n");
  43. printf("\n\t6.Sort tovar\n");
  44. printf("\n\t7.Show all tovar\n");
  45. printf("\n\t8.End work\n");
  46. //Обработка номера команды
  47. printf("\n\nEnter number of operation\t");
  48. scanf("%s", number);
  49. switch(number[0])
  50. {
  51. case '1' :
  52. create(name);
  53. break;
  54. case '2' :
  55. add(name);
  56. break;
  57. case '3' :
  58. printf("\n Delete according to the name_tov \n");
  59. printf("\n Enter the name_tov: \t");
  60. scanf("%s", tovar);
  61. k = find(name, tovar);
  62. if(k > 0)
  63. del(name, k);
  64. break;
  65. case '4' :
  66. printf("\n Find according to the name_tov \n");
  67. printf("\n Enter the name_tov: \t");
  68. scanf("%s", tovar);
  69. n = find(name, tovar);
  70. if(n > 0)
  71. displayN(name, n);
  72. break;
  73. case '5' :
  74. printf("\n Change according to the name_tov \n");
  75. printf("\n Enter the name_tov: \t");
  76. scanf("%s", tovar);
  77. k = find(name, tovar);
  78. if(k > 0)
  79. change(name, k);
  80. break;
  81. case '7' :
  82. print(name);
  83. break;
  84. case '6' :
  85. break;
  86. case '8' :
  87. return 0;
  88. default :
  89. printf("\nNumber is not correct\n");
  90. }
  91. }
  92. return 0;
  93. }
  94. int create(char *name)
  95. {
  96. FILE*f;
  97. str a;
  98. int i, n;
  99. if ((f = fopen(name, "w"))== NULL)
  100. {
  101. printf("Error %s\n", name);
  102. return 1;
  103. }
  104. printf("\nHow much elements in database? = \t");
  105. scanf("%d", &n);
  106. for(i = 0; i < n; i++);
  107. {
  108. input(&a);
  109. fwrite(&a, sizeof(str), 1, f);
  110. }
  111. fclose(f);
  112. return 0;
  113.  
  114. }
  115. void displayE(str E)
  116. {
  117. printf("\nName_tov: %s\n", E.name_tov);
  118. printf("\nDescription: %s\n", E.kor_opis);
  119. printf("\nCountry: %s\n", E.country);
  120. printf("\nRubl: %f\n", E.rubl);
  121. }
  122. void input(str *pE)
  123. {
  124. printf("\nName_tov: ");
  125. scanf("%s", pE->name_tov);
  126. printf("\nDescription: ");
  127. scanf("%s", pE->kor_opis);
  128. printf("\nCountry: ");
  129. scanf("%s", pE->country);
  130. printf("\nRubl: ");
  131. scanf("%f", &pE->rubl);
  132. }
  133. int print(char *name)
  134. {
  135. FILE*f;
  136. str a;
  137. if ((f = fopen(name, "r"))== NULL)
  138. {
  139. printf("Error %s\n", name);
  140. return 1;
  141. }
  142. while(!feof(f))
  143. {
  144. fread(&a, sizeof(str), 1, f);
  145. if(!feof(f))
  146. displayE(a);
  147. }
  148. fclose(f);
  149. return 0;
  150. }
  151. int find(char *name, char *tovar)
  152. {
  153. FILE*f;
  154. str a;
  155. int i = 0;
  156. if ((f = fopen(name, "r"))== NULL)
  157. {
  158. printf("Error %s\n", name);
  159. return -1;
  160. }
  161. while(!feof(f))
  162. {
  163. fread(&a, sizeof(str), 1, f);
  164. if(!feof(f))
  165. {
  166. if(strcmp(a.name_tov, tovar) == 0)
  167. {
  168. fclose(f);
  169. return i+1;
  170. }
  171. i++;
  172. }
  173.  
  174. }
  175. fclose(f);
  176. return 0;
  177. }
  178. int add(char *name)
  179. {
  180. FILE*f;
  181. str a;
  182. int i, n;
  183. if ((f = fopen(name, "r+"))== NULL)
  184. {
  185. printf("Error %s\n", name);
  186. return 1;
  187. }
  188. input(&a);
  189. fseek(f , 0, SEEK_END);
  190. fwrite(&a, sizeof(str), 1, f);
  191. fclose(f);
  192. return 0;
  193. }
  194. int displayN(char *name, int n)
  195. {
  196. FILE*f;
  197. str a;
  198. int i;
  199. if ((f = fopen(name, "r+"))== NULL)
  200. {
  201. printf("Error %s\n", name);
  202. return 1;
  203. }
  204. fseek(f, (n-1)*sizeof(str), SEEK_SET);
  205. fread(&a, sizeof(str), 1, f);
  206. displayE(a);
  207. fclose(f);
  208. return 0;
  209. }
  210. int change(char *name, int n)
  211. {
  212. FILE*f;
  213. str a;
  214. int i = n;
  215. if ((f = fopen(name, "r+"))== NULL)
  216. {
  217. printf("Error %s\n", name);
  218. return 1;
  219. }
  220. displayN(name, n);
  221. input(&a);
  222. fseek(f, (n-1)*sizeof(str), SEEK_SET);
  223. fwrite(&a, sizeof(str), 1, f);
  224. fclose(f);
  225. return 0;
  226. }
  227. int del(char *name, int k)
  228. {
  229. FILE*f;
  230. int i;
  231. long int n;
  232. str a;
  233. if ((f = fopen(name, "r+")) == NULL)
  234. {
  235. printf("Error %s\n", name);
  236. return 1;
  237. }
  238. n = filelength(fileno(f)) / sizeof(str);
  239. if((k > n) || (k < 0))
  240. {
  241. printf("Not found %d \n", k);
  242. fclose(f);
  243. return 2;
  244. }
  245. for(i = k; i < n; i++)
  246. {
  247. fseek(f, i*sizeof(str), SEEK_SET);
  248. fread(&a, sizeof(str), 1, f);
  249. fseek(f, (i-1)*sizeof(str), SEEK_SET);
  250. fwrite(&a, sizeof(str), 1, f);
  251. }
  252. chsize(fileno(f), filelength(fileno(f)) - sizeof(str));
  253. fclose(f);
  254. return 0;
  255. }
  256. #endif

Решение задачи: «Сортировка базы данных»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. typedef struct TExample
  6. {   char *info;
  7.     int num;
  8. } TExample;
  9.  
  10. void SetExample (TExample *example, char *info, int num)
  11. {   example->info = (char *) malloc (strlen (info) + 1);
  12.     strcpy (example -> info, info);
  13.     example->num = num;
  14. }
  15.  
  16. void DeleteExample (TExample *example)
  17. {   free (example->info);
  18.     free (example);
  19. }
  20.  
  21. TExample **CreateArray (int N)
  22. {   TExample **arr = (TExample**) malloc (N * sizeof (TExample*));
  23.     for (int i = 0; i<N; i++)
  24.         arr[i] = (TExample*) malloc (sizeof (TExample));
  25.     return arr;
  26. }
  27.  
  28. void DeleteArray (TExample **arr, int N)
  29. {   for (int i = 0; i<N; i++)
  30.         DeleteExample (arr[i]);
  31.     free (arr);
  32. }
  33.  
  34. void PrintArray (TExample **arr, int N)
  35. {   for (int i = 0; i<N; i++)
  36.         printf("%-20s%5d\n", arr[i]->info, arr[i]->num);
  37. }
  38.  
  39. void Swap (TExample *a, TExample *b)
  40. {   TExample temp = *a;
  41.     *a = *b;
  42.     *b = temp;
  43. }
  44.  
  45.  
  46. void SortArray (TExample **arr, int N)
  47. {   int i,j;
  48.     for (i = 0; i<N-1; i++)
  49.         for (j = i+1; j<N; j++)
  50.             if(strcmp (arr[i]->info, arr[j]->info) > 0)
  51.                 Swap (arr[i], arr[j]);
  52. }
  53.  
  54.  
  55. int main ()
  56. {   int N = 5;
  57.     TExample **arr = CreateArray (N);
  58.  
  59.     SetExample (arr[0], "Nile", 6650);
  60.     SetExample (arr[1], "Amazon", 6400);
  61.     SetExample (arr[2], "Yangtze", 6300);
  62.     SetExample (arr[3], "Missisipi", 6275);
  63.     SetExample (arr[4], "Yenisei", 5539);
  64.  
  65.     printf("Before sorting:\n");
  66.     PrintArray (arr, N);
  67.    
  68.     SortArray (arr, N);
  69.     printf("\n\nAfter sorting:\n");
  70.     PrintArray (arr, N);
  71.  
  72.     DeleteArray (arr, N);
  73.  
  74.     getchar();
  75.     return 0;
  76. }

Объяснение кода листинга программы

  1. Сначала создается структура данных TExample, которая содержит два поля: info (строка) и num (целое число).
  2. Затем определены функции SetExample и DeleteExample для установки и удаления элементов структуры TExample.
  3. Функция CreateArray создает массив указателей на структуру TExample, а функция DeleteArray освобождает память, выделенную для массива и его элементов.
  4. Функция PrintArray выводит информацию об элементах массива в формате название реки: номер.
  5. Функция Swap меняет местами два элемента массива.
  6. Функция SortArray использует алгоритм сортировки пузырьком для сортировки массива по полю info.
  7. В функции main создается массив из 5 элементов, заполняется данными и сортируется.
  8. Затем выводится отсортированный массив.
  9. Массив и его элементы удаляются с помощью функции DeleteArray.
  10. Программа завершается, ожидая нажатия клавиши.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.769 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут