Follow us on...
Follow us on Twitter Follow us on Facebook Watch us on YouTube

Reviews hay rinh note 4, galaxy V được vi vu Hàn Quốc

Gameshow “Ai Là Triệu Phú” trên VTV đang chờ đón bạn – Tải ngay!

Lời mời tham dự chương trình từ thiện "Giáng Sinh Trong Mắt Em"

Mời offline công nghệ cùng Vn-Zoom tại Hà Nội

Chiêm ngưỡng BaoMoi đẹp "tuyệt diệu" trên Windows Phone

Mời offline công nghệ cùng VN-Zoom tại TP HCM
kết quả từ 1 tới 12 trên 12
  1. #1
    blue_rosevnn's Avatar
    blue_rosevnn vẫn chưa có mặt trong diễn đàn Búa Đá
    Tham gia
    Jan 2011
    Bài
    66
    Cảm ơn
    36
    Điểm
    19/12 bài viết

    Question Bài tập về đọc/ghi lên file txt?

    Bài toán của mình như sau:
    "Viết một chương trình cho phép đọc từ file gồm nhiều chuỗi liên tiếp, mỗi chuỗi gồm các phép toán + - * / và hai toán hạng. Ví dụ:
    2 + 3
    4 - 2
    5 * 3
    9 / 3
    Sau đó sẽ trả về chuỗi kết quả và ghi lại file khác như sau:
    2 + 3 = 5
    4- 2 = 2
    5 * 3 = 15
    9 / 3 = 3 "
    Ý tưởng của mình là sẽ có một mảng kí tự sẽ lưu từng kí tự trong file txt và sau đó thực hiện phép tính trên mã ascii sau đó ghi lại file text kết quả.
    Thực sự thì thao tác trên file mình mới tìm hiểu gần đây chưa được thành thạo mà thời gian nộp bài gấp rút.
    (Bài toán trên chưa phải là bài toán nguyên bản mà mình được giao làm bài tập nữa!)
    Đừng tin vào những gì bạn nghe.
    Hãy tin vào những gì bạn thấy.

  2. #2
    auauau97's Avatar
    auauau97 vẫn chưa có mặt trong diễn đàn Rìu Chiến Vàng
    Tham gia
    Jun 2010
    Đến từ
    Hà Nội
    Bài
    6.647
    Cảm ơn
    11.934
    Điểm
    5.263/3.016 bài viết

    Default

    Bạn có thể tham khảo bài này của bạn Kien_coi_1997:

    trong đó có cái code để xử lý các phép tính kiểu đó, bạn chỉ cần thêm cái ghi vào tệp là ổn
    Nothing is true, everything is permitted

  3. #3
    blue_rosevnn's Avatar
    blue_rosevnn vẫn chưa có mặt trong diễn đàn Búa Đá
    Tham gia
    Jan 2011
    Bài
    66
    Cảm ơn
    36
    Điểm
    19/12 bài viết

    Default

    Trích auauau97 View Post
    Bạn có thể tham khảo bài này của bạn Kien_coi_1997:

    trong đó có cái code để xử lý các phép tính kiểu đó, bạn chỉ cần thêm cái ghi vào tệp là ổn
    Mình đọc rồi mà không hiểu bạn ơi!
    Đừng tin vào những gì bạn nghe.
    Hãy tin vào những gì bạn thấy.

  4. #4
    Tung_Huynh's Avatar
    Tung_Huynh vẫn chưa có mặt trong diễn đàn Cống hiến cho [V-Z]
    Tham gia
    Jul 2009
    Đến từ
    Thái Nguyên
    Bài
    6.776
    Cảm ơn
    1.540
    Điểm
    4.135/2.750 bài viết

    Default

    "mỗi chuỗi gồm các phép toán + - * / và hai toán hạng"
    Điều trên là cố định chứ bạn?
    <toán hạng 1> <dấu cách> <toán tử> <dấu cách> <toán hạng 2>
    Nếu muốn khắc phục đoạn dấu cách kia thì chuẩn hóa chuỗi đọc là được

    Cách đọc thẳng từ file thì thế này. Đọc 1 dòng nhá:

    Đầu tiên đọc toán hạng 1 (in ra kiểm tra thử)
    Code:
    int a; fscanf(f,"%d",&a);
    printf("%d",a);
    bỏ qua dấu cách
    Code:
    fseek(f,SEEK_CUR,1);
    Đọc toán tử (in ra để xem thử)
    Code:
    char op; op=fgetc(f);
    printf("%c",op);
    bỏ qua dấu cách
    Code:
    fseek(f,SEEK_CUR,1);
    Đọc toán hạng 2 (in ra kiểm tra thử)
    Code:
    int b; fscanf(f,"%d",&b);
    printf("%d",b);
    Sau đó dùng switch case (op) để xem nó là phép toán gì và thực hiện tính thôi

  5. Có 5 thành viên cảm ơn Tung_Huynh cho bài viết này:
    19-6 (23-11-2011), asakurayo_92 (13-12-2011), auauau97 (23-11-2011), blue_rosevnn (26-11-2011), ttjkbongdem (23-11-2011)

  6. #5
    becon91's Avatar
    becon91 vẫn chưa có mặt trong diễn đàn Rìu Vàng
    Tham gia
    Sep 2009
    Bài
    838
    Cảm ơn
    147
    Điểm
    418/271 bài viết

    Default

    Trích Tung_Huynh View Post
    "mỗi chuỗi gồm các phép toán + - * / và hai toán hạng"
    Điều trên là cố định chứ bạn?
    <toán hạng 1> <dấu cách> <toán tử> <dấu cách> <toán hạng 2>
    Nếu muốn khắc phục đoạn dấu cách kia thì chuẩn hóa chuỗi đọc là được

    Cách đọc thẳng từ file thì thế này. Đọc 1 dòng nhá:

    Đầu tiên đọc toán hạng 1 (in ra kiểm tra thử)
    Code:
    int a; fscanf(f,"%d",&a);
    printf("%d",a);
    bỏ qua dấu cách
    Code:
    fseek(f,SEEK_CUR,1);
    Đọc toán tử (in ra để xem thử)
    Code:
    char op; op=fgetc(f);
    printf("%c",op);
    bỏ qua dấu cách
    Code:
    fseek(f,SEEK_CUR,1);
    Đọc toán hạng 2 (in ra kiểm tra thử)
    Code:
    int b; fscanf(f,"%d",&b);
    printf("%d",b);
    Sau đó dùng switch case (op) để xem nó là phép toán gì và thực hiện tính thôi
    Ko cần làm từng bước như vây.
    Có thể đọc hết các entry bằng fscanf
    Code luôn cho nhanh (file text <số thứ 1><space><toán tử><space><số thư 2>)
    PHP Code:
    #include <stdio.h>
    #include <stdlib.h>
    double calculate(int operand1int operand2char op)
    {
           switch (
    op)
           {
                  case 
    '+':return operand1+operand2;
                  case 
    '-':return operand1-operand2;
                  case 
    '*':return operand1*operand2;
                  case 
    '/':return (double)operand1/ (double)operand2;
           }
    }
    void readFile(FILE *fin)
    {
         
    int  a,b;
         
    double kg;
         
    char chkt;
         while (
    1)
         {
               
    kt=fscanf(fin,"%d%*c%c%*c%d%*c",&a,&ch,&b);
              
               if (
    kt>0)
               {
                        
    kg=calculate(a,b,ch);
                        
    printf("%d %c %d = %.2f\n",achbkg);              
               }
               else break;          
         }          
    }
    int main()
    {
        
    FILE *fin;
        
    fin=fopen("input.txt","r");
        
    readFile(fin);
        
    fclose(fin);
        
    system("pause");
        return 
    0;   

    Nhận code BT lớn: C/C++, C#, Java, Assembly
    kiet.heros@gmail.com
    https://www.facebook.com/long.sheng.2012

  7. Có 2 thành viên cảm ơn becon91 cho bài viết này:
    blue_rosevnn (26-11-2011), Tung_Huynh (24-11-2011)

  8. #6
    Tung_Huynh's Avatar
    Tung_Huynh vẫn chưa có mặt trong diễn đàn Cống hiến cho [V-Z]
    Tham gia
    Jul 2009
    Đến từ
    Thái Nguyên
    Bài
    6.776
    Cảm ơn
    1.540
    Điểm
    4.135/2.750 bài viết

    Default

    ủa.. %*c có nghĩa là đọc 1 ký tự mà không lưu vào biến àh
    Hay đó
    mà sao cuối cùng lại 1 cái %*c nữa nhỉ
    Thay đổi nội dung bởi Tung_Huynh; 24-11-2011 lúc 00:41.

  9. #7
    becon91's Avatar
    becon91 vẫn chưa có mặt trong diễn đàn Rìu Vàng
    Tham gia
    Sep 2009
    Bài
    838
    Cảm ơn
    147
    Điểm
    418/271 bài viết

    Default

    Trích Tung_Huynh View Post
    ủa.. %*c có nghĩa là đọc 1 ký tự mà không lưu vào biến àh
    Hay đó
    mà sao cuối cùng lại 1 cái %*c nữa nhỉ
    Thì cuối dòng có dấu Enter mà '\n'
    Nhận code BT lớn: C/C++, C#, Java, Assembly
    kiet.heros@gmail.com
    https://www.facebook.com/long.sheng.2012

  10. Có 1 thành viên cảm ơn becon91 cho bài viết này:
    Tung_Huynh (29-11-2011)

  11. #8
    blue_rosevnn's Avatar
    blue_rosevnn vẫn chưa có mặt trong diễn đàn Búa Đá
    Tham gia
    Jan 2011
    Bài
    66
    Cảm ơn
    36
    Điểm
    19/12 bài viết

    Default

    "Viết chương trình giao tiếp giữa 2 tiến trình sử dụng pipe như sau: Tiến trình A
    đọc từ file gồm nhiều chuỗi liên tiếp, mỗi chuỗi gồm các phép toán +, -, *, / và 2 toán
    hạng. Ví dụ trong file sẽ lưu các chuỗi dạng như sau:
    2 + 3
    1 - 2
    4 * 6
    15 / 3
    Sau đó tiến trình thứ nhất truyền các chuỗi dữ liệu này cho tiến trình thứ hai. Tiến trình
    thứ hai thực hiện tính toán và trả chuỗi kết quả về lại cho tiến trình đầu tiên để ghi lại vào
    file như sau:
    2 + 3 = 5
    1 - 2 = -1
    4 * 6 = 24
    15 / 3 = 5 "
    Còn đây là bài tập nguyên mẫu của mình được cho, mình post lên không có ý là nhờ các bạn làm dùm. Mình post lên để bạn nào có nhu cầu có bài tập lạ và thú vị để làm.
    Đừng tin vào những gì bạn nghe.
    Hãy tin vào những gì bạn thấy.

  12. #9
    becon91's Avatar
    becon91 vẫn chưa có mặt trong diễn đàn Rìu Vàng
    Tham gia
    Sep 2009
    Bài
    838
    Cảm ơn
    147
    Điểm
    418/271 bài viết

    Default

    Mình có đọc qua pipe trong hệ điều hành nhưng chưa biết cơ chế cụ thể nó như thế nào.
    Nhận code BT lớn: C/C++, C#, Java, Assembly
    kiet.heros@gmail.com
    https://www.facebook.com/long.sheng.2012

  13. #10
    Tung_Huynh's Avatar
    Tung_Huynh vẫn chưa có mặt trong diễn đàn Cống hiến cho [V-Z]
    Tham gia
    Jul 2009
    Đến từ
    Thái Nguyên
    Bài
    6.776
    Cảm ơn
    1.540
    Điểm
    4.135/2.750 bài viết

    Default Cơ chế pipe (đường ống)

    Trích becon91 View Post
    Mình có đọc qua pipe trong hệ điều hành nhưng chưa biết cơ chế cụ thể nó như thế nào.
    Khi nhìn riêng 1 tiến trình đang được xử lý thì pipe vẫn là xử lý nối tiếp, nhưng khi có nhiều tiến trình cần được xử lý cùng lúc thì pipe lại thể hiện xử lý song song trên nhiều đường ống

    Tại thời điểm t1 tiến trình A đi vào và thực hiện đọc file, tiến trình B ở ngoài chờ
    Đến thời điểm t2 tiến trình A đọc file xong và chuyển sang bộ phận xử lý tính toán, tiến trình B đi vào đọc file (vì lúc này A đã ra khỏi bộ phận đọc file, bộ phận này đang rảnh nên B tranh thủ nhảy vào đọc file để tiết kiệm thời gian)
    Đến thời điểm t3 tiến trình A xử lý tính toán xong và thoát ra ngoài hoàn thành sản phẩm, tiến trình B đọc file xong và chuyển sang xử lý tính toán
    Thời điểm t4 tiến trình B cũng xử lý xong và ra ngoài hoàn thành sản phẩm

    Như vậy nếu bộ máy hoạt động liên tục không ngừng nghỉ và luôn có tiến trình sẵn sàng ở bên ngoài thì trong 1 chu kỳ công việc (đọc file - xử lý) thì sẽ tạo ra được 2 sản phẩm.
    Giả sử chu kỳ có 5 công việc thì cứ 1 chu kỳ sẽ tạo ra được 5 sản phẩm. Các tiến trình chờ ở bên ngoài chỉ cần đợi 1/5 chu kỳ, thấy máy rảnh là vào
    Còn đối với xử lý nối tiếp mà không có pipe thì bắt buộc 1 tiến trình chờ ngay tiếp sau tiến trình đang thực hiện phải đợi đúng sau 1 chu kỳ (khi tiến trình đang thực hiện kết thúc) mới có thể vào thực hiện

    Nếu như chỉ có đúng 1 tiến trình đi vào bộ máy hoặc là các tiến trình đi vào trễ nhau lớn hơn hoặc bằng 1 chu kỳ thì việc sử dụng pipe này coi như là vô tác dụng, không phát huy được điểm mạnh.
    Nhưng nếu các tiến trình liên tục đến chờ được xử lý ở ngoài, máy hoạt động không nghỉ thì hiệu suất đạt tối đa, càng nhiều công việc trong 1 quá trình thì càng thấy được ưu điểm

    Ảnh minh họa


    Nó giống như 1 công nghệ dây chuyền sản xuất ôtô

  14. #11
    blue_rosevnn's Avatar
    blue_rosevnn vẫn chưa có mặt trong diễn đàn Búa Đá
    Tham gia
    Jan 2011
    Bài
    66
    Cảm ơn
    36
    Điểm
    19/12 bài viết

    Default

    Code:
    void readWriteFile(FILE *fin)
    {
         int  a,b;
         double kg;
         char ch, kt;
         while (1)
         {
               kt=fscanf(fin,"%d%*c%c%*c%d%*c",&a,&ch,&b);
              
               if (kt>0)
               {
                        kg=calculate(a,b,ch);
                        fprintf(fin,"%d %c %d %d\n",a,ch,b,kg);            
               }
               else break;          
         }          
    }
    Nếu sửa hàm readFile thành hàm readWriteFile bằng cách thêm code fprintf(fin,"%d %c %d %d\n",a,ch,b,kg) vậy có đúng không các bác.
    Chứ mình chạy chươn trình thì không báo lỗi nhưng mở file .txt thì nó vẫn trơ trơ không gì thay đổi. Một điều nữa là không biết truyền thế nào cho ra chuỗi có dấu "="
    Thứ lỗi cho mình, mình mới học về thao tác trên file nên rất gà,nhiều tài liệu của mình thì không tập trung vào vấn đề thao tác file cho lắm.
    Đừng tin vào những gì bạn nghe.
    Hãy tin vào những gì bạn thấy.

  15. #12
    Tung_Huynh's Avatar
    Tung_Huynh vẫn chưa có mặt trong diễn đàn Cống hiến cho [V-Z]
    Tham gia
    Jul 2009
    Đến từ
    Thái Nguyên
    Bài
    6.776
    Cảm ơn
    1.540
    Điểm
    4.135/2.750 bài viết

    Default

    Trích blue_rosevnn View Post
    Code:
    void readWriteFile(FILE *fin)
    {
         int  a,b;
         double kg;
         char ch, kt;
         while (1)
         {
               kt=fscanf(fin,"%d%*c%c%*c%d%*c",&a,&ch,&b);
              
               if (kt>0)
               {
                        kg=calculate(a,b,ch);
                        fprintf(fin,"%d %c %d %d\n",a,ch,b,kg);            
               }
               else break;          
         }          
    }
    Nếu sửa hàm readFile thành hàm readWriteFile bằng cách thêm code fprintf(fin,"%d %c %d %d\n",a,ch,b,kg) vậy có đúng không các bác.
    Chứ mình chạy chươn trình thì không báo lỗi nhưng mở file .txt thì nó vẫn trơ trơ không gì thay đổi. Một điều nữa là không biết truyền thế nào cho ra chuỗi có dấu "="
    Thứ lỗi cho mình, mình mới học về thao tác trên file nên rất gà,nhiều tài liệu của mình thì không tập trung vào vấn đề thao tác file cho lắm.
    nếu vừa đọc vừa ghi thì phải định dạng cho file đó từ lúc mở file

    fin=fopen("input.txt","r+");

    nếu không được thì dùng thử
    fin=fopen("input.txt","w+");

    đấy là chế độ mở file để đọc vào ghi

    Nhưng vấn đề vừa đọc file ra để xử lý rồi ghi luôn lại như trên khi mà chưa đọc xong thế kia thì cũng có vấn đề đó

    Có lẽ bạn nên tách nó ra thành 2 file riêng nhau, 1 cái đọc và 1 cái ghi
    Sau đó copy từ file ghi đè lên file đọc (nếu muốn )

 

 

Quyền sử dụng

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