01/10/2018, 09:56

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("
 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("
 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("
 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("
 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("
 Tong hai gio: %02d : %02d : %02d", gioTong, phutTong, giayTong);

	_getch();
	return 0;
}
Tao Không Ngu. viết 12:05 ngày 01/10/2018

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…

HK boy viết 12:04 ngày 01/10/2018

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
}
Nguyen Kien viết 12:03 ngày 01/10/2018

em cảm ơn anh ạ

rogp10 viết 12:08 ngày 01/10/2018

Đú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.

Bài liên quan
0