C++第一個綜合項目

首先本項目主要是對C++裏 面的一些 基礎知識和概念進行練習,主要包括:const型函數,函數的返回值,引用,類的組合,以及內存的分配。

下面直接把各個文件的代碼寫上:

//
//  Date.h
//  train2
//
//  Created by student on 15/8/4.
//  Copyright (c) 2015年 personals. All rights reserved.
//

#ifndef train2_Date_h
#define train2_Date_h
class Date{
public:
    Date();
    Date(int year,int month,int day);
    void print();
private:
    int y,m,d;
};


#endif
//
//  Date.cpp
//  train2
//
//  Created by student on 15/8/4.
//  Copyright (c) 2015年 personals. All rights reserved.
//
#include <iostream>
using namespace std;
#include "Date.h"
Date::Date(){
    y=2015;
    m=1;
    d=1;
}

Date::Date(int year,int month,int day){
    y=year;
    m=month;
    d=day;
}

void Date::print(){
    cout<<"birthday is :"<<y<<"/"<<m<<"/"<<d<<endl;
}
//
//  Person.h
//  train2
//
//  Created by student on 15/8/4.
//  Copyright (c) 2015年 personals. All rights reserved.
//

#ifndef train2_Person_h
#define train2_Person_h
#include "Date.h"
class Person{
public:
    Person();
    Person(char *Name,char *Email,int day,int month,int year);
    char * getName();
    char * getEmail_Address();
    Date& getBirthday();
    void print();

private:
    char *name;
    char *email;
    Date date;
};


#endif
//
//  Person.cpp
//  train2
//
//  Created by student on 15/8/4.
//  Copyright (c) 2015年 personals. All rights reserved.
//

#include "Person.h"
#include <iostream>
#include <stdlib.h>
using namespace std;
#include "string.h"
Person::Person():date(2015,1,1){
    char n1[]="hh";
    char n2[]="[email protected]";
    name =n1 ;
    email =n2;
}

Person::Person(char *Name,char *Email,int day,int month,int year):date(year,month,day){
    name = (char *)malloc(sizeof(char)*20);
    email = (char *)malloc(sizeof(char)*20);
    strcpy(name,Name);
    strcpy(email,Email);
}

char * Person::getName(){
    return name;
}

char * Person::getEmail_Address(){
    return email;
}

void Person::print(){
    cout<<"name="<<name<<",email="<<email<<endl;
    date.print();
}

Date& Person::getBirthday(){
    return this->date;
}
//PersonSet是Person的容器,即Person的集合;

//  PersonSet.h
//  train2
//
//  Created by student on 15/8/4.
//  Copyright (c) 2015年 personals. All rights reserved.
//

#ifndef train2_PersonSet_h
#define train2_PersonSet_h
#include "Person.h"
class PersonSet{
public:
    PersonSet(int capacity=9,int initial_size=0);
    ~PersonSet();
    
public:
    void Add(Person & element);//增加peson成員;
    Person & NextElement(); //迭代下一個對象;
    Person & RemoveElement(); //刪除最後一個Person對象,並返回;
    Person & RemoveElement(int index); //刪除第index個對象,並返回;
    void reset(); //將容器重置大小爲0;
    int size() const; //返回容器裏的Person對象的數量;
    void print() const;

private:
    Person ** _elements;
    int _capacity; //容量
    int _size; //對象個數
    int _index; //索引值
    //static int count;
};

//int PersonSet::count=0;

#endif
//
//  PersonSet.cpp
//  train2
//
//  Created by student on 15/8/4.
//  Copyright (c) 2015年 personals. All rights reserved.
//
#include <iostream>
using namespace std;
#include "PersonSet.h"

PersonSet::PersonSet(int capacity,int initial_size){
    
    _capacity = capacity;
    _size = initial_size;
    _elements = new Person * [_capacity];
    //count++;_size = count;
}


int PersonSet::size() const{
    return _size;
}

//增容原理:1.先定義一個對象的二級指針指向原對象的二級指針
//2.根據需要給原對象重新開闢空間
//3.通過第一步定義的指針給新開闢的對象指針複製
//4.最後刪除定義的指針。
void PersonSet::Add( Person& aPerson )
{
    // Relocate the array space
    if ( _size == _capacity )
    {
        Person** temp = _elements;
        _elements = new Person*[_capacity*2];
        
        for( int i=0; i<_size;  i++ )
        {
              _elements [i] = temp[i];
        }
        _capacity*= 2;
        delete  temp;
    }
    _elements[_size++] = &aPerson;
}

