Ask Question

Name:
Title:
Your Question:

Answer Question

Name:
Your Answer:
User Submitted Source Code!


Description:
  d:\1.exe
Language: C/C++
Code:
//Предметная область – «Платежные поручения». Данные о платеже хранятся в структуре с именем ORDER, содержащей следующие поля:
// -- расчётный счёт плательщика;
// -- расчётный счёт получателя;
// -- перечисляемая сумма в рублях.
//Задание на поиск: найти информацию о сумме, снятой с расчётного счёта плательщика, введённого с клавиатуры.


#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <stdio.h>
//#include <crtdbg.h>
//#include <windows.h>
#ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#define newDBG_NEW
#endif
#endif
#include <iostream>
#include <cstring>
#include <iomanip>
#include <memory.h>
#include <fstream>

#include <string.h>
#include <sstream>


using namespace std;


#pragma pack(push,1)
struct Order{
     char * CreditNumber; // Номер расчетного счёта плательщика
     char * DebetNumber;  // Номер расчетного счёта получателя
     int sum;            // Перечисляемая сумма в рублях
};
#pragma pack(pop)

struct List
{
     Order data;
     List* next;
};
void OutLine(Order d)
{
     cout<<" "<<left<<setw(25)<<d.CreditNumber<<d.DebetNumber<<setw(5)<<d.sum<<endl;
}
// Добавление элемента в конец списка
void AddElem(List **begin, List ** cur, Order elem)
{
     List * p = new List;
     p->data=elem;
     //проверка, является ли список пустым
     if (*begin == NULL)
     {
          p->next = NULL;
          *begin = p;
     } else
     {
          p->next=(*cur)->next;// или p->next=NULL;
          (*cur)->next=p;
     }
     *cur = p;
}
// Добавление элемента в начало списка
void AddFirstElem(List **begin, Order elem)
{
     List * p = new List;
     p->data=elem;
     //проверка, является ли список пустым
     if (*begin == NULL)
     {
          p->next = NULL;
     } else
     {
          p->next=*begin;
     }
     *begin = p;
}
//вывод элементов списка на экран
void ShowList(List *begin)
{
     List * p = begin;
     while (p!=NULL)
     {
          OutLine(p->data);
          p=p->next;
     }
}
// поиск элемента в списке по номеру плательщика и получателя (оборотка)
List * FindElem(List *begin, Order elem)
{
     List * p = begin;
     while (p!=NULL)
     {
          if (!strcmp(p->data.CreditNumber,elem.CreditNumber) && (p->data.DebetNumber==elem.DebetNumber))
               break;
          p=p->next;
     }
     return p;
}
//Поиск єлемента по номеру расчетного счета
List * FindElemRS(List *begin, char *k)
{
     List * p = begin;
     while (p!=NULL)
     {
          if (!strcmp(p->data.CreditNumber,k) )
               break;
          p=p->next;
     }
     return p;
}

// Удаление списка

void DeleteSpisok(List  * begin)
 {
  //List *p = nullptr;
  List *p = begin;
   while (p->next)
  {
    List *tmp;
        tmp = p;
        p = p->next;
        delete tmp;
  }
  p=p->next;
  delete []p;
  }

  //Удаление єлемента из списка

void DelElem(List **begin, List* ptrCur)
{
     List * p;
     if (ptrCur==*begin) {//удаляем первый элемент
          *begin=(*begin)->next;
     }     
     else
     { //устанавливаем вспомогательный указатель на элемент, предшествующий удаляемому
          p=*begin;
          while (p->next!=ptrCur)
               p=p->next;
          // удаление элемента
          p->next=ptrCur->next;
     }
     delete ptrCur;
}
//очистка памяти
void Free(List **begin)
{
     if (*begin == 0) 
          return;
     List *p = *begin;
     List *t;
     while (p)
     {
          t = p;
          p = p->next;
          delete t;
     }
     *begin = NULL;
}
//Ввод данных - Расчётный счёт Плательщика, покуателя, и сумма
void inputData(Order & r)
{// проверки добавляются в соответствии с заданной предметной областью
     cin.ignore(cin.rdbuf()->in_avail());
     cout<<"Введите Расчётный счёт плательщика: "; cin.getline(r.CreditNumber, 20);
     //если ввели строку длиннее, чем выделено памяти, просто обрезаем ее и чистим буфер
     if (cin.fail()) {
          cin.clear();
          cin.ignore(cin.rdbuf()->in_avail());
     }
     cin.ignore(cin.rdbuf()->in_avail());
     cout<<"Введите Расчётный счёт Получателя: "; cin.getline(r.DebetNumber, 20);
     //если ввели строку длиннее, чем выделено памяти, просто обрезаем ее и чистим буфер
     if (cin.fail()) {
          cin.clear();
          cin.ignore(cin.rdbuf()->in_avail());
     }
     // Если можно использовать stdio.h то можно реализовать форматній ввод данных
     //printf("Введите сумму: \n");
     //scanf("%lf",&r.num);
     cout<<"Введите сумму: "; cin>>r.sum;
}

