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\n");
	}
	if(kq==1)
	{
		printf("  %d gio %d phut %d giay \n",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

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

2 Likes
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)
3 Likes

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

2 Likes

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

1 Like

Bị thừa function call kìa, xóa bớt đi :flushed:
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;
}
3 Likes

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.

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.

1 Like

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

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);
}
2 Likes

Trong hàm tính bạn có tăng biến s = s+1;

Ở hàm main bạn gọi 2 lần hàm tính thì nó tăng 2 là đúng rồi bạn!

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