Форум программистов, компьютерный форум CyberForum.ru

Не работает программа из книги - C++

Восстановить пароль Регистрация
 
fjay69
 Аватар для fjay69
85 / 85 / 1
Регистрация: 26.10.2012
Сообщений: 248
26.10.2012, 21:50     Не работает программа из книги #1
Изучаю C++ по пособию Дэвиса "для чайников". Набираю исходный код программы Бюджет3 точно, как в книге, но компилятор его не принимает. Что не так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
//budget3.cpp
#include<iostream.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
 
class LinkedListObject
{
 public:
  LinkedListObject()
  { addToEnd(); }
  static LinkedListObject* first()
  { return pFirst; }
  LinkedListObject* next()
  { return pNext; }
  void addToEnd();
 protected:
  static LinkedListObject* pFirst;
  LinkedListObject* pNext;
};
 
LinkedListObject* LinkedListObject::pFirst=0;
 
void LinkedListObject::addToEnd()
{
 if (pFirst==0)
 {
  pFirst=this;
 }
 else
 {
  LinkedListObject* pA;
  for (pA=pFirst; pA->pNext; pA=pA->pNext) {}
  pA->pNext=this;
 }
 pNext=0;
}
 
class Account: public LinkedListObject
{
 public:
  Account::Account(unsigned accNo, double initialBalance=0.0)
  {
   accountNumber=accNo;
   balance=initialBalance;
   count++;
  }
  int accountNo()
  { return accountNumber; }
  double acntBalance()
  { return balance; }
  static int noAccounts()
  { return count; }
  static Account* first()
  { return (Account*)LinkedListObject::first(); }
  Account* next()
  { return (Account*)LinkedListObject::next(); )
  void deposit(double amount)
  { balance+=amount; }
  virtual void withdrawal (double amount)=0;
  void display()
  {
   cout<<type()<<" счет номера "<<accountNumber<<" = "<<balance<<"\n";
  }
  virtual char* type()=0;  
 protected:
  static int count;
  unsigned accountNumber;
  double balance;
};
 
int Account::count=0;
 
class Checking: public Account
{
 public:
  Checking::Checking(unsigned sccNo, double initialBalance=0.0):
  Account(accNo, initalBalance) {}
  virtual void withdrawal(double amount);
  char* type()
  { return "Чековый"; }
};
 
void Checking::withdrawal(double amount)
{
 if (balance<amount)
 {
  cout<<"Недостаточно денег на счете: баланс равен "<<balance
  <<" ,попытка снять "<<amount<<"\n";
 }
 else
 {
  balance-=amount;
  if (balance<500.00)
  { balance -= 0.20; }
 }
}
 
class Savings: public Account
{
 public:
  Savings::Savings(unsigned accNo, double initialBalance=0.0):
  Account(accNo, initalBalance)
  { noWithdrawals=0; }
  virtual void withdrawal(double amount);
  char* type()
  { return "Сберегательный"; }
 protected:
  int noWithdrawals;
};
 
void Savings::withdrawal(double amount)
{
 if (balance<amount)
 {
  cout<<"Недостаточно денег на счете: баланс равен "<<balance
  <<" ,попытка снять "<<amount<<"\n";
 }
 else
 {
  if (++noWithdrawals>1)
  { balance -= 5.00; }
  balance-=amount;
 }
}
//прототипы
unsigned getAccntNo();
void process(Account* pAccount);
void getAccounts();
void displayReslts();
 
//main - сбор и вывод данных
int main(int nArg, char* pszArgs[])
{setlocale(LC_CTYPE, "rus");
 getAccounts();
 displayResults();
 return 0;
}
 
void getAccounts()
{
 Account* pA;
 char accountType;
 while(1)
 {
  cout<<"Нажмите S для сберегательных счетов, С для чековых, Х для выхода: ";
  cin>>accountType;
  switch (accountType)
  {
   case 'c':
   case 'C':
    pA=new Checking(getAccntNo());
    break;
   case 's':
   case 'S':
    pA=new Savings(getAccntNo());
    break;
   case 'x':
   case 'X':
    return;
   default:
    cout<<"Неверный ввод.\n";
  }
  process(pA);
 }
}
 
void displayResult()
{
 double total=0.0;
 cout<<"Суммы по всем счетам:\n";
 for (Account* pA=Account::first();pA;pA=pA->next())
 {
  pA->display();
  total+=pA->acntBalance();
 }
 cout<<"Всего = "<<total<<"\n";
}
 
