Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 6 của 6
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Lập trình hướng đối tượng

    Đề: Nhập tọa độ tâm và quỷ đạo đường tròn. Xuất ra tọa độ tâm, quỷ đạo, chu vi , diện tích của đường tròn
    Code của mình máy báo cần phải tạo lại class Point. Xin cho mình biết sai chổ nào. Xin cảm ơn!!!
    //Point.h
    #include <iostream>
    using namespace std;

    class Point
    {
    private:
    double x;
    double y;
    public:
    Point(double xx=0, double yy=0):x(xx),y(yy){};
    friend istream & operator >>(istream &, Point &);
    friend ostream & operator <<(ostream &, Point &);
    double distance(Point);
    };
    //Point.cpp
    #include "Point.h"

    istream & operator >>(istream &in, Point &P)
    {
    cout<<"x: ";
    in>>P.x;
    cout<<"y: ";
    in>>P.y;
    return in;
    }
    ostream & operator <<(ostream &out, Point &P)
    {
    out<<"("<<P.x<<","<<P.y<<")"<<endl;
    return out;
    }
    double Point::distance(Point P)
    {
    return sqrt((P.x-x)*(P.x-x)+(P.y-y)*(P.y-y));
    }
    //Circle.h

    #include "Point.h"

    class Circle
    {
    private:
    Point M;//quy dao cua diem M quay quanh tam I
    Point I;//tam
    public:
    Circle():M(0,0),I(0,0){};
    friend istream & operator >>(istream &, Circle &);
    friend ostream & operator <<(ostream &, Circle &);
    double perimeter();
    double area();
    };
    //Circle.cpp
    #include "Circle.h"

    istream & operator >>(istream &in, Circle &C)
    {
    cout<<"Nhap toa do tam I: "<<endl;
    in>>C.I;
    cout<<"Nhap toa do M: "<<endl;
    in>>C.M;
    return in;
    }
    ostream & operator <<(ostream &out, Circle &C)
    {
    cout<<"Toa do tam I = ";
    out<<C.I;
    cout<<"Toan do diem M = ";
    out<<C.M;
    return out;
    }
    double Circle:erimeter()
    {
    double R;
    R=I.distance(M);
    return 2*R*3.14159;
    }
    double Circle::area()
    {
    double R;
    R=I.distance(M);
    return R*R*3.14159;
    }
    //MainProg.cpp
    #include "Circle.h"
    #include "Point.h"
    #include <conio.h>

    void main()
    {
    Circle C;
    double result;
    cout<<"Nhap toa do tam va quy dao M cua duong tron"<<endl;
    cin>>C;
    cout<<C;
    result=C.perimeter();
    cout<<"Perimeter = "<<result<<endl;
    result=C.area();
    cout<<"Area = "<<result<<endl;
    getch();
    }

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    theo mình thì bạn nên khai báo thêm hàm toán tử "=" nữa[IMG]images/smilies/biggrin.png[/IMG]

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    copy cả cái lỗi đó được ko? Ta chạy chỉ thấy nó báo sqrt chưa được khai báo, chỉ cần thêm #include <cmath> ở Point.h là được.


    ---góp ý thêm là những hàm nào ko làm thay đổi Point/Circle thì nên thêm const vào phía sau hàm đó. Vd:
    double distance(Point);
    thì nên viết là
    double distance(Point)const;


    ---khi truyền tham số thì trừ phi tham số là primitive types (char, int, short, float, double, v.v...) thì nên truyền theo tham chiếu (&). Những tham số nào ko bị thay đổi thì nên thêm const.
    vd:
    double distance(Point)const;
    viết lại là
    double distance(const Point&)const;

    ostream & operator <<(ostream &out, Circle &C);
    viết lại là
    ostream & operator <<(ostream &out, const Circle &C);


    ---trong toán tử << của Circle thì sửa cout thành out.


    ---do toán tử << của ostream trả về ostream nên cout << x trả về cout, cout << x << y << z cũng trả về cout, nên có thể viết tắt ở những chỗ:
    out<<"("<<P.x<<","<<P.y<<")"<<endl;
    return out;
    viết gọn là
    return out<<"("<<P.x<<","<<P.y<<")"<<endl;

    cout<<"Toa do tam I = ";
    out<<C.I;
    cout<<"Toan do diem M = ";
    out<<C.M;
    return out;
    viết gọn là
    return out<<"Toa do tam I = "<<C.I<<"; Toan do diem M = "<<C.M;


    ---nếu các phần tử trong 1 class đã có default ctor hết rồi thì khỏi cần viết default ctor cho nó cũng được.
    Hoặc nếu có viết thì M(0,0),I(0,0) có thể viết là M(), I()

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Cảm ơn INTP !!
    Có một điều nửa, là bài tập này nếu gộp lại viết trên cùng một file.h thì chương trình chạy được, còn khi tách ra 2 file.h( Point.h và Cricle.h) thì lại ko chạy được nguyên nhân là sao z? Xin INTP chỉ với. Xin cảm ơn

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    sao lại ko chạy được @_@ Copy cái dòng lỗi paste lên đây để xem mới biết...





    à có lẽ do lỗi định nghĩa lại lớp Point/Circle. Phải thêm include guards vào Point.h và Circle.h

    #ifndef POINT_H
    #define POINT_H

    //... nội dung của Point.h

    #endif


    #ifndef CIRCLE_H
    #define CIRCLE_H

    //... nội dung của Circle.h

    #endif


    #ifndef <X> tức là nếu chưa định nghĩa (if not define) X thì sẽ chạy tất cả những gì bên dưới. #define <X> - định nghĩa X để lần sau #include "Point.h" thì #ifndef <X> sẽ trả về false, ko chạy những gì bên dưới #ifndef <X> nữa => chỉ include file Point.h 1 lần (Nếu có #if thì phải có #endif). Chọn tên X sao cho khó/không bị trùng. Thông thường lấy tên file viết in hoa...

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Cảm ơn INTP nhiều!!!
    Thì ra là lỗi định nghĩa lại lớp.
    Một lần nữa xin cảm ơn INTP. Chức bạn sức khỏe

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •