Сортировка базы данных - C (СИ)
Формулировка задачи:
Здравствуйте, есть база данных, которая полностью рабочая, ода только проблема не понимаю, как к ней дописать сортировку, если у кого есть идеи или кто знает, как можно сделать буду признателен.
Листинг программы
- #include "stdafx.h"
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <io.h>
- #define M [10];
- #ifndef _lab11_cpp
- #define _lab11_cpp
- typedef struct TExport
- {
- char name_tov[50];
- char kor_opis[50];
- char country[50];
- float rubl;
- }str;
- //----------------------------------------
- //Прототипы функция
- int create(char *name);//Создание базы данных
- int add(char *name);//Новый товар
- int print(char *name);//Показать базу данных
- int find(char *name, char *tovar);//нахождение элемента
- int del(char *name, int k);//удаление
- int change(char *name, int n);//Изменение товара
- void displayE(str E);
- void input(str *pE);
- int displayN(char *name, int n);
- void sort();//сортировка по алфавиту
- //-----------------------------------------
- int _tmain(int argc, _TCHAR* argv[])
- {
- char number M;
- char name[] = "D:\\base.dat";
- int k, n;
- char tovar[20];
- while(1)
- {
- printf("\n\t1.Create newbase\n");
- printf("\n\t2.Add new tovar\n");
- printf("\n\t3.Delete tovar\n");
- printf("\n\t4.Find tovar\n");
- printf("\n\t5.Change tovar\n");
- printf("\n\t6.Sort tovar\n");
- printf("\n\t7.Show all tovar\n");
- printf("\n\t8.End work\n");
- //Обработка номера команды
- printf("\n\nEnter number of operation\t");
- scanf("%s", number);
- switch(number[0])
- {
- case '1' :
- create(name);
- break;
- case '2' :
- add(name);
- break;
- case '3' :
- printf("\n Delete according to the name_tov \n");
- printf("\n Enter the name_tov: \t");
- scanf("%s", tovar);
- k = find(name, tovar);
- if(k > 0)
- del(name, k);
- break;
- case '4' :
- printf("\n Find according to the name_tov \n");
- printf("\n Enter the name_tov: \t");
- scanf("%s", tovar);
- n = find(name, tovar);
- if(n > 0)
- displayN(name, n);
- break;
- case '5' :
- printf("\n Change according to the name_tov \n");
- printf("\n Enter the name_tov: \t");
- scanf("%s", tovar);
- k = find(name, tovar);
- if(k > 0)
- change(name, k);
- break;
- case '7' :
- print(name);
- break;
- case '6' :
- break;
- case '8' :
- return 0;
- default :
- printf("\nNumber is not correct\n");
- }
- }
- return 0;
- }
- int create(char *name)
- {
- FILE*f;
- str a;
- int i, n;
- if ((f = fopen(name, "w"))== NULL)
- {
- printf("Error %s\n", name);
- return 1;
- }
- printf("\nHow much elements in database? = \t");
- scanf("%d", &n);
- for(i = 0; i < n; i++);
- {
- input(&a);
- fwrite(&a, sizeof(str), 1, f);
- }
- fclose(f);
- return 0;
- }
- void displayE(str E)
- {
- printf("\nName_tov: %s\n", E.name_tov);
- printf("\nDescription: %s\n", E.kor_opis);
- printf("\nCountry: %s\n", E.country);
- printf("\nRubl: %f\n", E.rubl);
- }
- void input(str *pE)
- {
- printf("\nName_tov: ");
- scanf("%s", pE->name_tov);
- printf("\nDescription: ");
- scanf("%s", pE->kor_opis);
- printf("\nCountry: ");
- scanf("%s", pE->country);
- printf("\nRubl: ");
- scanf("%f", &pE->rubl);
- }
- int print(char *name)
- {
- FILE*f;
- str a;
- if ((f = fopen(name, "r"))== NULL)
- {
- printf("Error %s\n", name);
- return 1;
- }
- while(!feof(f))
- {
- fread(&a, sizeof(str), 1, f);
- if(!feof(f))
- displayE(a);
- }
- fclose(f);
- return 0;
- }
- int find(char *name, char *tovar)
- {
- FILE*f;
- str a;
- int i = 0;
- if ((f = fopen(name, "r"))== NULL)
- {
- printf("Error %s\n", name);
- return -1;
- }
- while(!feof(f))
- {
- fread(&a, sizeof(str), 1, f);
- if(!feof(f))
- {
- if(strcmp(a.name_tov, tovar) == 0)
- {
- fclose(f);
- return i+1;
- }
- i++;
- }
- }
- fclose(f);
- return 0;
- }
- int add(char *name)
- {
- FILE*f;
- str a;
- int i, n;
- if ((f = fopen(name, "r+"))== NULL)
- {
- printf("Error %s\n", name);
- return 1;
- }
- input(&a);
- fseek(f , 0, SEEK_END);
- fwrite(&a, sizeof(str), 1, f);
- fclose(f);
- return 0;
- }
- int displayN(char *name, int n)
- {
- FILE*f;
- str a;
- int i;
- if ((f = fopen(name, "r+"))== NULL)
- {
- printf("Error %s\n", name);
- return 1;
- }
- fseek(f, (n-1)*sizeof(str), SEEK_SET);
- fread(&a, sizeof(str), 1, f);
- displayE(a);
- fclose(f);
- return 0;
- }
- int change(char *name, int n)
- {
- FILE*f;
- str a;
- int i = n;
- if ((f = fopen(name, "r+"))== NULL)
- {
- printf("Error %s\n", name);
- return 1;
- }
- displayN(name, n);
- input(&a);
- fseek(f, (n-1)*sizeof(str), SEEK_SET);
- fwrite(&a, sizeof(str), 1, f);
- fclose(f);
- return 0;
- }
- int del(char *name, int k)
- {
- FILE*f;
- int i;
- long int n;
- str a;
- if ((f = fopen(name, "r+")) == NULL)
- {
- printf("Error %s\n", name);
- return 1;
- }
- n = filelength(fileno(f)) / sizeof(str);
- if((k > n) || (k < 0))
- {
- printf("Not found %d \n", k);
- fclose(f);
- return 2;
- }
- for(i = k; i < n; i++)
- {
- fseek(f, i*sizeof(str), SEEK_SET);
- fread(&a, sizeof(str), 1, f);
- fseek(f, (i-1)*sizeof(str), SEEK_SET);
- fwrite(&a, sizeof(str), 1, f);
- }
- chsize(fileno(f), filelength(fileno(f)) - sizeof(str));
- fclose(f);
- return 0;
- }
- #endif
Решение задачи: «Сортировка базы данных»
textual
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- typedef struct TExample
- { char *info;
- int num;
- } TExample;
- void SetExample (TExample *example, char *info, int num)
- { example->info = (char *) malloc (strlen (info) + 1);
- strcpy (example -> info, info);
- example->num = num;
- }
- void DeleteExample (TExample *example)
- { free (example->info);
- free (example);
- }
- TExample **CreateArray (int N)
- { TExample **arr = (TExample**) malloc (N * sizeof (TExample*));
- for (int i = 0; i<N; i++)
- arr[i] = (TExample*) malloc (sizeof (TExample));
- return arr;
- }
- void DeleteArray (TExample **arr, int N)
- { for (int i = 0; i<N; i++)
- DeleteExample (arr[i]);
- free (arr);
- }
- void PrintArray (TExample **arr, int N)
- { for (int i = 0; i<N; i++)
- printf("%-20s%5d\n", arr[i]->info, arr[i]->num);
- }
- void Swap (TExample *a, TExample *b)
- { TExample temp = *a;
- *a = *b;
- *b = temp;
- }
- void SortArray (TExample **arr, int N)
- { int i,j;
- for (i = 0; i<N-1; i++)
- for (j = i+1; j<N; j++)
- if(strcmp (arr[i]->info, arr[j]->info) > 0)
- Swap (arr[i], arr[j]);
- }
- int main ()
- { int N = 5;
- TExample **arr = CreateArray (N);
- SetExample (arr[0], "Nile", 6650);
- SetExample (arr[1], "Amazon", 6400);
- SetExample (arr[2], "Yangtze", 6300);
- SetExample (arr[3], "Missisipi", 6275);
- SetExample (arr[4], "Yenisei", 5539);
- printf("Before sorting:\n");
- PrintArray (arr, N);
- SortArray (arr, N);
- printf("\n\nAfter sorting:\n");
- PrintArray (arr, N);
- DeleteArray (arr, N);
- getchar();
- return 0;
- }
Объяснение кода листинга программы
- Сначала создается структура данных TExample, которая содержит два поля: info (строка) и num (целое число).
- Затем определены функции SetExample и DeleteExample для установки и удаления элементов структуры TExample.
- Функция CreateArray создает массив указателей на структуру TExample, а функция DeleteArray освобождает память, выделенную для массива и его элементов.
- Функция PrintArray выводит информацию об элементах массива в формате
название реки: номер
. - Функция Swap меняет местами два элемента массива.
- Функция SortArray использует алгоритм сортировки пузырьком для сортировки массива по полю info.
- В функции main создается массив из 5 элементов, заполняется данными и сортируется.
- Затем выводится отсортированный массив.
- Массив и его элементы удаляются с помощью функции DeleteArray.
- Программа завершается, ожидая нажатия клавиши.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д