Thứ Hai, 2 tháng 2, 2015

[OOP C++] tính tổng các phân số - lập trình hướng đối tượng

[OOP C++] tính tổng các phân số - lập trình hướng đối tượng

phanso.h

#pragma once
#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
class phanso
{
private:
int tu,mau;
public:
phanso(void);
~phanso(void);
void settu(int);
void setmau(int);
int gettu();
int getmau();
int rutgon();
void nhapps();
void xuatps();
};


phanso.cpp

#include "phanso.h"


phanso::phanso(void)
{
}


phanso::~phanso(void)
{
}
void phanso::nhapps()
{
char s[100];
int i,j,k,kt,dem;
do{
kt=0;dem=0;k=0;
cout<<"\nnhap phan so dang a/b: ";
fflush(stdin);
gets(s);
for(i=0;i<strlen(s);i++)
if((s[i]>='0' && s[i]<='9') || s[i]=='/')
{
dem++;
if(s[i]=='/') k++;
}
if(dem!=strlen(s) || k!=1)
{
cout<<"\nloi dinh dang! nhap lai!!";
kt=1;
}
}while(kt);
char a[100];
i=0;k=0;
while(s[i]!='/')
a[k++]=s[i++];
a[k]='\0';
tu=atoi(a);
i++;k=0;
while(i<strlen(s)) a[k++]=s[i++];
a[k]='\0';
mau=atoi(a);
}
void phanso::xuatps()
{
cout<<tu<<"/"<<mau;
}
void phanso::settu(int x)
{
tu=x;
}
void phanso::setmau(int x)
{
mau=x;
}
int phanso::gettu()
{
return tu;
}
int phanso::getmau()
{
return mau;
}
int phanso::rutgon()
{
int a=abs(tu),b=abs(mau);
while(a!=b)
if(a>b) a-=b;
else b-=a;
if(a==1) return 0;
tu/=a;
mau/=a;
return 1;
}

mangps.h

#pragma once
#include"phanso.h"
class mangps
{
private:
phanso a[100];
int n;
public:
mangps(void);
~mangps(void);
void nhapmangps();
void xuatmangps();
void tong();
};



mangps.cpp


#include "mangps.h"


mangps::mangps(void)
{
}


mangps::~mangps(void)
{
}
void mangps::nhapmangps()
{
int kt,i=0,dem=0,k;
cout<<"\n *nhap phan so thu "<<i+1<<":";
a[i].nhapps();
i++;
nhap:;
cout<<"\n *nhap phan so thu "<<i+1<<":";
a[i].nhapps();
loop:;
cout<<"\n-----menu-----------";
cout<<"\n| 1. nhap tiep.    |";
cout<<"\n| 0. xong.         |";
cout<<"\n--------------------";
cout<<"\nlua chon cua ban: ";
cin>>k;
if(k!=0 && k!=1)
{
cout<<"\nkhong hop le!!!";
goto loop;
}
if(k==1)
{
i++;
goto nhap;
}
n=i+1;
}
void mangps::xuatmangps()
{
for(int i=0;i<n;i++)
{
if(i>=1) cout<<" + ";
a[i].xuatps();
}
}
void mangps::tong()
{
int i;
phanso x;
x.settu(a[0].gettu());
x.setmau(a[0].getmau());
for(i=1;i<n;i++)
{
x.settu(x.gettu()*a[i].getmau()+ x.getmau()*a[i].gettu());
x.setmau(x.getmau()*a[i].getmau());
}
xuatmangps();cout<<" = ";x.xuatps();
if(i=x.rutgon()) 
{
cout<<" = ";x.xuatps();
}
}

source.cpp

#include"mangps.h"
void main()
{
mangps x;
x.nhapmangps();
cout<<"\ntong cac phan so: \n";
x.tong();
system("pause");
}

[OOP C++] Tính Tổng, Hiệu, Tích, Thương của 2 phân số theo kiểu lập trình hướng đối tượng

[OOP C++] Tính Tổng, Hiệu, Tích, Thương của 2 phân số theo kiểu lập trình hướng đối tượng. có menu lựa chọn, nhập phân số kiểu string thuận tiện.



PHANSO.H
#pragma once
#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;
class phanso
{
private:
int tu,mau;
public:
phanso(void);
~phanso(void);
int gettu(); //trả về giá trị của tử số.
int getmau(); //trả về giá trị của mẫu số.
void settu(int); //cà đặt giá trị cho tử và mẫu
void setmau(int);
void nhapphanso();
void xuatphanso();
int rutgon();
// các phương thức tính tổng, hiệu, tích, thương của phân số ta đang viết class với phân số khác
//cũng là phân số thuộc đối tượng phanso nhưng nó nằm ngoài phạm vi hoạt động của class ta đang xây dựng nên phải có các phương thức get,set như trên để giao tiếp với nó
void tinhtong(phanso);
void tinhtich(phanso);
void tinhhieu(phanso);
void tinhthuong(phanso);
};




