Сортировка базы данных - 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;
}

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

  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