Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамические структуры данных в С++ 
:(
    Опции темы
Vinnety
  Дата 7.3.2004, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 8.4.2003

Репутация: нет
Всего: нет



baaa.gif Помогите!
Как в С++ организовать динамическую структуру типа ОЧЕРЕДЬ, которая содержала бы в
себе информацию например : телефон, имя, указатель на следуюший елемент очереди ?

Подскажи, плиз, как работать с очередями ! baaa.gif

PM MAIL   Вверх
mr.DUDA
Дата 7.3.2004, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



используем STL и не паримся ("queue" - очередь, англ.):
Цитата
#include <stdio.h>
#include <queue>

// будем хранить данные в структуре типа:
struct SomeInfo_t
{
    char szName[20];
    char szTelephone[20];
   
    // конструктор
    SomeInfo_t(char *N, char *T)
    {
        strcpy(szName, N);
        strcpy(szTelephone, T);
    }
};


int main(int argc, char* argv[])
{
    // вот так объявляется очередь "q" из элементов "SomeInfo_t"
    std::queue <SomeInfo_t> q;

    // вот так добавляются элементы в хвост очереди
    q.push(SomeInfo_t("John", "555-123-344"));
    q.push(SomeInfo_t("Bill", "(023)11-33-44"));
    q.push(SomeInfo_t("Kate", "88-99-1010"));

    // сделаем цикл, пока очередь не пуста
    while(q.size())
    {
        // можно взять ссылку на элемент, а можно пользовать "q.front" напрямую
        SomeInfo_t &info = q.front();

        // выводим содержимое элемента
        printf("%s, phone: %s\n", info.szName, info.szTelephone);

        // удаляем элемент из головы очереди
        q.pop();
    }
   
    return 0;
}



--------------------
user posted image
PM MAIL WWW   Вверх
bel_nikita
Дата 7.3.2004, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



В MVC6 есть CList
#include <afxtempl.h>


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 7.3.2004, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Цитата
В MVC6 есть CList
#include <afxtempl.h>

имхо речь идёт об очереди. первый зашёл - первый вышел, или последний зашёл - первый вышел.


--------------------
user posted image
PM MAIL WWW   Вверх
CaptainFlint
Дата 7.3.2004, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Искатель сокровищ
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 26.2.2003
Где: Москва

Репутация: нет
Всего: 23



mr.DUDA
А что такое очередь, как не список со специфичечким набором методов? Защищённо наследуем CQueue от CList с подставленным типом аргумента (чтобы нельзя было к методам CList обратиться), пишет Add() и Get() через методы CList'а (они очень простые должны получиться), и всё.
Конечно, можно использовать и STL, но это уже по вкусу. К тому же, если проект написан на MFC, то я лично, например, не люблю мешать эти две библиотеки...


--------------------
Почему же, ё-моё, ты нигде не пишешь "ё"?
--------------------
Для тех, кто не знает: CaptainFlint - это бывший Константин. ;) 
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 7.3.2004, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Цитата
А что такое очередь, как не список со специфичечким набором методов?

Не спорю, "очередь" - понятие чисто умозрительное. Это список, но из самого понятия предполагается, что добавить элемент можно только в хвост, а извлечь - только из головы списка. Можно юзать хоть CList, хоть TList билдеровский, но имхо STL предоставляет наиболее полный набор различных контейнеров - вот я и предлагаю пользоваться им.

Цитата
Конечно, можно использовать и STL, но это уже по вкусу. К тому же, если проект написан на MFC, то я лично, например, не люблю мешать эти две библиотеки...

Лично я предпочитаю (в последнее время) использовать STL даже в MFC-шных проектах вместо контейнеров от M$, тем более что есть выбор от средних до очень быстродействующих библиотек (STLPort от Silicon Graphics). Но это личное дело каждого. Автор вопроса ведь не сказал ни слова о платформе и технологиях! По-моему, ему бы подошёл даже вариант с собственным узкоспециализированным классом типа:
Цитата
class Member
{
    char *szName, *szTelephone;
    Member *Next;
   
    void Push() {...}
    Member *Pop() {...}
};

или что-то вроде того.


--------------------
user posted image
PM MAIL WWW   Вверх
Fantasist
Дата 8.3.2004, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата
А что такое очередь, как не список



Может быть и вектором. Так что не обязательно СList.

Цитата
последний зашёл - первый вышел


В этом случае обычно говорят о стеке.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
mr.DUDA
Дата 9.3.2004, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 25
Всего: 232



Цитата
Цитата
последний зашёл - первый вышел

В этом случае обычно говорят о стеке.

или о буфере LIFO smile.gif


--------------------
user posted image
PM MAIL WWW   Вверх
bel_nikita
Дата 9.3.2004, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



mr.DUDA
Цитата
имхо речь идёт об очереди. первый зашёл - первый вышел, или последний зашёл - первый вышел

А это смотря как читать вопрос
Цитата
указатель на следуюший елемент очереди ?

Так что, не совсем понятно, что хочет человек очередь или список, а может и то и другое


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Vinnety
Дата 10.3.2004, 02:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 8.4.2003

Репутация: нет
Всего: нет



