01/10/2018, 11:26

Nhờ giúp đỡ sửa lỗi logic trong chương trình quản lí sinh viên

chào m.n mình đang viết một chương trình quản lí trường học gồm nhiều module quản lí và mình đang viết module quản lí môn học bao gồm các chức năng thêm , xóa , chỉnh sửa và lưu vào file.
vấn đề mình đang gặp phải là ở hàm update.

void update_sub()
{
    subject list_subject[100];
    fstream myfile;
    myfile.open(file_mon_hoc,ios::in);
    int count1 = 0;
    int flag = 1;
    while(!myfile.eof())
    {
    
        if(flag%2!=0)
         {
           myfile >> list_subject[count1].subject_code;

         }
         else
         {
            myfile >> list_subject[count1].subject_name;
         }
        if(flag%4 == 0)
            count1++;
        flag++;
    }
    myfile.close();
    output_list_subject(list_subject,count1);

    char old_sub[30],old_code_sub[30];
    char new_sub[30],new_code_sub[30];
    int temp;
    cout << endl;
    cout << "Enter old subject name: ";
    cin.ignore(1);
    gets(old_sub);
    cout << "Enter new subject name: ";
    cin.ignore(1);
    gets(new_sub);
    cout << "Enter old subject code: ";
    cin.ignore(1);
    gets(old_code_sub);
    cout << "Enter new subject code: ";
    cin.ignore(1);
    gets(new_code_sub);
    for(int k = 0;k<count1;k++)
    {
        if(strcmp(list_subject[k].subject_code,old_code_sub)==0 && strcmp(list_subject[k].subject_name,old_sub)==0)
        {
            strcpy(list_subject[k].subject_code,new_code_sub);
            strcpy(list_subject[k].subject_name,new_sub);
        }
    }
    cout << endl;
    cout << "Update successful" << endl;
    myfile.open(file_mon_hoc,ios::out);
    for(int k = 0;k<count1;k++)
    {
        myfile << list_subject[k].subject_code << endl;
        myfile << list_subject[k].subject_name << endl;
    }
    myfile.close();
    cout << endl;
}

mình nghĩ là mình sai ở chỗ vòng lặp while , lúc đầu mình có thử cho chương trình đọc cả tên , mã môn , số môn lý thuyết, số môn thực hành , nhưng bị lỗi , thế nên mình đổi lại giống như trên nhưng cũng bị lỗi.
đây là kết quả sau khi xuất ra.


mình không biết tại sao ở chỗ in ra danh sách nó lại in ra số lượng môn lý thuyết , mà không in ra đầy đủ nội dung , và ở chỗ update nó cũng sai nốt, mình nghĩ mãi mà không ra cách , mong được giúp đỡ ạ.
link full code: http://codepad.org/XW9OV4lV .

*grab popcorn* viết 13:34 ngày 01/10/2018

A post was merged into an existing topic: Topic này chứa các post được cho là Off-topic

Hoài Nam Trương viết 13:32 ngày 01/10/2018

có máy nhà đâu , đó giờ toàn code ngoài net .

HK boy viết 13:30 ngày 01/10/2018

Lâu lắm rồi mới thấy bạn =)))
Góp ý nho nhỏ với bạn là nếu bạn chỉ muốn chụp màn hình console thì bạn dùng Alt + Print Screen để chụp màn hình đang mở hiện tại nhé.

Sao bạn không dùng std::string để xử lí xâu nhỉ?

HK boy viết 13:41 ngày 01/10/2018

flag là cái gì bạn ơi @@

Hoài Nam Trương viết 13:41 ngày 01/10/2018

flag là một biến cờ ấy bạn đọc xong 4 dòng tăng biến đếm lên 1
và lúc đầu ý tưởng là ntn

fstream myfile;
    myfile.open(file_mon_hoc,ios::in);
    char content[50];
    int count1 = 0;
    int flag = 1;
    while(!myfile.eof())
    {
        myfile.getline(content,50);
        if(flag%4!=0)
         {
            strcpy(list_subject[count1].subject_code,content);
              strcpy(list_subject[count1].subject_name,content);
           /// copy số lượng môn lý thuyết
         }
        else
        {
          
           /// copy số lượng môn thực hành
        }
        if(flag%4 == 0)
            count1++;
        flag++;
    }
    myfile.close();

nhưng nó không copy vào được số môn lý thuyết và thực hành , nên mình mới đổi giống như trên nhưng cũng bị lỗi giống như thế .

