Cần hỗ trợ test hoặc rút gọn code giúp

Đề: Viết phần mềm quản lý thư viện, thủ thư cần nhập ngày mượn sách, thời gian mượn 14 ngày. Cần xuất ra ngày tháng năm trả sách.
Mình mới học được 2 ngày, nên chỉ vận dụng được cú pháp If, If … else thôi nên mọi người đừng áp dụng các cú pháp mảng, vòng lặp gì nha, đọc không hiểu =))) Do máy yếu nên mình viết xong thì chương trình báo không lỗi nhưng tới lúc chạy thì chạy không nổi, chắc do câu cú dài dòng phức tạp quá thì phải. Cần mọi người test giúp xem kết quả có đúng không và có thể rút gọn biểu thức dưới cú pháp If … else được nữa không nhen. Cảm ơn ạ!

#include<iostream>
using namespace std;

int main(){
	int d, m, y;
	cout << "Nhap vao ngay thang nam:" << endl;
	cin >> d >> m >> y;
	
int maxDay;
if (m == 2){
	if (y % 400 != 0){
		maxDay == 28;
	}
	else {
		maxDay = 29;
	}
}
else {
	if (m == 4 || m == 6 || m == 9 || m == 11){
		maxDay == 30;
	}
	else {
		maxDay == 31;
	}
}
d += 14;
if (d <= maxDay){
	cout << "Ngay phai tra: " << d << "/" << m << "/" << y;
}
else {
	if (m < 12){
		d = d % maxDay;
		m = m++;
		cout << "Ngay phai tra: " << d << "/" << m << "/" << y;
	}
	else {
		d = d % maxDay;
		m == 1;
		cout << "Ngay phai tra: " << d << "/" << m << "/" << y;
	}
}
}

yếu thì yếu chứ chạy bt mà bạn

clean code và code lại từ đầu đi cha :))

compile nó xong rồi tới lúc run nhập ngày tháng năm gõ run nó lại báo *.exe stopped working hoài. Làm không kiểm tra được rút cuộc cái đống này có chính xác không luôn chứ @caibeer

mấy cái gán giá trị cho maxday = … thì là chỉ 1 dấu bằng thôi, ghi 2 dấu thế lỗi là đúng rồi. Check lại hết phép gán giá trị thì only 1 dấu bằng nhe.

2 Likes

Chỗ này hơi thừa nè. m++ thôi là được rồi chứ m = m++ không có tác dụng gì đâu.
Tìm hiểu chút về m++ với ++m đi là biết sao thừa.

1 Like

Code này bị lỗi do 3 đoạn:

if (y % 400 != 0){
   maxDay == 28;
}
if (m == 4 || m == 6 || m == 9 || m == 11){
		maxDay == 30;
	}
	else {
		maxDay == 31;
	}
m == 1;

Toán tử == là dùng để so sánh chứ không phải là gán giá trị, vì thế, khi viết maxDay == 28 thì nó không gán giá trị cho m, mà m có giá trị mặc định là 0 nê đoạn này làm ứng dụng bị crash do m không thể chia cho 0 (và một phần cũng vì C++ là một ngôn ngữ “không an toàn bộ nhớ”):

d = d % maxDay;

Ngoài ra, đoạn này vô dụng:

m = m++;

Toán tử ++ dùng để tăng giá trị của biến và trả về giá trị ban đầu của nó, thành ra máy sẽ chạy đoạn trên như sau:

  1. m++ => m = m + 1, trả về m
  2. m = m++ => m sau khi tăng 1 thì " trở lại" bằng giá trị gốc.

Thực tế, chuyện code dài dòng là chuyện…bình thường, nhưng quan trọng là code có dễ đọc, dễ hiểu, dễ bảo trì hay không. Đoạn if-else có thể được rút gọn bằng toán tử 3 ngôi, nhưng, làm thế code khó đọc hơn, tối nghĩa hơn, đặc biệt là khi code trình bày không tốt, căn lề, cách lung tung,…

Với bài toán trên có một cách ngắn gọn hơn nhiều: Chuyển ngày, tháng, năm nhập vào thành timestamp (thường tính bằng giây) rồi cộng cho 14 * 24 * 3600 rồi chuyển ngược lại thành ngày, tháng, năm.

4 Likes

thks thks, mới học nên hay dễ lầm lẫn vụ toán tử gán với toán tử so sánh @Huy_Huy14

mà để m++ thì lúc cout mình để m hay m++ bạn nhỉ ??? @@ mới học nên hơi rối

Cảm ơn nhiều mà cái phần mình cần sửa từ “==” thành “=” thì mình hiểu rồi, nhưng còn phần timestamp thì mình hiểu theo ý bạn có phải là đổi thgian mượn sách hiện tại thành số giây rồi cộng thêm 14 ngày đổi thành giây xong quy đổi ngược thành thgian trả sách đúng không nhỉ @HR16 Mà nếu theo cách này thì với những gì mình học thì vẫn dùng cú pháp If … else và tăng lượng tính toán nhiều hơn để giảm code dài dòng phải không

Theo cách đó thì phải dùng thư viện :smiley: ko dùng thì cứ cộng thêm ngày là xong.

3 Likes

cho mình hỏi bạn dùng thư viện nào để giải quyết bài này, mình mới biết có 3 thư viện là iostream, cmath với math.h à @@

Nếu dùng thì dùng <ctime>
Bài này mình không dùng :smiley: để hiểu cách viết switch-case hơn.

2 Likes

ok thks bro, switch-case tối nay mình mới được học, hẳn học xog sẽ giải quyết bài này ngắn gọn hơn :thinking: :smiley: :smiley:

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