Hỏi về bài toán nhập thời gian dạng 24h và in ra dạng 12h

Em có 1 bài toán của c++ như thế này ạ :smiley:

Viết một chương trình chuyển kí pháp dạng 24 giờ thành dạng 12 giờ. Ví dụ, nó có thể chuyển
14:25 thành 2:25 PM. Đầu vào được cho gồm hai số nguyên. Chương trình nên có ít nhất ba
hàm: Một hàm cho việc nhập dữ liệu, một hàm cho việc chuyển đổi và một hàm cho việc in dữ
liệu. Bản ghi thông tin A.M/P.M là giá trị kiểu char, ‘A’ cho A.M và ‘P’ cho P.M. Vì vậy hàm
chuyển đổi sẽ có một tham chiếu có kiểu char để ghi lại A.M hoặc P.M (Hàm này sẽ có thêm
những tham số khác nếu cần). Nên có một vòng lặp để giúp người dùng lặp đi lặp lại quá trình
tính toán này với giá trị nhập vào mới cho đến khi người dùng nói rằng họ muốn dừng chương
trình.

#include <iostream>

using namespace std;

int main()
{
	int gio,phut,giay,t;
	char A[]="A.M",P[]="P.M";
	
	cout<<"Nhap thoi gian (dang 24h)"<<endl<<"Nhap gio : ";
	cin>>gio;
	cout<<"Nhap phut : ";
	cin>>phut;
	cout<<"Nhap giay : ";
	cin>>giay;
	
	
	if ((1 <= gio <= 11 ) && (0 <= phut <= 60) && (0 <= giay <= 60)) {
		if (gio < 10) {
			if ((phut >= 10) && (giay >= 10)) {
				cout<<"Thoi gian la (dang 12h) : 0"<<gio <<"."<<phut<<"."<<giay<<" "<< A <<endl;
			}
			else if ((phut < 10) && (giay >= 10)) {
				cout<<"Thoi gian la (dang 12h) : 0"<<gio <<".0"<<phut<<"."<<giay<<" "<< A <<endl;
			}
			else if ((phut < 10) && (giay < 10)) {
				cout<<"Thoi gian la (dang 12h) : 0"<<gio <<".0"<<phut<<".0"<<giay<<" "<< A <<endl;
			}
			else {
				cout<<"Thoi gian la (dang 12h) : 0"<<gio <<"."<<phut<<".0"<<giay<<" "<< A <<endl;
			}
		}
		else {
			if ((phut >= 10) && (giay >= 10)) {
				cout<<"Thoi gian la (dang 12h) : "<<gio <<"."<<phut<<"."<<giay<<" "<< P <<endl;
			}
			else if ((phut < 10) && (giay >= 10)) {
				cout<<"Thoi gian la (dang 12h) : "<<gio <<".0"<<phut<<"."<<giay<<" "<< P <<endl;
			}
			else if ((phut < 10) && (giay < 10)) {
				cout<<"Thoi gian la (dang 12h) : "<<gio <<".0"<<phut<<".0"<<giay<<" "<< P <<endl;
			}
			else {
				cout<<"Thoi gian la (dang 12h) : "<<gio <<"."<<phut<<".0"<<giay<<" "<< P <<endl;
			}
		}
	}
	else if ((gio == 24) && (0 <= phut <= 60) && (0 <= giay <= 60)) || ((gio == 0) && (0 <= phut <= 60) && (0 <= giay <= 60))) {
		if ((phut >= 10) && (giay >= 10)) {
			cout<<"Thoi gian la (dang 12h) : 12."<<phut<<"."<<giay<<" "<< A <<endl;
		}
		else if ((phut < 10) && (giay >= 10)) {
			cout<<"Thoi gian la (dang 12h) : 12."<<phut<<"."<<giay<<" "<< A <<endl;
		}
		else if ((phut < 10) && (giay < 10)) {
			cout<<"Thoi gian la (dang 12h) : 12."<<phut<<".0"<<giay<<" "<< A <<endl;
		}
		else {
			cout<<"Thoi gian la (dang 12h) : 12."<<phut<<".0"<<giay<<" "<< A <<endl;
		}
	}
	else if ((13 <= gio <= 23) && (0 <= phut <= 60) && (0 <= giay <= 60)) {
		if ((phut >= 10) && (giay >= 10)) {
			cout<<"Thoi gian la (dang 12h) : "<<gio-12 <<"."<<phut<<"."<<giay<<" "<< P <<endl;
		}
		else if ((phut < 10) && (giay >= 10)) {
			cout<<"Thoi gian la (dang 12h) : "<<gio-12 <<".0"<<phut<<"."<<giay<<" "<< P <<endl;
		}
		else if ((phut < 10) && (giay < 10)) {
			cout<<"Thoi gian la (dang 12h) : "<<gio-12 <<".0"<<phut<<".0"<<giay<<" "<< P <<endl;
		}
		else {
			cout<<"Thoi gian la (dang 12h) : "<<gio-12 <<"."<<phut<<".0"<<giay<<" "<< P <<endl;
		}
	}
	else if ((gio == 12 ) && (0 <= phut <= 60) && (0 <= giay <= 60)) {
		if ((phut >= 10) && (giay >= 10)) {
			cout<<"Thoi gian la (dang 12h) : "<<gio <<"."<<phut<<"."<<giay<<" "<< P <<endl;
		}
		else if ((phut < 10) && (giay >= 10)) {
			cout<<"Thoi gian la (dang 12h) : "<<gio <<".0"<<phut<<"."<<giay<<" "<< P <<endl;
		}
		else if ((phut < 10) && (giay < 10)) {
			cout<<"Thoi gian la (dang 12h) : "<<gio <<".0"<<phut<<".0"<<giay<<" "<< P <<endl;
		}
		else {
			cout<<"Thoi gian la (dang 12h) : "<<gio <<"."<<phut<<".0"<<giay<<" "<< P <<endl;
		}
	}
	else {
		cout<<"Ban da nhap sai !! Xin thu lai..";
	}

	
	system("pause");
	return 0;
}

