Từ 1 tới 10 trên tổng số 10 kết quả

Đề tài: Tính giá trị biểu thức (không dùng CTDL)

  1. #1
    Ngày gia nhập
    12 2008
    Bài viết
    2

    Thumbs down Tính giá trị biểu thức (không dùng CTDL)

    Input : chuỗi giá trị biểu thức đơn giản ( không có dấu ngoặc )
    Output : giá trị biểu thức
    không dùng CTDL

    Mình đang suy nghĩ vấn đế này. Và mình còn đang rối ở việc tách số trong chuỗi và xác định độ ưu tiên của các toán tử. Mong các bạn giúp đỡ
    vd : 123+4*5-6/7
    Lưu Trường Hải Lân

  2. #2
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Cho bạn đoạn code minh họa việc tách số và toán tử từ chuỗi nè :

    C++ Code:
    1.     char s[] = "123+4*5-6/7";
    2.     double num, aNum[100];
    3.     char aOpr[100];
    4.     char s2[100];
    5.     int i = 0, n1 = 0, n2 = 0, n3 = 0;
    6.  
    7.     while (s[i] != 0)
    8.     {
    9.         if (s[i] >= '0' && s[i] <= '9')
    10.         {
    11.             s2[n3++] = s[i];
    12.         }
    13.         else
    14.         {
    15.             s2[n3++] = 0;
    16.             n3 = 0;
    17.             sscanf(s2,"%lf",&num);
    18.             aNum[n1++] = num;
    19.  
    20.             if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/')
    21.             {
    22.                 aOpr[n2++] = s[i];
    23.             }
    24.         }
    25.        
    26.         i++;   
    27.     }
    28.  
    29.     s2[n3++] = 0;
    30.     sscanf(s2,"%lf",&num);
    31.     aNum[n1++] = num;
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  3. #3
    Ngày gia nhập
    12 2008
    Bài viết
    2

    Cám ơn bạn nhiều. Nhưng bạn có thể giải thích giùm tôi hàm sscanf() được không ? Tôi không hiểu hàm này ?
    Lưu Trường Hải Lân

  4. #4
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Trích dẫn Nguyên bản được gửi bởi luutruonghailan Xem bài viết
    Cám ơn bạn nhiều. Nhưng bạn có thể giải thích giùm tôi hàm sscanf() được không ? Tôi không hiểu hàm này ?
    Hàm này dùng để nhập số từ luồng vào là chuỗi. Trong trường hợp này có thể xem như nó chuyển chuỗi thành số kiểu double.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  5. #5
    Ngày gia nhập
    11 2008
    Nơi ở
    Neverland
    Bài viết
    48

    C Code:
    1. #include <stdio.h>
    2. #include <conio.h>
    3.  
    4. void split(char s[],char operand[],char oper[],int* n_oper) {
    5.     int i , j , k;
    6.     int value;
    7.     i = j = k = 0;
    8.     while (s[i] != 0) {
    9.         value = 0;
    10.         while (s[i] >= '0' & s[i] <= '9') {
    11.             value = value * 10 + s[i] - '0';
    12.             i++;
    13.         }
    14.         operand[j++] = value;
    15.         if (s[i] == 0) break;
    16.         else oper[k++] = s[i++];
    17.     }
    18.     oper[k] = '\0';
    19.     *n_oper = k;
    20. }
    21. int cal(int o1,int o2,char operators) {
    22.     switch (operators) {
    23.         case '+':return o1 + o2;
    24.         case '-':return o1 - o2;
    25.         case '*':return o1 * o2;
    26.         case '/':return o1 / o2;
    27.     }
    28. }
    29. int eval(char operand[],char oper[]) {
    30.     int i , result , o;
    31.     char operators;
    32.     i = 0;
    33.     result = operand[i];
    34.    
    35.     while (oper[i] == '*' || oper[i] == '/') {
    36.         result = cal(result,operand[i + 1],oper[i]);
    37.         i++;
    38.     }
    39.    
    40.     while (oper[i] != 0) {
    41.         o = operand[i + 1];
    42.         operators = oper[i];
    43.         i++;
    44.         while (oper[i] == '*' || oper[i] == '/') {
    45.             o = cal(o,operand[i + 1],oper[i]);
    46.             i++;
    47.         }
    48.         result = cal(result,o,operators);
    49.     }
    50.     return result;
    51. }
    52.  
    53. int main() {
    54.     char s[] = "123-8/5+3-2+6/2";
    55.     char operand[100],oper[100];
    56.     int n_oper;
    57.     split(s,operand,oper,&n_oper);
    58.     printf("%s = %d\n",s,eval(operand,oper));
    59.     getch();
    60. }
    Bài này mình Code nói thực là chưa tối ưu . Anh em nào có cách làm hay bài này post bài lên để mọi người tham khảo .
    Đã được chỉnh sửa lần cuối bởi trung_dk070384 : 21-12-2008 lúc 02:42 PM.
    I'm superman

  6. #6
    Ngày gia nhập
    12 2008
    Bài viết
    2

    Mặc định Tính giá trị biểu thức (không dùng CTDL)

    Tui mới vừa làm xong.
    Post lên mấy bạn cho ý kiến giùm mình nha (còn trường hợp dấu ngoặc tui chưa xử lý)
    Quy ước :
    - dấu + - nhập bình thường
    - dấu * / có thể nhập * x, :
    - số thập phân ,
    Đã được chỉnh sửa lần cuối bởi luutruonghailan : 03-02-2009 lúc 08:06 AM. Lý do: Mình sẽ upfile lên cho dễ coi
    Lưu Trường Hải Lân

  7. #7
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Code:
    #include "FunctionString.h"
    #include "FunctionMath.h"
    Không có 2 cái trên thì sao test được bạn?

  8. #8
    Ngày gia nhập
    12 2008
    Bài viết
    2

    Oh. Xin lỗi. Mình sẽ cố gắng post đầy đủ lên. Các bạn test giùm mình nhá
    Lưu Trường Hải Lân

  9. #9
    Ngày gia nhập
    12 2008
    Bài viết
    2

    Chào các bạn. Mình post bài lên các bạn xem giúp mình nhen.
    Quy tắc:
    - dấu thập phân ,
    - dấu nhân * . x
    - dấu chia : /
    - dấu cộng trừ bình thường
    --> đây là trường hợp đơn giản, chưa có ngoặc nhen
    Attached Files Attached Files
    Lưu Trường Hải Lân

  10. #10
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Mình mới test qua.
    - Nhân với 0 gặp vấn đề không ra kết quả đúng.
    - Nếu biểu thức xen dấu cách trống thì hỏng, cái này bạn làm thêm một hàm xóa cách trống trước đã

    Có gì tối mình xem thêm.

Các đề tài tương tự

  1. Lập trình C bài toán ctdl
    Gửi bởi ke_di_hoi trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 24-09-2013, 12:41 PM
  2. Cần bài tập và giải đáp CTDL ĐH Cần Thơ
    Gửi bởi mohamedtr trong diễn đàn Tài liệu, ebooks và công cụ
    Trả lời: 1
    Bài viết cuối: 12-08-2011, 05:21 PM
  3. Tìm đề thi về CTDL Tree
    Gửi bởi hieuuu trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 1
    Bài viết cuối: 14-11-2010, 06:49 PM
  4. Bài tập môn CTDL& GT
    Gửi bởi hungbkpro90 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 12-10-2010, 10:17 PM
  5. Tài liệu về CTDL
    Gửi bởi vtien_uit trong diễn đàn Tài liệu, ebooks và công cụ
    Trả lời: 1
    Bài viết cuối: 25-11-2008, 09:52 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn