01/10/2018, 17:36

Tại sao code lại repeat?

Em vừa học lập trình , đang tập viết code cho bài "Nhập vào giờ phút giây ,cho biết thời gian sau 1s là ?
đây là code em viết:

#include<stdio.h>
void nhap(int &h,int &m,int &s);
int ktra(int h,int m,int &s);
int tinh(int &h,int &m,int &s,int kt);    //nhap gio phut giay vao cho biet thoi gian sau 1s
void xuat(int kq ,int &h,int &m,int &s);
void main()
{
	int h,m,s,kt,kq;                                  
	nhap(h,m,s);
	ktra(h,m,s);
	kt=ktra(h,m,s);
	tinh(h,m,s,kt);
	kq=tinh(h,m,s,kt);
	xuat(kq,h,m,s);
}
void nhap(int &h,int &m,int &s)
{
	printf("nhap gio vao:"); scanf("%d",&h);
	printf("nhap phut vao:");scanf("%d",&m);
	printf("nhap giay vao:");scanf("%d",&s);
}
int ktra(int h,int m,int &s)
{
	if((h>=0)&&(m>=0)&&(s>=0)&&(h<24)&&(m<60)&&(s<60))
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
int tinh(int &h,int &m,int &s,int kt)
{
	if(kt==1)
	{
		s=s+1;
		if(s==60)
		{
			m=m+1;
			s=0;
		}
		if(m==60)
		{
			h=h+1;
			m=0;
		}
		if(h==24)
		{
			h=0;
		}
	    return 1;
	}
	else
	{
		return 0;
	}
}
void xuat(int kq ,int &h,int &m,int &s)
{
	if(kq==0)
	{
		printf("ko hop le
");
	}
	if(kq==1)
	{
		printf("  %d gio %d phut %d giay 
",h,m,s);
	}
}

theo như ý tưởng thì nếu nhập 23:59:59 ----->0:0:0 nhưng kết quả lại là 0:0:1,kiểm tra thì em thấy nó repeat +1 hai lần , mọi người có thể giải thích vì sao không ạ? Em cảm ơn

Mai Anh Dũng viết 19:45 ngày 01/10/2018

@Quoc_Minh_Vu_Tran Cách post Code dùng Markdown trong Category Programming

明玉 viết 19:46 ngày 01/10/2018
int tinh(int &h,int &m,int &s,int kt);  // < pass by reference
kt=ktra(h,m,s);
tinh(h,m,s,kt);  // < gọi lần 1
kq=tinh(h,m,s,kt); // < gọi lần 2
xuat(kq,h,m,s);
if(kt==1)
{
	s=s+1; // pass by reference + modify => ảnh hưởng ra bên ngoài, + gọi 2 lần => nhảy 2 giây
	if(s==60)
Trần Hoàn viết 19:48 ngày 01/10/2018

Bạn có thể làm theo kiểu của máy tính:
Đổi hết thành số milliseconds tính từ 01/01/1970 00:00:00:000, tăng thêm 1000ms rồi tính lại thời gian =))

rogp10 viết 19:47 ngày 01/10/2018

Toy problem vẽ ra làm gì bạn.

Hung viết 19:52 ngày 01/10/2018

Bị thừa function call kìa, xóa bớt đi
Với lại đổi tên biến + space vài chỗ, cho nó dễ đọc.

int main()
{
	int hours, minutes, seconds;
	int is_valid = 0, time_sucess = 0;   
       
	get_time(hours, minutes, seconds); // nhap

	is_valid = time_is_valid(hours, minutes, seconds); // ktra
	if (is_valid)
		time_sucess = next_time(hours, minutes, seconds, is_valid); // tinh
	
	print_time(is_valid || time_success, hours, minutes, seconds); // xuat
	return 0;
}
Trần Hoàn viết 19:48 ngày 01/10/2018

Mình thấy timestamp là cách giải quyết đơn giản, chính xác mà. Với cả nó cũng không khó hiểu, đủ cho newbie áp dụng. Code lại ngắn và trong sáng.

Tao Không Ngu. viết 19:42 ngày 01/10/2018

Hi Quốc Minh Vũ Trần.
Hãy tìm hiểu các công cụ debug code. Đại khái nó sẽ cho bạn chạy từng lệnh một và xem trạng thái của chường trình.

rogp10 viết 19:47 ngày 01/10/2018

Kì đầu không đi sâu vào thư viện đâu

Trần Hoàn viết 19:43 ngày 01/10/2018

Có gì đâu bác ơi? Trong bài của bạn này thì đơn vị lớn nhất là “giây”, mình chỉ cần làm đến “giây” là được:

long toSecond(int hour, int minute, int second)
{
	return (hour * 60 * 60 + minute * 60 + second) % (24 * 60 * 60);
}

void printTime(long secondAsTimeStamp)
{
	printf("%ld:%ld:%ld", (secondAsTimeStamp / (60 * 60)) % 24, (secondAsTimeStamp / 60) % 60, secondAsTimeStamp % 60);
}
Bài liên quan
0