Khi em nhập thời gian là : 24 5 5
thì kết quả nó lại ra là : 24.05.05 PM trong khi em nghĩ nó sẽ hiện ra là: 12.05.05 AM
hoặc 0 1 1
thì kết quả là : 00.01.01 PM,em nghĩ là sẽ ra: 12.01.01 AM

Mọi người có thể chỉ ra cho e lỗi sai được không ạ? :astonished: em cảm ơn :grin:

giờ dạng 24h thì làm gì có 24:05:05 :open_mouth:

cứ tạm cho rằng input luôn luôn đúng format: 0 <= giờ <= 23, 0 <= phút <= 59, 0 <= giây <= 59.

đầu tiên là viết hàm in giờ gọn lại bằng cách xài std::fill trong <iomanip>

void prettyPrint12h(int h, int m, int s, bool am)
{
    char oldFill = std::cout.fill();
    std::cout << std::setfill('0') << std::setw(2) << h << ":"
              << std::setw(2) << m << ":"
              << std::setw(2) << s << " "
              << (am ? "AM" : "PM") << "\n" << std::setfill(oldFill);
} 

phút với giây ko đổi khi chuyển từ dạng 24h sang 12h nên khỏi đổi.
giờ thì có 3 trường hợp:

  1. nếu giờ 24 bằng 0 thì giờ 12 bằng 12
  2. nếu giờ 24 nằm trong đoạn [1…12] thì giờ 12 cũng như giờ 24
  3. nếu giờ 24 nằm trong đoạn [13…23] thì giờ 12 bằng giờ 24 trừ 12
    trường hợp 2 và 3 có thể viết gọn lại như thế này: h12 = h24 - (h24 > 12) * 12. Trong C++ thì true có giá trị là 1false có giá trị là 0, nên (h24 > 12) sẽ mang giá trị 0 hoặc 1. Nếu h24 > 12 thì h12 = h24 - 12 (trường hợp 3), ngược lại thì h12 = h24 (trường hợp 2).

vậy là xong rồi, giờ chỉ cần kiểm tra thêm h24 == 0 nữa là xong. Xài ? : để viết trong 1 dòng luôn.

prettyPrint12h(h ? h-(h>12)*12 : 12, m, s, h<12);
5 Likes

à đúng rồi em quên mất,cảm ơn anh nhiều :grin:

Dùng phép mod cho đơn giản.

2 Likes

Dùng như thế nào ạ? :open_mouth:

prettyPrint12h(h%12, m, s, h<12);
2 Likes

0 giờ ở dạng 24h chuyển về dạng 12h lại thành 12 nên xài h%12 ko đc :sweat: Mới đầu ta cũng nghĩ xài h%12 là đc rồi…

2 Likes

Vậy thì chỉ cần

prettyPrint12h(h?h%12:12, m, s, h<12);

tính chờ đến 24 giờ xem nó nhảy thế nào :))

1 Like

12 trưa nó vẫn là 12. Đổi thành h%12 ? h%12 : 12 :sweat_smile: Viết vậy ko cần sợ mod 2 lần, compiler nó đọc sẽ tự hiểu mà optimize dùm mình chỉ mod 1 lần thôi.

lúc viết ra cái (h>12)*12 cũng ngờ ngợ thấy nó phức tạp quá đáng rồi. Xài mod gọn hơn nhiều :sweat_smile:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?