PHANSO.CPP
#include "phanso.h"
phanso::phanso(void) //khởi tạo đối tượng mặ định.
{
//nếu biến trong private là kiểu con trỏ thì cấp phát vùng nhớ khởi tạo cho nó ở đây.
}
phanso::~phanso(void)//kết thúc nội đối tượng
{
//nếu biến trong private là cấp phát động thì delete nó ở đây.
}
void phanso::nhapphanso()
{
char s[100],a[100];
int i,j,k;
do{
k=0;
cout<<"\nnhap vao phan so dang a/b: ";
fflush(stdin); gets(s);
//phân số nhập vào đảm bảo phải chứa 1 dấu '/' và số, nếu sai thì nhập không đúng định dạng yêu cầu nhập lại.
int dem=0,d=0;
for(i=0;i<strlen(s);i++)
{
if((s[i]>='0' && s[i]<='9')|| s[i]=='/') dem++;
if(s[i]=='/') d++; //đếm số dấu '/', nếu có 2 dấu trở lên thì nhập sai.
}
if(dem!=strlen(s) || d!=1) // có nghĩa là đã xuất hiện ký tự không đúng yêu cầu, có thể là chữ, kí hiệu đặc biệt,...
{
cout<<"\nban da nhap khong dung dinh dang! nhap lai!";
k=1; // để lặp lại việc nhập phân số.
}
}while(k);

//lấy tử số là các chữ số nằm trước dấu '/'.
i=0;
while(s[i]!='/')
{
a[i]=s[i];
i++;
}
a[i]='\0';
tu=atoi(a);
k=0;
for(j=i+1;j<strlen(s);j++) a[k++]=s[j];
a[k]='\0';
mau=atoi(a);
}
void phanso::xuatphanso()
{
cout<<tu<<"/"<<mau;
}
int phanso::gettu()
{
return tu;
}
int phanso::getmau()
{
return mau;
}
void phanso::settu(int x)
{
tu=x;
}
 void phanso::setmau(int x)
{
mau=x;
}
int phanso::rutgon()//rút gọn phan số
{
//tìm UCLN rồi lấy tử và mẫu chia cho UCLN để rút gọn phân số.
int a=abs(tu),b=abs(mau);
while(a!=b)
if(a>b)a-=b;
else b-=a;

tu/=a;
mau/=a;
if(a!=1) return 1; //có rút gọn
return 0;//không xảy ra rút gọn
}
void phanso::tinhtong(phanso x)
{
phanso kq;
kq.settu(tu*x.getmau()+mau*x.gettu());// gán giá trị cho tử của phấn số kết quả thông qua phương thức settu đã tạo ở trên. tương tự cho mẫu.
kq.setmau(mau*x.getmau());
//in ket qua
cout<<"\n";xuatphanso();cout<<" + ";x.xuatphanso();cout<<" = ";kq.xuatphanso();
//nếu có rút gọn thì in kết quả đã rút gọn ra
if(kq.rutgon()) 
{
cout<<" = ";kq.xuatphanso();
}
cout<<"\n";
}
void phanso::tinhhieu(phanso x)
{
phanso kq;
kq.settu(tu*x.getmau()-mau*x.gettu());
kq.setmau(mau*x.getmau());
//in ket qua
cout<<"\n";xuatphanso();cout<<" - ";x.xuatphanso();cout<<" = ";kq.xuatphanso();
//nếu có rút gọn thì in kết quả đã rút gọn ra
if(kq.rutgon()) 
{
cout<<" = ";kq.xuatphanso();
}
cout<<"\n";
}
void phanso::tinhtich(phanso x)
{
phanso kq;
kq.settu(tu*x.gettu());
kq.setmau(mau*x.getmau());
//in ket qua
cout<<"\n";xuatphanso();cout<<" x ";x.xuatphanso();cout<<" = ";kq.xuatphanso();
//nếu có rút gọn thì in kết quả đã rút gọn ra
if(kq.rutgon()) 
{
cout<<" = ";kq.xuatphanso();
}
cout<<"\n";
}
void phanso::tinhthuong(phanso x)
{
phanso kq;
kq.settu(tu*x.getmau());
kq.setmau(mau*x.gettu());
//in ket qua
cout<<"\n";xuatphanso();cout<<" : ";x.xuatphanso();cout<<" = ";kq.xuatphanso();
//nếu có rút gọn thì in kết quả đã rút gọn ra
if(kq.rutgon()) 
{
cout<<" = ";kq.xuatphanso();
}
cout<<"\n";

}



