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;
}
Bài liên quan
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…
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 đề:
1 2 3
và4 0 9
. Đáp số sẽ là2 58 6
.giayTong
,phutTong
,gioTong
sai. Rõ ràng làphutTong > 60
màgiayTong < 60
vẫn phải được xử lí, tức là 2 cáiif giayTong > 60
vàif phutTong > 60
không hề phụ thuộc vào nhau. Đoạn đó sửa thành:em cảm ơn anh ạ
Đú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.