注意:必须在你的电脑里建一个文档来存储学生信息,我是再d盘建了一个stu.txt的文档,所以你只要在d 盘建一个一样的就可以了。如果你要改变存储路径,就必须把程序中的d:\\stu.txt全都改了
#include
#include
#include
#include
using namespace std;
void menu()
{
system("cls");
cout<<"******************************************"< cout<<"* 欢迎使用 *"< cout<<"******************************************"< cout<<"* 某大学面向对象程序设计 *"< cout<<"* *"< cout<<"* 运行操作者:*** *"< cout<<"* *"< cout<<"* **级软件工程***班 *"< cout<<"******************************************"< cout<<"* 1:输出学生信息 *"< cout<<"* 2:添加学生信息 *"< cout<<"* 3:修改学生信息 *"< cout<<"* 4:删除学生信息 *"< cout<<"* 5:查找 *"< cout<<"* 6:返回主菜单 *"< cout<<"* 7:退出并保存学生信息 *"< cout<<"******************************************"< } typedef struct{ long int num;//学号 char name[20];//姓名 char sex[4];//性别 char add[20];//住址 char native[40];//籍贯 int age;//年龄 }data; typedef struct stu{ data x; struct stu* next; }node,*pnode;//链表结点的定义 class student { private: node *head; public: student(); pnode gethead();//获取头结点 void insert(data x);//插入 void output(); //打印 void del(char *name);//删除 void change(char *name);//修改 void find(char *str);//查找}; student::student() { head=(node *)new(node); head->next=NULL; } void student::insert(data a) { node *p; p=(node *)new(node); p->x=a; p->next=head->next; head->next=p; } void student::output() node *p; int i=0,t,tempt; long int a[100]; p=head->next; if(p==NULL) cout<<"没有学生信息!!"< else {cout<<"姓名"<<'\t'<<"学号"<<'\t'<<" "<<"住址"<<'\t'<<"籍贯"<<'\t'<<"性别"<<'\t'<<"年龄"< if(p!=NULL) { while(p!=NULL) { i=i+1; a[i]=p->x.num; p=p->next; } t=i; for(int n=0;n<=t;n++) //按学号大小排序 for(int j=n+1;j<=t;j++) {if(a[n]>a[j]) { tempt=a[n]; a[n]=a[j]; a[j]=tempt; }} p=head->next; if(p!=NULL) {for(i=0;i<=t;i++) //打印排序后的信息 { while(p!=NULL) {if(p->x.num==a[i]) cout< p=p->next;} p=head->next;}} p=head->next; } } } void student::del(char *name) { node *p,*per; int flag=1; p=head->next; per=head; if(p==NULL) cout<<"空链表,不能删除!!"< else { while(p!=NULL) { if(strcmp(p->https://www.docsj.com/doc/558229005.html,,name)==0) { per->next=p->next; cout<<"删除成功!"< flag=0; delete p; break; } else { per=p; p=p->next; } } if(flag==1) cout<<"没有找到该学生!!"< } } pnode student::gethead() { return head; } void student::change(char *name) { node *p; int temp=0; p=head->next; char str[20]; while(p!=NULL) { if(strcmp(p->https://www.docsj.com/doc/558229005.html,,name)==0) { temp=1; cout<<"请选择需要修改的学生信息:"< cout<<"1.姓名:"< int n; cin>>n; switch(n) { case 1: cout<<"姓名:"; cin>>str;strcpy(p->https://www.docsj.com/doc/558229005.html,,str);break; case 2: cout<<"学号:"; long int m; cin>>m;p->x.num=m;break; case 3: cout<<"年龄:"; int a; cin>>a;p->x.age=a;break; case 4: cout<<"住址:"; cin>>str;strcpy(p->x.add,str);break; case 5: cout<<"籍贯:"; cin>>str;strcpy(p->x.native,str);break; case 6: cout<<"性别:"; cin>>str;strcpy(p->x.sex,str);break; } } p=p->next; } if(temp==0) { cout<<"该学生不存在!"< } } void student::find(char *str) { system("cls"); pnode p; int temp=0; p=head->next; while(p!=NULL) { if(strcmp(str,p->https://www.docsj.com/doc/558229005.html,)==0) { cout<<"姓名"<<'\t'<<"学号"<<'\t'<<" "<<"住址"<<'\t'<<"籍贯"<<'\t'<<"性别"<<'\t'<<"年龄"< cout< temp=1; } p=p->next; } if(temp==0) cout<<"该学生不存在"< } student H; void insert_stu()//插入学生信息 { system("cls"); ofstream file("d:\\stu.txt",ios::app); data x; cout<<"请输入学生姓名:"; cin>>https://www.docsj.com/doc/558229005.html,; // file< // cout< cout<<"请输入学生学号:"; cin>>x.num; // file< // cout< cout<<"请输入学生年龄:"; cin>>x.age; // file< cout<<"请输入学生住址:"; cin>>x.add; // file< cout<<"请输入学生籍贯:"; cin>>x.native; // file< cout<<"请输入学生性别:"; cin>>x.sex; // file< H.insert(x); file.close(); } void cout_stu()//输出学生信息 { system("cls"); H.output(); } void del_stu()//删除学生信息 { system("cls"); char name[20]; cout<<"请输入要删除学生的名字:"< cin>>name; H.del(name); } void readstu(void)//读文件 { data x; char str[200]; ifstream fout; fout.open("d:\\stu.txt"); if(!fout){ cout<<"读取文件失败!!"< cout<<"按任意键返回....."< exit(-1); } while(fout.getline(str,200)) { // fout.getline(str,200); cout<<"-----------"< // cout< int i=0; int j=0; while(str[i]!=' ') { https://www.docsj.com/doc/558229005.html,[j++]=str[i++]; } https://www.docsj.com/doc/558229005.html,[j]='\0'; j=0; i++; x.num=0; while(str[i]!=' ') { x.num=x.num*10+(str[i++]-'0'); } j=0; i++; x.age=0; while(str[i]!=' ') { x.age=x.age*10+(str[i++]-'0'); } j=0; i++; while(str[i]!=' ') { x.add[j++]=str[i++]; } x.add[j]='\0'; j=0; i++; while(str[i]!=' ') { x.native[j++]=str[i++]; } x.native[j]='\0'; j=0; i++; while(str[i]!='\0') { x.sex[j++]=str[i++]; } x.sex[j]='\0'; // cout< // <<"="< H.insert(x); } fout.close(); } void writestu(void)//写入 { pnode q; q=H.gethead()->next; ofstream fin; fin.open("d:\\stu.txt"); if(!fin) { cout<<"读取文件失败"< exit(-1); } while(q!=NULL) { fin< fin< fin< fin< fin< fin< q=q->next; } } void change_stu()//修改学生信息 { system("cls"); char str[20]; cout<<"请输入要修改的学生的姓名:"< cin>>str; H.change(str); } void find_stu()//查找学生信息 { system("cls"); char str[20]; cout<<"*****************"< cout<<"* 1:输入姓名 *"< cout<<"*****************"< cin>>str; H.find(str); } int main() { char w='6'; readstu();//读取文件的内容 while(w!='7'){ switch(w) { case '1':cout_stu();break; case '2':insert_stu();break; case '3':change_stu();break; case '4':del_stu();break; case '5':find_stu();break; case '6':menu();break; case '7':w='7';break; default:cout<<"输入错误"< } cout< cin>>w; } writestu(); cout< return 1; } 1.对象 (1)从概念层面讲,对象是某种拥有责任的抽象。 (2)从规格层面讲,对象是一系列可以被其他对象使用的公共接口。 (3)从语言实现层面讲,对象封装了代码和数据。 2.软件开发中的经典阶段:需求、分析、设计、规范、实现、测试、部署、维护。 3.设计7原则:开闭原则、里氏代换原则、依赖倒转原则、合成/聚合复用原则、 迪M特原则、接口隔离原则、单一职责原则。 4.面向对象的方法学:UML(统一建模语言)、RUP(统一软件开发过程)、XP(极限 编程)。 开发方法:Booch、Coad、OMT、UML、OOSE、Wirfs—Brock 5.OOA——运用面向对象方法进行需求分析。 OOD——运用面向对象方法进行系统设计。 OOP——运用面向对象方法进行程序设计。 6.OOA的基本任务:是运用面向对象的方法,对问题域和系统责任进行分析和理解,对其中的事物和它们之间的关系产生正确的认识,找出描述问题域及系统责任所需的类及对象,定义这些类和对象的属性和操作,以及它们之间所形成的结构、静态联系和动态联系。最终目的:是产生一个符合用户需求,并能够直接反映问题域和系统责任的OOA模型及其详细说明。 优点:(1)加强了对问题域和系统责任的理解。(2)改进与分析有关的各类人员之间的交流。(3)对需求的变化具有较强的适应性。(4)支持软件复用。 OOA的三大策略是:属性策略、方法策略、对象策略。 7.(1)封装:是指对象在其操作中隐藏属性。它是一种信息隐蔽技术,用户只能看见对象封装界面上的信息,对象的内部实现对用户是隐蔽的。封装的目的是使对象的使用者和生产者分开,使对象的定义和实现分开。 例如:要从同事那里借钱,在商店购买食物,就不会抢夺同事的钱包,大翻一通,看看里 面是否有足够的钱。而应该询问他们是否可以借你一些钱,他们就会自己翻钱包。 以表示圆的一个对象作为封装的例子。圆的操作应能计算出半径、直径、周长和面积。假定选择存储直径,要访问直径的程序员都会选择存储直径属性,而不是通过“获取直径”的操作来访问。如果在软件的后续版本中要存储的是半径,就必须找出系统中直接访问直径的所有代码,并更正它们,有了封装,就不会有问题。 (2)继承:可以指定类从父类中获取一些特性,再添加它自己的独特特性。继承是类间的 基本关系,它是基于层次关系的不同类共享数据和操作的一种机制。父类中定义了其所有子类的公共属性和操作,在子类中除了定义自己特有的属性和操作外,可以继承父类的属性和操作,也可以对父类中的操作重新定义其实现方法。 例如:在面向对象中,我们可以把洗衣机、电冰箱、微波炉、收音机看成是家用电气类的 子类,也可以说家用电器类是这些类的超类。家用电器类具有的属性OnOffSwitch和electricWire,具有turnOn()和turnOff()操作。因此,如果你知道某物是家用电器,那么就会立即知道它 具有家用电器类的属性和操作,这种关系就是继承。每个家用电器类的子类都继承了家用电器类的特征。同时,每个子类都增加了自己的属性和操作。 (3)多态:是指同一操作作用于不同的对象上可以有不同的解释,并产生不同的执行结果。例如:“画”操作,作用在“矩形”对象上,则在屏幕上画一个矩形;作用在“圆”对象上, 则在屏幕上画一个圆。也就是说,相同操作的消息发送给不同对象时,每个对象将根据自1 / 9 1 什么是面向对象程序设计,它与传统的结构式程序有什么不同。 面向对象程序设计是一种适用于设计、开发各类软件的范型。它是将软件看成是一个由对象组成的社会:这些对象具有足够的智能,能理解从其他对象接受的信息,并以适当的行为作出响应;允许低层对象从高层对象继承属性和行为。通过这样的设计思想和方法,将所模拟的现实世界中的事物直接映射到软件系统的解空间。 与传统的结构式程序设计相比,面向对象程序设计吸取了结构式程序设计的一切优点(自顶向下、逐步求精的设计原则)。而二者之间的最大差别表现在: ·面向对象程序采用数据抽象和信息隐藏技术使组成类的数据和操作是不可分割的,避免了结构式程序由于数据和过程分离引起的弊病。 · 面向对象程序是由类定义、对象(类实例)和对象之间的动态联系组成的。而结构式程序是由结构化的数据、过程的定义以及调用过程处理相应的数据组成的 2 用面向对象方法建立模型的思维过程是怎样的。 用面向对象方法建立拟建系统的模型的过程就是从被模拟现实世界的感性具体中抽象要解决的问题概念的过程。这种抽象过程分为知性思维和具体思维两个阶段,其中:·知性思维是从感性材料中分解对象,抽象出一般规定,形成了对对象的普遍认识。·具体思维是从知性思维得到出的一般规定中揭示的事物的深刻本质和规律,其目的是把握具体对象的多样性的统一和不同规定的综合。 3 解释以下概念: ①对象:在现实世界中,对象就是可以感觉到的实体。每个对象具有一个特定的名字以 区别于其他对象;具有一组状态用来描述它的某些特性;具有一组操作,每一个操作决定对象的一种功能或行为(为自身服务的操作和为其他对象提供服务的操作)。而在面向对象系统中,对象是可以标识的存储区域。每个对象的状态被保存在此区域中,而实现一类对象行为的操作(代码)被保存在另外相关的存储器区域中。 ②消息:消息是要求某个对象执行其某种功能操作(方法)的规格说明。因此,消息是 由消息的接收者、消息要求提供的操作(消息名)和必要的参数组成的。 ③类:在现实世界中,类是对一组具有共同特性(属性和行为)的客观对象的抽象。而 在面向对象系统中,类是由程序员自定义的具有特定结构和功能的类型,是一种代码共享的手段。 ④实例:任何一个对象都是该对象所属类的一个具体实例。 ⑤公有消息:是由对象外向对象发送的消息,用于激活该对象的某种方法。 ⑥私有消息:是由对象向自身发送的消息,用于内部操作;该类消息不能从对象外向该 对象发送。 ⑦消息序列:在面向对象系统中一个事件的发生总会有多个对象的多次相互作用才能完 成,使得这些对象能够相互作用的消息组成的序列被称为消息序列。 4 类与实例的关系如何? 类是创建对象的模板,而对象是实现类的实例。属于同一类的不同实例必须具有: ·相同的操作集合; ·相同的静态属性集合; ·不同的对象名和属性动态值。 第3章面向对象程序设计基础 第3章面向对象程序设计基础 【1】什么是Java程序使用的类?什么是类库? 答:类是将一类事物的特性描述出来,然后如果用这个类来定义对象,则该对象就拥有了这个类所描述的所有特性。 在Java系统中,系统定义好的类根据实现的功能不同,可以划分成不同的集合,每个集合称为一个包,所有包合称为类库。 【2】如何定义方法?在面向对象程序设计中方法有什么作用? 答:方法的定义由两部分组成:方法声明和方法体。 方法的声明如下: 返回值类型方法名(参数类型形式参数1,参数类型形式参数2…){ 程序代码; 返回值; } 在面向对象程序设计中,方法的作用是完成对类和对象属性操作。 【3】简述构造方法的功能和特点。下面的程序片段是某学生为student类编写的构造方法,请指出其中的错误。 void Student(int no,String name) { studentNo=no; studentName=name; return no; } 答:构造方法的功能是:构造方法是一个特殊的方法,主要用于初始化新创建的对象; 特点:构造方法的方法名要求与类名相同,用户不能直接调用,只能通过new运算符调用,而且构造方法是不返回任何数据类型,甚至也不返回void数据类型,即不能在构造方法前加void。 错误之处:(1)构造方法Student()前不能加void,(2)不能用return语句,(3)类名Student 首字母S改成小写s. 【4】定义一个表示学生的student类,包括的域有学号、姓名、性别、年龄,包括的方法有获得学号、姓名、性别、年龄及修改年龄。编写Java程序创建student类的对象及测试其方法的功能。 class Student { String id; String name; String sex; int age; void talk(){ 22. 下列的符号常量定义中,错误的定义是()。 A. const M=10; B. const int M=20; C. const char ch; D. const bool mark=true; 40. 函数重载是指()。 A. 两个或两个以上的函数取相同的函数名,但形参的个数或类型不同 B. 两个以上的函数取相同的名字和具有相同的参数个数,但形参的类型可以不同 C. 两个以上的函数名字不同,但形参的个数或类型相同 D. 两个以上的函数取相同的函数名,并且函数的返回类型相同 41. 以下关于函数模板叙述正确的是()。 A. 函数模板也是一个具体类型的函数 B. 函数模板的类型参数与函数的参数是同一个概念 C. 通过使用不同的类型参数,函数模板可以生成不同类型的函数 D. 用函数模板定义的函数没有类型 42. 下列()的调用方式是引用调用。 A. 形参和实参都是变量 B.形参是指针,实参是地址值 C. 形参是引用,实参是变量 D.形参是变量,实参是地址值 43. 为了提高程序的运行速度,可将不太复杂的功能用函数实现,此函数应选择()。 A. 内联函数 B.重载函数 C.递归函数 D.函数模板 44. 函数原型语句正确的是()。 A. int Function(void a); B.void Function (int); C. int Function(a); D.void int(double a); 45. C++中函数返回值的类型是由()决定的。 A. return语句中表达式的类型 B.该函数定义时的类型 C.调用函数时的调用语句 D.系统根据结果 56. 采用重载函数的目的是()。 A. 实现共享 B. 减少空间 C. 提高速度 D. 使用方便,提高可读性 58. 以下叙述中正确的是( )。 A. 使用#define可以为常量定义一个名字,该名字在程序中可以再赋另外的值 B. 使用const定义的常量,其值在程序运行时是不可改变的 C. 在程序中使用内联函数使程序的可读性变差 D. 在定义函数时可以在形参表的任何位置给出缺省形参值 70. 用new运算符创建一个含10个元素的一维整型数组的正确语句是( )。 A. int *p=new a[10]; B. int *p=new float[10];面向对象程序设计 复习资料
什么是面向对象程序设计
第3章 面向对象程序设计基础
面向对象程序设计期末综合练习一(单选题)
《面向对象程序设计》答案