unsigned getAccntNo()
{
 unsigned accntNo;
 cout<<"Введите номер счета: ";
 cin>>accntNo;
 return accntNo;
}
 
void process(Account* pAccount)
{
 cout<<"Введите положительную сумму для вклада, отрицательную для снятия, "
 <<"0 для завершения работы\n";
 double transaction;
 do
 {
  cout << ":";
  cin>>transaction;
  if (transaction>0)
  { pAccount->deposit(transaction); }
  if (transaction<0)
  { pAccount->withdrawal(-transaction); }
 } while (transaction!=0);
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
26.10.2012, 21:53     Не работает программа из книги #2
Хотелось бы прочитать мнение компилятора по этому поводу.
fjay69
 Аватар для fjay69
85 / 85 / 1
Регистрация: 26.10.2012
Сообщений: 248
26.10.2012, 22:00  [ТС]     Не работает программа из книги #3
Что-то вроде этого:
Кликните здесь для просмотра всего текста
Êîìïèëÿòîð: Default compiler
Âûïîëíåíèå g++.exe...
g++.exe "E:\Roman\cpp\Budget3\budget3.cpp" -o "nul" -g3 -I"E:\Software\Dev-Cpp\lib\gcc\mingw32\3.4.2\include" -I"E:\Software\Dev-Cpp\include\c++\3.4.2\backward" -I"E:\Software\Dev-Cpp\include\c++\3.4.2\mingw32" -I"E:\Software\Dev-Cpp\include\c++\3.4.2" -I"E:\Software\Dev-Cpp\include" -L"E:\Software\Dev-Cpp\lib" -g3
In file included from E:/Software/Dev-Cpp/include/c++/3.4.2/backward/iostream.h:31,
from E:\Roman\cpp\Budget3\budget3.cpp:2:

E:/Software/Dev-Cpp/include/c++/3.4.2/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
E:\Roman\cpp\Budget3\budget3.cpp:72: error: ISO C++ forbids initialization of member `count'
E:\Roman\cpp\Budget3\budget3.cpp:72: error: making `count' static
E:\Roman\cpp\Budget3\budget3.cpp:72: error: ISO C++ forbids in-class initialization of non-const static member `count'
E:\Roman\cpp\Budget3\budget3.cpp:75: error: invalid use of undefined type `class Account'
E:\Roman\cpp\Budget3\budget3.cpp:40: error: forward declaration of `class Account'
E:\Roman\cpp\Budget3\budget3.cpp:85: error: cannot declare member function `Account::Checking::withdrawal' within `Account'
E:\Roman\cpp\Budget3\budget3.cpp:100: error: invalid use of undefined type `class Account'
E:\Roman\cpp\Budget3\budget3.cpp:40: error: forward declaration of `class Account'
E:\Roman\cpp\Budget3\budget3.cpp:113: error: cannot declare member function `Account::Savings::withdrawal' within `Account'
E:\Roman\cpp\Budget3\budget3.cpp:141: error: `void Account::getAccounts()' and `void Account::getAccounts()' cannot be overloaded
E:\Roman\cpp\Budget3\budget3.cpp:181: error: `unsigned int Account::getAccntNo()' and `unsigned int Account::getAccntNo()' cannot be overloaded
E:\Roman\cpp\Budget3\budget3.cpp:189: error: `void Account:rocess(Account*)' and `void Account:rocess(Account*)' cannot be overloaded
E:\Roman\cpp\Budget3\budget3.cpp:202: error: expected `}' at end of input

E:\Roman\cpp\Budget3\budget3.cpp: In constructor `Account::Account(unsigned int, double)':
E:\Roman\cpp\Budget3\budget3.cpp:44: error: `accountNumber' undeclared (first use this function)
E:\Roman\cpp\Budget3\budget3.cpp:44: error: (Each undeclared identifier is reported only once for each function it appears in.)
E:\Roman\cpp\Budget3\budget3.cpp:45: error: `balance' undeclared (first use this function)
E:\Roman\cpp\Budget3\budget3.cpp: In member function `int Account::accountNo()':
E:\Roman\cpp\Budget3\budget3.cpp:49: error: `accountNumber' undeclared (first use this function)
E:\Roman\cpp\Budget3\budget3.cpp: In member function `double Account::acntBalance()':
E:\Roman\cpp\Budget3\budget3.cpp:51: error: `balance' undeclared (first use this function)
E:\Roman\cpp\Budget3\budget3.cpp: In member function `Account* Account::next()':
E:\Roman\cpp\Budget3\budget3.cpp:57: error: expected primary-expression before ')' token
E:\Roman\cpp\Budget3\budget3.cpp:57: error: expected `;' before ')' token
E:\Roman\cpp\Budget3\budget3.cpp:60: error: virtual outside class declaration
E:\Roman\cpp\Budget3\budget3.cpp:60: error: function `void withdrawal(double)' is initialized like a variable
E:\Roman\cpp\Budget3\budget3.cpp:61: error: expected primary-expression before "void"
E:\Roman\cpp\Budget3\budget3.cpp:61: error: expected `;' before "void"
E:\Roman\cpp\Budget3\budget3.cpp:65: error: virtual outside class declaration
E:\Roman\cpp\Budget3\budget3.cpp:65: error: function `char* type()' is initialized like a variable
E:\Roman\cpp\Budget3\budget3.cpp:66: error: expected primary-expression before "protected"
E:\Roman\cpp\Budget3\budget3.cpp:66: error: expected `;' before "protected"
E:\Roman\cpp\Budget3\budget3.cpp: In constructor `Account::Checking::Checking(unsigned int, double)':
E:\Roman\cpp\Budget3\budget3.cpp:78: error: type `class Account' is not a direct base of `Account::Checking'
E:\Roman\cpp\Budget3\budget3.cpp:78: error: `accNo' undeclared (first use this function)
E:\Roman\cpp\Budget3\budget3.cpp:78: error: `initalBalance' undeclared (first use this function)
E:\Roman\cpp\Budget3\budget3.cpp: In constructor `Account::Savings::Savings(unsigned int, double)':
E:\Roman\cpp\Budget3\budget3.cpp:103: error: type `class Account' is not a direct base of `Account::Savings'
E:\Roman\cpp\Budget3\budget3.cpp:103: error: `initalBalance' undeclared (first use this function)

E:\Roman\cpp\Budget3\budget3.cpp: In member function `int Account::main(int, char**)':
E:\Roman\cpp\Budget3\budget3.cpp:136: error: `displayResults' undeclared (first use this function)
E:\Roman\cpp\Budget3\budget3.cpp: In member function `void Account::getAccounts()':
E:\Roman\cpp\Budget3\budget3.cpp:152: error: cannot convert `Account::Checking*' to `Account*' in assignment
E:\Roman\cpp\Budget3\budget3.cpp:156: error: cannot convert `Account::Savings*' to `Account*' in assignment
E:\Roman\cpp\Budget3\budget3.cpp: In member function `void Account::displayResult()':
E:\Roman\cpp\Budget3\budget3.cpp:174: error: 'class Account' has no member named 'display'

E:\Roman\cpp\Budget3\budget3.cpp: In member function `void Account:rocess(Account*)':
E:\Roman\cpp\Budget3\budget3.cpp:198: error: 'class Account' has no member named 'deposit'
E:\Roman\cpp\Budget3\budget3.cpp:200: error: 'class Account' has no member named 'withdrawal'
E:\Roman\cpp\Budget3\budget3.cpp: At global scope:
E:\Roman\cpp\Budget3\budget3.cpp:202: error: expected unqualified-id at end of input
E:\Roman\cpp\Budget3\budget3.cpp:202: error: expected `,' or `;' at end of input

