Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Базы данных в C, нужна помощь

63K
27 декабря 2010 года
Andrei1700
10 / / 13.12.2010
Прошу помочь с разъяснением программы) Если кому не сложно сделайте подписи к некоторым элементам. По мере продвижения понимания буду сам задавать вопросы.
Для ясности напишу задание по которому делалась программа.

Задание:
Разработать информационно-поисковую систему «Коллекция».
Сведения об отдельном предмете коллекции :
– название предмета;
– краткое описание (историческая справка);
– количество экземпляров;
– стоимость;
– время создания;
– дата приобретения.

Должны быть реализованы следующие операции:
– выдать список названий предметов, количество экземпляров которых
не превышает указанной величины (редкие предметы);
– выдать список названий предметов стоимость которых не меньше
чем указанное значение (самые дорогие);
– найти предметы, время создания которых не превосходит заданное
значение (самые древние).

Код:
Main.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);   
}
14K
28 декабря 2010 года
Fenja
138 / / 20.03.2009
Цитата:
Прошу помочь с разъяснением программы)


А что ж Вы не попросили разъяснения у того, кто делал программу?
Что именно не понятно? Все?

63K
28 декабря 2010 года
Andrei1700
10 / / 13.12.2010
Цитата: Fenja
А что ж Вы не попросили разъяснения у того, кто делал программу?
Что именно не понятно? Все?



хочу разобраться сам)
Более или менее уже вникаю.
Сейчас очень интересует модуль поиска, как работает и что в ней происходит?

63K
09 января 2011 года
Andrei1700
10 / / 13.12.2010
FILE *file;
if((fopen_s(&file,"collection.txt","r"))!=0) return NULL;

происходит открытие файла collection.txt значение которого сравнивается с нулем и при выполнении условия возвращаем пустую строку.
Поправьте меня, я уверен что не прав!
7
09 января 2011 года
@pixo $oft
3.4K / / 20.09.2006
Вообще-то не значение файла сравнивается с нулём(ибо у файла оного нет,НЯЗ:)),а результат операции
Если файл открыть не удалось,возвращается NULL
63K
10 января 2011 года
Andrei1700
10 / / 13.12.2010
Цитата: @pixo $oft
Вообще-то не значение файла сравнивается с нулём(ибо у файла оного нет,НЯЗ:)),а результат операции
Если файл открыть не удалось,возвращается 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) здесь выполняется сравнение строк?

7
10 января 2011 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: Andrei1700
(strcmp(mark->name,name)==0) здесь выполняется сравнение строк?

Всё верно.А вообще,чтобы не задавать банальных вопросов,смотрите описание функций на MSDN.Там и параметры объяснены,и возвращаемые значения,и принцип работы

63K
10 января 2011 года
Andrei1700
10 / / 13.12.2010
Цитата: @pixo $oft
Всё верно.А вообще,чтобы не задавать банальных вопросов,смотрите описание функций на MSDN.Там и параметры объяснены,и возвращаемые значения,и принцип работы



смотрю там)

есть вопрос, что у меня делает данный цикл?)
как не пытался объяснить доценту но не получилось... прошу помощи:(:confused:

 
Код:
if (fread(mark,sizeof(struct collection),1,file)==0)
        {
            free(mark);
            fclose(file);
            return first;
        }
7
10 января 2011 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: Andrei1700
смотрю там)

Ды вот как-то не видно…
Итак,по порядку:если в процессе чтения потока(читаем по одному экземпляру,размер равен размеру структуры collection) данные закончились,то освободить память,выделенную под буфер для чтения,закрыть файлопоток и что-то там вернуть

63K
13 января 2011 года
Andrei1700
10 / / 13.12.2010
Цитата: @pixo $oft
Ды вот как-то не видно…
Итак,по порядку:если в процессе чтения потока(читаем по одному экземпляру,размер равен размеру структуры collection) данные закончились,то освободить память,выделенную под буфер для чтения,закрыть файлопоток и что-то там вернуть



огромное спасибо, знаю что уже надоел) но есть последний вопрос по структуре:

 
Код:
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;
}


как я её понимаю: объявляем указатель структуру типа collection, выполняем условие : когда значение first равно нулю возвращаем значение first, переходим к следующему элементу first, следующему значению указателя mark присваиваем нулевое значение, освобождаем память и возвращаем значение first.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог