1 #include <iostream> 2 using namespace std; 3 class Student 4 {public: 5 void get_value() 6 {cin>>num>>name>>sex;} 7 void display( ) 8 {cout<<"num: "<<num<<endl; 9 cout<<"name: "<<name<<endl; 10 cout<<"sex: "<<sex<<endl;} 11 private : 12 int num; 13 char name[10]; 14 char sex; 15 }; 16 17 class Student1: public Student 18 {public: 19 void get_value_1() 20 {get_value(); 21 cin>>age>>addr;} 22 void display_1() 23 { cout<<"age: "<<age<<endl; //引用派生类的私有成员,正确。 24 cout<<"address: "<<addr<<endl;} //引用派生类的私有成员,正确。 25 private: 26 int age; 27 char addr[30]; 28 }; 29 30 int main() 31 {Student1 stud1; 32 stud1.get_value_1(); 33 stud1.display(); 34 stud1.display_1(); 35 system("pause"); 36 return 0; 37 } 38 39 40 41 #include <stdio.h> 42 #include <stdlib.h> 43 #include <string.h> 44 #define N 3 45 #define LEN (Student*) malloc(sizeof(Student)) 46 /* 学生数据结构 */ 47 typedef struct node 48 { 49 char num[20];// 50 char name[15]; 51 int score[N]; 52 int sum; 53 double ave; 54 struct node *next; 55 } Student; 56 57 /* 头指针 */ 58 Student *head = NULL; 59 /* 临时指针 */ 60 Student *tmp = NULL; 61 /* 课程名称 */ 62 char CLASSNAME[N][30] = {"大物", "高数", "c语言"}; 63 /* 命令开关 */ 64 int SWITCH[16] = {0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 65 /* 函数声明 */ 66 int Menu(); 67 Student* Init(); 68 int CheckNUM(char*); 69 int CheckName(char*); 70 int CheakScore(int score); 71 int Same_NUM(char*); 72 void InputNodeInfo(Student*); 73 void OutputNodeInfo(Student*); 74 Student* SearchFrontNode(Student*); 75 void DeleteNode(Student*); 76 void InsertBefore(); 77 void InputList(); 78 Student* SearchID(char*); 79 Student* SearchName(char*); 80 void SearchDeleteNode(); 81 void OutList(); 82 void SearchPrintNode(); 83 void Compute(); 84 int CmpID(Student*, Student*, int); 85 int CmpSum(Student*, Student*, int); 86 int CmpScore(Student*, Student*, int); 87 Student* SearchMaxNode(int (*cmp)(Student*, Student*, int), int); 88 Student* Sort(int (*cmp)(Student*, Student*, int), int); 89 void OutputToFile(FILE*, Student*, int); 90 void InsertAfter(Student*); 91 void SaveToFile(); 92 void LoadFile(); 93 void CopyFile(); 94 void InsertToFile(); 95 void FreeList(Student* p); 96 void Stat(); 97 void Quit(); 98 99 /* 主函数 */ 100 int main() 101 { 102 int n; 103 104 while (1) 105 { 106 n = Menu(); 107 { 108 if (n == 1 || n == 15 || SWITCH[1]) 109 { 110 switch (n) 111 { 112 /* 执行初始化 */ 113 case 1: 114 head = Init(); 115 printf("LOOK...初始化成功\n"); 116 break; 117 /* 创建链表 ,输入学生信息*/ 118 case 2: 119 InputList(); 120 break; 121 /* 查找学号或姓名删除信息 */ 122 case 3: 123 SearchDeleteNode(); 124 break; 125 /* 输出全部学生信息 */ 126 case 4: 127 system("cls"); 128 OutList(); 129 break; 130 /* 按姓名查找学生信息*/ 131 case 5: 132 SearchPrintNode(); 133 break; 134 /* 保存到文件 */ 135 case 6: 136 SaveToFile(); 137 break; 138 /* 从文件中读取学生信息*/ 139 case 7: 140 if (SWITCH[6]) 141 { 142 head = Init(); 143 LoadFile(); 144 } 145 else 146 { 147 printf("当前文件未保存\n"); 148 } 149 break; 150 /* 计算所有学生的总分和平均分 */ 151 case 8: 152 Compute(); 153 SWITCH[8] = 1; 154 printf("计算完毕\n"); 155 break; 156 /* 插入一个学生信息到链表 */ 157 case 9: 158 InsertBefore(); 159 SWITCH[6] = 0; 160 SWITCH[8] = 0; 161 break; 162 /* 复制文件 */ 163 case 10: 164 CopyFile(); 165 break; 166 /* 排序,按总分排序并打印学生信息 */ 167 case 11: 168 if (SWITCH[8]) 169 { 170 head = Sort(CmpSum, 0); 171 system("cls"); 172 OutList(); 173 } 174 else 175 { 176 printf("请先计算总分!\n"); 177 } 178 break; 179 /* 尾部添加一个学生信息到文件中 */ 180 case 12: 181 InsertToFile(); 182 SWITCH[6] = 0; 183 printf("尾部添加完毕!\n"); 184 break; 185 /* 按学号搜索..学生信息*/ 186 case 13: 187 if (SWITCH[8]) 188 { 189 head = Sort(CmpID, 0); 190 system("cls"); 191 OutList(); 192 } 193 else 194 { 195 printf("请先计算总分!\n"); 196 } 197 break; 198 /* 分类汇总 */ 199 case 14: 200 system("cls"); 201 Stat(); 202 break; 203 /* 结束 */ 204 case 15: 205 Quit(); 206 break; 207 default: 208 printf("无效命令!\n"); 209 fflush(stdin); 210 } 211 system("pause"); 212 } 213 else 214 { 215 printf("你必须首先初始化!\n"); 216 system("pause"); 217 } 218 } 219 } 220 221 system("pause"); 222 return 0; 223 } 224 225 /* 菜单 */ 226 int Menu() 227 { 228 int n; 229 system("cls"); 230 fflush(stdin); 231 printf("*********************************************************************\n"); 232 printf("*********************************************************************\n"); 233 printf("【01】 初始化........\n"); 234 printf("【02】 输入学生信息\n"); 235 printf("【03】 查找学号或姓名删除信息\n"); 236 printf("【04】 输出全部学生信息\n"); 237 printf("【05】 按姓名查找学生信息\n"); 238 printf("【06】 保存到文件\n"); 239 printf("【07】 从文件中读取学生信息\n"); 240 printf("【08】 计算所有学生的总分和平均分\n"); 241 printf("【09】 插入一个学生信息到链表中\n"); 242 printf("【10】 复制文件\n"); 243 printf("【11】 按总分排序并打印学生信息\n"); 244 printf("【12】 尾部添加一个学生信息到文件中\n"); 245 printf("【13】 按学号搜索..学生信息\n"); 246 printf("【14】 分类汇总\n"); 247 printf("【15】 退出\n"); 248 printf("********************************************************************\n"); 249 printf("请输入命令编号: "); 250 scanf("%d", &n); 251 return n; 252 } 253 254 /* 初始化 */ 255 Student* Init() 256 { 257 int i; 258 Student *head; 259 head = LEN; 260 head->next = NULL; 261 262 /* 命令开关初始化 */ 263 for (i = 1; i < 16; i++) 264 { 265 SWITCH[i] = 0; 266 } 267 268 SWITCH[1] = 1; 269 SWITCH[6] = 1; 270 return head; 271 } 272 273 /* 检查学号 */ 274 int CheckNUM(char* s) 275 { 276 int i; 277 278 if (strlen(s) == 0 || strlen(s) > 10) return 0; 279 280 for (i = 0; i < strlen(s); i++) 281 { 282 if (s[i] < '0' || s[i] > '9') return 0; 283 } 284 285 return 1; 286 } 287 288 /* 检查姓名 */ 289 int CheckName(char* s) 290 { 291 int i; 292 293 if (strlen(s) == 0 || strlen(s) > 15) return 0; 294 295 for (i = 0; i < strlen(s); i++) 296 { 297 if (!(s[i] >= 'a' && s[i] <= 'z' || s[i] >= 'A' && s[i] <= 'Z')) return 0; 298 } 299 300 return 1; 301 } 302 303 /* 检查分数 */ 304 int CheakScore(int score) 305 { 306 if (score > 100 || score <= 0) return 0; 307 return 1; 308 } 309 310 /* 检查相同学号 */ 311 int Same_NUM(char* s) 312 { 313 Student *p = head->next; 314 while(p != NULL) 315 { 316 if (strcmp(s, p->num) == 0) return 1; 317 p = p->next; 318 } 319 return 0; 320 } 321 322 /* 给p指向的节点输入信息 */ 323 void InputNodeInfo(Student* p) 324 { 325 fflush(stdin); 326 327 /* 学号 */ 328 printf("\n请输入学号: "); 329 do 330 { 331 gets(p->num); 332 333 if (!CheckNUM(p->num)) 334 { 335 printf("数据不标准,请重新输入学号: "); 336 } 337 else if (Same_NUM(p->num)) 338 { 339 printf("检测到此学号存在,请重新输入: "); 340 } 341 }while (!(CheckNUM(p->num) && !Same_NUM(p->num))); 342 343 /* 姓名 */ 344 printf("请输入姓名: "); 345 do 346 { 347 gets(p->name); 348 if (!CheckName(p->name)) 349 { 350 printf("数据不标准,请重新输入姓名: "); 351 } 352 } 353 while (!CheckName(p->name)); 354 355 /* 成绩 */ 356 int i; 357 for (i = 0; i < N; i++) 358 { 359 printf("请输入 %s 成绩: ", CLASSNAME[i]); 360 do 361 { 362 fflush(stdin); 363 scanf("%d", &p->score[i]); 364 365 if (!CheakScore(p->score[i])) 366 { 367 printf("数据不标准,请重新输入 %s 成绩: ", CLASSNAME[i]); 368 } 369 } 370 while (!CheakScore(p->score[i])); 371 } 372 373 /* 总分及平均分 */ 374 p->sum = -1; 375 p->ave = -1; 376 } 377 378 /* 输出p指向节点的信息 */ 379 void OutputNodeInfo(Student* p) 380 { 381 int i; 382 printf("\n"); 383 printf("姓名: %s\n", p->name); 384 printf("学号: %s\n", p->num); 385 386 for (i = 0; i < N; i++) 387 { 388 printf("%s 成绩: %d\n", CLASSNAME[i], p->score[i]); 389 } 390 391 /* 计算过才输出 */ 392 if (SWITCH[8]) printf("总分: %d\n", p->sum); 393 if (SWITCH[8]) printf("平均分: %.2lf\n", p->ave); 394 } 395 396 /* 返回r的前一个节点 */ 397 Student* SearchFrontNode(Student* r) 398 { 399 Student *p = head; 400 while (p->next != r) p = p->next; 401 return p; 402 } 403 404 /* 删除r指向的节点 */ 405 void DeleteNode(Student* r) 406 { 407 Student *p = SearchFrontNode(r); 408 p->next = r->next; 409 } 410 411 /* 头插法插入节点 */ 412 void InsertBefore() 413 { 414 Student *s = LEN; 415 InputNodeInfo(s); 416 s->next = head->next; 417 head->next = s; 418 } 419 420 /* 输入链表 */ 421 void InputList() 422 { 423 int n; 424 printf("有多少个学生信息要输入? "); 425 scanf("%d", &n); 426 427 while (n--) 428 { 429 InsertBefore(); 430 } 431 } 432 433 /* 按学号查找 */ 434 Student* SearchID(char* num) 435 { 436 Student *p = head->next; 437 438 while (p != NULL) 439 { 440 if (strcmp(p->num, num) == 0) break; 441 p = p->next; 442 } 443 444 return p; 445 } 446 447 /* 按姓名查找 */ 448 Student* SearchName(char* name) 449 { 450 Student *p = head->next; 451 452 while (p != NULL) 453 { 454 if (strcmp(p->name, name) == 0) break; 455 p = p->next; 456 } 457 458 return p; 459 } 460 461 /* 按学号或姓名查找删除节点 */ 462 void SearchDeleteNode() 463 { 464 Student *p; 465 fflush(stdin); 466 char str[20]; 467 char sure[20]; 468 469 /* 输入合法性判断 */ 470 printf("请输入你要删除的学生的 姓名 或 学号: "); 471 do 472 { 473 gets(str); 474 475 if (!(CheckNUM(str) || CheckName(str))) 476 { 477 printf("数据不标准,请重新输入姓名或学号: "); 478 } 479 } 480 while (!(CheckNUM(str) || CheckName(str))); 481 482 /* 判断是姓名还是学号 */ 483 if (str[0] >= '0' && str[0] <= '9') 484 { 485 p = SearchID(str); 486 487 if (p == NULL) 488 { 489 printf("对不起,找不到这个学号\n"); 490 } 491 else 492 { 493 OutputNodeInfo(p); 494 printf("确认删除? (输入\"y\"确认,任意键取消): "); 495 if (strcmp(gets(sure), "y") == 0) 496 { 497 DeleteNode(p); 498 printf("删除成功\n"); 499 SWITCH[6] = 0; 500 } 501 fflush(stdin); 502 } 503 } 504 else 505 { 506 p = SearchName(str); 507 508 if (p == NULL) 509 { 510 printf("对不起,找不到这个姓名\n"); 511 } 512 else 513 { 514 OutputNodeInfo(p); 515 printf("确认删除? (输入\"y\"确认,任意键取消): "); 516 if (strcmp(gets(sure), "y") == 0) 517 { 518 DeleteNode(p); 519 printf("删除成功!\n"); 520 SWITCH[6] = 0; 521 } 522 fflush(stdin); 523 } 524 } 525 } 526 527 /* 输出链表 */ 528 void OutList() 529 { 530 Student *p = head->next; 531 532 /* 空表处理 */ 533 if (p == NULL) 534 { 535 printf("暂无学生信息!\n"); 536 } 537 538 while (p != NULL) 539 { 540 OutputNodeInfo(p); 541 p = p->next; 542 } 543 } 544 545 /* 按姓名查找记录并打印 */ 546 void SearchPrintNode() 547 { 548 Student *p = head->next; 549 int ok = 1; 550 char name[20]; 551 fflush(stdin); 552 553 /* 姓名合法性判断 */ 554 printf("请输入你要查找的学生姓名: "); 555 do 556 { 557 gets(name); 558 559 if (!CheckName(name)) 560 { 561 printf("数据不标准,请重新输入姓名: "); 562 } 563 } 564 while (!CheckName(name)); 565 566 /* 按姓名查找节点 */ 567 while (p != NULL) 568 { 569 if (strcmp(p->name, name) == 0) 570 { 571 ok = 0; 572 OutputNodeInfo(p); 573 } 574 p = p->next; 575 } 576 577 if (ok) 578 { 579 printf("对不起,找不到这个姓名\n"); 580 } 581 } 582 583 /* 计算总分和均分 */ 584 void Compute() 585 { 586 int i; 587 Student *p = head->next; 588 589 while (p != NULL) 590 { 591 int sum = 0; 592 593 for (i = 0; i < N; i++) 594 { 595 sum += p->score[i]; 596 } 597 598 p->sum = sum; 599 p->ave = sum * 1.0 /N; 600 p = p->next; 601 } 602 } 603 604 /* 比较学号 */ 605 int CmpID(Student* a, Student* b, int k) 606 { 607 return strcmp(a->num, b->num); 608 } 609 610 /* 比较总分 */ 611 int CmpSum(Student* a, Student* b, int k) 612 { 613 return b->sum - a->sum; 614 } 615 616 /* 比较各科分数 */ 617 int CmpScore(Student* a, Student* b, int k) 618 { 619 return b->score[k] - a->score[k]; 620 } 621 622 /* 选择最大元素 */ 623 Student* SearchMaxNode(int (*cmp)(Student* a, Student* b, int k), int k) 624 { 625 Student *p = head->next; 626 Student *max = p; 627 628 while (p != NULL) 629 { 630 if (cmp(p, max, k) < 0) 631 { 632 max = p; 633 } 634 p = p->next; 635 } 636 637 return max; 638 } 639 640 /* 排序 */ 641 Student* Sort(int (*cmp)(Student* a, Student* b, int k), int k) 642 { 643 Student *newhead = LEN; 644 Student *p = newhead; 645 Student *max; 646 647 while (head->next != NULL) 648 { 649 max = SearchMaxNode(cmp, k); 650 p->next = max; 651 DeleteNode(max); 652 p = p->next; 653 } 654 655 /* 表尾处理 */ 656 p->next = NULL; 657 return newhead; 658 } 659 660 661 /* 将s插入链表尾部 */ 662 void InsertAfter(Student* s) 663 664 { 665 Student *p = head; 666 667 while (p->next != NULL) p = p->next; 668 669 s->next = NULL; 670 p->next = s; 671 } 672 673 /* 保存到文件 */ 674 void SaveToFile() 675 { 676 /* 处理尾部添加表尾情况 */ 677 if (SWITCH[12]) 678 { 679 InsertAfter(tmp); 680 } 681 682 FILE *fp; 683 int i; 684 Student *p; 685 char file[20]; 686 fflush(stdin); 687 printf("请输入要保存的文件名: "); 688 gets(file); 689 690 if ((fp = fopen(file, "wt")) == NULL) 691 { 692 printf("写文件错误.......!\n"); 693 return; 694 } 695 for(p = head->next;p!=NULL;p=p->next) 696 fprintf(fp,"%s %s \n",p->name,p->num); 697 for(i=0;i<2;i++) 698 { 699 fprintf(fp,"%d\n",p->score[i]); 700 } 701 printf("文件保存成功!\n"); 702 fclose(fp); 703 SWITCH[6] = 1; 704 705 /* 处理尾部添加情况 */ 706 if (SWITCH[12]) 707 { 708 DeleteNode(tmp); 709 SWITCH[12] = 0; 710 } 711 } 712 713 /* 从文件中读入记录 */ 714 void LoadFile() 715 { 716 int i; 717 FILE *fp; 718 char file[20]; 719 fflush(stdin); 720 printf("请输入文件名: "); 721 gets(file); 722 723 if ((fp = fopen(file, "rt")) == NULL) 724 { 725 printf("对不起,无法打开文件!\n"); 726 return; 727 } 728 729 /* 文件未结束时读入数据 */ 730 while (!feof(fp)) 731 { 732 Student *s = LEN; 733 fscanf(fp, "%s", s->name); 734 fscanf(fp, "%s", s->num); 735 736 for (i = 0; i < N; i++) 737 { 738 fscanf(fp, "%d", &s->score[i]); 739 } 740 741 s->next = head->next; 742 head->next = s; 743 } 744 745 printf("文件读取成功!\n"); 746 fclose(fp); 747 } 748 749 /* 复制文件 */ 750 void CopyFile() 751 { 752 FILE *fp1, *fp2; 753 char ch, file1[20], file2[20]; 754 fflush(stdin); 755 /* 读入源文件 */ 756 printf("请输入源文件名: "); 757 gets(file1); 758 759 if ((fp1 = fopen(file1, "rb")) == NULL) 760 { 761 printf("对不起,无法打开文件!\n"); 762 return; 763 } 764 765 /* 读入目标文件 */ 766 printf("请输入目标文件名: "); 767 gets(file2); 768 769 if ((strcmp(file1, file2) == 0) || ((fp2 = fopen(file2, "wb")) == NULL)) 770 { 771 printf("对不起,无法创建文件!\n"); 772 return; 773 } 774 775 /* 逐个字符拷贝 */ 776 while (!feof(fp1)) 777 { 778 ch = fgetc(fp1); 779 780 if (ch != EOF) 781 fputc(ch, fp2); 782 } 783 784 fclose(fp1); 785 fclose(fp2); 786 printf("文件拷贝成功!\n"); 787 } 788 789 /* 尾部添加记录到文件中 */ 790 void InsertToFile() 791 { 792 tmp = LEN; 793 InputNodeInfo(tmp); 794 SWITCH[12] = 1; 795 } 796 797 /* 分类统计 */ 798 void Stat() 799 { 800 int i, j, n = 0; 801 int sum[N] = {0}; 802 Student *p = head->next; 803 804 if (p == NULL) 805 { 806 printf("暂无学生信息,无法统计\n"); 807 return; 808 } 809 810 /* 统计各科总分 */ 811 while (p != NULL) 812 { 813 /* 记录学生总数 */ 814 n++; 815 816 for (i = 0; i < N; i++) 817 { 818 sum[i] += p->score[i]; 819 } 820 821 p = p->next; 822 } 823 824 /* 各科分别输出 */ 825 for (i = 0; i < N; i++) 826 { 827 printf("%s 总均分: %.2lf\n", CLASSNAME[i], sum[i] * 1.0 / n); 828 head = Sort(CmpScore, i); 829 j = 0; 830 p = head->next; 831 832 while (p != NULL) 833 { 834 j++; 835 printf("第%d名 %s %d\n", j, p->name, p->score[i]); 836 p = p->next; 837 } 838 839 printf("\n"); 840 } 841 } 842 843 /* 释放链表 */ 844 void FreeList(Student* p) 845 { 846 if (p->next != NULL) 847 { 848 FreeList(p->next); 849 } 850 free(p); 851 } 852 853 /* 退出 */ 854 void Quit() 855 { 856 if (!SWITCH[6]) 857 { 858 printf("请先保存文件!\n"); 859 return; 860 } 861 if (head != NULL) 862 { 863 FreeList(head); 864 } 865 exit(0); 866 } 867 868 869 #include <iostream> //用VC++时改为∶ #include <iostream.h> 870 using namespace std; //用VC++时为取消此行 871 class Complex 872 {public: 873 Complex(){real=0;imag=0;} 874 Complex(double r,double i){real=r;imag=i;} 875 Complex operator+(Complex &c2); 876 Complex operator+(int &i); 877 friend Complex operator+(int&,Complex &); 878 void display(); 879 private: 880 double real; 881 double imag; 882 }; 883 884 Complex Complex::operator+(Complex &c) 885 {return Complex(real+c.real,imag+c.imag);} 886 887 Complex Complex::operator+(int &i) 888 {return Complex(real+i,imag);} 889 890 void Complex::display() 891 {cout<<"("<<real<<","<<imag<<"i)"<<endl;} 892 893 Complex operator+(int &i,Complex &c) 894 {return Complex(i+c.real,c.imag);} 895 896 int main() 897 {Complex c1(3,4),c2(5,-10),c3; 898 int i=5; 899 c3=c1+c2; 900 cout<<"c1+c2="; 901 c3.display(); 902 c3=i+c1; 903 cout<<"i+c1="; 904 c3.display(); 905 c3=c1+i; 906 cout<<"c1+i="; 907 c3.display(); 908 system("pause"); 909 return 0; 910 } 911 912 913 #include <iostream> 914 using namespace std; 915 class Complex 916 {public: 917 Complex(){real=0;imag=0;} 918 Complex(double r,double i){real=r;imag=i;} 919 double get_real(); 920 double get_imag(); 921 void display(); 922 private: 923 double real; 924 double imag; 925 }; 926 927 double Complex::get_real() 928 {return real;} 929 930 double Complex::get_imag() 931 {return imag;} 932 933 void Complex::display() 934 {cout<<"("<<real<<","<<imag<<"i)"<<endl;} 935 936 Complex operator + (Complex &c1,Complex &c2) 937 { 938 return Complex(c1.get_real()+c2.get_real(),c1.get_imag()+c2.get_imag()); 939 } 940 941 int main() 942 {Complex c1(3,4),c2(5,-10),c3; 943 c3=c1+c2; 944 cout<<"c3="; 945 c3.display(); 946 system("pause"); 947 return 0; 948 } 949 950 #include <iostream> 951 using namespace std; 952 class Complex 953 {public: 954 Complex(){real=0;imag=0;} 955 Complex(double r){real=r;imag=0;} 956 Complex(double r,double i){real=r;imag=i;} 957 operator double(){return real;} 958 void display(); 959 private: 960 double real; 961 double imag; 962 }; 963 964 void Complex::display() 965 {cout<<"("<<real<<", "<<imag<<")"<<endl;} 966 967 int main() 968 {Complex c1(3,4),c2; 969 double d1; 970 d1=2.5+c1; 971 cout<<"d1="<<d1<<endl; 972 c2=Complex(d1); 973 cout<<"c2="; 974 c2.display(); 975 system("pause"); 976 return 0; 977 }