ΠΠΈΡΡΠΈΠ½Π³ 21.6. ΠΡΠ²ΠΎΠ΄ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΠΎΡΠ»Π°Π΄ΠΊΠΈ
1: // ΠΠΈΡΡΠΈΠ½Π³ 21.6. ΠΡΠ²ΠΎΠ΄ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΠΎΡΠ»Π°Π΄ΠΊΠΈ
2: #include <iostream.h>
3: #define DEBUG
4:
5: #ifndef DEBUG
6: #define PRINT(x)
7: #else
8: #define PRINT(x) \
9: cout << #x << ":\t" << x << endl;
10: #endif
11:
12: enum bool { FALSE, TRUE } ; 13:
14: int main()
15: {
16: int x = 5;
17: long Ρ = 738981;
18: PRINT(x);
19: for (int i = 0; i < x; i++)
20: {
21: PRINT(i);
22: }
23:
24: PRINT (Ρ);
25: PRINT("Hi,");
26: int *px = &x;
27: PRINT(px);
28: PRINT (*px);
29: return 0;
30: }
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ:
x: 5
i: 0
i: 1
i: 2
i: 3
i: 4
Ρ: 73898
"Hi.": Hi.
px: 0x2100
*px: 5
ΠΠ½Π°Π»ΠΈΠ·: ΠΠ°ΠΊΡΠΎΡ PRINT(x) (ΡΡΡΠΎΠΊΠΈ 5β10) ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ Π²ΡΠ²ΠΎΠ΄ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΡΠ½Π°ΡΠ°Π»Π° ΠΎΠ±ΡΠ΅ΠΊΡΡ cout ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ ΡΠ°ΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ, Π²Π·ΡΡΡΠΉ Π² ΠΊΠ°Π²ΡΡΠΊΠΈ, Ρ.Π΅., Π΅ΡΠ»ΠΈ Π²Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π΄ΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ x, ΠΎΠ±ΡΠ΅ΠΊΡ cout ΠΏΡΠΈΠΌΠ΅Ρ "x".
ΠΠ°ΡΠ΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ cout ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π·Π°ΠΊΠ»ΡΡΠ΅Π½Π½ΡΡ Π² ΠΊΠ°Π²ΡΡΠΊΠΈ ΡΡΡΠΎΠΊΡ ":\t", ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΠΏΠ΅ΡΠ°ΡΡ Π΄Π²ΠΎΠ΅ΡΠΎΡΠΈΡ ΠΈ ΡΠ°Π±ΡΠ»ΡΡΠΈΠΈ. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ cout ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° (x), Π° ΠΎΠ±ΡΠ΅ΠΊΡ endl Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ Π½Π° Π½ΠΎΠ²ΡΡ ΡΡΡΠΎΠΊΡ ΠΈ ΠΎΡΠΈΡΠ°Π΅Ρ Π±ΡΡΠ΅Ρ.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Ρ Π²Π°Ρ Π²ΠΌΠ΅ΡΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ 0x2100 ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π²ΡΠ²Π΅Π΄Π΅Π½ΠΎ Π΄ΡΡΠ³ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ.
Π£ΡΠΎΠ²Π½ΠΈ ΠΎΡΠ»Π°Π΄ΠΊΠΈ
Π Π±ΠΎΠ»ΡΡΠΈΡ ΠΈ ΡΠ»ΠΎΠΆΠ½ΡΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ Π²Π°ΠΌ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΡΡΡΠ°Π³ΠΎΠ² ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Π΄Π»Ρ ΠΎΡΠ»Π°ΠΆΠΈΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΡΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΎΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΆΠΈΠΌΠ° ΠΎΡΠ»Π°Π΄ΠΊΠΈ (ΠΏΡΡΠ΅ΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π»Π΅ΠΊΡΠ΅ΠΌΡ DEBUG). ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΡΡΠΎΠ²Π½ΠΈ ΠΎΡΠ»Π°Π΄ΠΊΠΈ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π»Ρ ΡΡΠΈΡ ΡΡΠΎΠ²Π½Π΅ΠΉ, ΠΏΡΠΈΠ½ΠΈΠΌΠ°Ρ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΌΠ°ΠΊΡΠΎΠΊΠΎΠΌΠ°Π½Π΄Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ, Π° ΠΊΠ°ΠΊΠΈΠ΅ - ΡΠ΄Π°Π»ΠΈΡΡ.
Π§ΡΠΎΠ±Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΡΠΎΠ²Π΅Π½Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ, Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΠΎΡΠ»Π΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ #define DEBUG ΡΠΊΠ°Π·Π°ΡΡ Π½ΠΎΠΌΠ΅Ρ. Π₯ΠΎΡΡ ΡΠΈΡΠ»ΠΎ ΡΡΠΎΠ²Π½Π΅ΠΉ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π»ΡΠ±ΡΠΌ, ΠΎΠ±ΡΡΠ½Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅ΡΡ ΡΠ΅ΡΡΡΠ΅ ΡΡΠΎΠ²Π½Ρ: HIGH (Π²ΡΡΠΎΠΊΠΈΠΉ), MEDIUM (ΡΡΠ΅Π΄Π½ΠΈΠΉ), LOW (Π½ΠΈΠ·ΠΊΠΈΠΉ) ΠΈ NONE (Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ). Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 21.7 ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ, Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΊΠ»Π°ΡΡΠΎΠ² String ΠΈ Animal ΠΈΠ· Π»ΠΈΡΡΠΈΠ½Π³Π° 21.5.
ΠΠΈΡΡΠΈΠ½Π³ 21.7. Π£ΡΠΎΠ²Π½ΠΈ ΠΎΡΠ»Π°Π΄ΠΊΠΈ
1: enum LEVEL { NONE, LOW, MEDIUM, HIGH } ;
2: const int FALSE = 0;
3: const int TRUE = 1;
4: typedef int bool;
5:
6: #define DEBUGLEVEL HIGH
7:
8: #include <iostream.h>
9: #include <string.h>
10:
11: #if DEBUGLEVEL < LOW // Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΡΠ΅Π΄Π½ΠΈΠΉ ΠΈΠ»ΠΈ Π²ΡΡΠΎΠΊΠΈΠΉ
12: #define ASSERT(x)
13: #else
14: #define ASSERT(x)
15: if (!(x))
16: {
17: cout << "ERROR!! Assert " << #x << " failed\n";
18: cout << " on line " << __LINE__ << "\n";
19: cout << " in file " << FILE << "\n";
20: }
21: #endif
22:
23: #if DEBUGLEVEL < MEDIUM
24: #define EVAL(x)
25: #else
26: #define EVAL(x)
27: cout << #x << ":\t" << x << andl;
28: #endif
29:
30: #if DEBUGLEVEL < HIGH
31: #define PRINT(x)
32: #else
33: #define PRINT(x)
34: cout << x << endl;
35: #endif
36:
37:
38: class String
39: {
40: public:
41: // ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ
42: String();
43: String(const char *const);
44: String(const String &);
45: ~String();
46:
47: char & operator[](int offset);
48: char operator[](int offset) const;
49:
50: String & operator= (const String &);
51: int GetLen()const { return itsLen; }
52: const char >> GetString() const
53: { return itsString; }
54: bool Invariants() const;
55:
56: private:
57: String (int); // Π·Π°ΠΊΡΡΡΡΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ
58: char * itsString;
59: unsigned short itsLen;
60: };
61:
62: // ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΡΡΠΎΠΊΡ Π½ΡΠ»Π΅Π²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ
63: String::String()
64: {
65: itsString = new char[1];
66: itsString[0] = '\0';
67: itsLen=0;
68: ASSERT(Invariants());
69: }
70:
71: // Π·Π°ΠΊΡΡΡΡΠΉ (Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠΉ) ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ
72: // ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ ΠΊΠ»Π°ΡΡΠ° ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½ΠΎΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ
73: // ΡΡΠ΅Π±ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°. ΠΠ°ΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ Null.
74: String::String(int len)
75: {
76: itsString = new char[len+1];
77: for (int i = 0; i<=len; i++)
78: itsString[i] = '\0';
79: itsLen=len;
80: ASSERT(Invariants());
81: }
82:
83: // ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ ΠΌΠ°ΡΡΠΈΠ² ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² ΠΊ ΡΠΈΠΏΡ String
84: String::String(const char * const cString)
85: {
86: itsLen = strlen(cString);
87: itsString = new char[itsLen+1];
88: for (int i = 0; i<itsLen; i++)
89: itsString[i] = cString[i];
90: itsString[itsLen]='\0';
91: ASSERT(Invariants());
92: }
93:
94: // ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ-ΠΊΠΎΠΏΠΈΡΠΎΠ²ΡΠΈΠΊ
95: String::String (const String & rhs)
96: {
97: itsLen=rhs.GetLen();
98: itsString = new char[itsLen+1];
99: for (int i = 0; i<itsLen;i++)
100: itsString[i] = rhs[i];
101: itsString[itsLen] = '\0';
102: ASSERT(Invariants());
103: }
104:
105: // Π΄Π΅ΡΡΡΡΠΊΡΠΎΡ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ Π²ΡΠ΄Π΅Π»Π΅Π½Π½ΡΡ ΠΏΠ°ΠΌΡΡΡ
106: String::^String ()
107: {
108: ASSERT(Invariants());
109: delete [] itsString;
110: itsLen = 0;
111: }
112:
113: // ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅, ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅Ρ Π·Π°Π½ΡΡΡΡ ΠΏΠ°ΠΌΡΡΡ
114: // Π·Π°ΡΠ΅ΠΌ ΠΊΠΎΠΏΠΈΡΡΠ΅Ρ ΡΡΡΠΎΠΊΡ ΠΈ Π΅Π΅ ΡΠ°Π·ΠΌΠ΅Ρ
115: String& String::operator=(const String & rhs)
116: {
117: ASSERT(Invariants());
118: if (this == &rhs)
119: return *this;
120: delete [] itsString;
121: itsLen=rhs.GetLen();
122: itsString = new char[itsLen+1];
123: for (int i = 0; i<itsLen;i++)
124: itsString[i] = rhs[i];
125: itsString[itsLen] = '\0';
126: ASSERT(Invariants());
127: return *this;
128: }
129:
130: // Π½Π΅ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ
131: char & String:;operator[](int offset)
132: {
133: ASSERT(Invariants());
134: if (offset > itsLen)
135: {
136: ASSERT(Invariants());
137: return itsString[itsLen-1];
138: }
139: else
140: {
141: ASSERT(Invariants());
142: return itsString[offset];
143: }
144: }
145: // ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ
146: char String::operator[](int offset) const
147: {
148: ASSERT(Invariants());
149: char retVal;
150: if (offset > itsLen)
151: retVal = itsString[itsLen-1];
152: else
153: retVal = itsString[offset];
154: ASSERT(Invariants());
155: return retVal;
156: }
157:
158: bool String::Invariants() const
159: {
160: PRINT("(String Invariants Checked)");
161: return ( (bool) (itsLen && itsString) ||
162: (!itsLen && !itsString) );
163: }
164:
165: class Animal
166: {
167: public:
168: Anxmal():itsAge(1),itsName("John Q, Animal")
169: { ASSERT(Invariants());}
170:
171: Animal(int, const String&);
172: ~Animal(){ }
173:
174: int GetAge()
175: {
176: ASSERT(Invariants());
177: return itsAga;
178: }
179:
180: void SetAge(int Age)
181: {
182: ASSERT(Invariants());
183: itsAge = Age;
184: ASSERT(Inva riants());
185: }
186: String& GetName()
187: {
188: ASSERT(Invariants());
189: return itsName;
190: }
191:
192: void SetName(const String& name)
193: {
194: ASSERT(Invariants());
195: itsName = name;
196: ASSERT(Invariants());
197: }
198:
199: bool Invariants();
200: private:
201: int itsAge;
202: String itsName;
203: }
204:
205: Animal::Animal(int age, const String& name):
206: itsAge(age),
207: itsName(name)
208: {
209: ASSERT(Invariants());
210: }
211:
212: bool Animal::Invariants()
213: {
214: PRINT("(Animal Invariants Checked)");
215: return (itsAge > 0 && itsName.GetLen());
216: }
217:
218: int main()
219: {
220: const int AGE = 5;
221: EVAL(AGE);
222: Animal sparky(AGE,"Sparky");
223: cout << "\n" << sparky.GetName().GetStrin();
224: cout << " is ";
225: cout << sparky.GetAge() << " years old.";
226: sparky.SetAge(8);
227: cout << "\n" << sparky.GetName().GetString();
228: cout << " is ";
229: cout << sparky.GetAge() << " years old.";
230: return 0;
231: }
Π Π΅Π·ΡΠ»ΡΡΠ°Ρ:
AGE: 5
(String Invariants Checked)
(String Invariants Checked)
(String Invariants Checked)
(String Invariants Checked)
(String Invariants Checked)
(String Invariants Checked)
(String Invariants Checked)
(String Invariants Checked)
(String Invariants Checked)
(String Invariants Checked)
Sparky is (Animal Invariants Checked)
5 years old. (Animal Invariants Checked)
(Animal Invariants Checked)
(Animal Invariants Checked)
Sparky is (Animal Invariants Checked)
8 years old. (String Invariants Checked)
(String Invariants Checked)
// run again with DEBUG = MEDIUM