Это всё конечно хорошо! :-)
Но мне надо работать с очередью и под обычного Turbo C++ под DOS! :-(
И в данной версии нет такой директивы препроцессора как <queue> (как показано в первом ответе) !!!
Как выйти из такого положения confused.gif
PM MAIL   Вверх
Kurt
Дата 10.3.2004, 03:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлеченный
***


Профиль
Группа: Участник Клуба
Сообщений: 1662
Регистрация: 22.8.2003
Где: Краснодар

Репутация: нет
Всего: 36



Тогда тока ручками..
Хм..
Когда тебе это надо?


Это сообщение отредактировал(а) Kurt - 10.3.2004, 03:56


--------------------
Для корабля, который не знает куда плыть, нет попутного ветра... ((С) Архимед)
...
Все знают, что это невозможно. Но случайно находится невежда, который этого не знает. Он-то и делает открытие.. ((С) А. Эйнштейн)
PM ICQ   Вверх
bel_nikita
Дата 10.3.2004, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Vinnety А шаблоны поддерживает, твой компилер??
Вот держи, правда через шаблон сделанно, но можешь заменить шаблон дефайном, и всего то
Код
const unsigned int CountElements=0x50;

template<typename T>
 class cTPLQueue
 {
 public:
   cTPLQueue        (DWORD uiMaxLen=CountElements);
   ~cTPLQueue       ();
   inline int   AddItem (T const &Item);   // Put Msg in queue
   inline int   ReadItem(T &Item);         // Get Msg from queue
  inline DWORD GetQueue() const;          // Get quantity of elements

 protected:
   DWORD uiNotFull;
   DWORD uiMaxElements, uiSizeElem,uiElements;
   DWORD uiIn, uiOut, uiEndValue;
   void  *pMessageArray;
 };

template<typename T>
 cTPLQueue<T>::cTPLQueue<T>(DWORD uiMaxLen/* =CountElements */)
 {
   uiNotFull=1;
   uiIn = uiOut = 0;
   uiMaxElements=uiMaxLen;
   uiElements=0;
  uiSizeElem=sizeof(T);
   uiEndValue=uiSizeElem*uiMaxElements;
   pMessageArray=malloc(uiEndValue);
   if (!pMessageArray){  cprintf("Not enough memory for TPLQueue!\n");  };
 };

template<typename T>
 cTPLQueue<T>::~cTPLQueue<T>(){  if (pMessageArray) free(pMessageArray); }

template<typename T>
 inline int cTPLQueue<T>::AddItem(T const &Item)
 {
     
     if (!uiNotFull)
     {
       
       cprintf("TPLQueue is full!\n");
       return -1;
     };
     memcpy((char*)pMessageArray+uiIn, &Item, uiSizeElem);
     uiIn = (uiIn + uiSizeElem) % uiEndValue;
     uiNotFull=uiOut-uiIn;
   uiElements++;
     
     return 1;
 }

template<typename T>
 inline int cTPLQueue<T>::ReadItem(T &Item)
 {
     
     if (!uiNotFull) uiNotFull=1;
     else if (uiIn==uiOut) { return -1; }
     memcpy(&Item, (char*)pMessageArray+uiOut, uiSizeElem);
     uiOut = (uiOut+uiSizeElem) % uiEndValue;
   uiElements--;
     
     return 1;
 }

template<typename T>
  inline DWORD cTPLQueue<T>::GetQueue() const{return (uiElements);}

Да, еще, если встретишь в коде Lock() или UnLock() просто удали их, это я для других целей юзал


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
wnayk
Дата 16.12.2006, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



Ребят Здорова всем,СПАСИТЕ МНЕ ПОЖУЛУЙСТА ЖИЗНЬ... smile 
У меня через недельку надо будет курсовуху сдавать,если не сдам-мне пи... Задачка такая:
Магазин с одним продавцом.
Компьютер вместо кассового аппарата. База наличия товаров: наименование, единица измерения, цена единицы, количество, дата последнего завоза. Регистрация поступления товара( как старых ,так и новых наименований ). Оформление покупки: выписка чека, корректировка базы. Проблема уценки и описания. Инвентаризация остатков товара с вычислением суммарной стоимости. Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе. 

Может у кого то есть такая уже,ПППЛЛЛЛИИИЗЗЗЗ
или пришлите на [email protected]
PM MAIL   Вверх
Anikmar
Дата 16.12.2006, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(wnayk @ 16.12.2006,  11:09)
Ребят Здорова всем,СПАСИТЕ МНЕ ПОЖУЛУЙСТА ЖИЗНЬ... smile 
У меня через недельку надо будет курсовуху сдавать,если не сдам-мне пи... Задачка такая:
Магазин с одним продавцом.
Компьютер вместо кассового аппарата. База наличия товаров: наименование, единица измерения, цена единицы, количество, дата последнего завоза. Регистрация поступления товара( как старых ,так и новых наименований ). Оформление покупки: выписка чека, корректировка базы. Проблема уценки и описания. Инвентаризация остатков товара с вычислением суммарной стоимости. Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе. 

Может у кого то есть такая уже,ПППЛЛЛЛИИИЗЗЗЗ
или пришлите на [email protected]

Ребят, ну давайте по правилам общаться!
Вверху страницы есть отдельная фраза:

Цитата

Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи". 


PM MAIL ICQ   Вверх
zabivator
Дата 16.12.2006, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 7.6.2006
Где: нск

Репутация: 1
Всего: 2



wnayk, тебя убьют, если ты не сдашь курсовую?  smile 
--------------------
#include <zabivator>int main( int, char * [] ){   while( Zabivator::жив() ) Zabivator::моск()++;   return 0;}
PM MAIL WWW ICQ   Вверх
wnayk
Дата 16.12.2006, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



Меня просто на второй семестр не переведут,если через неделю не сдам
zabivator, ,просто ректор новый и с этим он строго((
Ты не можешь подсказать или может есть у кого нибудь хотя бы похожая??? меня предки smile  замочат,и я буду рядовым(((Помогите.....
PM MAIL   Вверх
wnayk
Дата 17.12.2006, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



zabivator, у тебя нет похожей задачи или этой же,может сможешь чем-нибудб помочьььььь smile 
PM MAIL   Вверх
Anikmar
Дата 17.12.2006, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Это программа не на 5 и даже не на 500 строчек. Никто ради забавы ее делать не будет - следовательно, если у кого она и есть, то скорее всего достаточно объемный и серьезный проект.

Мы такую программу писали на моем старом месте работы. там была поддержка склада, работа с ККМ - практически все, что ты написал в задании. Объем сего продукта был минимум на 5000 строк (на сколько я помню, давно это было).

Если до сдачи курсовика осталось 1 неделя я бы предложил наляпать стандартными контролами на PARADOX нечто, которое будет работать - врядли ее серьезно будут тестировать. 1 недели в принципе хватит, если серьезно этим озаботиться.
PM MAIL ICQ   Вверх
колючка
Дата 17.12.2006, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 9.12.2006

Репутация: нет
Всего: нет



А кто-нибудь может просветить по поводу очереди с приоритетом? Ну вот нигде найти не могу что это и с чем ее едят! Может хотя бы подскажите где информацию на эту тему искать  smile А еще лучше примерчик какой-нибудь, или програмку (вообще мечта!)...
PM MAIL   Вверх
Anikmar
Дата 17.12.2006, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата

или програмку (вообще мечта!)... 


Программку чего? Очереди с приоритетом? А что она делать должна (программка)?
PM MAIL ICQ   Вверх
JackYF
Дата 18.12.2006, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(колючка @  17.12.2006,  21:58 Найти цитируемый пост)
Ну вот нигде найти не могу что это и с чем ее едят!


priority_queue - поищи по этому слову.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
wnayk
Дата 19.12.2006, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



Anikmar, У меня есть несколько похожих задачик нашел в нете там от 250 строк до 700 строк максимум,ты не знаешь может есть какие нибудь сайты где выкладываются задачки с решениями-УМИРАЮ smile  smile 
PM MAIL   Вверх
Anikmar
Дата 20.12.2006, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



wnayk, К сожалению не знаю - никогда этим вопросом не занимался. Как говорится "Да прибудет с вами Yandex"

Если уже найдены готовые программки - почему не использовать их? Доработать необходимый функционал и вперед. С точки зрения алгоритма такая задача особой сложностью не отличается - там больше рутины - рисование окошек, отработка редактирования и т.п.
PM MAIL ICQ   Вверх
wnayk
Дата 20.12.2006, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



 smile  smile  smile 
PM MAIL   Вверх
wnayk
Дата 27.12.2006, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



 smile  я хочу узнать-дано: 
double price;
как найти длину этого числа?Ну тм двузначное или еще???Подскажите...
PM MAIL   Вверх
zkv
Дата 28.12.2006, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(wnayk @  27.12.2006,  22:18 Найти цитируемый пост)
как найти длину этого числа?

хм, интересно зачем? 

Определение количества цифр в целой части числа:
Код

int DigitsInDouble( double price )
{
    price = ( price > 0 ) ? price : -price;//берем модуль
    int numDigs = 0;
    while( price >= 1. )
    {
        price /= 10.;
        ++numDigs;
    }
    return numDigs;
}

PM MAIL   Вверх
KpoHyc
Дата 28.12.2006, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 23.12.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 5



Anikmar,  какие нафиг 5к строк? это курсач первака...1к максимум - 500-600 самое реальное...


wnayk
Код

//---------------------------------------------------------------------
//
// Laboratornaya rabota ? 20
//
// Zadanie:
// Sostavit' programmu, kotoraya soderzhit dinamicheskuyu informatsiyu
// o nalichii knig v biblioteke. Svedeniya o kazhdoi knige soderzhat:
// familiyu avtora, nazvanie, god izdaniya.
// Programma dolzhna obespechivat':
//   1) nachal'noe formirovanie dannyh obo vseh knigah v biblioteke
//      v vide lineinogo spiska,
//   2) dobavlenie novoi knigi v spisok,
//   3) udalenie knigi iz spiska,
//   4) spisok vseh knig avtora,
//      familiya kotorogo vvedena pol'zovatelem.
// Programma dolzhna obespechivat' dialog s pomosch'yu menyu
// i kontrol' oshibok pri vvode.
//
//---------------------------------------------------------------------

#include <iostream.h>
#include <conio.h>
#include <stdlib.h>

struct Book {
  char Author [30]; // Avtor
  char Title [100]; // Nazvanie
  int Year;         // God izdaniya
  Book *prev;       // Ukazatel' na predyduschuyu zapis'
  Book *next;       // Ukazatel' na sleduyuschuyu zapis'
};

Book *first = NULL; // Ukazatel' na nachalo spiska
Book *last = NULL;  // Ukazatel' na konets spiska

// Prototipy funktsii
void Input (void); // Nachal'noe formirovanie spiska
void Find (void);  // Poisk v spiske
int List (void);   // Pechat' vsego spiska
void Clear (void); // Udalenie spiska iz pamyati
int Menu (void);   // Menyu

int main (void)
{
  while (Menu ()); // tsikl poka pol'zovatel' ne vybral vyhod

  Clear ();
  return 0;
}

//---------------------------------------------------------------------
//
// Funktsiya void Add (Book *book)
//
// Dobavlyaet strukturu book v konets spiska
//
// Ishodnye dannye:
//   ukazatel' na strukturu Book *book
//
//---------------------------------------------------------------------

void Add (Book *book)
{
  if (last != NULL) // esli spisok uzhe suschestvuet
  {
    book->prev = last;
    book->next = NULL;
    last->next = book;
    last = book;
  }
  else              // esli spisok esche ne sozdan
  {
    book->prev = NULL;
    book->next = NULL;
    first = book;
    last = book;
  }
}

//---------------------------------------------------------------------
//
// Funktsiya void Delete (Book *book)
//
// Udalyaet strukturu iz spiska
//
// Ishodnye dannye:
//   ukazatel' na strukturu Book *book
//
//---------------------------------------------------------------------

void Delete (Book *book)
{
  if (book)
  {
    if (book->prev) book->prev->next = book->next;
    if (book->next) book->next->prev = book->prev;
    if (book == first) first = first->next;
    if (book == last) last = last->prev;
    delete book;
  }
}

//---------------------------------------------------------------------
//
// Funktsiya void AddItem (void)
//
// Sozdaet strukturu i zanosit v nee dannye,
// vvedennye pol'zovatelem s klaviatury
//
//---------------------------------------------------------------------

void AddItem (void)
{
  Book *book;

  // sozdaem novuyu strukturu
  book = new Book;
  // zapolnyaem ee
  cout << "Vvedite familiyu avtora: ";
  cin >> book->Author;
  cout << "Vvedite nazvanie knigi: ";
  cin >> book->Title;
  cout << "Vvedite god izdaniya: ";
  cin >> book->Year;
  // dobavlyaem v spisok
  Add (book);
}

//---------------------------------------------------------------------
//
// Funktsiya void DeleteItem (void)
//
// Udalyaet iz spiska strukturu, vybrannuyu pol'zovatelem
//
//---------------------------------------------------------------------

void DeleteItem (void)
{
  // vyvodim spisok vseh struktur
  int i = List ();
  int num;

  cout << "Vvedite nomer udalyaemoi zapisi: ";
  cin >> num;
  if (num < 1 || num > i) return;

  Book *book = first;
  // nahodim ukazatel' na udalyaemuyu strukturu
  for (i = 1; i < num; i++)
  {
    book = book->next;
  }
  // udalyaem ee
  Delete (book);
}

//---------------------------------------------------------------------
//
// Funktsiya void Input (void)
//
// Nachal'noe formirovanie spiska
//
//---------------------------------------------------------------------

void Input (void)
{
  bool enough = false;

  do
  {
    AddItem (); // zapolnyaem ocherednuyu strukturu
    cout << "Prodolzhit' vvod informatsii? (y/n)" << endl;
    if (getch () == 'n') enough = true;
  }
  while (!enough);
}

//---------------------------------------------------------------------
//
// Funktsiya void Find (void)
//
// Poisk v spiske knig, familiya avtora kotoryh vvedena pol'zovatelem
//
//---------------------------------------------------------------------

void Find (void)
{
  char author[30];
  cout << "Vvedite familiyu avtora: ";
  cin >> author;

  Book *book = first;
  cout << "Naidennye knigi:" << endl;
  while (book)
  {
    if (strcmp (book->Author, author) == 0) // proveryaem zapis'
    {
      cout << book->Author << " "
   << book->Title << " "
   << book->Year << endl;
    }
    book = book->next; // perehodim k sleduyuschei zapisi
  }
}

//---------------------------------------------------------------------
//
// Funktsiya int List (void)
//
// Pechat' spiska
//
// Vozvraschaet chislo napechatannyh zapisei
//
//---------------------------------------------------------------------

int List (void)
{
  Book *book = first;
  int i = 0;

  cout << endl << "V spiske soderzhatsya:" << endl;
  while (book)
  {
    i++;
    cout << i << ". " << book->Author << " " << book->Title << " " << book->Year << endl;
    book = book->next;
  }
  return i;
}

//---------------------------------------------------------------------
//
// Funktsiya void Clear (void)
//
// Udalenie spiska iz pamyati
//
//---------------------------------------------------------------------

void Clear (void)
{
  Book *book = first;
  while (book)
  {
    Book *tmp = book;
    book = book->next;
    Delete (tmp);
  }
}

//---------------------------------------------------------------------
//
// Funktsiya int Menu (void)
//
// Realizuet rabotu menyu
//
// Vozvraschaet 0 v sluchae zaversheniya raboty
// i 1 v protivnom sluchae
//
//---------------------------------------------------------------------

int Menu (void)
{
  char ch = 0;

  // Vyvodim spisok vozmozhnyh variantov vybora
  cout << "Vash vybor:" << endl;
  cout << "1. Sformirovat' spisok." << endl;
  cout << "2. Pechat' spiska." << endl;
  cout << "3. Dobavit' v spisok." << endl;
  cout << "4. Udalit' iz spiska." << endl;
  cout << "5. Poisk v spiske." << endl;
  cout << "6. Vyhod." << endl;

  // ozhidaem, kogda budet nazhata "pravil'naya" klavisha
  while (ch < '1' || ch > '6')
  {
    ch = getch ();
  }

  // osuschestvlyaem vybor soglasno nazhatoi klavishy
  switch (ch)
  {
    case '1': Input (); break;
    case '2': List (); break;
    case '3': AddItem (); break;
    case '4': DeleteItem (); break;

    case '5': Find (); break;
    case '6': return 0;
  };
  return 1;
}


это база данных деканат - переработать под вашу задачу можно за один вечер. - дерзайте...

Добавлено @ 00:48 
или вот...задание тоже...
Код

#include <stdio.h>      //  для работы с файлами и макросом FILE в частности (он используется для объявления указателя на файл)
#include <stdlib.h>     //  для того чтобы можно было использовать функции...stdlib.h  - для С, cstdlib.h - для С++
#include <string.h>     //  для использования строковых функций...string.h  - для С, cstring.h - для С++
#include <conio.h>      //  не помню
#include <windows.h>    //  не нужен...совсем не нужен...



const int l_name = 31;     // отводим 31 символ на переменную, за КОЛИЧЕСТВО студентов
Блок закончен
struct Man             // вложенная запись Мэн
{   char name[l_name];     //имя
    int birth_day;        //ДР
    float pay;            // средний балл
    Man* next;            // переход с следующему студенту (вроде)
};
  // Тут объявляются все процЫдуры, для того чтобы их можно было использовать, их опсание будет дальше
Man* add(Man* beg, const Man &man);
int edit(Man* beg);
Man* find(Man* beg, char* name, Man** prev);
void find(Man* beg, int birth_day);
void find(Man* beg, float pay);
void find_man(Man* beg);
void get_name(char* name);
int menu();
void print_dbase(Man* beg);
Man* read_dbase(char* filename);
Man read_man();
Man* remove(Man* beg);
int   write_dbase(char* filename, Man* beg);

// --------------------------------------------------  Главная страница, в которой происходит выбор между функциями
int main()
{  Man* beg = read_dbase("dbase.txt");      //Чиатем базу
if (!beg) return 1;                         //Если не получилось - еще раз
while (TRUE)                                //бесконечный цикл
 {   switch (menu())                        //выбор между функциями - их описание ниже
  {   case 1: add(beg, read_man()); break;
      case 2: beg = remove(beg);    break;
      case 3: find_man(beg);        break;
      case 4: edit(beg);            break;
      case 5: print_dbase(beg);     break;
      case 6: write_dbase("dbase.txt", beg); break;
      case 7: return 0;              //выход из проги
      default: puts("Nado vvodit' chislo ot 1 do 7"); break;    // защита от дурака
  }
 }
 getch();                              //ожидание ввода - затем выход
return 0;

}
// -------------------------------------------------- Добавление студента
Man* add(Man* beg, const Man& man)
{
Man* pv = new Man;                          // Формирование нового элемента
*pv = man; pv->next = 0;
if (beg)                                    // Если список не пуст
 {   Man* temp = beg;                                                                                                               
     while (temp->next)
     temp = temp->next;                     // Находим конеце списка
     temp->next = pv;                       // Приклеиваем новый элемент
 }
else                                        // Если пуст
beg = pv;
return beg;
}
// -------------------------------------------------- Корректировка сведений
int edit(Man* beg)
{   char name[l_name], buf[80];
    get_name(name);                         // Кого ищем?
    Man* prev;
    Man* pv = find(beg, name, &prev);
    if (!pv) return 1;                      // Если не нашли пробуем заново
    do
 {
     puts("Vvedite nov'i srednii ball");    //запрос данных
     gets(buf);
 }
    while (!(pv->pay = (float)atof(buf)));  //конвертация pay из символьной переменной в числовую, с плавающей точкой
    return 0;
}
// -------------------------------------------------- Поиск в списке по фамилии
Man* find(Man* pv, char* name, Man** prev)
{   *prev = 0;
    while(pv)
 {   if (strstr(pv->name, name))   //проверяет, находиться ли указатель на первом месте, в начале строки...
     if (pv->name[strlen(name)] == ' ')   // а вот не знаю - тут идет проверка на длину строки...но почему то проверяет на то что строка должна быть пустая...
  {
      printf("%30s%5i%10.2f\n", pv->name, pv->birth_day, pv->pay);
      return pv;
  }
     *prev = pv;
     pv = pv->next;
 }
    puts("Takogo studenta net\n");
    return 0;
}

// -------------------------------------------------- Поиск и вывод студентов по году рождения
void find(Man* pv, int birth_day)           //Поиск в таком-то файле такойто записи,
{   while (pv)
 {   if (pv->birth_day < birth_day)       // при условии что данные из базы меньше введенных
     printf("%30s%5i%10.2f\n", pv->name, pv->birth_day, pv->pay);       //выводим
     pv = pv->next;                       // переходим к следующеему студенту
 }
}

// -------------------------------------------------- Поиск и вывод студентов по среднему баллу
void find(Man* pv, float pay)                          // аналогично
{   while (pv)
 {   if (pv->pay >= pay)
     printf("%30s%5i%10.2f\n", pv->name, pv->birth_day, pv->pay);
     pv = pv->next;
 }
}

// -------------------------------------------------- Поиск
void find_man(Man* beg)
{   char buf[l_name];                    // отводим текстовую переменную под  запрос
    int birth_day=1, option;             // Объявляем переменные
    float pay;                           // еще одну
    do
 {   puts("l - poisk po familii    |   2 - po godu rozshdeniya,\n\
           3 - po srednemu ballu   |   4 - otmena\n");
     gets(buf);                          // считывание с клавы
 }
    while (!(option = atoi(buf)));      // конвертация buf из символьной переменной в числовую
    switch (option)                     // Опшн - счетчик
  {   case 1: get_name(buf);            // Если выбрали 1
      Man *prev;                        // могу с этим ошибаться, но кажеться это отвечает за поиск
      Man *pv = find(beg, buf, &prev);  // в файле, а это прогоняет по всем позициям...уточни в желтой книге которую я тебе давал, там есть раздел базы данных - работа с файлами, где-то в середине
      break;
     case 2: do                         // Если выбрали 2
   {  puts("Vvedite god rozshdeniya\n"); gets(buf);
   }  
      while (!(birth_day = atoi(buf)));   // конвертация birth_day из символьной переменной в числовую
      find(beg, birth_day);               // находим в файле дату
      break;
      case 3: do                      // Если выбрали 3
    {   puts("Vvedite srednii ball\n"); gets(buf);
    }
        while (!(pay = (float)atof(buf)));   // конвертация pay из символьной переменной в числовую, с плавающей точкой
        find(beg, pay);                   // ищем нужное
        break;
        case 4: return;            // Если выбрали 4 - выходим отсюда
        default:
        puts("nevern'i rezshim\n");   // Если нету такого варианта, то выводим предупреждение (защита от юзера)
  }
}
// -------------------------------------------------- Запрос фамилии
void get_name(char* name)                         // Функция, которая называется  get_name("имя студента")  - запрашивает имя
{   puts("Vvedite familiu I.O.");
    gets(name);                                 // считывает с клавы значение и заносит в переменную name

}
// -------------------------------------------------- Вывод меня
int menu()
{   char buf[10];         // Переменная отвечающая за введенную клавишу...изначально строковая переменная (защита от дурака, в случае если булет введена не та клавиша, программа не вылетит)
    int option;           // *
    do
 {   puts ("=================================================================");
     puts("1 - dobavlenie studenta\t   |   4 - korrektirovka svedenii");
     puts("2 - udalenie studenta\t\t   |   5 - v'vod baz' naekran");
     puts("3 - poisk studenta\t\t      |   6 - v'vod baz' v fail");
     puts("\t\t\t 7 - exit");
     gets(buf);
     option = atoi(buf);      // Переводит переменную отвечающую за нажатую клавишу из символьной переменной в числовую
 }
    while (!option);          // >* Пока не будет  нажата клавиша и выбрана нужная позиция (фактически означает, что это все будет находиться в бесконечном цикле, пока не будут выбран, какой-либо пункт)
    return option;
}
// -------------------------------------------------- Вывод базы данных на экран
void print_dbase(Man* beg)
{   Man* pv = beg;
    while (pv)
 {   printf("%s%5i%10.2f\n", pv->name, pv->birth_day, pv->pay);
     pv = pv->next;
 }
}
// -------------------------------------------------- Чтение базы из файла
Man* read_dbase(char* filename)
{   FILE* fin;
    Man man, *beg = 0;
    if ((fin = fopen(filename, "r")) == 0 )   // если фалй не был открыт для ЧТЕНИЯ
 {   printf("Net faila %s\n,", filename); return 0;
 }
    while (!feof(fin))         // пока не придет к концу файла (feof) делаем..
  {   fgets(man.name, l_name, fin);                   //уточние в книжке желтой
      fscanf(fin, "%i%f\n", &man.birth_day, &man.pay);
      beg = add(beg, man);
  }
    fclose(fin);        // закрываем базу
    return beg;
}
// -------------------------------------------------- Ввод инфы о новом студенте
Man read_man()
{   Man man; char buf[80];
    get_name(man.name);
    for (int i = strlen(man.name); i < l_name; i++)
    man.name[i] = ' ';
    man.name[l_name - 1] = '\0';
    do
 {   puts("Vvedite god rozshdeniya"); gets(buf);
 }
    while (!(man.birth_day = atoi(buf)));
    do
  {   puts("Vvedite srednii ball"); gets(buf);
  }
    while (!(man.pay = (float)atof(buf)));
    return man;
 }
// -------------------------------------------------- Процедура удаления студента
Man* remove(Man* beg)
{   char name [l_name];                     // Вроде переменную объявляем
    get_name(name);                         // Кого удаляем?
    Man* prev;                              // Переход на предыдущий элемент
    Man* pv = find(beg, name, &prev);       // Находим студента Find(В диапазоне от Beg,до Name, устраняем строчку из под студня)
    if (pv)                                 // Если студент найден
 {   if (pv == beg)                         // Удаление из начала списка
     beg = beg->next;                       //
     else                                   // Удаление из конца или середины списка
     prev->next = pv->next;
     delete pv;                             // Освобождение памяти из-под элемента
 }
    return beg;
}
// -------------------------------------------------- Процедура записи базы данных в файл
int write_dbase(char *filename, Man *pv)
{   FILE *fout;                                       // Привязка к переменной файла
    if ((fout = fopen(filename, "w")) == NULL)        // Если ФАЙЛ не был открыт для ЗАПИСИ - выводим "Error open file"
 {   puts("Error open file"); return 1;
 }
    while (pv)
  {   fprintf(fout, "%s%5i%10.2f\n", pv->name, pv->birth_day, pv->pay);      // Записываем в файл Имя Др Балл, и переходим на следующую строчку...
      pv = pv->next;                                                         // Идем записывать следующий элемент
  }
    fclose(fout);                                                            // Закрываем файл =)))
    return 0;
}




ЗЫ за вторую прогу на кол не сажать...
--------------------
AScript + Pascal + C -> C++ ->C#Adobe Photoshop 7.0/CS 2.0 + GIMP+ Visual Studio .NET(sp1)/2005 pro(sp1)
PM MAIL ICQ Skype GTalk Jabber   Вверх
wnayk
Дата 1.1.2007, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



KpoHyc, ни х..я они не запускаются твои проги...........
 smile 
PM MAIL   Вверх
Rockie
Дата 1.1.2007, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



Цитата(wnayk @  27.12.2006,  22:18 Найти цитируемый пост)
как найти длину этого числа?

wnayk, к примеру перегнать число в строку функцией itoa и узнать длину строки функцией strlen






--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
wnayk
Дата 2.1.2007, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



Rockie, , 
KpoHyc, , 
zkv
Anikmar
JackYF
колючка
Парни помогите с таким вопросом-очень важно-Дана функция :
void Dobav (Spisok **begin,char dpz [],int pok,char naim [],char ediz [],char price [],int kol)
мне нужно после того,как abc в функции abc=Srav (&aa,naim); ИСТИНА - мне нужно выйти из этой функции,
функция такова:
void Dobav (Spisok **begin,char dpz [],int pok,char naim [],char ediz [],char price [],int kol)
{
    int dlina=0,b=0,abc=1,a;
    char kol1 [11];
    Spisok *pp;
    Spisok *aa=*begin;
    Spisok *t1;
    Spisok *t=*begin;

    do
    {
          cout << rus("Укажите наименование товара: ");
          gets (naim);
          a=ForFIO (naim);
             dlina=strlen(naim);
         if (a)
            {
           cout << rus("ОШИБКА! Недопустимый символ!\n");
            }
 abc=Srav (&aa,naim);
 if(abc)
{
    cout << rus("Такой товар уже есть в наличии") << endl;
        cout << rus("Введите тогда количество ввозимого товара: ") << endl;
    cin >> kol1;
        kol=Perevod (kol1);
}
    } 
    while ((dlina==0)||(dlina>50)||(a));
    
    do
    {
     cout << rus("Укажите единицу измерения товара: ");
     gets (ediz);
     a=ForFIO(ediz);
        dlina=strlen (ediz);
        if (a)
        {
          cout << rus("ОШИБКА! Недопустимый символ!\n");
        }
    }
    while ((dlina==0)||(dlina>50));

    do
    {
     cout << rus("Укажите цену товара: ");
     cin >> price;
        a=ForCHIS(price);
        dlina=strlen(price);
        if (a)
        {
          cout << rus("ОШИБКА! Недопустимый символ!\n");
        }
    }
    while((dlina==0)||(dlina>10)||(a));
    do
    {
     cout << rus("Укажите дату: ");
     gets (dpz);
     a=ForCHIS (dpz);
     dlina=strlen(dpz);
     if (a)
        {
          cout << rus("ОШИБКА! Недопустимый символ!\n");
        }
        
    }
    while ((dlina==0)||(dlina>8)||(a));
    do
    {
     cout << rus("Укажите количество товара: ");
     gets (kol1);
     a=ForCHIS (kol1);
     dlina=strlen(kol1);
     if (a)
        {
          cout << rus("ОШИБКА! Недопустимый символ!\n");
        }
    }
    while ((dlina==0)||(dlina>10)||(a));
    kol=Perevod (kol1);
    if(abc==0)
    {
     while (t)
        {
         t1=t;      
         t=t->next;
        }
     pp=new Spisok;
     strcpy(pp->u,dpz);
     pp->p=pok;
     strcpy(pp->a,naim);
     strcpy(pp->n,ediz);
     strcpy(pp->g,price);
     pp->k=kol;
     pp->next=0;
     pp->next=0;
        t1->next=pp;
    }
    b=Podchet (&aa);
    cout << rus("Количество данных: ") << b << "\n" << endl;
}
ОЧЕНЬ НУЖНО И ВАЖНЕЦКО!!!!!!! smile 



PM MAIL   Вверх
zkv
Дата 2.1.2007, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 26
Всего: 92



Цитата(wnayk @  2.1.2007,  16:53 Найти цитируемый пост)
 
Код

abc=Srav (&aa,naim);
 if(abc)
{
    cout << rus("Такой товар уже есть в наличии") << endl;
    return;
}

пользуйтесь кнопкой "код"
PM MAIL   Вверх
zabivator
Дата 2.1.2007, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 7.6.2006
Где: нск

Репутация: 1
Всего: 2



Хм. За 500 рублей сделаю. Меньше не возьмусь. Это оплата двух дней моих работы в конторе. Я на каникулах. Тебя устравивает вариант?
--------------------
#include <zabivator>int main( int, char * [] ){   while( Zabivator::жив() ) Zabivator::моск()++;   return 0;}
PM MAIL WWW ICQ   Вверх
wnayk
Дата 3.1.2007, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



 smile Ну ты и барыга. Я сам скоро доделаю ее smile 
PM MAIL   Вверх
zabivator
Дата 4.1.2007, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 7.6.2006
Где: нск

Репутация: 1
Всего: 2



wnayk, время штука сложная. Мне его вечно не хватает. Я с радостью помогаю советом. Но надо понимать разницу между советом и готовой программой.
--------------------
#include <zabivator>int main( int, char * [] ){   while( Zabivator::жив() ) Zabivator::моск()++;   return 0;}
PM MAIL WWW ICQ   Вверх
wnayk
Дата 4.1.2007, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 10.12.2006

Репутация: нет
Всего: нет



zabivator, Я тебя и не просил готовую прогу. А че за х..я такая :
--------------------Configuration: кур2 - Win32 Debug--------------------
Compiling...
Skipping... (no relevant changes detected)-это че означает??????
кур2.cpp
Linking...

кур2.exe - 0 error(s), 0 warning(s)

Добавлено @ 17:52 
zabivator, А вот попробуй запусти у себя эту прогу на компе
ГОТОВАЯ ПРЧТИ ЧТО ПРОГА:::
#include <iostream>
#include <windows.h>
using namespace std;
char* rus(const char* text);
void Disk (char den [],char mes [],char god [],int pok,char naim [],char ediz [],char price [] ,int kol);
int kolvo ();
struct Spisok *Loading (char den [],char mes [],char god [],int pok,char naim [],char ediz [],char price [] ,int kol);
void Load (Spisok **begin,char den [],char mes [],char god [],int pok,char naim [],char ediz [],char price [] ,int kol);
int Podchet (Spisok **begin);
void Pech (Spisok **begin);
void Exit (Spisok **begin);
void Save (Spisok **begin);
int ForFIO (char a[]);
int ForCHIS (char a[]);
void Opis (Spisok **begin,char naim []);
int Srav (Spisok **begin, char naim[]);
void MainMenu ();
void Prodat (Spisok **begin,int pok,char naim [],char price [],char ediz [],int kol);
void Ucenka (Spisok **begin,int pok,char naim [],char price []);
void Dobav (Spisok **begin,char den [],char mes [],char god [],int pok,char naim [],char ediz [],char price [],int kol);
int Perevod (char pl[]);

struct Spisok     // Структура содержит данные лишь об одной книге!
{
    char d[3];   // Уникальный номер для каждой книги // день завоза
    char m[3];   // Месяц завоза
    char g[5];   // Год завоза
    int  p;       // Индикатор наличия данной книги в библиотеке // индикатор наличия товара 
    char a[45];   // Фамилия и инициалы автора книги // Наименование товара!
    char n[45];   // Полное название книги // Цена единицы!
    char e[20];    // Год издания книги // Единица измерения!
    int  k;       // Количество экземпляров данной книги // Количество товара
    Spisok *next;
};
//-----ГЛАВНАЯ ФУНКЦИЯ--------
int main ()
{
        cout << rus(" ***************************\n**МАГАЗИН С ОДНИМ ПРОДАВЦОМ**\n ***************************\n\n");    
    int a,b,d=0;
    FILE *fp;
    char abc[3];
    Spisok *begin;
    char den [3];// День завоза
    char mes [3];// Месяц завоза
    char god [5];// Год завоза
    int pok=0;// Индикатор наличия товара
    char naim [51];// Наименование товара!
    char price [51]; // Цена единицы!
    char ediz [10]; // Еденица измерения!
    int kol=0;// Количество товара
    fp=fopen ("data.txt","r");
    if (fp==NULL)
    {
        Disk (den,mes,god,pok,naim,price,ediz,kol);
    }
    else
    {
        fclose (fp);
    }
    begin=Loading(den,mes,god,pok,naim,price,ediz,kol);
metka: ;
    a=kolvo ();         // Мы узнали количество карточек в картотеке
    b=Podchet (&begin); // Подсчет карточек в памяти    
    cout << rus(" Объем базы на диске: ") << a << endl;
    cout << rus(" База загружена память объёмом: ") << b << "\n"<< endl;
    if (d)
    {
     cout << rus(" База товаров изменена! Рекомендуется сохраниться!\n") << endl;
    }
    MainMenu ();
    do
    {
     cout << rus(" Ваш выбор: ");
     gets (abc);
    }
    while ((strlen(abc)==0)||(strlen(abc)>1));
    switch (abc[0])
    {
    case '1':
        {
         Dobav (&begin,den,mes,god,pok,naim,price,ediz,kol);
            d=1;
        }
        break;
    case '2':
        {
         Pech (&begin);
        }
        break;
    case '3':
        {
         Prodat (&begin,pok,naim,price,ediz,kol); d=1;
 break;
        }
    case '4':
        {
         Ucenka (&begin,pok,naim,price);
 d=1;
        }
        break; 
    case '6':
        {
            do
            {
             cout << rus(" Перезаписать текущую базу товаров?") << "(Y/N)";
             gets (abc);
            }
            while ((strlen(abc)==0)||(strlen(abc)>1));
            if ((abc[0]=='Y')||(abc[0]=='y'))
            {
                Save (&begin);
                d=0;
            }
            else
                cout << rus(" Сохранения НЕ произошло!\n\n");
        }
        break;
    case '7':
        {
            do
            {
              cout << rus(" Выходим?") << "(Y/N) ";
             gets (abc);
            }
            while ((strlen(abc)==0)||(strlen(abc)>1));
            if ((abc[0]=='Y')||(abc[0]=='y'))
            {
                do
                {
                 cout << rus(" Сохраняемся?") << "(Y/N) ";
                 gets (abc);
                }
                while ((strlen(abc)==0)||(strlen(abc)>1));
                if ((abc[0]=='y')||(abc[0]=='Y'))
                {
                    Save (&begin);
                    d=0;
                }
                Exit (&begin); //  Высвобождение всей картотеки из памяти
            }
    case '5':
        {
            Opis (&begin,naim);
            break;
        }
        } 
        break;
    default:
        cout << rus(" Невыполнимая команда!\n");
    }
    goto metka;    
    return 0;
}
//----РУСИФИКАТОР----
char bufer[100];
char* rus(const char* text)
{
    CharToOem(text,bufer);
    return bufer;
}
//------НАЧАЛЬНОЕ ФОРМИРОВАНИЕ------
void Disk (char den [],char mes [],char god [],int pok,char naim [],char price [],char ediz [],int kol)
{
    pok=1;
    kol=1;
    FILE *fp;
    naim [0]='0';  den [0]='0';   price [0]='*';  ediz [0]='0';
    naim [1]='3';  den [1]='0';   price [1]='*';  ediz [1]='0';
    naim [2]='3';  den [2]='\0';  price [2]='*';  ediz [2]='0';
    naim [3]='2';  mes [0]='1';   price [3]='*';  ediz [3]='0';
    naim [4]='3';  mes [1]='1';   price [4]='\0'; ediz [4]='\0';
    naim [5]='\0'; mes [2]='\0';
                   god [0]='0';
                   god [1]='1';
                   god [2]='2';
                   god [3]='3';
                   god [4]='\0';
    
    fp=fopen ("data.txt","w");
    fprintf (fp,"%s.",den);
    fprintf (fp,"%s.",mes);
    fprintf (fp,"%s\n",god);
    fprintf (fp,"%d\n",pok);
    fprintf (fp,"%s\n",naim);
    fprintf (fp,"%s\n",price);
    fprintf (fp,"%s\n",ediz);
    fprintf (fp,"%d\n",kol);
    fclose (fp);
}
//-----КОЛИЧЕСТВО СОХРАНЕННЫХ ДАННЫХ-------
int kolvo ()
{
    int k=0;
    char a[51];
    FILE *f;
    f=fopen("data.txt","r");
    while (!feof(f))
    {
        fscanf(f,"%s",a);
        k++;
    }
    fclose (f);   
    return ((k-1)/6);
}
//-----ЗАГРУЗКА ДАННЫХ ИЗ ФАЙЛА-----
struct Spisok *Loading (char den [],char mes [],char god [],int pok,char naim [],char price [],char ediz [],int kol)
{
    int a=-1,b=0;
    FILE *fp;
    Spisok *aa;
    Spisok *d;
    fp=fopen ("data.txt","r");

    fscanf(fp,"%s",den);
    fprintf(fp,"%s.",mes);
    fprintf(fp,"%s.\n",god);
    fscanf(fp,"%d",&pok);
    fscanf(fp,"%s",naim);
    fscanf(fp,"%s",price);
    fscanf(fp,"%s",ediz);
    fscanf(fp,"%d",&kol);

    aa=new Spisok;
    strcpy(aa->d,den);
    strcpy(aa->m,mes);
    strcpy(aa->g,god);
    aa->p=pok;
    strcpy(aa->a,naim);
    strcpy(aa->n,price);
    strcpy(aa->e,ediz);
    aa->k=kol;
    aa->next=0;
    
    d=aa;            
    a=kolvo ();
    b=1;
    while ((!feof(fp))&&(b<a))
    {
        fscanf(fp,"%s",den);
        fscanf(fp,"%s.",mes);
        fscanf(fp,"%s.\n",god);
     fscanf(fp,"%d",&pok);
     fscanf(fp,"%s",naim);
     fscanf(fp,"%s",ediz);
     fscanf(fp,"%s",price);
     fscanf(fp,"%d",&kol);
        Load (&d,den,mes,god,pok,naim,price,ediz,kol);
        b++;
    }
    fclose (fp);
    cout << rus(" Загружено: ") << b << endl;
    return d;
}
//------ДОБАВЛЕНИЕ К КОНЦУ ПРИ ЗАГРУЗКЕ-------------
void Load (Spisok **begin,char den [],char mes [],char god [],int pok,char naim [],char price [],char ediz [],int kol)
{
    Spisok *t=*begin;
    Spisok *t1; 
    Spisok *aa;
    while (t)
    {
        t1=t;      
        t=t->next;
    }
    aa=new Spisok;
    strcpy(aa->d,den);
    strcpy(aa->m,mes);
    strcpy(aa->g,god);
    aa->p=pok;
    strcpy(aa->a,naim);
    strcpy(aa->n,price);
    strcpy(aa->e,ediz);
    aa->k=kol;
    aa->next=0;
    t1->next=aa; 
}
//-------КОЛИЧЕСТВО ДАННЫХ В ПАМЯТИ---------
int Podchet (Spisok **begin)
{
    Spisok *t=*begin;
    int k=0;
    while (t)
    {
        k++;
        t=t->next;
    }
    return k;
}
//--------ПЕЧАТЬ ДАННЫХ---------------------
void Pech (Spisok **begin)
{
    Spisok *t=*begin;
    while (t)
    {
        cout << rus(" Наименование товара:              ") << t->a << endl;
        cout << rus(" Дата последнего завоза:           ") << t->d << "." <<  t->m << "." << t->g << endl;
        cout << rus(" Цена товара:                      ") << t->n;
        cout << rus(" руб за 1 ") << t->e << endl;
        cout << rus(" Количество товара:                ") << t->k << " " << t->e <<  "\n" << endl;
        t=t->next;
    }
}
//------ВЫХОД ИЗ ПРОГРАММЫ---------
void Exit (Spisok **begin)
{
    Spisok *t=*begin;
    Spisok *t1;
    int n=0;
    while (t)
    {
        t1=t->next;
        delete t;
        n++;       
        t=t1;    
    }
    cout << rus("Выгружено: ") << n << "\n" << endl;
    exit (0);
}
//------СОХРАНЯЕМСЯ В ФАЙЛ---------
void Save (Spisok **begin)
{
    int n=0;
    Spisok *t=*begin;
    Spisok *t1;
    FILE *fp;
    fp=fopen ("data.txt","w");
    while (t)
    {
        t1=t->next;
        fprintf(fp,"%s.",t->d);
        fprintf(fp,"%s.",t->m);
        fprintf(fp,"%s\n",t->g);
        fprintf(fp,"%d\n",t->p);
        fprintf(fp,"%s\n",t->a);
        fprintf(fp,"%s\n",t->n);
        fprintf(fp,"%s\n",t->e);
        fprintf(fp,"%d\n",t->k);
        t=t1;
        n++;
    }
    cout << rus("Сохранено: ") << n << "\n" << endl;
    fclose (fp);
}
//---------ИНДИКАЦИЯ ЧИСЕЛ--------
int ForCHIS (char a[]) 
{
    int i,n=0;
    n=strlen (a);
    for (i=0;i<n;i++)
    {
        if (((a[i]<'0')||(a[i]>'9'))&&(a[i]!=':'))
        {
            return 1;
        }
    }
    return 0;
}
//--------ИНДИКАЦИЯ СЛОВ---------------
int ForFIO (char a[])
{
    int i,n=0;
    n=strlen (a);
    for (i=0;i<n;i++)
    {
        if (((a[i]<'A')||(a[i]>'Z'))&&((a[i]<'a')||(a[i]>'z')))
        {
            return 1;    
        }
    }
    return 0;
}
//--------ФУНКЦИЯ СРАВНЕНИЯ------------
int Srav (Spisok **begin, char naim[])
{
    Spisok *t=*begin;
    int a=0;
    while (t)
    {
        a=strcmp(t->a,naim);
        if (a==0)
        {
            return 2;
        }
        else
        {
            t=t->next;
        }
    }
    return 0;
}
//----------ГЛАВНОЕ МЕНЮ--------
void MainMenu ()
{
    cout << rus(" 1 - Добавить информацию о новом товаре\n");// Добавление книги
    cout << rus(" 2 - Инвентаризация товаров\n"); // Просмотр базы
    cout << rus(" 3 - Оформление покупки\n"); // Выдать книгу
    cout << rus(" 4 - Уцека товаров\n"); // Возврат обратно книги
    cout << rus(" 5 - Опись товаров\n");// Поиск по запросу 
    cout << rus(" 6 - Сохранить изменения\n");
    cout << rus(" 7 - Выйти из программы\n\n");

}
//----------ПОИСК------------------
void Opis (Spisok **begin,char naim [])
{
    int a=0,k=0,dlina,d=0;
    Spisok *t=*begin;
    Spisok *t1;

    do
    {
     cout << rus("Наименование товара: ");
     gets (naim);
     a=ForFIO (naim);
     dlina=strlen(naim);
     if (a)
        {
          cout << rus("ОШИБКА! Недопустимый символ!\n");
        }
    }
    while ((dlina==0)||(dlina>50)||(a));

    
    while (t)
    {
        t1=t->next;
        k=strcmp(t->a,naim);
                if (k==0)
        {
            d=1;
            cout << rus("\nНАЙДЕН РЕЗУЛЬТАТ:\n");
            cout << rus("Цена товара:          ") << t->n << " " <<  t->e << endl;
            cout << rus("Количество в наличии: ") << t->k << endl;
        }
        t=t1;
    }
    if (d==0)
    {
        cout << rus("Такой книги не найдено!\n");
    }
}
//------------ВЫДАТЬ КНИГУ НА РУКИ------------
void Prodat (Spisok **begin,int pok,char naim [],char price [],char ediz [],int kol)
{
    int a=0,k1=0,dlina,d=0,chetchik=0;
    Spisok *t=*begin;
    Spisok *t1;

    do
    {
     cout << rus("Укажите наименование товара: ");
     gets (naim);
     a=ForFIO (naim);
     dlina=strlen(naim);
     if (a)
        {
          cout << rus("ОШИБКА! Недопустимый символ!\n");
        }
    }
    while ((dlina==0)||(dlina>50)||(a));



    while (t)
    {
        t1=t->next;
        k1=strcmp(t->a,naim);
        if (k1==0)
        {
            d=1;
            cout << rus(" Цена товара: ") << t->n << rus(" руб за 1 ") << t->e << endl;  
            t->p=0;
        }
        t=t1;
    }
    t=*begin;
    while (t)
    {
        t1=t->next;
        k1=strcmp(t->a,naim);
        if ((k1==0)&&((t->p)==1))
        {
            chetchik=chetchik-1; // Количество книг уменьшилось на 1
        }
        t=t1;
    }
    t=*begin;
    while (t)
    {
        t1=t->next;
        k1=strcmp(t->a,naim);
        if ((k1==0)&&((t->p)==1))
        {
            t->k=chetchik;   // Применяем изменения
        }
        t=t1;
    }
    if (d==0)
    {
        cout << rus("Такого товара нет в наличии!\n");
    }
}
//------ВОЗВРАТ КНИГИ В БИБЛИОТЕКУ-----------
void Ucenka (Spisok **begin,int pok,char naim [],char price [])
{
    int a=0,k1=0,l=0,m=0,dlina,d=0,chetchik=0;
    Spisok *t=*begin;
    Spisok *t1;

    do
    {
     cout << rus("Укажите наименование товара: ");
     gets (naim);
     a=ForFIO (naim);
     dlina=strlen(naim);
     if (a)
        {
          cout << rus("ОШИБКА! Недопустимый символ!\n");
        }
    }
    while ((dlina==0)||(dlina>20)||(a));

    while (t)
    {
        t1=t->next;
        k1=strcmp(t->a,naim);
        if (k1==0)
        {
            d=1;
            cout << rus("Цена товара ДО уценки: ") << t->n << rus(" руб за 1 ");
            cout << t->e << endl;
            cout << rus("Укажите новую цену: ");
            gets (price);
            a=ForCHIS (price);
            dlina=strlen(price);
            if (a)
            {
                cout << rus("ОШИБКА! Недопустимый символ!\n");
            }
            if (! strcmp(t->n,price))
            {
                cout << rus("Именно ЭТА цена у данного товара!");
            }
            strcpy(t->n,price);
            cout << rus("Теперь у данного товара цена: ") << t->n << rus(" руб за 1 ");
            cout << t->e << endl;
        }
            break;
        t=t1;
    }


}
//-------ДОБАВЛЕНИЕ НОВОЙ КНИГИ-----------
void Dobav (Spisok **begin,char den [],char mes [],char god [],int pok,char naim [],char price [],char ediz [],int kol)
{
    int dlina=0,b=0,abc=1,a,x,y,z,c=0;
    char kol1 [11];
    Spisok *pp;
    Spisok *aa=*begin;
    Spisok *t1;
    Spisok *t=*begin;

    do
    {
     cout << rus("Укажите наименование товара: ");
     gets (naim);
     a=ForFIO (naim);
     dlina=strlen(naim);
     if (a)
        {
          cout << rus("ОШИБКА! Недопустимый символ!\n");
        }
        abc=Srav (&aa,naim);
        if (abc)
        {
        do
        {
            cout << rus("Такой товар уже имеется в наличии!\n");
            cout << rus("Укажите количество ввозимого товара: ");
            gets(kol1);
            a=ForCHIS(kol1);
            dlina=strlen(kol1);
            if (a)
        {
          cout << rus("ОШИБКА! Недопустимый символ!\n");
        }
kol=Perevod (kol1);
cout << rus("Теперь количество данного товара стало: ") << kol;
        }
while((dlina==0)||(dlina>50)||(a));
        }
    }
    while ((dlina==0)||(dlina>50)||(a));

    do
    {
     cout << rus("Укажите цену товара: ");
     gets (price);
     dlina=strlen (price);
        a=ForCHIS(price);
    if(a)
    {
cout << rus("ОШИБКА! Недопустимый символ!\n");
    }
    }
    while ((dlina==0)||(dlina>50));

    do
    {
     cout << rus("Укажите единицу измерения: ");
     gets (ediz);
     a=ForFIO (ediz);
     dlina=strlen(ediz);
     if (a)
        {
          cout << rus("ОШИБКА! Недопустимый символ!\n");
        }
    }
    while ((dlina==0)||(dlina>10)||(a));
metka1:;    
    do
    {
        cout << rus("Укажите дату завоза: ") << endl;
     cout << rus("Укажите число: ");
        gets (den);
     a=ForCHIS (den);
     dlina=strlen(den);
     if (a)
        {
          c=2;
        }
     cout << rus("Укажите месяц: ");
        gets (mes);
     a=ForCHIS (mes);
     dlina=strlen(mes);
     if (a)
        {
          c=2;
        }
     cout << rus("Укажите год: ");
        gets (god);
     a=ForCHIS (god);
     dlina=strlen(god);
     if (a)
        {
          c=4;
        }
        if ©
        {
            cout << rus("ОШИБКА!!! Недопустимый символ!\n");
        }
    }
    while ((strlen(den)==0)||(strlen(den)>2)||(strlen(mes)==0)||(strlen(god)>4)||©);
    x=Perevod (den);
    y=Perevod (mes);
    z=Perevod (god);
if (((x<1)||(x>31))||((y<1)||(y>12))||((z<1)||(z>9999)))
    {
        goto metka1;
    }
    do
    {
     cout << rus("Укажите количество товара: ");
     gets (kol1);
     a=ForCHIS (kol1);
     dlina=strlen(kol1);
     if (a)
        {
          cout << rus("ОШИБКА! Недопустимый символ!\n");
        }
    }
    while ((dlina==0)||(dlina>10)||(a));
    kol=Perevod (kol1);
    if(abc==0)
    {
     while (t)
        {
         t1=t;      
         t=t->next;
        }
     pp=new Spisok;
     strcpy(pp->d,den);
        strcpy(pp->m,mes);
        strcpy(pp->g,god);
     pp->p=pok;
     strcpy(pp->a,naim);
     strcpy(pp->n,price);
     strcpy(pp->e,ediz);
     pp->k=kol;
     pp->next=0;
     pp->next=0;
        t1->next=pp;
    }
    b=Podchet (&aa);
    cout << rus("Количество данных: ") << b << "\n" << endl;
}
    
    
//--------ПЕРЕВОД СТРОКИ В ЧИСЛО------------
int Perevod (char pl[])
{
    int a=0,b;
    for (b=0;b<strlen (pl);b++)
        a=a*10+pl[b]-'0';
    return a;
}






Она у меня после сохранения выдает Виндосовскую Ошибку(отправлять,не отправлять оштчет и все такое )
Че такое?!Помоги пожалуйста
PM MAIL   Вверх
JackYF
Дата 4.1.2007, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Ну ... такой пост читать !
Прикрепил бы файл!


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.3052 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.