SOURCE.CPP
#include"phanso.h"
void main()
{
phanso x,y;
cout<<"\n\t*nhap phan so x*\n";
x.nhapphanso();
cout<<"\n\t*nhap phan so y*\n";
y.nhapphanso();
int k,kt;
do{
do{
kt=0;
cout<<"\n------------------MENU------------------";
cout<<"\n1. tinh TONG 2 phan so x,y.";
cout<<"\n2. tinh HIEU 2 phan so x,y.";
cout<<"\n3. tinh TICH 2 phan so x,y.";
cout<<"\n4. tinh THUONG 2 phan so x,y.";
cout<<"\n0.ket thuc chuong trinh.";
cout<<"\n-----------------------------------------";
cout<<"\n->lua chon cua ban: ";
cin>>k;
//kiểm tra lựa chọn có hợp lý không.
if(k!=0 && k!=1 && k!=2 && k!=3 && k!=4)
{
cout<<"\nlua chon khong hop le! chon lai!!!\n";
kt=1;//để lặp lại việc nhập.
}
}while(kt);
//lựa chọn hợp lý thì tiến hành lựa chọn đó.
if(k==1)
{
cout<<"\n\t*TONG*\n";
x.tinhtong(y);//gọi các phương thúc cần dùng ra.
}
if(k==2)
{
cout<<"\n\t*HIEU*\n";
x.tinhhieu(y);
}
if(k==3)
{
cout<<"\n\t*TICH*\n";
x.tinhtich(y);
}
if(k==4)
{
cout<<"\n\t*THUONG*\n";
x.tinhthuong(y);
}
}while(k!=0);//dừng chương trình khi k=0. lựa chọn kết thúc trong menu ở trên
system("pause");

}

Thứ Bảy, 31 tháng 1, 2015

[oop c++] bài tập về doanh thu bán hàng, thuế, số lượng, giá tiền

[oop c++] bài tập về doanh thu bán hàng, thuế, số lượng, giá tiền
viết chương trình theo phong cách hướng đối tượng c++ thiết kế chuong trình nhập vào số lượng hồ sơ bán ra với giá à có thuế hay khong thì tùy nhập vào. xuất ra thông tin đã nhập và tính tổng doanh thu bán hàng. với thuế có 2 loại là 7% hoặc 8%. đồng thời thiết kế chương trình theo phương pháp enu lựa chọn.
bài này mình chia ra làm nhiều fle nhỏ để dễ quản lý và viết code hơn.


HOSO.H
#pragma once
#include<iostream>
using namespace std;
class hoso
{
private:
int soluong;
float giatien;
int thue;
int loaithue;
public:
hoso(void);
~hoso(void);
void nhaphoso();
void xuathoso();
float sotien();
};


HOSO.CPP
#include "hoso.h"


hoso::hoso(void)
{
}


hoso::~hoso(void)
{
}

void hoso::nhaphoso()
{
int kt;
do{
kt=0;
cout<<"\nso luong : ";cin>>soluong;
if(soluong<0)
{
cout<<"\nnhap so luong khong hop le! nhap lai!\n";
kt=1;
}
}while(kt);
do{
kt=0;
cout<<"\ngia tien : ";cin>>giatien;
if(giatien<0)
{
cout<<"\nnhap gia tien khong hop le! nhap lai!\n";
kt=1;
}
}while(kt);
do{
kt=0;
cout<<"\nco thue hay khong? (1:co, 0:khong) :";
cin>>thue;
if(thue !=1 && thue!=0)
{
cout<<"\nlua chon khong dung! chon lai!\n";
kt=1;
}
}while(kt);
if(thue==1)
{
do{
kt=0;
cout<<"\nnhap loai thue (1:7%, 0:8%) :";
cin>>loaithue;
if(loaithue !=0 && loaithue!=1)
{
cout<<"\nlua cho khong hop le! nhap lai!\n";
kt=1;
}
}while(kt);
}
}
float hoso::sotien()
{
float tien=soluong*giatien;
if(thue==1)
if(loaithue==1) tien+=tien*7/100;
else tien+=tien*8/100;
return tien;
}
void hoso::xuathoso()
{
cout<<"\nso luong: "<<soluong<<"\ngia tien: "<<giatien;
if(thue==1)
if(loaithue==1) cout<<"\nco thue 7%";
else cout<<"\nco thue 8%";
else cout<<"\nkhong co thue";
cout<<"\ntong tien = "<<sotien();
}