HK boy viết 13:42 ngày 01/10/2018

Bạn thử debug bằng cách sau khi đọc dữ liệu từ file thì cout hết dữ liệu ra ngoài màn hình và sau khi update dữ liệu (trước khi ghi lại vào file) thì cout hết dữ liệu ra ngoài màn hình, rồi chụp lên đây mình xem giúp.

Hoài Nam Trương viết 13:33 ngày 01/10/2018

Bạn thử debug bằng cách sau khi đọc dữ liệu từ file thì cout hết dữ liệu ra ngoài màn hình và sau khi update dữ liệu (trước khi ghi lại vào file) thì cout hết dữ liệu ra ngoài màn hình, rồi chụp lên đây mình xem giúp.

bây giờ net sắp nghĩ , để mai được không bạn.

HK boy viết 13:43 ngày 01/10/2018

Được bạn ạ. Lúc nào bạn làm được thì cmt vào đây.

Hoài Nam Trương viết 13:37 ngày 01/10/2018

hello @sueruan012 đây là các bước debug của mình, mình đã cố gắng chụp từng bước rồi , bạn xem giúp mình nha
đây là các bước khi đọc dữ liệu từ file

đây là các bước sau khi update

Ở chỗ bước này nó nhảy lên for rồi nó bay xuống dưới luôn

đó là tất cả các bước của mình

Hoài Nam Trương viết 13:41 ngày 01/10/2018

@sueruan012 mình vừa nghĩ ra một cách giải quyết mới nhưng vẫn chưa khả quan lắm
mình có đặt lại hàm output_list_subject(list_subject,n); dưới hàm main và phần update thì mình đã bỏ khúc đọc xuất file
thay vào đó mình đổi lại là so sánh mã môn vừa nhập với mã môn có sẵn , nếu trùng thì bắt đầu cập nhật tên môn , mã , số tiết lý thuyết và thực hành, nhập tới đâu lưu vào file tới đó , nhưng có một vấn đề là khi mình nhập và xuất danh sách xong tới phần update thì khi mình nhập mã vào nó không cho mình cập nhật mà nó hiện ra luôn danh sách file.
đây là quá trình mình nhập, về phần hiển thị thì nó đã ok rồi , duy chỉ có phần update là còn lỗi thôi, bạn xem giúp mình nó sai ở chỗ nào vậy. thank.

đây là code phần update của mình

void update_subject(int n)
{
    subject list_subject[100];
    char old_sub[30],old_code_sub[30];
    char new_sub[30],new_code_sub[30];
    fstream myfile;
    myfile.open(file_mon_hoc,ios::out|ios::app);
    cout << endl;
   cout << "Enter old subject code: ";
    fflush(stdin);
    gets(old_code_sub);
    for(int i = 0;i<n;i++)
    {
      if(strcmp(list_subject[i].subject_code,old_code_sub)==0)
      {
        fflush(stdin);
        cout << "Enter code : ";
        gets(list_subject[i].subject_code);
        myfile << list_subject[i].subject_code << endl;

        cout << "Enter name: ";
        fflush(stdin);
        gets(list_subject[i].subject_name);
        myfile << list_subject[i].subject_name << endl;
        cout << "Enter number of theoretical subjects: ";
        fflush(stdin);
        cin >> list_subject[i].number_theory_of_subject;
        myfile << list_subject[i].number_theory_of_subject << endl;

        cout << "Enter number of practicetical subjects: ";
        fflush(stdin);
        cin >> list_subject[i].number_of_subject_practice;
        myfile << list_subject[i].number_of_subject_practice << endl;
      }
  }
   myfile.close();
}

đây là full code

#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string.h>
#include <string>
#include <stdlib.h>
#include <conio.h>
#include <iomanip>
#define file_mon_hoc "monhoc.txt"

