
Кодофей
   
Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008
Репутация: 10 Всего: 33
|
mgkit, Ты уже определись. Либо пишешь на С, либо на С++. Вот. Недавно студику делал. Принцип тот же, но хранимые объекты другие. Поправь, и будет тебе счастье! | Код |
#include <io.h> #include <conio.h> #include <sys/stat.h>
#include <windows.h>
#include <ctime> #include <cstdlib> #include <cstdio> #include <vector> #include <string> #include <iostream> #include <algorithm>
using namespace std;
static const string _name = "base."; static const string _bext = "bin"; static const string _text = "txt"; static bool _binary = true;
/***************************************************************************/ /* Строка должна содержать две точки, пробел, двоеточие */ bool is_valid_time_string(const string& s) { return ( count(s.begin(), s.end(), '.')==2 && count(s.begin(), s.end(), ' ')==1 && count(s.begin(), s.end(), ':')==1 ); }
/***************************************************************************/
class MyTime { public: MyTime() { reset(); } MyTime(const string& s) { from_string(s); } /* */ bool from_string(const string& s) { if ( !is_valid_time_string(s) ) return false; sscanf(s.c_str(), "%d.%d.%d %d:%d", &day, &month, &year, &hour, &minutes); return true; } string to_string() const { char buf[128] = "\0"; sprintf( buf, "%02d.%02d.%04d %02d:%02d", day, month, year, hour, minutes); return string(buf); } void reset() { month=day=year=hour=minutes=0; } /* */ int month; int day; int year; int hour; int minutes; };
/***************************************************************************/
class File { public: enum Mode {read, write}; /**/ File():file(NULL) {} File(const char* name, Mode m) { open(name, m); } ~File() {fclose(file);} /* */ bool open(const char* fn, Mode m) { string mode = (m == read) ? "rb" : "wb"; file = fopen(fn, mode.c_str()); return file != NULL; } void close() { fclose(file); } /* */ bool at_end() const { return feof(file) != 0; } int size() const { struct stat stat; fflush(file); fstat(fileno(file), &stat); return stat.st_size; } /**/ File& operator<< (int v) { fwrite(&v, 1, sizeof(v), file); return *this; } File& operator<< (const MyTime& v) { fwrite(&v, 1, sizeof(v), file); return *this; } File& operator<< (const string& v) { int len = strlen(v.c_str()); *this << len; fwrite(v.c_str(), 1, len+1, file); return *this; } File& operator>> (int& v) { fread(&v, 1, sizeof(v), file); return *this; } File& operator>> (MyTime& v) { fread(&v, 1, sizeof(v), file); return *this; } File& operator>> (string& v) { int len = 0; *this >> len; v.clear(); v.resize(len); fread((char*)v.c_str(), 1, len+1, file); return *this; } /* */ FILE* file; };
/***************************************************************************/
class Item { friend File& operator<< (File&, const Item&); friend File& operator>> (File&, Item&); public: Item() { num = 0; } Item( int n, const string& fb, const string& fv, const string& d, MyTime in, MyTime out) { num = n; fiob = fb; fiov = fv; diagnoz = d; d_in = in; d_out = out; } Item(const Item& i) { num = i.num; fiob = i.fiob; fiov = i.fiov; diagnoz = i.diagnoz; d_in = i.d_in; d_out = i.d_out; } void clear() { fiob.clear(); fiov.clear(); diagnoz.clear(); num = 0; d_in.reset(); d_out.reset(); } /**/ int num; string fiob; string fiov; string diagnoz; MyTime d_in; MyTime d_out; };
/***************************************************************************/
File& operator<< (File& fs, const Item& item) { if ( _binary ) { fs << item.num << item.fiob << item.fiov << item.diagnoz << item.d_in << item.d_out; } else { fprintf(fs.file, "%d#%s#%s#%s#%s#%s\n", item.num, item.fiob.c_str(), item.fiov.c_str(), item.diagnoz.c_str(), item.d_in.to_string().c_str(), item.d_out.to_string().c_str() ); } return fs; }
File& operator>> (File& fs, Item& item) { if ( _binary ) { fs >> item.num >> item.fiob >> item.fiov >> item.diagnoz >> item.d_in >> item.d_out; } else { char buf[1024] = "\0"; char _num[128] = "\0"; char _fiob[128] = "\0"; char _fiov[128] = "\0"; char _diag[128] = "\0"; char _d_in[128] = "\0"; char _d_ou[128] = "\0"; /* */ fgets(buf, sizeof(buf), fs.file); /* if buf id empty */ if ( strlen(buf) < 5 ) return fs; /* Number */ char* p1 = buf; char* p2 = strchr(p1, '#'); strncpy(_num, p1, p2-p1); /* fiob */ p2++; p1 = p2; p2 = strchr(p1, '#'); strncpy(_fiob, p1, p2-p1); /* fiov */ p2++; p1 = p2; p2 = strchr(p1, '#'); strncpy(_fiov, p1, p2-p1); /* diagnoz */ p2++; p1 = p2; p2 = strchr(p1, '#'); strncpy(_diag, p1, p2-p1); /* incomming */ p2++; p1 = p2; p2 = strchr(p1, '#'); strncpy(_d_in, p1, p2-p1); /* outgoing */ p2++; p1 = p2; p2 = strchr(p1, '\n'); strncpy(_d_ou, p1, p2-p1);
item.num = atoi(_num); item.fiob = _fiob; item.fiov = _fiov; item.diagnoz = _diag; item.d_in.from_string(_d_in); item.d_out.from_string(_d_ou); } return fs; }
/***************************************************************************/
bool CompFiob(const Item& it1, const Item& it2) { return it1.fiob < it2.fiob; } bool CompFiov(const Item& it1, const Item& it2) { return it1.fiov < it2.fiov; } bool CompDiag(const Item& it1, const Item& it2) { return it1.diagnoz < it2.diagnoz; }
/***************************************************************************/
bool file_exists(const char* fn) { FILE* file = fopen(fn, "r"); return (file) ? fclose(file) == 0 : false; }
/***************************************************************************/
class ItemList :public vector<Item> { string fname; public: enum Sort{fiob, fiov, diag}; ItemList():vector<Item>() {} ItemList(const char* fn, bool b):vector<Item>() { fname = fn; if ( !file_exists(fn) ) { File file(fn, File::write); } load(fn); } ~ItemList() { save(fname.c_str()); } /* Загужает список из файла */ bool load(const char* fn) { fname = fn; clear(); File file(fn, File::read); if ( file.size() == 0 ) return true; Item item; while ( !file.at_end() ) { file >> item; if ( !item.fiob.length() ) continue; push_back(item); } file.close(); return true; } /* Сохраняет список в файл */ void save(const char* fn) { File file(fn, File::write); vector<Item>::const_iterator it; for (it = begin(); it != end(); it++) { file << *it; } file.close(); } /* Тут все понятно */ void sort(Sort s) { switch (s) { case fiob: std::sort(begin(), end(), CompFiob); break; case fiov: std::sort(begin(), end(), CompFiov); break; case diag: std::sort(begin(), end(), CompDiag); break; } save(fname.c_str()); } bool contains(const Item& item) const { const_iterator it = begin(); while ( it != end() ) { if ( it->fiob == item.fiob ) return true; it++; } return false; } void add(Item& item) { if ( size() && contains(item) ) return; item.num = size(); push_back(item); } int find(Sort s, const string& p) const { int idx = 0; const_iterator it = begin(); while ( it != end() ) { if ( p == ((s==fiob)?it->fiob:(s==fiov)?it->fiov:it->diagnoz) ) { return idx; } it++; idx++; } return -1; } };
/***************************************************************************/
void ClearScreen() { COORD c = {0,0}; DWORD whocares; FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE),' ',2000,c,&whocares); SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c); }
/***************************************************************************/
void Add(ItemList& list) { string tmp1; string tmp2; Item item; while ( true ) { ClearScreen(); /* */ cout << "ФИО пациента : "; getline(cin, item.fiob, '\n'); cout << "Диагноз : "; getline(cin, item.diagnoz, '\n'); cout << "ФИО врача : "; getline(cin, item.fiov, '\n'); cout << "Поступил (дд.мм.гггг чч:мм): "; getline(cin, tmp1, '\n'); cout << "Выписан (дд.мм.гггг чч:мм): "; getline(cin, tmp2, '\n'); if ( !is_valid_time_string(tmp1) ) { cerr << "Ошибка ввода даты поступления пациента! Повторите ввод." << endl; continue; } if ( !is_valid_time_string(tmp2) ) { cerr << "Ошибка ввода даты выписки пациента! Повторите ввод." << endl; continue; } break; } item.d_in.from_string(tmp1); item.d_out.from_string(tmp2); list.add(item); }
/***************************************************************************/
void Print(const Item& item) { cout << "ФИО пациента : " << item.fiob << endl; cout << "ФИО врача : " << item.fiov << endl; cout << "Диагноз : " << item.diagnoz << endl; cout << "Поступил : " << item.d_in.to_string().c_str() << endl; cout << "Выписан : " << item.d_out.to_string().c_str() << endl; }
void PrintAll(const ItemList& list) { ItemList::const_iterator it; for ( it = list.begin(); it != list.end(); it++ ) { Print(*it); cout << "\n***************************************************************************\n"; } cout << "Нажмите Esc для продолжения." << endl; getch(); }
/***************************************************************************/
void Find(ItemList& list) { int idx = 0; char ch = 0; string tmp; /* */ while ( ch != 'q' ) { cout << "Искать по ФИО пациента - 1\n" "Искать по ФИО врача - 2\n" "Искать по диагнозу - 3\n" "Вернуться - q\n"; ch = getch(); ClearScreen(); switch ( ch ) { case '1': cout << "Укажите ФИО пациента : "; getline(cin, tmp, '\n'); idx = list.find(ItemList::fiob, tmp); break; case '2': cout << "Укажите ФИО врача : "; getline(cin, tmp, '\n'); idx = list.find(ItemList::fiov, tmp); break; case '3': cout << "Укажите диагноз : "; getline(cin, tmp, '\n'); idx = list.find(ItemList::diag, tmp); break; case 'q': cout << "Возвращаемся"; return; default: cout << "Не верно указан параметр. Нажмите Esc для повторного ввода." << endl; getch(); ClearScreen(); continue; } if ( idx == -1 ) { cout << "Искомая запись не найдена. Нажмите Esc для повторного ввода." << endl; getch(); ClearScreen(); continue; } Print(list[idx]); cout << "Нажмите Esc для продолжения." << endl; getch(); ClearScreen(); } ClearScreen(); }
/***************************************************************************/
void Remove(ItemList& list) { unsigned ch = 0; cout << "Укажите номер записи которую желаете удалить. Макс = " << list.size()-1 << endl; ch = getch()-'0'; if ( ch > list.size() ) { cout << "Элемента с этим номером не существует!" << endl; return; } ItemList::iterator it = list.begin()+ch; list.erase(it); }
/***************************************************************************/
void RemoveAll(ItemList& list) { char ch = 0; cout << "Вы действительно желаете удалить все записи? 1-Да, Esc-Нет." << endl; ch = getch(); if ( ch == '1' ) { list.clear(); } else { return; } }
/***************************************************************************/
void Edit(ItemList& list) { unsigned ch = 0; cout << "Укажите номер записи которую желаете изменить. Макс = " << list.size()-1 << endl; ch = getch()-'0'; if ( ch > list.size() ) { cout << "Элемента с этим номером не существует!" << endl; return; } ClearScreen(); string tmp; Item item = list[ch]; cout << "Предыдущая информация в записи:\n" "***************************************************************************\n"; Print(item); cout << "***************************************************************************\n"; cout << "Внесите необходимые изменения:" << endl << endl; cout << "ФИО пациента : "; getline(cin, item.fiob, '\n'); cout << "ФИО врача : "; getline(cin, item.fiov, '\n'); cout << "Диагноз : "; getline(cin, item.diagnoz, '\n'); cout << "Поступил : "; getline(cin, tmp, '\n'); item.d_in.from_string(tmp); cout << "Выписан : "; getline(cin, tmp, '\n'); item.d_out.from_string(tmp); /* */ list[ch] = item; }
/***************************************************************************/
void SaveAs(ItemList& list) { cout << "Укажите имя файла для сохранения: "; string file_name; getline(cin, file_name, '\n'); list.save(file_name.c_str()); }
/***************************************************************************/
int main(int argc, char** argv) { char ch = 0; string file_name; system("chcp 1251 > nul"); cout << "Выбирите способ хранения информации:\n" " 1 - бинарный\n" " 2 - текстовый\n"; _binary = (getch() == '1'); file_name = (_binary) ? _name + _bext : _name + _text; ItemList list(file_name.c_str(), _binary);
while ( ch != 'q') { ClearScreen(); cout << "Выбирите действие:\n" " 1 - Добавить\n" " 2 - Найти\n" " 3 - Изменить\n" " 4 - Показать все\n" " 5 - Удалить\n" " 6 - Удалить все\n" " 7 - Сохранить\n" " 8 - Сохранить как...\n" " q - Выход\n"; ch = getch(); if ( ch == 'q' || ch == 27 ) break; switch (ch) { case '1': ClearScreen(); Add(list); ClearScreen(); break; case '2': ClearScreen(); Find(list); ClearScreen(); break; case '3': ClearScreen(); Edit(list); ClearScreen(); break; case '4': ClearScreen(); PrintAll(list); ClearScreen(); break; case '5': ClearScreen(); Remove(list); ClearScreen(); break; case '6': ClearScreen(); RemoveAll(list); ClearScreen(); break; case '7': list.save(file_name.c_str()); break; case '8': ClearScreen(); SaveAs(list); ClearScreen(); break; }; }
ClearScreen(); return 0; }
/***************************************************************************/
|
Это сообщение отредактировал(а) andrew_121 - 11.6.2009, 01:25
--------------------
Удалил аккаунт. Прощайте!
|