DANHSACH.H
#pragma once
#include"hoso.h"
#include<vector>;
class danhsach
{
private:
vector<hoso> l;
public:
danhsach(void);
~danhsach(void);
void nhapdanhsach();
void xuatdanhsach();
float doanhthu();
};


DANHSACH.CPP
#include "danhsach.h"


danhsach::danhsach(void)
{
}


danhsach::~danhsach(void)
{
}
void danhsach::nhapdanhsach()
{
int kt,m,k;
do{
do{
kt=0;
cout<<"\n--------------menu---------------------";
cout<<"\n1.nhap ho so.";
cout<<"\n0.ket thuc.";
cout<<"\n---------------------------------------\n nhap lua chon cua ban: ";
cin>>m;
if(m!=1 && m!=0)
{
cout<<"\nlua chon cua ban khong hop le! chon lai!\n";
kt=1;
}
}while(kt);
if(m==1)
{
hoso x;
x.nhaphoso();
l.push_back(x);
}
}while(m);
}
float danhsach::doanhthu()
{
float tong=0;
for(int i=0;i<l.size();i++) tong+=l[i].sotien();
return tong;
}
void danhsach::xuatdanhsach()
{
for(int i=0;i<l.size();i++)
{
cout<<"\n\n\tho so thu "<<i+1;
l[i].xuathoso();
}
cout<<"\n\n\tTONG DOANH THU: "<<doanhthu();
}


SOURCE.CPP
#include"danhsach.h"
void main()
{
danhsach t;
t.nhapdanhsach();//nhập vào sô lượng hồ sơ , giá tiền , có thuế hay không, có thì 7% hoặc 8%
t.xuatdanhsach();//xuat ra nhưng thứ đã nhập và tính tiền tường loại hồ sơ bán ra và tổng doanh thu
system("pause");//dừng chương trình để xem kết quả
}


[oop c++] tính chu vi, diện tích, tọa đô trọng tâm, trực tâm của tam giác nhập vào tọa độ 3 đỉnh

[oop c++] tính chu vi, diện tích, tọa đô trọng tâm, trực tâm của tam giác nhập vào tọa độ 3 đỉnh

#include<iostream>
using namespace std;
class diem
{
private:
float x,y;
public:
diem(void);
~diem(void);
float getx();
float gety();
void nhapdiem();
void xuatdiem();
float tinhkhoangcach(diem);
};
diem::diem(void)
{
}
diem::~diem(void)
{
}
float diem::getx()
{
return x;
}
float diem::gety()
{
return y;
}
void diem::nhapdiem()
{
cout<<"hoanh do: ";cin>>x;
cout<<"tung do: ";cin>>y;
}
void diem::xuatdiem()
{
cout<<"("<<x<<" , "<<y<<")";
}
float diem::tinhkhoangcach(diem b)
{
return sqrt(pow((x-b.x),2)+pow((y-b.y),2));
}
class tamgiac
{
private:
diem a,b,c;
public:
tamgiac(void);
~tamgiac(void);
void nhaptamgiac();
void xuattamgiac();
float tinhchuvi();
float tinhdientich();
void diemtrongtam();
void diemtructam();
};
tamgiac::tamgiac(void)
{
}
tamgiac::~tamgiac(void)
{
}
void tamgiac::nhaptamgiac()
{
int kt;
do
{
kt=0;
float ab,ac,bc;
cout<<"\tnhap diem A:\n";
a.nhapdiem();
cout<<"\tnhap diem B:\n";
b.nhapdiem();
cout<<"\tnhap diem c:\n";
c.nhapdiem();
ab=a.tinhkhoangcach(b);
ac=a.tinhkhoangcach(c);
bc=b.tinhkhoangcach(c);
if(ab+ac<=bc || ab+bc<=ac || ac+bc<=ab)
{
cout<<"\n3 diem khong tao thanh am giac! nhap lai!\n\n";
kt=1;
}
}while(kt);
}
void tamgiac::xuattamgiac()
{
cout<<"\nA:";a.xuatdiem();
cout<<"\nB:";b.xuatdiem();
cout<<"\nC:";c.xuatdiem();
}
float tamgiac::tinhchuvi()
{
float ab,ac,bc;
ab=a.tinhkhoangcach(b);
ac=a.tinhkhoangcach(c);
bc=b.tinhkhoangcach(c);
return ab+ac+bc;
}
float tamgiac::tinhdientich()
{
float p=tinhchuvi()/2,ab,bc,ac;
ab=a.tinhkhoangcach(b);
ac=a.tinhkhoangcach(c);
bc=b.tinhkhoangcach(c);
return sqrt(p*(p-ab)*(p-ac)*(p-bc));
}
void tamgiac::diemtrongtam()
{
float x,y;
x=(a.getx()+b.getx()+c.getx())/3;
y=(a.gety()+b.gety()+c.gety())/3;
cout<<"("<<x<<" , "<<y<<")";
}
void tamgiac::diemtructam()
{
float dx,dy,d;
d=4*(b.getx()-b.getx())*(c.gety()-a.gety())-4*(c.getx()-a.getx())*(b.gety()-a.gety());
dx=(pow(b.getx(),2)+pow(b.gety(),2)-pow(a.getx(),2)-pow(a.gety(),2))*2*(c.gety()-a.gety())
-(pow(c.getx(),2)+pow(c.gety(),2)-pow(a.getx(),2)-pow(a.gety(),2))*2*(b.gety()-a.gety());
dy=(pow(c.getx(),2)+pow(c.gety(),2)-pow(a.getx(),2)-pow(a.gety(),2))*2*(b.getx()-a.getx())
-(pow(b.getx(),2)+pow(b.gety(),2)-pow(a.getx(),2)-pow(a.gety(),2))*2*(c.getx()-a.getx());
cout<<"("<<dx/d<<" , "<<dy/d<<")";
}
void main()
{
tamgiac t;
t.nhaptamgiac();
t.xuattamgiac();
cout<<"\nchu vi = "<<t.tinhchuvi();
cout<<"\ndien tich = "<<t.tinhdientich();
cout<<"\ndiem trong tam = ";t.diemtrongtam();
cout<<"\ndiem truc tam = ";t.diemtructam();
}