istream& getrecord(istream& s, Order& t)
{
    string line;
    while (line == "" && getline(s, line))
        ;
    if (s)
        t.CreditNumber = const_cast<char*>(line.c_str());
    if (getline(s, line))
        t.DebetNumber = const_cast<char*>(line.c_str());
    if (getline(s, line))
        istringstream(line.c_str()) >> t.sum;
    return s;
}
void LoadFromFile(List **head,List **cur,Order r)
{
      ifstream f("orders.txt",ios::app);
      while (getrecord(f, r))
        AddElem(head,cur,r);
     f.close();
}
void OutFileLine(Order d)
{
     ofstream output("orders.txt",ios::app);
     if(output)
     {
        output<<d.CreditNumber;
        output<<d.DebetNumber;
        output<<d.sum;
        output.close();
     }          
}
void AddToFile(List **begin)
{
     List * p = *begin;
     while (p!=NULL)
     {
          OutFileLine(p->data);
          p=p->next;
     }
}
void EditElem(Order r)
{
     cin.ignore(cin.rdbuf()->in_avail());
     cout<<"Введите Расчётный счёт Получателя: "; 
     cin.getline(r.DebetNumber, 20);
     if (cin.fail()) {
          cin.clear();
          cin.ignore(cin.rdbuf()->in_avail());
     }
     cout<<"Введите сумму: "; 
     cin>>r.sum;
}


int main()
{
     List* head = NULL;
     List* cur = NULL;
//      SetConsoleCP(1251);
//      SetConsoleOutputCP(1251);
     int n=-1;
     Order r;
     // Меню пользователя
     while (n != 0){
          cout << endl <<
          "1 - Добавить в конец"<<endl<<
          "2 - Вывод списка"<<endl<<
          "3 - Добавить в начало"<<endl<<
          "3 - Добавить в начало"<<endl<<
          "4 - Поиск"<<endl<<
          "5 - Поиск по № Расчётного счёта плательщика"<<endl<<
          "6 - Удаление"<<endl<<
          "7 - Редактирование"<<endl<<          
          "8 - Добавить платёжку в файл "<<endl<<
          "9 - Загрузить платёжки из файла "<<endl<<
          "0 - Выход\nВыберите действие: ";
          cin.clear();
          cin.ignore(cin.rdbuf()->in_avail());
          cin >> n;
          while (cin.fail() || (n<0) || (n>8)){
               cin.clear();
               cin.sync();
               cout << "Ошибка ввода, выберите действие: "; cin >> n;
          }
          switch (n)
          {
          case 1: {//Добавить в конец
               inputData(r);
               AddElem(&head, &cur, r); break; }
          case 2: {//Вывод списка
               if (head) 
                    ShowList(head);
               else 
                    cout<<"Нет данных!"<<endl; 
               break; }
          case 3: {//Добавить в начало
               inputData(r);
               AddFirstElem(&head, r); break; }
          case 4: {//поиск Элемента
               if (!head) {
                    cout<<"Нет данных!"<<endl;
                    break;}
               List* ptr;
               inputData(r);
               ptr=FindElem(head, r);
               if (ptr==NULL)
                    cout<<"Запись не найдена!"<<endl;
               else
                    OutLine(ptr->data);
               break; }
          case 5: {//Поиск по номеру расчетного счёта
               if (!head) {cout<<"Нет данных!"<<endl; break;}
               char * num;
               cout<<"Введите номер Расчётного счёта плательщика: "; cin>>num;
               List* ptr;
               ptr=FindElemRS(head, num);
               if (ptr==NULL)
                    cout<<"Запись не найдена!"<<endl;
               else
                    OutLine(ptr->data);
               break;}
          case 6: {// удаление записи
               if (!head) {cout<<"Нет данных!"<<endl; break;}
               List* ptr;
               inputData(r);
               ptr=FindElem(head, r);
               if (ptr==NULL)
                    cout<<"Запись не найдена!"<<endl;
               else {
                    DelElem(&head,ptr); 
                    cout<<"Запись удалена!"<<endl;};
               break; }
          case 7: {//Редактирование
               if (!head) {cout<<"Нет данных!"<<endl; break;}
               char * num;
               cout<<"Введите номер Расчётного счёта плательщика: "; cin>>num;
               List* ptr;
               ptr=FindElemRS(head, num);
               if (ptr==NULL)
                    cout<<"Запись не найдена!"<<endl;
               else
                    EditElem(ptr->data);
               break;}
          case 8: {// Запись структуры в файл
               gets("orders.txt");
               if(remove("orders.txt")) 
                    cout<<"Ошибка удаления файла";
               else
                    AddToFile(&head);
               break; }
          case 9: {// Загрузить платёжки из файла
               DeleteSpisok(head);
               DeleteSpisok(cur);
               //List* head = NULL;
               //List* cur = NULL;
               LoadFromFile(&head,&cur,r);
               break; }     
          }
     }
     Free(&head);
/* // Включить Этот блок вместе с библиотекой crtdbg.h - Это очистка  и прочая лабуда -  взято из методы
    _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
     _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);
     _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);
     _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDOUT);
     _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
     _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT);
     _CrtDumpMemoryLeaks();
*/
     system ("pause");
     return 0;
}
/*void SaveToFile(&head,r)
{
    // создаём или открываем файл
    fstream f("orders.dat",ios::binary|ios::in|ios::out|ios::trunc);
    f.write((unsigned char*)&head,sizeof head);
     f.close();
    return 0;
}



ifstream input("c:\\temp\\s.txt");
if(input)
{
   input>>family;
   input>>name;
   ....
   input.close();
}
...
ofstream output("c:\\temp\\s.txt",ios::app);
if(output)
{
   output<<family;
   output<<name;
   ....
   output.close();
}
*/     
Comments: