30/09/2018, 18:09

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 ạ

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 ạ? em cảm ơn

viết 20:23 ngày 30/09/2018

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

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);
N M T viết 20:24 ngày 30/09/2018

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

Minh Hoàng viết 20:16 ngày 30/09/2018

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

N M T viết 20:14 ngày 30/09/2018

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

Minh Hoàng viết 20:25 ngày 30/09/2018
prettyPrint12h(h%12, m, s, h<12);
viết 20:22 ngày 30/09/2018
en.wikipedia.org

12-hour clock

The 12-hour clock is a time convention in which the 24 hours of the day are divided into two periods: a.m. (from the Latin, ante meridiem, meaning before midday) and p.m. (post meridiem, meaning past midday). Each period consists of 12 hours numbered: 12 (acting as zero), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, and 11. The 24 hour/day cycle starts at 12 midnight (often indicated as 12 a.m.), runs through 12 noon (often indicated as 12 p.m.), and continues to the midnight at the end of the day. Th The 12...

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

Minh Hoàng viết 20:18 ngày 30/09/2018

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 :))

viết 20:14 ngày 30/09/2018

12 trưa nó vẫn là 12. Đổi thành h%12 ? h%12 : 12 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

Bài liên quan
0