Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2008, 17:41   #1
Go6a
Пользователь
 
Регистрация: 27.01.2008
Сообщений: 50
По умолчанию Помогите разобраться с ошибками в исходнике С++

Скопировал из учебника исходник задачи:
Написать программу учета нарушений ПДД. Для каждой автомашины необходимо хранить в базе список нарушений, для каждого нарушения фиксируется дата, время, вид нарушения и размер штрафа. При оплате всех штрафов автомашина удаляется из базы.
При компиляции выдается о-о-очень много ошибок, помогите разобраться , в чем дело!

Код:
#include <fstream.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <iomanip.h>

const char *filename = "dbase";
enum Action {INSERT, DEL, INFO};
enum Dir {LEFT, RIGHT};
const int l_time = 20, l_type = 40, l_number = 12;

struct Fine {  
   char time[l_time];  
   char type[l_type]; 
   float price; 
   Fine *next;  
   };
struct Node {  
   char number[l_number];
   Fine *beg; 
   Node *left;
   Node *right;
   };
struct Data {  
   char number[l_number];
   char time[l_time];
   char type[l_type]; 
   float price;
   };

Node *descent (Node *p);
Node *first (Data data);
Data input (Action action);
int menu ();
void print_node (const Node &node);
void print_dbase (Node *p);
Node *read_dbase (char *filename);
int read_fine (ifstream f, Data &data);
int remove_fine (Node *p, const Data &data);
void remove_fines (Node *p);
Node *remove_node (Node *root, Node *p, Node *parent, Dir dir);
Node remove_tree (Node *p);
Node search_insert (Node *root, const Data &data, Action action,
		    Dir &dir, Node *&parent)
void write_dbase (ofstream f, const Node* root);
void write_node (ofstream f, const Node &node);

int main ()
   {
   Node *p, *parent;
   Node *root = read_dbase(filename);
   ofstream fout;

   Dir dir;
   while (true)
      {
      switch (menu())
	 {
	 case 1: 
	    if (!root) root = first (input (INSERT));
	    else search_insert (root, input (INSERT), INSERT, dir, parent);
	    break;
	 case 2:
	    if (!root)
	       {
	       cout << "Baza pusta" << endl;break;
	       }
	    Data data = input (DEL);
	    if (!(p = search_insert (root, data, DEL, dir, parent)))
	       cout << "Svedenia ob avtomobile otsutstvujut" << endl;
	    else
	       if (remove_fine (p, data) == 2)
		  root = remove_node (root, p, parent, dir);
	       break;
	 case 3:
	    if (!root) {cout << "Baza pusta" << endl; break; }
	    if (!(p = search_insert (root, input (INFO), INFO, dir, parent)))
	       cout << "Svedenia otsutstvujut" << endl;
	    else print_node (*p);
	    break;
	 case 4:
	    fout.open (filename);
	    if (!fout.is_open())
	       {
	       cout << "Oshibka otkriria faila" << filename << endl; return 1;
	       }
	    write_dbase (fout.root);
	    return 0;
	 case 5:
	    print_dbase (root);
	    break;
	 default:
	    cout << "Nado vvodit' chislo ot 1 do 4" << endl;
	    break;
	 }
      }
      return 0;
   }
Node *descent (Node *p) {
   Node *prev, *y = p -> right;
   if (!y -> left) y -> left = p -> left;
   else {
      do {prev = y; y = y -> left; }
      while (y -> left);
      y -> left = p -> left;
      prev -> left = y -> right;
      y -> right = p -> right;
      }
      return y;
   }
Node *first (Data data)
   {
 
   Fine *beg = new Fine;
   strncpy (beg -> time, data.time, l_time);
   strncpy (beg - > type, data.type, l_type);
   beg -> price = data.price;
   beg -> next = 0;
 
   Node *root = new Node;
   strncpy (root -> number, data.number, l_number);
   root -> beg = beg;
   root -> left = root -> right = 0;
   return root;
   }
Data input(Action action)
   {
   Data data;
   char buf[10], temp1[3], temp2[3];
   int day, month, hour, min;
   cout << "Vvedite nomer a/m" << endl;
   cin.getline (data.number, l_number);
   if (action == INFO) return data;

   do
      {
      cout << "Vvedite datu narushenia v formate DD.MM.GG:" << endl;
      cin >> buf;
      strncpy (temp1, buf, 2);
      strncpy (temp2, &buf[3], 2);
      day = atoi (temp1);
      month = atoi (temp2);
      }
   while (!(day > 0 && day < 32 && month > 0 && month < 13));
   strcpy (data.time, buf);
   strcat (data,time, " ");

   do
      {
      cout << "Vvedite vremya narushenia v formate CHCH:MM" << endl;
      cin >> buf;
      strncpy (temp1, buf, 2);
      strncpy (temp2, &buf[3], 2);
      hour = atoi (temp1);
      min = atoi (temp2);
      }
   while (!(hour >= 0 && hour < 24 && min >= 0 && min < 60));

   strcat(data.time, buf);
   cin.get();
   if (action == DEL) return data;

   cout <<"Bbedite tip narushenia" << endl;
   cin.getline (data.type, l_type);

   do
      {
      cout << "Vvedite razmer shtrafa" << endl;
      cin >> buf;
      }
   while (!(data.price = (float)atof(buf)));
   cin.get();
   return data;
   }
Go6a вне форума Ответить с цитированием
Старый 03.05.2008, 17:43   #2
Go6a
Пользователь
 
Регистрация: 27.01.2008
Сообщений: 50
По умолчанию