Person& PersonSet:: RemoveElement()
{
    _size--;
    Person* p = new Person;
    p=_elements[_size];
    //shrink the container
    if(_size < _capacity/2)
    {
        cout << "shrinking ! Capacity is "<<_capacity<<endl;
        Person** temp = _elements;
        _elements= new Person*[_capacity/2];
        for ( int i=0;  i<_size;  i++ )
        {
              _elements [i]= temp[i];
        }
        _capacity /= 2;
        delete temp;
    }
    return *p;
}

Person& PersonSet::NextElement() {
    Person* p = new Person;
    if (_elements[_size]!=NULL) {
        p = _elements[_size];
        _size++;
    }
    else
    {
        delete p;
        p=NULL;
    }
    return *p;
    
}

void PersonSet::reset(){
    _size=0;
}

void PersonSet::print() const{
    int i=0;
    for (; i<_size; i++) {
        cout<<"name:"<<_elements[i]->getName()<<endl;
    }
}

Person& PersonSet::RemoveElement(int index){
    Person* p = new Person;
    if (index>_size || index<=0) {
        cout<<"index is out of side!\n";
        p = NULL;
        return *p;
    }
    int x;
    Person *p1 = _elements[--index];
    for(x=index;x<_size-1;x++){
        _elements[x]=_elements[x+1];
    }
    int i = _size-1;
    _elements[i] = p1;
    *p = RemoveElement();
    return *p;
}

PersonSet::~PersonSet(){
    
}
//
//  main.cpp
//  train2
//
//  Created by student on 15/8/4.
//  Copyright (c) 2015年 personals. All rights reserved.
//

#include <iostream>
#include <iostream>
#include <string.h>
#include "Date.h"
#include "Person.h"
#include "PersonSet.h"

using namespace std;

int main(int argc, const char * argv[])
{
    //declare some const persons
    Person *p1 = new Person("Lou", "[email protected]", 20, 6, 1960);
    Person *p2 = new Person("Frank", "[email protected]", 20, 3, 1967);
    Person *p3 = new Person("Ann", "[email protected]", 20, 8, 1960);
    
    PersonSet boys, girls;
    boys.Add(*p1);
    
    //test to see if the same object is retrieved from the set.
    if (p1 != &boys.RemoveElement() )
    {
        cout << "ERROR: the objects are different \n";
    }
    else
    {
        cout << "Good, the objects are the same \n";
    }
    
    boys.Add( *p1);
    boys.Add( *p2);
    girls.Add( *p3);
    boys.Add(*(new Person("John", "[email protected]", 20, 3, 1967)));
    girls.Add(*(new Person("Sue", "[email protected]", 20, 3, 1967)));
    boys.Add(*(new Person("Frank", "[email protected]", 25, 4, 1958)));
    girls.Add(*(new Person("Mary", "[email protected]", 25, 4, 1955)));
    boys.Add(*(new Person("John", "johnchat.ca", 12, 12, 1970)));
    
    //print all the boys using the removeSomeElement() method and delete //them
    int numberOfBoys = boys.size();
    cout << "number of boys = " << numberOfBoys << "\n";
    
    for(int i = 0; i<numberOfBoys; i++)
    { 
        Person & boy = boys.RemoveElement();
        if (&boy == NULL) {
            break;
        }
        boy.print();
        delete &boy; 
    }
    cout << "number of girls = " << girls.size() << "\n";
    girls.print();
    
    //print of the girls birthdays and using the someElement() method*/
    int numberOfGirls =girls.size();
    girls.reset();
    for(int i = 0; i<numberOfGirls; i++)
        girls.NextElement().getBirthday().print();
    
    //delete all the girls from the heap
    
    Person& hh=girls.RemoveElement(3);
    hh.print();
    delete &hh;
    numberOfGirls = girls.size();
    for(int i = 0; i<numberOfGirls; i++)
    {
        Person & her = girls.RemoveElement();
        her.print();
        delete &her;  
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章