Âûïîëíåíèå çàâåðøåíî
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11834 / 6813 / 769
Регистрация: 27.09.2012
Сообщений: 16,887
Записей в блоге: 2
Завершенные тесты: 1
26.10.2012, 22:12     Не работает программа из книги #4
Все исправления кратко прокомментировал
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
#include<iostream>//убрал .h
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
using namespace std;//включил пространство имен std
 
 
class LinkedListObject
{
 public:
  LinkedListObject()
  { addToEnd(); }
  static LinkedListObject* first()
  { return pFirst; }
  LinkedListObject* next()
  { return pNext; }
  void addToEnd();
 protected:
  static LinkedListObject* pFirst;
  LinkedListObject* pNext;
};
 
LinkedListObject* LinkedListObject::pFirst=0;
 
void LinkedListObject::addToEnd()
{
 if (pFirst==0)
 {
  pFirst=this;
 }
 else
 {
  LinkedListObject* pA;
  for (pA=pFirst; pA->pNext; pA=pA->pNext) {}
  pA->pNext=this;
 }
 pNext=0;
}
 
class Account: public LinkedListObject
{
//перенес секцию protected в начало объявления
 protected://Если определяете методы прямо в объявлении класса, тогда перед использованием переменных они должны быть объявлены
  static int count;
  unsigned accountNumber;
  double balance;
 public:
     