Thứ Sáu, 30 tháng 1, 2015

PHẠM VI LỚP VÀ TRUY CẬP CÁC THÀNH VIÊN LỚP C++


  • Các thành viên dữ liệu của một lớp (các biến khai báo trong định nghĩa lớp) và các hàm thành viên (các hàm khai báo trong định nghĩa lớp) thuộc vào phạm vi của lớp. 
  • Trong một phạm vi lớp, các thành viên của lớp được truy cập ngay lập tức bởi tất cả các hàm thành viên của lớp đó và có thể được tham chiếu một cách dễ dàng bởi tên. 
  • Bên ngoài một phạm vi lớp, các thành viên của lớp được tham chiếu thông qua hoặc một tên đối tượng, một tham chiếu đến một đối tượng, hoặc một con trỏ tới đối tượng.
  •  Các hàm thành viên của lớp có thể được đa năng hóa (overload), nhưng chỉ bởi các hàm thành viên khác của lớp.
  •  Để đa năng hóa một hàm thành viên, đơn giản cung cấp trong định nghĩa lớp một prototype cho mỗi phiên bản của hàm đa năng hóa, và cung cấp một định nghĩa hàm riêng biệt cho mỗi phiên bản của hàm.
  •  Các hàm thành viên có phạm vi hàm trong một lớp – các biến định nghĩa trong một hàm thành viên chỉ được biết tới hàm đó. 
  • Nếu một hàm thành viên định nghĩa một biến cùng tên với tên một biến trong phạm vi lớp, biến phạm vi lớp được dấu bởi biến phạm vi hàm bên trong phạm vi hàm. 
  • Như thế một biến bị dấu có thể được truy cập thông qua toán tử định phạm vi.
  •  Các toán tử được sử dụng để truy cập các thành viên của lớp được đồng nhất với các toán tử sử dụng để truy cập các thành viên của cấu trúc. 
  • Toán tử lựa chọn thành viên dấu chấm (.) được kết hợp với một tên của đối tượng hay với một tham chiếu tới một đối tượng để truy cập các thành viên của đối tượng. 
  • Toán tử lựa chọn thành viên mũi tên (->)được kết hợp với một con trỏ trỏ tới một truy cập để truy cập các thành viên của đối tượng. 
  • Ví dụ 3.4: Chương trình sau minh họa việc truy cập các thành viên của một lớp với các toán tử lựa chọn thành viên

