QJ424 - Tính giá trị biểu thức

Xem dưới dạng PDF

Gửi bài giải

Điểm: 100
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 256M

Tác giả:
Kiểu bài tập

Đây là bài toán điền khuyết hoàn thiện mã nguồn. Hãy hoàn thiện mã nguồn được cho trong đề, sao chép vào khung mã bên phải, chọn ngôn ngữ biên dịch tương ứng (C/Java) rồi nộp bài. Nếu ngôn ngữ của mã nguồn cho trong đề không phải là duy nhất thì chỉ cần chọn một trong số đó để hoàn thiện và nộp là được. Sau khi sao chép cần xóa các dấu gạch dưới ở phần điền khuyết trong mã nguồn và điền đáp án của bạn vào. Sau khi nộp nếu chưa qua được, ngoài việc xem xét lỗi ở phần điền khuyết, còn cần chú ý xem có phải do sau khi sao chép đã sửa nhầm phần không phải điền khuyết dẫn đến lỗi hay không.

Mặc dù chúng ta đã học lập trình khá lâu, nhưng với một biểu thức bốn phép tính hỗn hợp đơn giản, nếu để chúng ta hoàn toàn tự lập trình từ đầu để phân tích thì vẫn hơi khó khăn.

Ở đây, chúng ta đơn giản hóa bài toán một chút, giả sử chỉ có phép cộng và phép nhân, và không có dấu ngoặc để thay đổi thứ tự ưu tiên. Lại giả sử các số tham gia phép tính đều là số nguyên dương.

Với nhiều điều kiện ràng buộc như vậy, việc phân tích biểu thức có vẻ đơn giản hơn nhiều.

Đoạn mã dưới đây giải quyết bài toán này. Hãy đọc kỹ mã nguồn và điền vào phần mã còn thiếu ở chỗ gạch dưới.

#include <stdio.h>
int f3(const char* s, int begin, int end)
{
    int sum = 0;
    int i;
    for(i=begin; i<end; i++){
        if(s[i]==' ') continue;
        sum = sum * 10 + (s[i]-'0');
    }
    return sum;
}

int f2(const char* s, int begin, int end)
{
    int p = begin;
    int pro = 1;
    while(1){
        int p0 = p;
        while(p!=end && s[p]!='*') p++;
        pro *= _______________________________;
        if(p==end) break; 
        p++;
    }
    //printf("f2: pro=%d\n", pro);
    return pro;
}

int f(const char* s)
{
    int p = 0;
    int sum = 0;
    while(1){
        int p0 = p;
        while(s[p]!=0 && s[p]!='+') p++;
        sum += f2(s,p0,p);
        if(s[p]==0) break;
        p++;
    }

    return sum;
}

int main()
{
    printf("%d\n", f("12+18+5*4*3+10"));
    printf("%d\n", f("1+21+31"));
    printf("%d\n", f("10*20*15"));

    return 0;
}

Dữ liệu vào

Không có

Dữ liệu ra

Không có


Nhận xét

Không có ý kiến tại thời điểm này.