Сортировка базы данных - 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.
- Программа завершается, ожидая нажатия клавиши.