1: #include <iostream.h> 
2:  
3: class Count 
4: {
5:     public:
6:     int X;
7:     void Print()
8:     {
9:         cout << X << endl; 
10:     } 
11: }; 
12: 
13: int main() 
14: { 
15:     Count Counter, //Tạo đối tượng Counter 
16:     *CounterPtr = &Counter, //Con trỏ trỏ tới Counter 
17:     &CounterRef = Counter; //Tham chiếu tới Counter 
18: 
19:     cout << "Assign7 to X and Print using the object's name: "; 
20:     Counter.X = 7; //Gán 7 cho thành viên dữ liệu X 
21:     Counter.Print(); //Gọi hàm thành viên Print 
22: 
23:     cout << "Assign 8 to X and Print using a reference: "; 
24:     CounterRef.X = 8; //Gán 8 cho thành viên dữ liệu X 
25:     CounterRef.Print(); //Gọi hàm thành viên Print 
26: 
27:     cout << "Assign 10 to X and Print using a pointer: "; 
28:     CounterPtr->X = 10; // Gán 10 cho thành viên dữ liệu X 
29:     CounterPtr->Print(); //Gọi hàm thành viên Print 
30:     return 0; 
31: }

Lớp CLASS trong C++ || Lập trình OOP

Các lớp cho phép lập trình viên mô hình các đối tượng mà có các thuộc tính (biểu diễn như các thành viên dữ liệu – Data members) và các hành vi hoặc các thao tác (biểu diễn như các hàm thành viên – Member functions). Các kiểu chứa các thành viên dữ liệu và các hàm thành viên được định nghĩa thông thường trong C++ sử dụng từ khóa class, có cú pháp như sau:  class <class-name> { <member-list> //Thân của lớp }; Trong đó: class-name: tên lớp. member-list: đặc tả các thành viên dữ liệu và các hàm thành viên. Các hàm thành viên đôi khi được gọi là các phương thức (methods) trong các ngôn ngữ lập trình hướng đối tượng khác, và được đưa ra trong việc đáp ứng các message gởi tới một đối tượng. Một message tương ứng với việc gọi hàm thành viên. Khi một lớp được định nghĩa, tên lớp có thể được sử dụng để khai báo đối tượng của lớp theo cú pháp sau: <class-name> <object-name>; Chẳng hạn, cấu trúc Time sẽ được định nghĩa dưới dạng lớp như sau: class Time { public: Time(); void SetTime(int, int, int) void PrintMilitary(); void PrintStandard() private: int Hour; // 0 - 23 int Minute; // 0 - 59 int Second; // 0 - 59  };  Trong định nghĩa lớp Time chứa ba thành viên dữ liệu là Hour, Minute và Second, và cũng trong lớp này, chúng ta thấy các nhãn public và private được gọi là các thuộc tính xác định truy cập thành viên (member access specifiers) gọi tắt là thuộc tính truy cập.  Bất kỳ thành viên dữ liệu hay hàm thành viên khai báo sau public có thể được truy cập bất kỳ nơi nào mà chương trình truy cập đến một đối tượng của lớp. Bất kỳ thành viên dữ liệu hay hàm thành viên khai báo sau private chỉ có thể được truy cập bởi các hàm thành viên của lớp. Các thuộc tính truy cập luôn luôn kết thúc với dấu hai chấm (:) và có thể xuất hiện nhiều lần và theo thứ tự bất kỳ trong định nghĩa lớp. Mặc định thuộc tính truy cập là private. Định nghĩa lớp chứa các prototype của bốn hàm thành viên sau thuộc tính truy cập public là Time(), SetTime(), PrintMilitary() và PrintStandard(). Đó là các hàm thành viên public (public member function) hoặc giao diện (interface) của lớp. Các hàm này sẽ được sử dụng bởi các client (nghĩa là các phần của một chương trình mà là các người dùng) của lớp xử lý dữ liệu của lớp. Có thể nhận thấy trong định nghĩa lớp Time, hàm thành viên Time() có cùng tên với tên lớp Time, nó được gọi là hàm xây dựng (constructor function) của lớp Time. Một constructor là một hàm thành viên đặc biệt mà khởi động các thành viên dữ liệu của một đối tượng của lớp. Một constructor của lớp được gọi tự động khi đối tượng của lớp đó được tạo.  Thông thường, các thành viên dữ liệu được liệt kê trong phần private của một lớp, còn các hàm thành viên được liệt kê trong phần public. Nhưng có thể có các hàm thành viên private và thành viên dữ liệu public. Khi lớp được định nghĩa, nó có thể sử dụng như một kiểu trong phần khai báo như sau: Time Sunset, // Đối tượng của lớp Time ArrayTimes[5], // Mảng các đối tượng của lớp Time *PTime, // Con trỏ trỏ đến một đối tượng của lớp Time &DinnerTime = Sunset; // Tham chiếu đến một đối tượng của lớp Time
#include<iostream>
using namespace std;
class time
{
public:
time();
void settime(int ,int ,int);
void inkieu1();
void inkieu2();
private:
int hour;
int minute;
int second;
};
time::time()
{
hour=minute=second=0;
}
void time::settime(int h,int m,int s)
{
hour=(h>=0 && h<24)?h:0;
minute=(m>=0 && m<59)? m:0;
second=(s>=0 && s<59)?s:0;
}
void time::inkieu1()
{
cout<<(hour<10?"0":"")<<hour<<":"<<(minute<10?"0":"")<<minute<<":"<<(second<10?"0":"")<<second;
}
void time::inkieu2()
{
cout<<((hour==0 || hour==12)?12:hour%12)<<":"<<(minute<10?"0":"")<<minute<<":"<<(second<10?"0":"")<<second<<(hour<12?" AM":" PM");
}
void main()
{
time t;
int h,m,s;
cout<<"nhap hour,minute,second:\n";
cin>>h>>m>>s;
cout<<"gio mac dinh: \n";
cout<<"kieu 1: ";t.inkieu1();
cout<<"\nkieu 2: ";t.inkieu2();
cout<<"\n\ngio da thiet lap:\n";
t.settime(h,m,s);
cout<<"kieu 1: ";t.inkieu1();
cout<<"\nkieu 2: ";t.inkieu2();
cout<<"\n\nnhap vao gio sai:\n";cin>>h>>m>>s;
t.settime(h,m,s);
cout<<"kieu 1: ";t.inkieu1();
cout<<"\nkieu 2: ";t.inkieu2();
}

[Olympic Tin Học] Đề Thi Sinh Viên Cao Đẳng 2014

Bài 1. Tính tổng (30 điểm)

Viết chương trình đọc vào hai số thực dương a và b và tính tổng tất cả các số nguyên 

không nhỏ hơn a và không lớn hơn b.

Dữ liệu: Vào từ file văn bản SUM.INP gồm một dòng chứa hai số thực dương a, b.

Kết quả: Đưa ra file văn bản SUM.OUT gồm một dòng chứa một số nguyên là tổng tất cả

các số nguyên không nhỏ hơn a và không lớn hơn b.

Ví dụ:

SUM.INP SUM.OUT

0.3 2.89

SUM.OUT
 3

Chú ý:

- Có 50% số test có 0 < a ≤ b ≤ 1000;

- Có 50% số test còn lại có 0 < a ≤ b ≤ 109


#include<stdio.h>
#include<stdlib.h>
void main()
{
float a,b;
long i,t=0;
FILE *in,*out;
in=fopen("SUM.INP ","r");
out=fopen("SUM.OUT ","w");
if(in==NULL || out==NULL)
{
printf("error");exit(0);
}
fscanf(in,"%f%f",&a,&b);
fprintf(in,"%f %f",a,b);
for(i=long(a);i<=long(b);i++)
if(i>=a && i<=b) t+=i;
fprintf(out,"%ld",t);
fcloseall();
}

Bài 2. Dãy số (30 điểm)

Cho dãy số gồm n số nguyên a1, a2, . . . , an. Một đoạn con của dãy đã cho là dãy ai

(1 ≤ i ≤ j ≤ n), dãy có độ dài (j − i + 1) và có trọng số bằng tổng (ai+. . . +aj). 

Yêu cầu: Tìm đoạn con có độ dài là một số chia hết cho 3 và có trọng số lớn nhất.

Dữ liệu: Vào từ file văn bản SEQ.INP có định dạng như sau:

 Dòng đầu ghi số nguyên n (n ≥ 3);

 Dòng thứ hai ghi n số nguyên a1, a2, . . . , an (|ai

Kết quả: Ghi ra file văn bản SEQ.OUT giá trị trọng số của đoạn con tìm được.

OLP’14 - Đề thi khối Cá nhân Cao đẳng Trang 1/2

Ví dụ:

SEQ.INP
11

SEQ.OUT
1 1 1 -9 1 1 1 1 -1 1 -9

Chú ý:

- Có 30% số test có n ≤ 300;

- Có 30% số test khác có n ≤ 3000;

- Có 40% số test còn lại có n ≤ 300000.


#include<stdio.h>
#include<stdlib.h>
void main()
{
FILE *in,*out;
in=fopen("SEQ.INP","r");
out=fopen("SEQ.OUT","w");
if(in==NULL || out==NULL)
{
printf("error");exit(0);
}
int n,i=0,j,k;
long a[100],max=-99999999,t;
fscanf(in,"%d",&n);
while(fscanf(in,"%ld",&a[i])!=EOF) i++;
for(i=0;i<n;i++)
for(j=i;j<n;j++)
if((j-i+1)%3==0)
{
t=0;
for(k=i;k<=j;k++) t+=a[k];
if(max<t)max=t;
}
fprintf(out,"%ld",max);
fcloseall();
}

Bài 3. Giao đấu hữu nghị (40 điểm)

Để tạo không khí vui vẻ náo nhiệt, trong buổi giao lưu giữa sinh viên các trường tham dự 

OLP – ACM, trường đăng cai OLP năm tới đề xuất tổ chức một cuộc thi đấu game online 

tay đôi giữa sinh viên trường mình với sinh viên trường sở tại. Mỗi trường cử ra một đội n

người, tạo thành n cặp đấu, sinh viên cùng trường không đấu với nhau. Trò chơi được chọn 

là một trò chơi rất phổ biến, được các bạn trẻ yêu thích, ai cũng biết và đã từng chơi nhiều 

trước đó. Mọi người đều biết chỉ số năng lực của mình trong trò chơi này và biết rằng nếu 

đấu tay đôi, ai có năng lực cao hơn sẽ thắng. Trong các trận đấu tay đôi, người thắng sẽ 

được 1 điểm, người thua – 0 điểm. Thời gian chơi được quy định đủ để phân biệt thắng 

thua. Các trận hòa sẽ kéo dài vô hạn và sẽ bị hủy kết quả khi hết thời gian.Với tinh thần 

fair play các bạn trường đề xuất ngồi vào vị trí thi đấu, truy nhập vào hệ thống và gửi về 

máy chủ chỉ số năng lực của mình. Trưởng đoàn của trường sở tại có 1 giây để xử lý thông 

tin, phân công ai đấu với ai để tổng số điểm thu được là lớn nhất.

Yêu cầu: Hãy xác định, với cách bố trí tối ưu các cặp đấu, đội của trường sở tại sẽ có bao 

nhiêu điểm.

Dữ liệu: Vào từ file văn bản FAIRPLAY.INP:

 Dòng đầu tiên chứa số nguyên n (1 ≤ n ≤ 105

 Dòng thứ 2 chứa n số nguyên a1, a2, . . . , an, trong đó ai – chỉ số năng lực của 

người thứ i thuộc đội của trường đề xuất, 1 ≤ ai ≤ 109

 Dòng thứ 3 chứa n số nguyên b1, b2, . . . , bn, trong đó bi – chỉ số năng lực của người 

thứ i thuộc đội của trường sở tại, 1 ≤ bi ≤ 109

Kết quả: Đưa ra file văn bản FAIRPLAY.OUT một số nguyên – số điểm đội trường sở tại 

có thể đạt được với cách bố trí cặp chơi tối ưu.

Ví dụ:

FAIRPLAY.INP

5

10 15 30 20 25

28 24 20 16 14

FAIRPLAY.OUT

4

Chú ý:

- Có 25% số test có n ≤ 3;

- Có 25% số test khác có n ≤ 8;

- Có 25% số test khác có n ≤ 1000;

- Có 25% số test còn lại có n ≤ 105


#include<iostream>
using namespace std;
#include<stdlib.h>
void doi(long &a,long &b)
{
long t=a;a=b;b=t;
}
void xep(long *a,int n)
{
for(int i=0;i<n-1;i++)
{
int m=i;
for(int j=i+1;j<n;j++)
if(a[m]>a[j])m=j;
doi(a[m],a[i]);
}
}
int maxdiem(FILE *t)
{
long a[100],b[100];
int n,i=0,j=0,max=0;
fscanf(t,"%d",&n);
while(i<n){ fscanf(t,"%ld",&a[i]);i++;}
i=0;
while(fscanf(t,"%ld",&b[i])!=EOF) i++;
xep(a,n);xep(b,n);
for(i=0;i<n;i++)
{
if(j==n) break;
while(j<n) if(b[j]>a[i]) {max++;break;} else j++;
}
return max;
}
void main()
{
int i,n;
long a;
FILE *in=fopen("FAIRPLAY.INP","r");
FILE *out=fopen("FAIRPLAY.OUT","w");
if(in==NULL || out==NULL) 
{
cout<<"error";exit(0);
}
fprintf(out,"%d",maxdiem(in));
fclose(in);fclose(out);
}