  Account::Account(unsigned accNo, double initialBalance=0.0)
  {
   accountNumber=accNo;
   balance=initialBalance;
   count++;
  }
  int accountNo()
  { return accountNumber; }
  double acntBalance()
  { return balance; }
  static int noAccounts()
  { return count; }
  static Account* first()
  { return (Account*)LinkedListObject::first(); }
  Account* next()
  { return (Account*)LinkedListObject::next(); }// Поменял ) на }
  void deposit(double amount)
  { balance+=amount; }
  virtual void withdrawal (double amount)=0;
  void display()
  {
   cout<<type()<<" счет номера "<<accountNumber<<" = "<<balance<<"\n";
  }
  virtual char* type()=0;  
};
 
int Account::count=0;
 
class Checking: public Account
{
 public:
  Checking::Checking(unsigned sccNo, double initialBalance=0.0):
  Account(sccNo, initialBalance) {}//Здесь перепутали имена переменных
  virtual void withdrawal(double amount);
  char* type()
  { return "Чековый"; }
};
 
void Checking::withdrawal(double amount)
{
 if (balance<amount)
 {
  cout<<"Недостаточно денег на счете: баланс равен "<<balance
  <<" ,попытка снять "<<amount<<"\n";
 }
 else
 {
  balance-=amount;
  if (balance<500.00)
  { balance -= 0.20; }
 }
}
 
class Savings: public Account
{
 public:
  Savings::Savings(unsigned accNo, double initialBalance=0.0):
  Account(accNo, initialBalance)//Здесь тоже перепутали(скорее всего копировали)
  { noWithdrawals=0; }
  virtual void withdrawal(double amount);
  char* type()
  { return "Сберегательный"; }
 protected:
  int noWithdrawals;
};
 
void Savings::withdrawal(double amount)
{
 if (balance<amount)
 {
  cout<<"Недостаточно денег на счете: баланс равен "<<balance
  <<" ,попытка снять "<<amount<<"\n";
 }
 else
 {
  if (++noWithdrawals>1)
  { balance -= 5.00; }
  balance-=amount;
 }
}
//прототипы
unsigned getAccntNo();
void process(Account* pAccount);
void getAccounts();
void displayReslts();
 
//main - сбор и вывод данных
void displayResult();//Добавил прототип функции перед main, чтобы было нагляднее. Лучше это сделать в начале файла
int main(int nArg, char* pszArgs[])
{setlocale(LC_CTYPE, "rus");
 getAccounts();
 displayResult();//Перепутали имя функции функции
 return 0;
}
 
void getAccounts()
{
 Account* pA;
 char accountType;
 while(1)
 {
  cout<<"Нажмите S для сберегательных счетов, С для чековых, Х для выхода: ";
  cin>>accountType;
  switch (accountType)
  {
   case 'c':
   case 'C':
    pA=new Checking(getAccntNo());
    break;
   case 's':
   case 'S':
    pA=new Savings(getAccntNo());
    break;
   case 'x':
   case 'X':
    return;
   default:
    cout<<"Неверный ввод.\n";
  }
  process(pA);
 }
}
 
void displayResult()
{
 double total=0.0;
 cout<<"Суммы по всем счетам:\n";
 for (Account* pA=Account::first();pA;pA=pA->next())
 {
  pA->display();
  total+=pA->acntBalance();
 }
 cout<<"Всего = "<<total<<"\n";
}
 
unsigned getAccntNo()
{
 unsigned accntNo;
 cout<<"Введите номер счета: ";
 cin>>accntNo;
 return accntNo;
}
 
void process(Account* pAccount)
{
 cout<<"Введите положительную сумму для вклада, отрицательную для снятия, "
 <<"0 для завершения работы\n";
 double transaction;
 do
 {
  cout << ":";
  cin>>transaction;
  if (transaction>0)
  { pAccount->deposit(transaction); }
  if (transaction<0)
  { pAccount->withdrawal(-transaction); }
 } while (transaction!=0);
}
fjay69
 Аватар для fjay69
85 / 85 / 1
Регистрация: 26.10.2012
Сообщений: 248
26.10.2012, 22:30  [ТС]     Не работает программа из книги #5
Цитата Сообщение от fjay69 Посмотреть сообщение
Набираю исходный код программы Бюджет3 точно, как в книге
Конечно же, нет. В противном случае всё работало бы. Спасибо, что подсказали, где я опечатался. Теперь все ОК!
Yandex
Объявления
26.10.2012, 22:30     Не работает программа из книги
Ответ Создать тему
Опции темы

Текущее время: 14:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru