Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
fjay69
85 / 85 / 1
Регистрация: 26.10.2012
Сообщений: 248
#1

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

26.10.2012, 21:50. Просмотров 712. Ответов 4
Метки нет (Все метки)

Изучаю 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);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2012, 21:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не работает программа из книги (C++):

Не работает программа из Книги Шилда) - C++
Привет,СyberForum,и пользователи) Читаю книгу Шилдт Г. С++ Базовый курс (3-е издание, 2010) По чуть чуть не торопясь,но перепробывая...

Не работает программа из книги Герберта Шилдта. - C++
При вводе кода из вышеупомянутой книги, выдает 3 ошибки: 1) error C2440: '=' : cannot convert from 'char ' to 'char' 2)error C2446:...

Не работает программа из книги Герберта Шилдта. - C++
Подскажите и мне тоже из этой книги не работает программа. #include&lt;iostream&gt; #include&lt;cstdlib&gt; #include&lt;conio.h&gt; using namespace...

Программа из книги, в которой осуществляется вызов двух функций не работает - C++
Может кто поможет, не работает программа с книги &quot;Моя первая программа на С/С++&quot; А.Нейбауэр (Листинг 7.1. Программа, в которой...

Почему не работает программа-пример для демонстрации работы функции strcmp (из книги Шилдта)? - C++
Здравствуйте, помогите пожалуйста разобраться, почему программа не выполняется как надо. Программа-пример, для демонстрации работы функции...

Не работает программа из книги Дейтела "Как программировать на с++" - C++
Помогите, пожалуйста, решить проблему. Программа из раздела книги &quot;Отделение интерфейса от реализации&quot;. При компиляции(использую visual c++...

4
John Prick
830 / 763 / 152
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
26.10.2012, 21:53 #2
Хотелось бы прочитать мнение компилятора по этому поводу.
0
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

Âûïîëíåíèå çàâåðøåíî
0
Croessmah
Ушел
Эксперт CЭксперт С++
13565 / 7716 / 873
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 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);
}
0
fjay69
85 / 85 / 1
Регистрация: 26.10.2012
Сообщений: 248
26.10.2012, 22:30  [ТС] #5
Цитата Сообщение от fjay69 Посмотреть сообщение
Набираю исходный код программы Бюджет3 точно, как в книге
Конечно же, нет. В противном случае всё работало бы. Спасибо, что подсказали, где я опечатался. Теперь все ОК!
0
26.10.2012, 22:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2012, 22:30
Привет! Вот еще темы с ответами:

Описать структуру Bibliotec, содержащую следующие поля: автор книги, инвентарный номер книги, название книги - C++
Описать структуру BIBLIOTEC содержащий следующие поля: автор книги , инвентарный номер книги , название книги. Подсчитать , книги скольких...

Программа из книги - C++
Помогите с данным кодом - не выводиться результат. Пишу по книге Хортон &quot;Полный курс си++&quot; и пишу в Visual Studio 2010 //...

Не компилируется программа из книги - C++
Переписал из книги первую простейшую программу для Win32 a simple message box #define WIN32_LEAN_AND_MEAN #include &lt;windows.h&gt; ...

Не работает пример из книги - C++
Я писал код из книжки и ничего не работает. #include &lt;iostream&gt; using namespace std; #include &lt;conio.h&gt; int main(){ ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.