using namespace std;
typedef struct subject
{
    char subject_code[10];
    char subject_name[100];
    int number_theory_of_subject;
    int number_of_subject_practice;
};
void enter_sub(subject list_subject[],int n)
{
    fstream myfile;
    myfile.open(file_mon_hoc,ios::out|ios::app);
    cout << "*****ENTER SUBJECT*****" << endl;
    for(int i = 0;i<n;i++)
    {
        fflush(stdin);
        cout << "Enter code : ";
        gets(list_subject[i].subject_code);
        myfile << list_subject[i].subject_code << endl;

        cout << "Enter name: ";
        fflush(stdin);
        gets(list_subject[i].subject_name);
        myfile << list_subject[i].subject_name << endl;
        cout << "Enter number of theoretical subjects: ";
        fflush(stdin);
        cin >> list_subject[i].number_theory_of_subject;
        myfile << list_subject[i].number_theory_of_subject << endl;

        cout << "Enter number of practicetical subjects: ";
        fflush(stdin);
        cin >> list_subject[i].number_of_subject_practice;
        myfile << list_subject[i].number_of_subject_practice << endl;
    }
    myfile.close();
}
void output_list_subject(subject list_subject[],int n)
{
    cout << "\t\t|----------------------------|" << endl;
    cout << "\t\t|******* LIST SUBJECT *******|" << endl;
    cout << "\t\t|----------------------------|" << endl;
    cout << "|---------------+---------------+"<< "----------------+---------------+" << endl;
    cout << "|          CODE SUBJECT         |"<< "           NAME SUBJECT         |" << endl;
    cout << "|---------------+---------------+"<< "----------------+---------------+" << endl;;
    for(int i = 0;i<n;i++)
    {
        cout <<"| " << setw(20) << list_subject[i].subject_code << setw(5) << "\t|";
        cout << setw(24) <<  list_subject[i].subject_name << "\t |" << endl;
        cout << "|---------------+---------------+" << "----------------+---------------+"<<  endl;
    }
    cout << "+---------------+---------------+" << "----------------+---------------+" << endl;
    cout << "|          THEORY               |" << "           PRACTICE             |" << endl;
    cout << "+---------------+---------------+" << "----------------+---------------+" << endl;
    for(int i = 0;i<n;i++)
    {
        cout << "| " << list_subject[i].subject_name << ": " << setw(3) << list_subject[i].number_theory_of_subject << "\t\t| ";
        cout  << list_subject[i].subject_name << ": " << setw(3) << list_subject[i].number_of_subject_practice << "\t\t |" << endl;
        cout << "+---------------+---------------+" << "----------------+---------------+" <<  endl;
    }
}
void output_sub()
{
    fstream myfile;
    myfile.open(file_mon_hoc,ios::in);
    char count1[50];
    int flag = 1;
    cout << "***** CONTENT FILE ***** " << endl;
    cout << "|-----------------------|-----------------------|-----------------------|" << endl;
    while(!myfile.eof())
    {
        myfile.getline(count1,50);
        if(flag%4==0)
        {
            cout << setw(12)<<  count1 << setw(12) << endl;
        }
        else
        {
            cout << setw(19) << count1 << setw(19);
        }
        flag++;
    }
    cout << endl;
    cout << "|-----------------------|-----------------------|-----------------------|" << endl;
    myfile.close();
}
void update_subject(int n)
{
    subject list_subject[100];
    char old_sub[30],old_code_sub[30];
    char new_sub[30],new_code_sub[30];
    fstream myfile;
    myfile.open(file_mon_hoc,ios::out|ios::app);
    cout << endl;
    /*cout << "Enter old subject name: ";
    fflush(stdin);
    gets(old_sub);
    cout << "Enter new subject name: ";
    fflush(stdin);
    gets(new_sub);*/
    cout << "Enter old subject code: ";
    fflush(stdin);
    gets(old_code_sub);
    for(int i = 0;i<n;i++)
    {
      if(strcmp(list_subject[i].subject_code,old_code_sub)==0)
      {
        fflush(stdin);
        cout << "Enter code : ";
        gets(list_subject[i].subject_code);
        myfile << list_subject[i].subject_code << endl;

        cout << "Enter name: ";
        fflush(stdin);
        gets(list_subject[i].subject_name);
        myfile << list_subject[i].subject_name << endl;
        cout << "Enter number of theoretical subjects: ";
        fflush(stdin);
        cin >> list_subject[i].number_theory_of_subject;
        myfile << list_subject[i].number_theory_of_subject << endl;

        cout << "Enter number of practicetical subjects: ";
        fflush(stdin);
        cin >> list_subject[i].number_of_subject_practice;
        myfile << list_subject[i].number_of_subject_practice << endl;
      }
      
    }
    myfile.close();
}

int main()
{
    int n;
    cout << "Enter number subject: ";
    cin >> n;
    subject list_subject[100];
    enter_sub(list_subject,n);
    output_sub();
    output_list_subject(list_subject,n);
    update_subject(n);
    output_sub();
    return 0;
}
Bài liên quan
0