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

Đề tài: Sắp xếp trực tiếp trên tệp với C

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

    Red face Sắp xếp trực tiếp trên tệp với C

    Bộ nhớ trong của máy tính là có hạn.Vì vậy việc sử dụng bộ nhớ ngoài để lưu trữ là rất cần thiết.Nhưng làm sao để sử lí trực tiếp trên bộ nhớ ngoài giống như bộ nhớ trong đây?Mình mới học C cũng xin đưa ra một chương trình.Mời mọi người tham khảo và đóng góp ý kiến nhé:

    C Code:
    1. #include"stdio.h"
    2. #include"conio.h"
    3. #include"dos.h"
    4. #include"process.h"
    5. #include"string.h"
    6. typedef struct
    7.                 {
    8.                     char ten[21];
    9.                     float diem;
    10.                 }sinh_vien;
    11. FILE *f;
    12. sinh_vien sv;
    13. int n;
    14. char s[31];
    15. void nhap();
    16. void sap_xep();
    17. void in();
    18. void main()
    19. {
    20.     textmode(C80);
    21.     textbackground(BLUE);
    22.     clrscr();
    23.     window(15,1,60,1);
    24.     textbackground(YELLOW);
    25.     textcolor(10);
    26.     clrscr();
    27.     cprintf(" CHUONG TRINH QUAN LI DIEM SINH VIEN TREN TEP");
    28.     window(1,2,80,25);
    29.     textbackground(BLUE);
    30.     textcolor(WHITE);
    31.     clrscr();
    32.     nhap();
    33.     sap_xep();
    34.     in();
    35.     clrscr();
    36.     printf("xong roi");
    37.     getch();
    38. }
    39. void nhap()
    40. {
    41.     char tent[21];
    42.     float diemt;
    43.     int i,j;
    44.     printf("\n Moi ban nhap vao so sinh vien can quan li:");
    45.     do
    46.     {
    47.         fflush(stdin);scanf("%d",&n);
    48.         if(n<1) printf(" Nhap sai roi.\n So sinh vien phai lon hon 0.\n Nhap lai di.\n So sinh vien:");
    49.     }
    50.     while (n<1);
    51.     printf(" Ten tep muon luu:");
    52.     do
    53.     {
    54.         fflush(stdin);gets(s);
    55.         if(s[0]==0) printf(" Nhap sai roi.\n Ten tep phai khac rong chu.\n Nhap lai di.\n Ten tep:");
    56.     }
    57.     while(s[0]==0);
    58.     s[30]=0;
    59.     clrscr();
    60.     printf(" Bat dau nhap thong tin cho lop thoi.\n");
    61.     delay(500);
    62.     f=fopen("TAM.DT","wb");
    63.     for (i=0;i<n;++i)
    64.     {
    65.         clrscr();
    66.         printf("\n Ten sinh vien thu %d:",i+1);
    67.         do
    68.         {
    69.             fflush(stdin);gets(tent);
    70.             if(tent[0]==0) printf("   Chua nhap ten roi.\n   Nhap lai ban oi.\n   Ten sinh vien la:");
    71.         }
    72.         while(tent[0]==0);
    73.         tent[20]=0;
    74.         for(j=0;j<21;++j) sv.ten[j]=0;
    75.         strcpy(sv.ten,tent);
    76.         printf("         Diem:");
    77.         do
    78.         {
    79.             fflush(stdin);scanf("%f",&diemt);
    80.             if((diemt<0)||(diemt>10))
    81.                 printf("   Nhap sai roi.\n   Nhap lai di.\n   Diem:");
    82.         }
    83.         while((diemt<0)||(diemt>10));
    84.         sv.diem=diemt;
    85.         fwrite(&sv,sizeof(sinh_vien),1,f);
    86.     }
    87.     fclose(f);
    88. }
    89. void sap_xep()
    90. {
    91.     sinh_vien svt;
    92.     int i,j;
    93.     f=fopen("TAM.DT","r+b");
    94.     for(i=0;i<n-1;++i)
    95.     {
    96.         fseek(f,i*sizeof(sinh_vien),SEEK_SET);
    97.         fread(&sv,sizeof(sinh_vien),1,f);
    98.         for(j=i+1;j<n;++j)
    99.         {
    100.             fseek(f,j*sizeof(sinh_vien),SEEK_SET);
    101.             fread(&svt,sizeof(sinh_vien),1,f);
    102.             if(svt.diem>sv.diem)
    103.             {
    104.                 fseek(f,i*sizeof(sinh_vien),SEEK_SET);
    105.                 fwrite(&svt,sizeof(sinh_vien),1,f);
    106.                 fseek(f,j*sizeof(sinh_vien),SEEK_SET);
    107.                 fwrite(&sv,sizeof(sinh_vien),1,f);
    108.                 sv=svt;
    109.             }
    110.         }
    111.     }
    112.     fclose(f);
    113. }
    114. void in()
    115. {
    116.     FILE *f1;
    117.     int i;
    118.     f=fopen("TAM.DT","rb");
    119.     f1=fopen(s,"wt");
    120.     fprintf(f1,"                 BANG DIEM\n\n");
    121.     fprintf(f1,"   ÉÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍ»\n");
    122.     fprintf(f1,"   º STT ³       HO VA TEN      ³ DIEM º\n");
    123.     for(i=0;i<n;++i)
    124.     {
    125.         fread(&sv,sizeof(sinh_vien),1,f);
    126.         fprintf(f1,"   ÇÄÄÄÄÄ+ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ+ÄÄÄÄÄĶ\n");
    127.         fprintf(f1,"   º %3d ³ %-20s ³ %4.1f º\n",i+1,sv.ten,sv.diem);
    128.     }
    129.     fprintf(f1,"   ÈÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍͼ");
    130.     fcloseall();
    131.     system("del TAM.DT");
    132. }

    Có chút lỗi ở phàn cuối in ra tệp.Do mình viết trên Dos rồi copy ra win nên trình bày không đẹp lắm.Nhưng chương trình vẫn chạy ngon
    Đã được chỉnh sửa lần cuối bởi ducthiem90 : 19-12-2008 lúc 11:07 PM.

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

    Mình cũng có làm vài cái kiểu kiểu này rồi.
    Nhưng rốt cuộc đều phải load tất cả các File đó vào RAM cùng lúc để xử lý.

    Code:
    f=fopen("TAM.DT","r+b");
    for(i=0;i<n-1;++i)
    Có cách nào để xử lý từng phần đc ko ???

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

    Trích dẫn Nguyên bản được gửi bởi ducthiem90 Xem bài viết
    Bộ nhớ trong của máy tính là có hạn.Vì vậy việc sử dụng bộ nhớ ngoài để lưu trữ là rất cần thiết.Nhưng làm sao để sử lí trực tiếp trên bộ nhớ ngoài giống như bộ nhớ trong đây?Mình mới học C cũng xin đưa ra một chương trình.Mời mọi người tham khảo và đóng góp ý kiến nhé:

    C Code:
    1. #include"stdio.h"
    2. #include"conio.h"
    3. #include"dos.h"
    4. #include"process.h"
    5. #include"string.h"
    6. typedef struct
    7.                 {
    8.                     char ten[21];
    9.                     float diem;
    10.                 }sinh_vien;
    11. FILE *f;
    12. sinh_vien sv;
    13. int n;
    14. char s[31];
    15. void nhap();
    16. void sap_xep();
    17. void in();
    18. void main()
    19. {
    20.     textmode(C80);
    21.     textbackground(BLUE);
    22.     clrscr();
    23.     window(15,1,60,1);
    24.     textbackground(YELLOW);
    25.     textcolor(10);
    26.     clrscr();
    27.     cprintf(" CHUONG TRINH QUAN LI DIEM SINH VIEN TREN TEP");
    28.     window(1,2,80,25);
    29.     textbackground(BLUE);
    30.     textcolor(WHITE);
    31.     clrscr();
    32.     nhap();
    33.     sap_xep();
    34.     in();
    35.     clrscr();
    36.     printf("xong roi");
    37.     getch();
    38. }
    39. void nhap()
    40. {
    41.     char tent[21];
    42.     float diemt;
    43.     int i,j;
    44.     printf("\n Moi ban nhap vao so sinh vien can quan li:");
    45.     do
    46.     {
    47.         fflush(stdin);scanf("%d",&n);
    48.         if(n<1) printf(" Nhap sai roi.\n So sinh vien phai lon hon 0.\n Nhap lai di.\n So sinh vien:");
    49.     }
    50.     while (n<1);
    51.     printf(" Ten tep muon luu:");
    52.     do
    53.     {
    54.         fflush(stdin);gets(s);
    55.         if(s[0]==0) printf(" Nhap sai roi.\n Ten tep phai khac rong chu.\n Nhap lai di.\n Ten tep:");
    56.     }
    57.     while(s[0]==0);
    58.     s[30]=0;
    59.     clrscr();
    60.     printf(" Bat dau nhap thong tin cho lop thoi.\n");
    61.     delay(500);
    62.     f=fopen("TAM.DT","wb");
    63.     for (i=0;i<n;++i)
    64.     {
    65.         clrscr();
    66.         printf("\n Ten sinh vien thu %d:",i+1);
    67.         do
    68.         {
    69.             fflush(stdin);gets(tent);
    70.             if(tent[0]==0) printf("   Chua nhap ten roi.\n   Nhap lai ban oi.\n   Ten sinh vien la:");
    71.         }
    72.         while(tent[0]==0);
    73.         tent[20]=0;
    74.         for(j=0;j<21;++j) sv.ten[j]=0;
    75.         strcpy(sv.ten,tent);
    76.         printf("         Diem:");
    77.         do
    78.         {
    79.             fflush(stdin);scanf("%f",&diemt);
    80.             if((diemt<0)||(diemt>10))
    81.                 printf("   Nhap sai roi.\n   Nhap lai di.\n   Diem:");
    82.         }
    83.         while((diemt<0)||(diemt>10));
    84.         sv.diem=diemt;
    85.         fwrite(&sv,sizeof(sinh_vien),1,f);
    86.     }
    87.     fclose(f);
    88. }
    89. void sap_xep()
    90. {
    91.     sinh_vien svt;
    92.     int i,j;
    93.     f=fopen("TAM.DT","r+b");
    94.     for(i=0;i<n-1;++i)
    95.     {
    96.         fseek(f,i*sizeof(sinh_vien),SEEK_SET);
    97.         fread(&sv,sizeof(sinh_vien),1,f);
    98.         for(j=i+1;j<n;++j)
    99.         {
    100.             fseek(f,j*sizeof(sinh_vien),SEEK_SET);
    101.             fread(&svt,sizeof(sinh_vien),1,f);
    102.             if(svt.diem>sv.diem)
    103.             {
    104.                 fseek(f,i*sizeof(sinh_vien),SEEK_SET);
    105.                 fwrite(&svt,sizeof(sinh_vien),1,f);
    106.                 fseek(f,j*sizeof(sinh_vien),SEEK_SET);
    107.                 fwrite(&sv,sizeof(sinh_vien),1,f);
    108.                 sv=svt;
    109.             }
    110.         }
    111.     }
    112.     fclose(f);
    113. }
    114. void in()
    115. {
    116.     FILE *f1;
    117.     int i;
    118.     f=fopen("TAM.DT","rb");
    119.     f1=fopen(s,"wt");
    120.     fprintf(f1,"                 BANG DIEM\n\n");
    121.     fprintf(f1,"   ÉÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍ»\n");
    122.     fprintf(f1,"   º STT ³       HO VA TEN      ³ DIEM º\n");
    123.     for(i=0;i<n;++i)
    124.     {
    125.         fread(&sv,sizeof(sinh_vien),1,f);
    126.         fprintf(f1,"   ÇÄÄÄÄÄ+ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ+ÄÄÄÄÄĶ\n");
    127.         fprintf(f1,"   º %3d ³ %-20s ³ %4.1f º\n",i+1,sv.ten,sv.diem);
    128.     }
    129.     fprintf(f1,"   ÈÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍͼ");
    130.     fcloseall();
    131.     system("del TAM.DT");
    132. }


    Có chút lỗi ở phàn cuối in ra tệp.Do mình viết trên Dos rồi copy ra win nên trình bày không đẹp lắm.Nhưng chương trình vẫn chạy ngon
    *Bọc code vào tag code nghe bạn.

  4. #4
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    Mình nghĩ,kiểu gì thì kiểu,đằng nào chẳng phải load FIle Lên Ram thì máy mới sử lý được,vì thế việc đọc vào bộ nhớ trong là bắt buộc phải xảy ra,hehe,còn nếu
    Nhưng làm sao để sử lí trực tiếp trên bộ nhớ ngoài giống như bộ nhớ trong đây
    thì có lẽ bạn phải tự làm thôi

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

    Nếu muốn đọc/ghi vào vị trí bất kỳ trên file thì dùng hàm fseek.

    PS : đưa code vào tag nha.
    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.

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

    Mặc định Sắp xếp trực tiếp trên tệp với C

    Ý bạn là sử lí từng phần thế nào cơ?
    Dù phải load file lên Ram nhưng thực chất chương trình đâu có chiếm bộ nhớ bởi nó ghi đọc trực tiếp lên tệp mà.Nếu muốn bạn có thể đóng tệp sau mỗi lần ghi.Như vậy bộ nhớ đệm của file không chiếm nhiều bộ nhớ bằng việc dùng mảng bởi bộ nhớ trong

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

    Trích dẫn Nguyên bản được gửi bởi ducthiem90 Xem bài viết
    Ý bạn là sử lí từng phần thế nào cơ?
    Dù phải load file lên Ram nhưng thực chất chương trình đâu có chiếm bộ nhớ bởi nó ghi đọc trực tiếp lên tệp mà.Nếu muốn bạn có thể đóng tệp sau mỗi lần ghi.Như vậy bộ nhớ đệm của file không chiếm nhiều bộ nhớ bằng việc dùng mảng bởi bộ nhớ trong
    Nhất trí với bạn. Ở đây là bạn dùng hàm fseek để "lần" trên File.
    Đúng là không phải load toàn bộ cả File vào một mảng nào đó trên bộ nhớ.
    Chỗ này thì đúng là mình có nhầm lẫn

    Tuy nhiên cái cách đọc từng phần tử File này đối với File bé thì không sao chứ File lớn thì rất rất chậm.
    Trước đây mình có làm từ điển anh việt = cách như bạn này... Thời gian để tra 1 từ chậm đến gần phút.

    Theo ý bạn thì File lớn đọc tốn Ram, tuy nhiên nếu "ko chịu" tốn Ram thì sẽ chậm vô cùng. Thật đấy.

    Mình cũng đã đọc một số tài liệu người ta có đề suất phương pháp "Băm ngoài". Tức là băm sẵn các File đó nhỏ ra rồi Load từng phần vào. Tuy nhiên do chưa có điều kiện kiểm thử nên ko dám khẳng định về cách này ^^

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

    Về việc làm từ điển thì mình nghĩ nếu muốn tốc độ nhanh bạn nên phân nhỏ thành nhiều file.Chẳng hạn bạn có thể phân thành các file a,b,c,...,z.Rồi tùy người dùng nhập vào từ nào mình mở file bắt đầu bằng chữ cái đầu của từ.Như vậy tốc độ sẽ cải thiện rất nhiều bạn ạ.Hoặc bạn có thể sắp xếp từ điển trước.Như thế việc tìm cũng nhanh.Thưc ra bài trên mình viết cho cậu bạn cùng lớp.post lên cho mọi người tham khảo và đóng góp ý kiến ý mà.Ai có ý nào hay post cho anh em nhé

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

  1. Cách đọc và ghi dữ liệu trực tiếp trên RAM?
    Gửi bởi HuyNS trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 12-08-2013, 03:28 PM
  2. lồng tiếng tất cả các thứ tiếng trên thế giới
    Gửi bởi hachphong69 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 30-09-2012, 08:40 PM
  3. Tiếng việt và C thuần túy - Cách gõ tiếng việt trên DOS 16bit
    Gửi bởi langman trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 19-05-2012, 03:51 PM
  4. Lập trình Socket trên C++ có thể giao tiếp chương trình Java trên Server được ko các
    Gửi bởi jacobkruse trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 18-11-2010, 11:10 PM
  5. Gọi tiến trình Hook API bằng tiến trình bị inject trên VC++ như thế nào?
    Gửi bởi AdminPro trong diễn đàn Windows API, Hooking, xử lý Windows Message
    Trả lời: 1
    Bài viết cuối: 24-05-2009, 12:50 AM

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