Базы данных в C, нужна помощь
Для ясности напишу задание по которому делалась программа.
Задание:
Разработать информационно-поисковую систему «Коллекция».
Сведения об отдельном предмете коллекции :
– название предмета;
– краткое описание (историческая справка);
– количество экземпляров;
– стоимость;
– время создания;
– дата приобретения.
Должны быть реализованы следующие операции:
– выдать список названий предметов, количество экземпляров которых
не превышает указанной величины (редкие предметы);
– выдать список названий предметов стоимость которых не меньше
чем указанное значение (самые дорогие);
– найти предметы, время создания которых не превосходит заданное
значение (самые древние).
#include "menu.h"
int main()
{
menu();
return 0;
}
Collections.h
#ifndef collections_h
#define collections_h
struct collection
{
char name[20];
char info[80];
int size;
float price;
int time[3];
int time_price[3];
struct collection *next;
};
struct collection *add();
struct collection enter();
struct collection *dellete();
void memory();
void correct();
#endif
Collections.c
#include <stdio.h>
#include <stdlib.h>
#include "collections.h"
#include "menu.h"
#include "print_c.h"
struct collection *add(struct collection *first)
{
struct collection *mark;
mark=(struct collection*)malloc(sizeof(struct collection));
if (mark==NULL) return first;
*mark=enter(*mark);
mark->next=first;
return mark;
}
struct collection enter(struct collection mark)
{
printf("nazvanie\n");
scanf("%s",&mark.name);
printf("opisanie\n ");
scanf("%s",&mark.info);
printf("kol-vo ekzemplyarov\n ");
scanf("%d",&mark.size);
printf("ctoimost (12.55)\n ");
scanf("%f",&mark.price);
printf("vremia sozdania(01 <enter> 01 <enter> 2000 <enter>)\n ");
scanf("%d%d%d",&mark.time[0],&mark.time[1],&mark.time[2]);
printf("data preobretenia(01 <enter> 01 <enter> 2000 <enter>)\n ");
scanf("%d%d%d",&mark.time_price[0],&mark.time_price[1],&mark.time_price[2]);
system("cls");
return mark;
}
struct collection *dellete(struct collection *first)
{
struct collection *mark=first;
if(first==NULL) return first;
first=first->next;
mark->next=NULL;
free(mark);
return first;
}
void correct(struct collection *mark)
{
if(mark==NULL) return;
mar_k(*mark);
*mark=enter(*mark);
}
void memory(struct collection *first)
{
struct collection *mark=first;
if (first==NULL) return;
while(mark!=NULL)
{
first=first->next;
mark->next=NULL;
free(mark);
mark=first;
}
}
File.h
#ifndef file_h
#define file_h
struct collection *read_c();
struct collection *save_c();
#endif
File.c
#include <stdio.h>
#include <stdlib.h>
#include "collections.h"
struct collection *read_c()
{
struct collection *mark,*first=NULL;
FILE *file;
if((fopen_s(&file,"collection.txt","r"))!=0) return NULL;
fseek(file,0,SEEK_SET);
while(!feof(file))
{
mark=(struct collection*)malloc(sizeof(struct collection));
fread(mark,sizeof(struct collection),1,file)
mark->next=first;
first=mark;
}
fclose(file);
return first;
}
struct collection *save_c(struct collection *first)
{
FILE *file;
if (first==NULL) return first;
fopen_s(&file,"collection.txt","w");
fseek(file,0,SEEK_SET);
while(first!=NULL)
{
fwrite(first,sizeof(struct collection),1,file);
first=first->next;
}
fclose(file);
return first;
}
Functions.h
#ifndef functions_h
#define functions_h
void quest();
void artefact();
void max_price();
void rare();
#endif
Functions.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "collections.h"
#include "print_c.h"
void poisk(struct collection *mark)
{
char name[20];
int time[3];
printf("poisk po nazvaniy i vremeni sozdania\n");
printf("nazvanie:\n");
scanf("%s",&name);
printf("data sozdania(01 <enter> 01 <enter> 2000 <enter>):\n");
scanf("%d%d%d",&time[0],&time[1],&time[2]);
while(mark!=NULL)
{
if ((strstr(mark->name,name))&&(time[0]==mark->time[0])&&(time[1]==mark->time[1])&&(time[2]==mark->time[2])) mar_k(*mark);
mark=mark->next;
}
system("pause");
}
void rare(struct collection *mark)
{
int size;
printf("redkie predmeti\n");
printf("vvedite kol-vo ekz. do kotorogo oni schitautsia redkimi\n");
scanf("%d",&size);
while(mark!=NULL)
{
if (mark->size<=size)
{
printf("%s\n",mark->name);
}
mark=mark->next;
}
system("pause");
}
void max_price(struct collection *mark)
{
int price;
printf("samii dorogie\n");
printf("vvedite chzeny\n");
scanf("%d",&price);
while(mark!=NULL)
{
if (mark->price>=price)
{
printf("%s\n",mark->name);
}
mark=mark->next;
}
system("pause");
}
void artefact(struct collection *mark)
{
int time[3];
printf("artefacti\n");
printf("data sozdania(01 <enter> 01 <enter> 2000 <enter>):\n");
scanf("%d%d%d",&time[0],&time[1],&time[2]);
while(mark!=NULL)
{
if ((time[0]>=mark->time[0])&&(time[1]>=mark->time[1])&&(time[2]>=mark->time[2]))
{
printf("%s\n%s",mark->name,mark->info);
}
mark=mark->next;
}
system("pause");
}
Menu.h
#ifndef menu_h
#define menu_h
void menu();
#endif
Menu.c
#include <stdio.h>
#include "collections.h"
#include "file.h"
void menu()
{
int key;
struct collection *first=read_c();
while(1)
{
printf("menu\n");
printf("1 add\n");
printf("2 dell\n");
printf("3 cange\n");
printf("4 print\n");
printf("5 redkie predmeti\n");
printf("6 samie dorogie\n");
printf("7 artefarti\n");
printf("8 poisk\n");
printf("9 exit\n");
scanf("%d",&key);
switch(key)
{
case 1: first=add(first);
break;
case 2: first=dellete(first);
break;
case 3: correct(first);
break;
case 4: print(first);
break;
case 5: rare(first);
break;
case 6: max_price(first);
break;
case 7: artefact(first);
break;
case 8: poisk(first);
break;
case 9: first=save_c(first);
memory(first);
return;
}
}
}
Print_c.h
#ifndef print_c_h
#define print_c_h
void print();
void mar_k();
#endif
Print_c.c
#include <stdio.h>
#include "collections.h"
#include "print_c.h"
void print(struct collection *mark)
{
if (mark==NULL) return;
while(mark!=NULL)
{
mar_k(*mark);
mark=mark->next;
}
system("pause");
}
void mar_k(struct collection mark)
{
printf("%s %d %f %d.%d.%d %d.%d.%d\n%s\n",mark.name,mark.size,mark.price,mark.time[0],mark.time[1],mark.time[2],mark.time_price[0],mark.time_price[1],mark.time_price[2],mark.info);
}
А что ж Вы не попросили разъяснения у того, кто делал программу?
Что именно не понятно? Все?
Что именно не понятно? Все?
хочу разобраться сам)
Более или менее уже вникаю.
Сейчас очень интересует модуль поиска, как работает и что в ней происходит?
if((fopen_s(&file,"collection.txt","r"))!=0) return NULL;
происходит открытие файла collection.txt значение которого сравнивается с нулем и при выполнении условия возвращаем пустую строку.
Поправьте меня, я уверен что не прав!
Если файл открыть не удалось,возвращается NULL
Если файл открыть не удалось,возвращается NULL
Спасибо разобрался.
Появился другой вопрос :
[HTML]while(mark!=NULL)
{
if ((strcmp(mark->name,name)==0)&&(time[0]==mark->time[0])&&(time[1]==mark->time[1])&&(time[2]==mark->time[2])) mar_k(*mark);
mark=mark->next;
}[/HTML]
(strcmp(mark->name,name)==0) здесь выполняется сравнение строк?
Всё верно.А вообще,чтобы не задавать банальных вопросов,смотрите описание функций на MSDN.Там и параметры объяснены,и возвращаемые значения,и принцип работы
смотрю там)
есть вопрос, что у меня делает данный цикл?)
как не пытался объяснить доценту но не получилось... прошу помощи:(:confused:
{
free(mark);
fclose(file);
return first;
}
Ды вот как-то не видно…
Итак,по порядку:если в процессе чтения потока(читаем по одному экземпляру,размер равен размеру структуры collection) данные закончились,то освободить память,выделенную под буфер для чтения,закрыть файлопоток и что-то там вернуть
Итак,по порядку:если в процессе чтения потока(читаем по одному экземпляру,размер равен размеру структуры collection) данные закончились,то освободить память,выделенную под буфер для чтения,закрыть файлопоток и что-то там вернуть
огромное спасибо, знаю что уже надоел) но есть последний вопрос по структуре:
{
struct collection *mark=first;
if(first==NULL) return first;
first=first->next;
mark->next=NULL;
free(mark);
return first;
}
как я её понимаю: объявляем указатель структуру типа collection, выполняем условие : когда значение first равно нулю возвращаем значение first, переходим к следующему элементу first, следующему значению указателя mark присваиваем нулевое значение, освобождаем память и возвращаем значение first.