Tính tổng và hiệu 2 thời điểm

Em viết thuật giải và chương trình như thế này đã đúng chưa ạ ?

/*
	Bài tập 13: Tính tổng và hiệu 2 giờ nhập vào từ bàn phím

	- Input: 2 giờ (hh:mm:ss)
	- Output: tổng và hiệu 2 giờ này

	- Thuật giải:
		- Tính tổng hai giờ:
			- tính tổng giây = giây số 1 + giây số 2
			- tính tổng phút = phút số 1 + phút số 2
			- tính tổng giờ = giờ 1 + giờ 2
				- chuẩn hóa giờ, phút, giây tổng
				- chuẩn hóa giây
					- nếu giây lớn hơn hoặc bằng 60 thì giây chuẩn sẽ là: giây chia dư cho 60
					- tăng phút lên một đơn vị. Nếu phút lơn hơn hoặc bằng 60 thì phút chuẩn hóa
					  lại bằng phút tổng chia dư cho 60
					- tăng giờ lên 1 đơn vị. Nếu giờ bằng 24 thì giờ gán lại bằng 0 còn lớn hơn
					  thì giờ bằng giờ cũ chia dư cho 24 trừ 1

		- Tính hiệu hai giờ
			- tính trị tuyệt đối hiệu 2 giây
			- tính trị tuyệt đối hiệu 2 phút
			- tính trị tuyệt đối hiệu 2 giờ
*/

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <conio.h>
#include <math.h>

int main(void) {

	int gio1{ 0 };
	int phut1{ 0 };
	int giay1{ 0 };

	int gio2{ 0 };
	int phut2{ 0 };
	int giay2{ 0 };

	printf("\n Nhap vao gio thu nhat: ");
	scanf("%d", &gio1);

	printf(" Nhap vao phut thu nhat: ");
	scanf("%d", &phut1);

	printf(" Nhap vao giay thu nhat: ");
	scanf("%d", &giay1);

	printf("\n Nhap vao gio thu hai: ");
	scanf("%d", &gio2);

	printf(" Nhap vao phut thu hai: ");
	scanf("%d", &phut2);

	printf(" Nhap vao giay thu hai: ");
	scanf("%d", &giay2);

	if (giay1 < 0 || giay1 > 59 || phut1 < 0 || phut1 > 59 || gio1 < 0 || gio1 > 23 || giay2 < 0 || giay2 > 59 || phut2 < 0 || phut2 > 59 || gio2 < 0 || gio2 > 23) {

		printf("\n Xin vui long kiem tra lai !");
		_getch();
		return -1;
	}

	int giayHieu = abs(giay1 - giay2);
	int phutHieu = abs(phut1 - phut2);
	int gioHieu = abs(gio1 - gio2);

	printf("\n Hieu hai gio: %02d : %02d : %02d", gioHieu, phutHieu, giayHieu);

	int gioTong = gio1 + gio2;
	int phutTong = phut1 + phut2;
	int giayTong = giay1 + giay2;

	if (giayTong >= 60) {

		giayTong %= 60;
		phutTong++;

		if (phutTong >= 60) {

			phutTong %= 60;
			gioTong++;

			if (gioTong >= 24) {

				if (gioTong == 24) {

					gioTong = 0;
				}
				else {

					gioTong %= 24;
					gioTong--;
				}
			}
		}
	}

	printf("\n Tong hai gio: %02d : %02d : %02d", gioTong, phutTong, giayTong);

	_getch();
	return 0;
}

Hi Lê Hiếu
Đúng sai bạn tự test.
Theo mình thì dùng tick. Bạn có 1 biến int64 lưu giá trị theo giây. Tính toán cộng trừ trên đó rồi conver giá trị int64 đó ra ngày tháng năm giờ phút giây v.v.v…

2 Likes

Hồi lớp 5 có bài toán trừ thời gian mà. Bạn đọc lại nhé.
Không cần biến quá to, cộng trừ trực tiếp từ hàng giây -> phút -> giờ. Nhớ là có biến nhớ.

UPD: Đã đọc code bạn và thấy nhiều vấn đề:

  • Cách tính hiệu thời gian sai. Test: 1 2 34 0 9. Đáp số sẽ là 2 58 6.
  • Cách xử lí biến giayTong, phutTong, gioTong sai. Rõ ràng là phutTong > 60giayTong < 60 vẫn phải được xử lí, tức là 2 cái if giayTong > 60if phutTong > 60 không hề phụ thuộc vào nhau. Đoạn đó sửa thành:
if giayTong >= 60 {
    //code
}
if phutTong >= 60 {
    //code
}
if gioTong >= 60 {
    //code
}
2 Likes

em cảm ơn anh ạ :slight_smile:

Đúng vậy, đổi ra dạng chuẩn (canonize) để khi cần thì xuất ra dạng tùy ý là nhanh nhất. Như bignum chẳng hạn.

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