Сортировка базы данных - 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.
- Программа завершается, ожидая нажатия клавиши.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д