Chạy bằng CodeBlocks thì đúng còn chạy bằng Dev - C++ thì ra kết quả sai?

Đề bài yêu cầu:

Viết chương trình nhập ngày, tháng, năm.

  • Tháng có bao nhiêu ngày
  • Tìm ngày trước ngày vừa nhập.
  • Tìm ngày sau ngày vừa nhập

Em có viết đoạn code như ở dưới. Em thắc mắc là khi e dùng CodeBlocks thì nó chạy đúng còn khi e dùng Dev - C++ thì nó lại ra sai. Các bác giúp em giải đáp với ạ. Em cảm ơn ạ!!

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#define MAX 99

void ngaycuathang(int thang, int nam)
{
    int NgayTrongThang;
    switch(thang)
    {
    case 1: case 3: case 5: case 7: case 8: case 10: case 12:
        NgayTrongThang = 31;
        printf("\n\tThang %d co 31 ngay!", thang);
        break;
    case 4: case 6: case 9: case 11:
        NgayTrongThang = 30;
        printf("\n\tThang %d co 30 ngay!", thang);
        break;
    case 2:
        if((nam%4==0 && nam%100 != 0)|| nam%400==0)
        {
            NgayTrongThang = 29;
            printf("\n\tThang %d co 29 ngay!", thang);
        }
        else
        {
            NgayTrongThang = 28;
            printf("\n\tThang %d co 28 ngay!", thang);
        }
        break;
    }
}

void TimNgayTruocDo(int ngay, int thang, int nam)
{
    int NgayTrongThang;
    if(ngay==1)
    {
        if(thang==1)
        {
            thang=12;
            nam = nam-1;
        }
        else
            thang = thang-1;
            ngay = NgayTrongThang;
    }
    else
    {
        ngay=ngay-1;
    }
    printf("\n\tNgay truoc ngay vua nhap la: %d/%d/%d", ngay, thang, nam);
}

void TimNgaySauDo(int ngay, int thang, int nam)
{
    int NgayTrongThang;
    if(ngay==NgayTrongThang)
    {
        if(thang==12)
        {
            thang = 1;
            nam = nam+1;
        }
        else
            thang = thang + 1;
            ngay = 1;
    }
    else
    {
        ngay=ngay+1;
    }
    printf("\n\tNgay sau ngay vua nhap la: %d/%d/%d", ngay, thang, nam);
}

int main()
{
    int ngay, thang, nam;
    int NgayTrongThang;
    printf("Nhap ngay: ");
    scanf("%d", &ngay);
    while(ngay<1)
    {
        printf("\nNhap lai ngay: ");
        scanf("%d", &ngay);
    }
    printf("\nNhap thang: ");
    scanf("%d", &thang);
    while(thang<1 || thang>12)
    {
        printf("\nNhap lai thang: ");
        scanf("%d", &ngay);
    }
    printf("\nNhap nam: ");
    scanf("%d", &nam);
    if (ngay <= NgayTrongThang)
    {
        printf("\nNgay vua nhap la: %d/%d/%d", ngay, thang, nam);
        ngaycuathang(thang, nam);
        TimNgayTruocDo(ngay, thang, nam);
        TimNgaySauDo(ngay, thang, nam);
        printf("\n");
    }
    else
        printf("\nNgay khong hop le! Vui long nhap lai!\n");
	return 0;
}

Nói chung là code bạn sai rồi.

Đây copy paste không sửa

image

Tự dưng thấy các biến ngayTrongThang khác được khai báo mới đầy trong các hàm khác mà chẳng thấy biến ngayTrongThang trong main không thấy có gán gì cả. CodeBlocks ra đúng mới lạ đấy.


Nguyên nhân code sai là do chưa có cách hiểu đúng đắn về biến trong C, chưa học kỹ về hàm, blah blah blah. Đọc 2 link dưới để hiểu:

http://aelinik.free.fr/c/ch14.htm

và ghi nhớ từ khoá scope.

2 Likes
#include <math.h>
#include <stdlib.h>
#include <string.h>
#define MAX 99

int ngaycuathang(int thang, int nam)
{
    int NgayTrongThang;
    switch(thang)
    {
    case 1: case 3: case 5: case 7: case 8: case 10: case 12:
        NgayTrongThang = 31;
        break;
    case 4: case 6: case 9: case 11:
        NgayTrongThang = 30;
        break;
    case 2:
        if((nam%4==0 && nam%100 != 0)|| nam%400==0)
        {
            NgayTrongThang = 29;
        }
        else
        {
            NgayTrongThang = 28;
        }
        break;
    }
    return NgayTrongThang;
}

void TimNgayTruocDo(int ngay, int thang, int nam)
{
    int NgayTrongThang = ngaycuathang(thang, nam);
    if(ngay==1)
    {
        if(thang==1)
        {
            thang=12;
            nam = nam-1;
        }
        else
            thang = thang-1;
            ngay = NgayTrongThang;
    }
    else
    {
        ngay=ngay-1;
    }
    printf("\n\tNgay truoc ngay vua nhap la: %d/%d/%d", ngay, thang, nam);
}

void TimNgaySauDo(int ngay, int thang, int nam)
{
    int NgayTrongThang = ngaycuathang(thang, nam);
    if(ngay==NgayTrongThang)
    {
        if(thang==12)
        {
            thang = 1;
            nam = nam+1;
        }
        else
            thang = thang + 1;
            ngay = 1;
    }
    else
    {
        ngay=ngay+1;
    }
    printf("\n\tNgay sau ngay vua nhap la: %d/%d/%d", ngay, thang, nam);
}

int main()
{
    int ngay, thang, nam;
    int NgayTrongThang;
    do
    {
        printf("Nhap thang: ");
        scanf("%d", &thang);
    }
    while(thang<1 || thang>12);
    printf("\nNhap nam: ");
    scanf("%d", &nam);

    NgayTrongThang = ngaycuathang(thang, nam);

    do
    {
        printf("\nNhap ngay: ");
        scanf("%d", &ngay);
    }
    while(ngay<1||ngay>NgayTrongThang);

    printf("\n\tNgay vua nhap la: %d/%d/%d", ngay, thang, nam);

    printf("\n\tThang %d nam %d co %d ngay!", thang, nam, NgayTrongThang);

    TimNgayTruocDo(ngay, thang, nam);

    TimNgaySauDo(ngay, thang, nam);

    printf("\n");

	return 0;
}~~~

Em làm lại như kia chuẩn chưa ạ

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