基于指针构造的程序设计

【实验目的】

(1)掌握指针的概念,会定义和使用指针变量

(2)指针与对象结合的使用

1、程序设计题:编写函数fun(char *s),功能是把s所指字符串中的内容逆置。例如:字符串中原有的字符串为:abcdefg,则调用该函数后, 串中的内容为:gfedcba

#include <string.h>
#include <stdio.h>
#define   N   81
void fun ( char  *s ) {
  int i, j;//写入你的代码
    char t;
    for (i = 0, j = strlen(s) - 1; i < j; i++, j--)
    {
        t = s[i];
        s[i] = s[j]; 
        s[j] = t;
    } 
}
void  main(void)  {
char   a[N];
   printf ( "Enter  a  string :  " ); gets ( a );
   printf ( "The original string is :  " ); puts( a );
   fun ( a );
   printf("\n");
   printf ( "The string after modified :  ");
   puts ( a );
}

 字符串逆置:

void fun ( char  *s ) {
  int i, j;//写入你的代码
    char t;
    for (i = 0, j = strlen(s) - 1; i < j; i++, j--)
    {
        t = s[i];
        s[i] = s[j]; 
        s[j] = t;
    } 
}

2、用公有继承的方式,程序运行的时候 输入num,name,sex,age,addr的值,程序输出5个数据的值

#include <iostream>
#include <string>
using namespace std;
class Student  {
public:
   void get_value()  { 
 cout << "Please enter num, name, sex: ";
        cin >> num >> name >> sex;
            //添加代码 实现  num,name和sex的输入 
     }
   void display( )  {
     cout<<"num: "<<num<<endl;
     cout<<"name: "<<name<<endl;
     cout<<"sex: "<<sex<<endl;
   }
private :
   int num;
   string name;
   string sex;
};   
class Student1 : public Student   //增加公有继承
{
public:
  void get_value_1()  {
          get_value();
        cout << "Please enter age, address: ";
cin >> age >> addr; 
//添加代码。实现基类继承的成员的输入以及本类新增的数据成员的输入
  }
   void display_1()  {   
display();
        cout << "age: " << age << endl;
cout << "address: " << addr << endl;
//添加代码。实现基类继承成员和新增age,addr的输出
}
private:
int age;
     string addr;
 };
void main()   {
  Student1 stud1;
  //stud1.get_value();
  stud1.get_value_1();
  //stud1.display();
  stud1.display_1();
}

 

 

 子类的对象可以调用基类的成员函数,所以主函数中声明的是子类的对象。

 

 注意:

公有继承得到的子类成员函数中包含使用基类成员函数的书写方法。

  void get_value_1()  {
          get_value();
        cout << "Please enter age, address: ";
cin >> age >> addr; 
//添加代码。实现基类继承的成员的输入以及本类新增的数据成员的输入
  }

3、赋值兼容性原则(public继承)

① 派生类的对象可以赋值给基类对象。(派生类对象是基类对象)

② 派生类的对象可以初始化基类的引用。

③ 指向基类的指针也可以指向派生类。

  • 派生类对象的地址可以赋值给基类指针
base * pb = &d;

 

▲通过基类对象名、指针和引用只能使用从基类继承的成员

#include <iostream>
using namespace std;
class B0 { //基类B0声明
public:
    void display() { cout << "B0::display()" << endl; }  //公有成员函数
};

class B1 : public B0 {
public:
    void display() { cout << "B1::display()" << endl; }
};
void fun(B0* ptr) {
    ptr->display();    //"对象指针->成员名"
}
    void main() 
    {  //主函数
        B0 b0;    //声明B0类对象
        B1 b1;    //声明B1类对象
        B0* p;    //声明B0类指针
        p = &b0;    //B0类指针指向B0类对象①
        fun(p);
        p = &b1;    //B0类指针指向B1派生类对象②
        fun(p);
        b0 = b1;//派生类对象赋值给基类对象③
        b0.display();
        B0& x = b1; //派生类对象初始化基类对象的引用④
        x.display();
        b1.display();//派生类对象⑤
    }

 

分析:

5次调用display()函数,通过不同的对象不同的方式;

①是基类对象的指针指向基类对象;②③④是三条赋值兼容性规则;

①②③④调用基类的display()函数;通过基类对象名、指针和引用只能使用从基类继承的成员

⑤是派生类的对象,通过对象名调用派生类的成员函数display();

当派生类与基类有形同的成员时,若未强行指名,则通过派生类的对象使用的是派生类中的同名成员。

如果要通过派生类的对象访问基类中被覆盖的同名成员,应使用类名限定。

5、编写程序:定义Person类,数据成员包含保存姓名的变量name,并有能够输出姓名的成员函数PrintName()。

从Person类派生出Worker类,包括数据成员number记录工号、sex记录性别、age记录年龄、add记录家庭住址;函数成员printinfor()输出全部个人信息。

要求:在Worker类的printinfor()成员函数中须调用Person类的成员函数PrintName()。主函数中,构造Worker类对象,并输出该对象的工号、年龄、家庭住址等信息。

 

#include <string>
#include <iostream>
using namespace std;
class Person
{
private:
    char* name;
public:
    Person(char* n1) :name(n1) {}
    void PrintName() { cout << "姓名:" << name; }
};
class Worker :public Person
{
private:
    long int Number; int age; char* sex;char* add;
public:
    Worker(char* n2, long int n3, int n4, char* n5, char* n6) :Person(n2) { Number = n3; age = n4; sex = n5; add = n6; }
    void PrintInfor() {
/*this->*/PrintName();
cout<< endl << "学号:"<<Number<<endl<<"年龄:"<<age<<endl<<"性别:"<<sex<<endl<<"地址号:"<<add<< endl;
} }; int main() { char ch[] = "张三"; Person a(ch);char m[]= "女"; char n[]= "平安街道310号"; Worker b(ch, 142180217,19,m,n); b.PrintInfor(); cout << endl; return 0; }

 字符数组运用:

  char ch [ ] = "张三";

  char m[ ]= "女";

   char n[ ]= "平安街道310号";

  Worker b(ch, 142180217,19,m,n);

#include<iostream>
#include<string>
using namespace std;
class Person {
public:
    //Person() {}
    Person(string n):name(n) {}
    void PrintName();
private:
    string name;
};
void Person::PrintName()
{
    cout << "Name of person:" << name<<endl;
}
class Worker :public Person
{
public:
    Worker(string n1,int num, int a, string ad, string s) :Person(n1),number(num), age(a), add(ad), sex(s) {}
    void Printinfor()
    {
        PrintName();
        cout << "number of student:" <<number<<endl;
        cout << "age of student:" <<age<<endl;
        cout << "add of student:" <<add<<endl;
        cout << "sex of student:" << sex << endl;
    }
private:
    int number, age;
    string add;
    string sex;
};
int main()
{
    Worker c("lili",03,18,"永安街", "女");
    c.Printinfor();
    return 0;
}

注意:

派生类从基类继承数据成员、函数成员:

Worker(string n1,int num, int a, string ad, string s) :Person(n1),number(num), age(a), add(ad), sex(s) {}

派生类的构造函数中包含了需要继承的基类成员name,且命名形参变量(n1)不能与基类构造函数中声明的name的形参(n)一样。

赋值:Person(n1)  基类名(被继承数据成员形参名)

在派生类构造函数的初始化列表里调用基类的构造函数

 

 ②主函数声明对象:

Worker c("lili",03,18,"永安街", "女");

派生类名 对象名(数据成员值,与派生类构造函数声明的数据成员个数、名称相对应)

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值