Вторая половина кода:
Код:
int menu()
   {
   char buf[10];
   int option;
   do
      {
      cout << "1 - Vvod svedenii o narushenii" << endl;
      cout << "2 - Vvod svedenii ob oplate strafa" << endl;
      cout << "3 - Spravka" << endl;
      cout << "4 - Vihod" << endl;
      cin >> buf;
      option = atoi (buf);
      }
      while (!option);
      cin.get ();
      return option;
   }
//--------------------Vivod svedenii ob a/m

void print_node (const Node &node)
   {
   cout << "Nomer a/m: " << node.number << endl;
   Fine *pf = node.beg;
   float summa = 0;
   while (pf)
      {
      cout << "Vid narushenia: " << pf -> type << endl;
      cout << "Data i vremya: " << pf -> time;
      cout << "Razmer strafa:" << pf -> price << endl;
      summa += pf -> price;
      pf = pf -> next;
      }
   cout << "Obshaia summa strafov: " << summa << endl;
   }
//-----------------Vivod na ekran vsego dereva

void print_dbase (Node *p)
   {
   if (p)
      {
      print_node (*p);
      print_dbase (p -> left);
      print_dbase (p -> right);
      }
   }
//------------------Chtenir bazi iz faila
Node *read_dbase (char *filename)
   {
   Node *parent;
   Dir dir;
   Data data;
   ifstream f(filename, ios::in|ios::nocreate);
   if (!f) {cout << "Net faila " << filename << endl; return 0;}
   f.getline (data.number, l_number);
   if(f,eof()) {cout << "Pustoi fail (0 bait)" << endl; return 0;}
   read_fine (f, data);
   Node *root = first (data);
   while (!read_fine (f, data))
      search_insert (root, data, INSERT, dir, parent);

   // Formirovanie deteva:
   while (f.getline (data.number, l_number))
      {
      read_fine (f, data);
      search_insert (root, data, INSERT, dir, parent);
      while (!read_fine (f, data)) // posledujushie narushenia
	 search_insert (root, data, INSERT, dir, parent);
	 }
	 return root;
	 }
//---------------------Chtenie iz faila inf o narushenii

int read_fine (ifstream f, Data &data)
   {
   f.getline (data.time, l_time);
   if (data.time[0] == '=')
      return 1;
      f.getline (data.type, l_type);
      f >> data.price;
      f.get();
      return 0;
      }
//----------------Udalenie narushenia iz spiska

int remove_fine (Node *p, const Data &data)
   {
   fine *prev, *pf = p -> beg;
   bool found = false;
   while (pf && !found)
      {
      if (!strcmp(pf -> time, data.time))
      found = true;
      else
      {
      prev = pf;
      pf = pf -> next;
      }
      }
      if (!found)
	 {
	 cout << "Svedenia o narushenii otsutstvujut" << endl;
	 return 1;
	 }
   if (pf == p -> beg)
      p -> beg = pf -> next;
   else
      prev -> next = pf -> next;
   delete pf;
   if (!p -> beg) return 2;
   return 0;
   }
//-----------------Udalenie uzla dereva
Node *remove_node (Node *root, Node *p, Node *parent, Dir dir)
   {
   Node *y;
   if (!p -> left)
      y = p -> right;
   else if (!p -> right) y = p -> left;
   else y = desent (p);
   if (p == root) root = y;
   else
      {
      if (dir == LEFT) parent -> left = y;
      else parent -> right = y;
      }
      delete p;
      return root;
   }
//----------------poisk s vkljucheniem

Node *search_insert (Node *root, const Data &data, Action action,
		     Dir &dir, Node *&parent)
   {
   Node *p = root;
   bool found = false;
   int cmp;

   parent = 0;
   while (p && !found)
      {
      cmp = strcmp (data,number, p -> number);
      if (!cmp) found = true;
      else {
	 parent = p;
	 if (cmp < 0) {p = p -> left; dir = LEFT;}
	 else {p = p -> right; dir = RIGHT;}
      }
      }
   if (action !=INSERT) return p;

// sozdanie zapisi o narushenii

Fine *pf = new Fine;
strncpy (pf -> time, data.time, l_time);
strncpy (pf -> type, data.type, l_type);
pf -> price = data.price;
pf -> next = 0;

if (!found)
   {
   p = new Node;
   strncpy (p -> number, data,number, l_number);
   p -> beg = pf;
   p -> left = p -> right = 0;
   if (dir == LEFT)
      parent -> left = p;
      else
      parent -> right = p;
      }
      else {
      Fine *temp = p -> beg;
      while (temp -> next) temp = temp -> next;
      temp -> next = pf;
      }
      return p;
      }
//--------------------Vivod bazi v fail
void write_dbase (ofstream f, const Node *p)
   {
   if (p)
      {
      write_node (f, *p);
      write_dbase (f, p -> left);
      write_dbase (f, p-> right);
      }
      }
//--------vivod v fail svedenii ob a/m
void write_node (ofstream f, const Node &node)
   {
   f << node.number << endl;
   Fine *pf = node.beg;
   while (pf)
      {
      f << pf -> time << endl << pf -> type << endl << pf -> price << endl;
      pf = pf -> next;
      }
   f << "=" << endl;
   }
Go6a вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите разобраться с С++ igroman Общие вопросы C/C++ 1 03.08.2008 23:15
Помогите разобраться! SerSasha Помощь студентам 4 09.06.2008 10:00
помогите разобраться с icq _ик_ Помощь студентам 1 29.04.2008 19:05
помогите разобраться с Rss Hallo HTML и CSS 0 24.11.2006 18:44
сообщения с ошибками в delphi Alar Общие вопросы Delphi 0 30.10.2006 00:43