|
не копируется структура
#38637677
Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
|
|
|
|
кому интересно, смотрите
было задание на курсач:
Вариант 17
На междугородной телефонной станции картотека абонентов. содержащая сведе-
ния о телефонах и их владельцах. организована в виде линейного списка.
Написать программу. которая:
* обеспечивает начальное формирование картотеки в виде линейного списка;
* производит вывод всей картотеки:
* вводит номер телефона и время разговора;
* выводит извещение на оплату телефонного разговора
Программа должна обеспечивать диалог с помощью меню и контроль ошибок при
вводе.
сделал вот так:
файл "main.h"
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.
//---------------------------------------------------------------------------
#ifndef mainH
#define mainH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Grids.hpp>
#include <Mask.hpp>
#include <DateUtils.hpp>
#include <ComCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TStringGrid *StringGrid1;
TButton *add;
TButton *edit;
TButton *del;
TGroupBox *GroupBox1;
TGroupBox *GroupBox2;
TButton *apply;
TEdit *Edit3;
TEdit *Edit2;
TEdit *Edit1;
TLabel *Label5;
TLabel *Label4;
TLabel *Label3;
TLabel *Label2;
TLabel *Label1;
TEdit *Edit4;
TLabel *Label6;
TButton *find;
TGroupBox *GroupBox3;
TLabel *Label7;
TMaskEdit *MaskEdit3;
TButton *izv;
TMemo *Memo1;
TButton *cler;
TButton *rest;
TDateTimePicker *DateTimePicker1;
TDateTimePicker *DateTimePicker2;
void __fastcall FormCreate(TObject *Sender);
void __fastcall Edit3KeyPress(TObject *Sender, char &Key);
void __fastcall Edit1KeyPress(TObject *Sender, char &Key);
void __fastcall MaskEdit3KeyPress(TObject *Sender, char &Key);
void __fastcall Edit2KeyPress(TObject *Sender, char &Key);
void __fastcall addClick(TObject *Sender);
void __fastcall applyClick(TObject *Sender);
void __fastcall editClick(TObject *Sender);
void __fastcall FormDestroy(TObject *Sender);
void __fastcall delClick(TObject *Sender);
void __fastcall findClick(TObject *Sender);
void __fastcall clerClick(TObject *Sender);
void __fastcall izvClick(TObject *Sender);
void __fastcall restClick(TObject *Sender);
void __fastcall DateTimePicker1KeyPress(TObject *Sender,
char &Key);
void __fastcall DateTimePicker2KeyPress(TObject *Sender,
char &Key);
void __fastcall Edit4KeyPress(TObject *Sender, char &Key);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
struct Abonent {
AnsiString fam;
AnsiString nam;
AnsiString tel;
AnsiString start;
AnsiString end;
Abonent *next;
};
Abonent *TelList = 0, *find_list = 0;
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
void add_abn(Abonent& abn);
void edit_abn(Abonent &beg);
void del_abn(AnsiString fam, AnsiString nam, AnsiString tel);
void add_finded(Abonent &abn);
void find_abn(Abonent *pv, AnsiString tel);
Abonent* find_abn(Abonent *pv, AnsiString fam, AnsiString nam, AnsiString tel, Abonent** prev);
AnsiString notice(int pay, Abonent *pv);
int read_dbase(char* filename);
int write_dbase(char *filename);
файл "main.cpp"
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. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300. 301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318. 319. 320. 321. 322. 323. 324. 325. 326. 327. 328. 329. 330. 331. 332. 333. 334. 335. 336. 337. 338. 339. 340. 341. 342. 343. 344. 345. 346. 347. 348. 349. 350. 351. 352. 353. 354. 355. 356. 357. 358. 359. 360. 361. 362. 363. 364. 365. 366. 367. 368. 369. 370. 371. 372. 373. 374. 375. 376. 377. 378. 379. 380. 381. 382. 383. 384. 385. 386. 387. 388. 389. 390. 391. 392. 393. 394. 395. 396. 397. 398. 399. 400. 401. 402. 403. 404. 405. 406. 407. 408. 409. 410. 411. 412. 413. 414. 415. 416. 417. 418. 419. 420. 421. 422. 423. 424. 425. 426. 427. 428. 429. 430. 431. 432. 433. 434. 435. 436. 437. 438. 439. 440. 441. 442. 443. 444. 445. 446. 447. 448. 449. 450. 451. 452. 453. 454. 455. 456. 457. 458. 459. 460. 461. 462. 463. 464. 465. 466. 467. 468. 469. 470. 471. 472. 473. 474. 475. 476. 477. 478. 479. 480. 481. 482. 483. 484. 485. 486. 487. 488. 489. 490. 491. 492. 493. 494. 495. 496. 497. 498. 499. 500. 501. 502. 503. 504. 505. 506. 507. 508. 509. 510. 511. 512. 513. 514. 515. 516. 517. 518. 519. 520. 521. 522. 523. 524. 525. 526. 527. 528. 529. 530. 531. 532. 533. 534. 535. 536. 537. 538. 539. 540. 541. 542. 543. 544. 545. 546. 547. 548. 549. 550. 551. 552. 553. 554. 555. 556. 557. 558. 559. 560. 561. 562. 563. 564. 565. 566. 567. 568. 569. 570. 571. 572. 573. 574. 575. 576. 577.
//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#pragma hdrstop
#include "main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
bool add_edit=false;
AnsiString familia, name, telephone;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
// ---ResizeGrid--------------------------------------------------------------
void ResizeGrid(TStringGrid* SG) {
int cols, widths, w, c;
cols = SG->ColCount;
c = cols-1;
w = SG->ColWidths[0];
w = SG->Width - w;
widths = (w / c) - 6;
for (int i = 1; i <= cols - 1; i++) {
SG->ColWidths[i] = widths;
}
}
// ---обновлени StringGrid и очистка Edits--------------------------------------------------------------
void ReadActiv(TStringGrid* SG) {
Form1->GroupBox1->Enabled = false;
Form1->Label1->Enabled = false;
Form1->Label2->Enabled = false;
Form1->Label3->Enabled = false;
Form1->Label4->Enabled = false;
Form1->Label5->Enabled = false;
Form1->Edit1->Enabled = false;
Form1->Edit2->Enabled = false;
Form1->Edit3->Enabled = false;
Form1->DateTimePicker1->Enabled = false;
Form1->DateTimePicker2->Enabled = false;
Form1->DateTimePicker1->Time = Form1->DateTimePicker1->Time.CurrentTime();
Form1->DateTimePicker2->Time = Form1->DateTimePicker2->Time.CurrentTime();
Form1->apply->Enabled = false;
Form1->rest->Enabled = false;
Form1->Edit1->Text = "";
Form1->Edit2->Text = "";
Form1->Edit3->Text = "";
for (int r = 1; r < SG->RowCount; r++) {
for (int c = 0; c < SG->ColCount; c++) {
SG->Cells[c][r] = "";
}
}
SG->RowCount = 2;
Abonent *pv;
if (find_list) {
pv = find_list;
} else {
pv = TelList;
}
while(pv) {
SG->RowCount++;
SG->Cells[0][SG->RowCount-2] = SG->RowCount - 2;
SG->Cells[1][SG->RowCount-2] = pv->fam;
SG->Cells[2][SG->RowCount-2] = pv->nam;
SG->Cells[3][SG->RowCount-2] = pv->tel;
SG->Cells[4][SG->RowCount-2] = TimeToStr(StrToTime(pv->end) - StrToTime(pv->start));
pv=pv->next;
}
if (SG->RowCount>2) {
Form1->edit->Enabled = true;
Form1->del->Enabled = true;
Form1->GroupBox3->Enabled = true;
} else {
Form1->edit->Enabled = false;
Form1->del->Enabled = false;
Form1->GroupBox3->Enabled = false;
}
Form1->add->Enabled = true;
}
// ---главная--------------------------------------------------------------
void start() {
read_dbase("dbase.abn");
}
// ---добавление абонента--------------------------------------------------------------
void add_abn(Abonent& abn)
{
Abonent *pv = new Abonent;
*pv = abn;
pv->next=0;
if(TelList)
{
Abonent *temp = TelList;
while(temp->next)
temp = temp->next;
temp->next = pv;
}
else
TelList = pv;
}
// ---корректировка--------------------------------------------------------------
void edit_abn(Abonent &beg)
{
Abonent *prev;
AnsiString fam = beg.fam;
AnsiString nam = beg.nam;
Abonent *abn = find_abn(TelList, familia, name, telephone, &prev);
abn->fam = beg.fam;
abn->nam = beg.nam;
abn->tel = beg.tel;
abn->start = beg.start;
abn->end = beg.end;
}
// ---удаление--------------------------------------------------------------
void del_abn(AnsiString fam, AnsiString nam, AnsiString tel)
{
Abonent *prev;
Abonent *pv=find_abn(TelList, fam, nam, tel, &prev);
if (pv)
{
if(pv == TelList)
TelList = TelList->next;
else
TelList->next = pv->next;
delete pv;
}
}
// ---добавление найденых записей в список поиска по телефону--------------------------------------------------------------
void add_finded(Abonent &abn) {
Abonent *pv = new Abonent;
*pv = abn;
pv->next=0;
if(find_list)
{
Abonent *temp = find_list;
while(temp->next)
temp = temp->next;
temp->next = pv;
}
else
find_list=pv;
}
// ---поиск по телефону--------------------------------------------------------------
void find_abn(Abonent *pv, AnsiString tel)
{
Abonent *prev = 0, *first = 0;
Abonent *ret = pv;
Abonent *tmp = new Abonent;
tmp->next = 0;
while(ret)
{
if(ret->tel == tel) {
add_finded(*ret);
}
ret=ret->next;
}
if (!find_list) {
ShowMessage("Ничего не найдено");
}
}
// ---поиск по фамилии, имени и телефону--------------------------------------------------------------
Abonent* find_abn(Abonent* pv, AnsiString fam, AnsiString nam, AnsiString tel, Abonent** prev)
{
*prev=0;
while(pv != NULL)
{
if(pv->fam == fam && pv->nam == nam && pv->tel == tel) {
return pv;
}
*prev=pv;
pv=pv->next;
}
return 0;
}
// ---формирование извещения--------------------------------------------------------------
AnsiString notice(int pay, Abonent *pv) {
AnsiString not;
not = "Абонент: " + pv->fam + " " + pv->nam + "\r\n";
not+= "Номер телефона: " + pv->tel + "\r\n";
not+= "Начало разговора: " + pv->start + "\r\n";
not+= "Окончание разговора: " + pv->end + "\r\n";
not+= "Длительность разговора: " + TimeToStr(StrToTime(pv->end) - StrToTime(pv->start)) + "\r\n";
TTime call_duration = StrToTime(pv->end) - StrToTime(pv->start);
int h = HourOf(call_duration);
int m = MinuteOf(call_duration);
int s = SecondOf(call_duration);
float mins = h * 60 + m + (float)s / 60;
AnsiString tmp = FormatFloat("0.00", (mins * pay));
int rub = tmp.SubString(0, tmp.Pos(",")-1).ToInt();
int kop = tmp.SubString(tmp.Pos(",")+1, tmp.Length()).ToInt();
not+= "Сумма к оплате: " + IntToStr(rub) + " руб. " + IntToStr(kop) + " коп.";
return not;
}
// ---чтение из файла--------------------------------------------------------------
int read_dbase(char* filename)
{
FILE* fin;
Abonent abn;
const int MaxLen = 255;
char fam[MaxLen], nam[MaxLen], tel[MaxLen], start[MaxLen], end[MaxLen];
if((fin=fopen(filename,"r"))==0)
{
return 0;
}
while(!feof(fin))
{
fscanf(fin, "%s\n%s\n%s\n%s\n%s\n", fam, nam, tel, start, end);
abn.fam=AnsiString(fam);
abn.nam=AnsiString(nam);
abn.tel=AnsiString(tel);
abn.start=AnsiString(start);
abn.end=AnsiString(end);
add_abn(abn);
}
fclose(fin);
return 0;
}
// ---запись в файл--------------------------------------------------------------
int write_dbase(char *filename)
{
FILE *fout;
Abonent *pv = TelList;
if ((fout=fopen(filename,"w")))
{
while(pv != NULL)
{
fprintf(fout, "%s\n%s\n%s\n%s\n%s\n", pv->fam, pv->nam, pv->tel, pv->start, pv->end);
pv=pv->next;
}
}
fclose(fout);
return 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
StringGrid1->Cells[0][0] = "№";
StringGrid1->Cells[1][0] = "Фамилия";
StringGrid1->Cells[2][0] = "Имя";
StringGrid1->Cells[3][0] = "Номер";
StringGrid1->Cells[4][0] = "Длительность";
ResizeGrid(StringGrid1);
start();
ReadActiv(StringGrid1);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
write_dbase("dbase.abn");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{
if(((Key>='А')&&(Key<='я')) || ((Key>='a')&&(Key<='z'))
|| ((Key>='A')&&(Key<='Z'))||(Key==VK_BACK)) return;
if (Key=13) {
Edit2->SetFocus();
}
Key=0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit2KeyPress(TObject *Sender, char &Key)
{
if(((Key>='А')&&(Key<='я')) || ((Key>='a')&&(Key<='z'))
|| ((Key>='A')&&(Key<='Z'))||(Key==VK_BACK)) return;
if (Key=13) {
Edit3->SetFocus();
}
Key=0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit3KeyPress(TObject *Sender, char &Key)
{
switch (Key) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '-':
case '+':
case 8:
break;
case 13: {
DateTimePicker1->SetFocus();
break;
}
default:
Key = 0;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit4KeyPress(TObject *Sender, char &Key)
{
switch (Key) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '-':
case '+':
case 8:
break;
case 13: {
find->Click();
break;
}
default:
Key = 0;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DateTimePicker1KeyPress(TObject *Sender, char &Key)
{
switch (Key) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case 8:
break;
case 13: {
DateTimePicker2->SetFocus();
break;
}
default:
Key = 0;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DateTimePicker2KeyPress(TObject *Sender, char &Key)
{
switch (Key) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case 8:
break;
case 13: {
apply->Click();
break;
}
default:
Key = 0;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MaskEdit3KeyPress(TObject *Sender, char &Key)
{
switch (Key) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case 8:
break;
case 13: {
izv->Click();
break;
}
default:
Key = 0;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::addClick(TObject *Sender)
{
add_edit = false;
GroupBox1->Enabled = true;
Label1->Enabled = true;
Label2->Enabled = true;
Label3->Enabled = true;
Label4->Enabled = true;
Label5->Enabled = true;
Edit1->Enabled = true;
Edit2->Enabled = true;
Edit3->Enabled = true;
DateTimePicker1->Enabled = true;
DateTimePicker2->Enabled = true;
apply->Enabled = true;
rest->Enabled = true;
Edit1->SetFocus();
add->Enabled = false;
edit->Enabled = false;
del->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::editClick(TObject *Sender)
{
add_edit = true;
GroupBox1->Enabled = true;
Label1->Enabled = true;
Label2->Enabled = true;
Label3->Enabled = true;
Label4->Enabled = true;
Label5->Enabled = true;
Edit1->Enabled = true;
Edit2->Enabled = true;
Edit3->Enabled = true;
DateTimePicker1->Enabled = true;
DateTimePicker2->Enabled = true;
apply->Enabled = true;
rest->Enabled = true;
Edit1->SetFocus();
add->Enabled = false;
edit->Enabled = false;
del->Enabled = false;
Abonent* prev;
AnsiString fam = StringGrid1->Cells[1][StringGrid1->Row];
AnsiString nam = StringGrid1->Cells[2][StringGrid1->Row];
AnsiString tel = StringGrid1->Cells[3][StringGrid1->Row];
Abonent* pv = find_abn(TelList, fam, nam, tel, &prev);
Edit1->Text = pv->fam;
Edit2->Text = pv->nam;
Edit3->Text = pv->tel;
DateTimePicker1->Time = StrToTime(pv->start);
DateTimePicker2->Time = StrToTime(pv->end);
familia = pv->fam;
name = pv->nam;
telephone = pv->tel;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::applyClick(TObject *Sender)
{
Edit1->Text = Edit1->Text.Trim();
Edit2->Text = Edit2->Text.Trim();
Edit3->Text = Edit3->Text.Trim();
Abonent abn;
if (Edit1->Text.Length() && Edit2->Text.Length() && Edit3->Text.Length()) {
abn.fam = Edit1->Text;
abn.nam = Edit2->Text;
abn.tel = Edit3->Text;
abn.start = DateTimePicker1->Time.TimeString();
abn.end = DateTimePicker2->Time.TimeString();
} else {
ShowMessage("Все поля должны быть заполнены");
return;
}
if (!add_edit) {
add_abn(abn);
} else {
edit_abn(abn);
}
ReadActiv(StringGrid1);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::restClick(TObject *Sender)
{
ReadActiv(StringGrid1);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::delClick(TObject *Sender)
{
AnsiString fam = StringGrid1->Cells[1][StringGrid1->Row];
AnsiString nam = StringGrid1->Cells[2][StringGrid1->Row];
AnsiString tel = StringGrid1->Cells[3][StringGrid1->Row];
del_abn(fam, nam, tel);
ReadActiv(StringGrid1);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::findClick(TObject *Sender)
{
AnsiString tel = Edit4->Text;
find_list = 0;
find_abn(TelList, tel);
ReadActiv(StringGrid1);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::clerClick(TObject *Sender)
{
Edit4->Text = "";
find_list = 0;
ReadActiv(StringGrid1);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::izvClick(TObject *Sender)
{
Memo1->Clear();
AnsiString tmp_pay = MaskEdit3->Text.Trim();
if (tmp_pay.Length()) {
int pay = StrToInt(tmp_pay);
Abonent* prev;
int row = StringGrid1->Row;
if (row == 0) {
row++;
}
AnsiString fam = StringGrid1->Cells[1][row];
AnsiString nam = StringGrid1->Cells[2][row];
AnsiString tel = StringGrid1->Cells[3][row];
Abonent* pv = find_abn(TelList, fam, nam, tel, &prev);
AnsiString not = notice(pay, pv);
Memo1->Lines->Add(not);
} else {
ShowMessage("Введите цену минуты");
}
}
//---------------------------------------------------------------------------
во вложении проект целиком
|
|
|