Chào bạn !
Bài này hay đó nhưng sao bạn không viết theo OOP cho dễ hơn, với lại mình đề ghị hạn chế sư dụng thèng switch, case trong trường hợp này bạn xài mảng sẽ hay hơn !
Code:#include <iostream> #include <conio.h> using namespace std; struct date { int d,m,y,a; }; int nhuan(date x) //Kiem tra nam nhuan hay ko { return (x.y%4==0)?1:0; } long daycount(date x) //Tinh khoang cach tu ngay nhap vao voi ngay 1/1/1 { return x.d-1+(x.m-1)*30+(x.y-1)*365+x.a+(x.y-1)/4; } main() { date x; int month[42]; int i,j,ngaymax,ngaydu,k,thu,ok; cout<<"\nChuong trinh in ra cac ngay trong thang cua nam nao do\n------\n\n"; do { if(ok==0) cout<<"\nXin loi, thang (nam) ban vua nhap ko hop le,xin nhap lai\n-\n"; ok=1; cout<<"Nhap thang, nam (vi du 11 2007): "; fflush(stdin); cin>>x.m>>x.y; if(x.y<0||x.m<1) ok=0; //Kiem tra tinh hop le cua else if (x.m>12) ok=0; //so lieu nhap vao tu ban phim } while(ok==0); switch(x.m) { case 1: ngaymax=31; ngaydu=0; break; case 2: if(nhuan(x)) ngaymax=29; else ngaymax=28; ngaydu=1; break; case 3: ngaymax=31; ngaydu=-1+nhuan(x); break; case 4: ngaymax=30; ngaydu=0+nhuan(x); break; case 5: ngaymax=31; ngaydu=0+nhuan(x); break; case 6: ngaymax=30; ngaydu=1+nhuan(x); break; case 7: ngaymax=31; ngaydu=1+nhuan(x); break; case 8: ngaymax=31; ngaydu=2+nhuan(x); break; case 9: ngaymax=30; ngaydu=3+nhuan(x); break; case 10: ngaymax=31; ngaydu=3+nhuan(x); break; case 11: ngaymax=30; ngaydu=4+nhuan(x); break; case 12: ngaymax=31; ngaydu=4+nhuan(x); break; } x.a=ngaydu; x.d=1; //Gan ngay la ngay mung 1 thu=daycount(x)%7; //de tinh thu cua ngay dau tien cua thang for(i=0;i<5;i++) { for(j=0;j<7;j++) { if(7*i+j+1<=ngaymax) *(month+7*i+j+thu)=7*i+j+1; } } //Gan tat ca ngay trong thang vao mot day for(i=0;i<thu;i++) *(month+i)=32; //Gan gia tri tam thoi bieu thi nhung ngay ko ton tai for(i=ngaymax+thu;i<42;i++) *(month+i)=32; //Gan gia tri tam thoi bieu thi nhung ngay ko ton tai cout<<"----\n\nLich thang "<<x.m<<"\\"<<x.y<<"\n------\n\n"; cout<<"CN\tThu 2\tThu 3\tThu 4\tThu 5\tThu 6\tThu 7\n\n"; for(i=0;i<6;i++) { for(j=0;j<7;j++) { if(*(month+7*i+j)==32) cout<<"\t"; //Thay the gia tri tam thoi bang null else cout<<*(month+7*i+j)<<"\t"; } cout<<"\n"; } getch(); }
welcome to http://fotech.org
bắt đầu với C/C++
Chào bạn !
Bài này hay đó nhưng sao bạn không viết theo OOP cho dễ hơn, với lại mình đề ghị hạn chế sư dụng thèng switch, case trong trường hợp này bạn xài mảng sẽ hay hơn !
Tớ cũng có một bài in ra lịch của một năm bất kỳ >= 1700
http://forums.congdongcviet.com/show...7&postcount=31
PHP Code:#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
int songay(int,int);
bool namnhuan(int nam);
void InLich(int,int);
int ThuDauTien(int,int);
void main()
{
int nam;
char chon;
do
{
do
{
cout<<"Nhap vao nam(> 1700): ";
cin>>nam;
}while(nam < 1700);
for(int i = 1;i <= 12;i++)
{
cout<<"Thang "<<i<<endl;
InLich(i,nam);
cout<<endl;
}
cout<<"\nBan co muon tiep tuc khong(y/n): ";
cin>>chon;
system("cls");
}while(chon == 'y');
cout<<"Thanh Nam cam on ban da su dung chuong trinh {an Enter de thoat)";
getch();
}
int songay(int thang,int nam)
{
switch(thang)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
case 2:
if(namnhuan(nam))
return 29;
else
return 28;
case 4:
case 6:
case 9:
case 11:
return 30;
}
return 0;
}
bool namnhuan(int nam)
{
return ((nam % 4 == 0 && nam % 100 != 0)||(nam % 400 == 0));
}
void InLich(int thang,int nam)
{
int ngayd = ThuDauTien(thang,nam);
if(ngayd == 0)
ngayd = 7;
int i;
int sn = songay(thang,nam);
cout<<"\nMon\tTUE\tWED\tTHU\tFRI\tSAT\tSun\n";
for(i = 1;i <= ngayd - 1;i++)
cout<<"\t";
for(i = 1;i <= sn;i++)
{
cout<<i<<"\t";
if((i + ngayd - 1) % 7 == 0)
cout<<endl;
}
}
long int funct1 (int nam,int thang)
{
long int result;
if ( thang <= 2 )
nam -= 1; //
result = nam;
return (result);
}
long int funct2 (int thang)
{
long int result;
if ( thang <= 2 )
result = thang + 13;
else
result = thang + 1;
return(result);
}
long int day_count (int thang, int nam)
{
long int number;
number = 1461 * funct1(nam,thang) / 4 + 153 * funct2(thang) / 5 + 1;
return (number);
}
int ThuDauTien(int thang,int nam)
{
long int number_of_days1;
int day_of_week;
number_of_days1 = day_count (thang, nam);
day_of_week = (number_of_days1 - 621049) % 7;
return day_of_week;
}
Chào bạn !
-Bạn viết cũng hay đấy nhưng bạn viết như vậy ứng dụng của bạn chỉ sử dụng duy nhất 1 việc là In Lich thôi ! thế thì tệ phải ko ạ !
-Chẳng hạn khi mình muốn sử dụng lại với việc khác như tính lãi chẳng hạn thì người dùng sẽ nhập vào 1 ngày nào đó rồi tính số tiền lời trong tương lai chẳng hạn ... có rất nhìu ứng dụng sẽ sử dụng lại cái nì phải ko ?
- Mình đề nghị viết theo OOP tạo 1 class Date và 1 Display.cpp riêng để thật hiện việc in lịch ! Các bạn thấy sao ?
Thân !
Đã được chỉnh sửa lần cuối bởi zZKiddyZz : 20-11-2007 lúc 11:28 AM. Lý do: Class Date
À,em đang học C++ trên lớp, mới học đến phần cấu trúc thôi ạ, mấy tuần nữa mới học hướng đối tượng nên em thử một bài thôi ạ. Lúc đầu đề bài cô cho chỉ là tìm thứ qua ngày tháng năm, em áp dụng thêm thôi
welcome to http://fotech.org
bắt đầu với C/C++
Chào bạn !
Mình xin lỗi, mình sẽ post code trong thời gian sớm nhất nhưng hiện giờ mình đang busy về cái project của mình `__`. Vì code LNgay của mình lúc trước cũ rồi ko hay nữa mình mới học thêm 1 số mới sẽ update code rồi post lên lun nha bạn nhé !
Thân
Đây là đoạn code mình chỉnh lại thành OOP,vì đang bận nên mình chỉ chỉnh lại phần switch thôi!Có thiếu sót gì các bạn bổ sung nhé!Đây là bài đầu tiên mình post ở diễn đàn này.Code://file Date.h //////////////////////////// #include<iostream> #include<cmath> #include<cstdlib> #include<conio.h> using namespace std; class Date { private: int year;//chi can nam la du public: Date(); ~Date(); int soNgay(int,int); bool namNhuan(int); void inLich(int,int); int thuDauTien(int,int); long int day_count (int, int); long int funct2 (int); long int funct1 (int,int); }; //file Date.cpp(file cai dat) #include "Date.h" using namespace std; //////////////////////////////cai dat class Date //constructor Date::Date():year(0)//khoi tao cho year=0 { do { cout<<"Nhap vao nam(> 1700): "; cin>>this->year; }while(this->year < 1700); for(int i = 1;i <= 12;i++) { cout<<"Thang "<<i<<endl; this->inLich(i,this->year); cout<<endl; } } //destructor Date::~Date() { } int Date::soNgay(int thang ,int nam) { if(thang==1,3,5,7,8,10,12) return 31; if(thang=2,4,6,9,11) return 30; if(thang==2) if(this->namNhuan(nam)) return 29; else return 28; return 0; } bool Date::namNhuan(int nam) { return ((nam % 4 == 0 && nam % 100 != 0)||(nam % 400 == 0)); } void Date::inLich(int thang ,int nam) { int ngayd = this->thuDauTien(thang,nam); if(ngayd == 0) ngayd = 7; int i; int sn = this->soNgay(thang,nam); cout<<"\nMon\tTUE\tWED\tTHU\tFRI\tSAT\tSun\n"; for(i = 1;i <= ngayd - 1;i++) cout<<"\t"; for(i = 1;i <= sn;i++) { cout<<i<<"\t"; if((i + ngayd - 1) % 7 == 0) cout<<endl; } } int Date::thuDauTien(int thang,int nam) { long int number_of_days1; int day_of_week; number_of_days1 = this->day_count(thang,nam); day_of_week = (number_of_days1 - 621049) % 7; return day_of_week; } long int Date::day_count(int thang, int nam) { long int number; number = 1461 * this->funct1(nam,thang) / 4 + 153 * this->funct2(thang) / 5 + 1; return (number); } long int Date::funct1(int nam,int thang) { long int result; if ( thang <= 2 ) nam -= 1; // result = nam; return (result); } long int Date::funct2 (int thang) // { long int result; if ( thang <= 2 ) result = thang + 13; else result = thang + 1; return(result); } ///ham main void main() { char chon; do { Date y;//khoi tao 1 doi tuong can xet cout<<"\nBan co muon tiep tuc khong(y/n): "; cin>>chon; system("cls"); }while(chon == 'y'); cout<<"Thanh Nam cam on ban da su dung chuong trinh {an Enter de thoat)"; getch(); }
![]()
![]()
![]()
![]()
![]()
![]()
Không có người phụ nữ xấu!!! Chỉ có những người phụ nữ không biết tự làm đẹp, hoặc... làm hoài mà không đẹp!!!![]()
![]()
![]()
Chào các bạn !
Sau khi cày xong mấy cái đồ án mình viết lại class CDate, mấy class dạng này bạn có thể tìm open source trên web nhưng ko vì thế mình lại ko viết 1 cái class này. Code sau đây mình chỉ up file .h thui, để mọi người đánh giá góp ý, cần bổ sung hàm nào nữa không, cũng như hàm nào không cần thiết thì bỏ đi. Mong mọi người góp ý:
PS: Happy new year, best wishes for allCode:/* Date Class */ #ifndef _CDate_h_ #define _CDate_h_ #include <iostream> #include <string> #define max(x, y) (x > y) ? x : y #define min(x, y) (x < y) ? x : y using namespace std; class CDate { private: int _Day; int _Moth; int _Year; void _Set(int, int, int); public: CDate(); /* Constructor default */ CDate(int, int, int); /* Constructor */ CDate(const CDate &); /* Copy constructor */ ~CDate(); /* Destructor */ void setDay(int); /* Dat lai ngay */ void setMonth(int); /* Dat lai thang */ void setYear(int); /* Dat lai nam */ int getDay() const; /* Lay ngay */ int getMonth() const; /* Lay thang */ int getYear() const; /* Lay nam */ void addMonth(int m = 1); /* Them thang */ void addYear(int y = 1); /* Them nam */ bool IsLeapYear() const; /* Kiem tra nam nhuan */ CDate& operator = (const CDate &); /* Toan tu gan doi tuong ngay */ CDate operator + (int); /* Toan tu cong Obj voi int */ CDate operator - (int); /* Toan tu tru Obj voi int */ CDate operator - (const CDate &); /* Toan tu tru Obj voi Obj */ CDate& operator ++ (); /* Toan tu cong don 1 don vi ngay (int) */ CDate& operator -- (); /* Toan tu tru don 1 don vi ngay (int) */ CDate& operator += (int); /* Toan tu cong bang Obj voi int (ngay qua tuong lai) */ CDate& operator -= (int); /* Toan tu tru bang Obj voi int (ngay qua khu) */ bool operator == (const CDate &); bool operator != (const CDate &); bool operator >= (const CDate &); bool operator <= (const CDate &); bool operator > (const CDate &); bool operator < (const CDate &); friend ostream& operator <<(ostream &, const CDate &); friend istream& operator >>(istream &, CDate &); friend CDate operator + (const CDate&, int); /* Toan tu cong giua int voi Obj*/ }; #endif
Thân
Mình cũng làm thử một bài in lịch thế này, mọi người xem thử
PHP Code:#include <iostream.h>
#include <stdio.h>
#include <conio.h>
//Ham tinh so ngay cua mot thang
int SoNgayCuaThang(int th,int nam)
{
switch(th)
{
case 1:case 3:case 5:case 7:case 8:case 10: case 12:
return 31;break;
case 2:
if (nam % 4 == 0) return 29; else return 28; break;
default:
return 30;
}
}
//Ham chuyen tu ngay -> thu
int ThuCuaNgay(int ng, int th, int nam)
{
//cout<<"Nhap vao nam can in lich: ";
//cin>>nam;int ThuCuaNgay(int ng,int th,int nam)
int s=(nam-1)/4+(nam-1)*365;
for (int i=1;i<th;++i)
s+=SoNgayCuaThang(i, nam);
s+=ng;
if (s%7 == 0) return 7;
else return (s%7);
}
void main()
{
int nam;
cout<<"Nhap vao mot nam can in lich : ";
cin>>nam;
printf("Lich cua nam %d la \n",nam);
cout<<endl;
for (int thang = 1; thang <= 12; ++thang)
{
printf(" THANG %d\n",thang);
printf("%5s","Hai");
printf("%5s","Ba");
printf("%5s","Tu");
printf("%5s","Nam");
printf("%5s","Sau");
printf("%5s","Bay");
printf("%5s\n","Cn");
int k = 2;
while (k)
if (ThuCuaNgay(1,thang,nam) == k || (ThuCuaNgay(1,thang,nam) == 1 && k == 8)) {printf("%5d",1);break;}
else {printf("%5s"," "); k++;}
if (ThuCuaNgay(1,thang,nam) == 1) cout<<endl;
for (int i = 2; i <= SoNgayCuaThang(thang, nam); ++i)
{
if (ThuCuaNgay(i,thang,nam) == 1) printf("%5d\n",i);
else printf("%5d",i);
}
cout<<endl;
cout<<endl;
}
getch();
}