Chưa hình dung ra được hướng lập trình. Nhờ mọi người giúp đỡ

E chưa hiểu ý của anh lắm ạ, đề ra là nhập vào 1 danh sách học sinh mà…
Hay anh có thể nói cho e hướng đi của bài toán, sau đó e tìm hiểu và làm code được ko ạ …?

Trước tiên bạn phải xây dựng class HS với operator< như đề bài yêu cầu, sau đó lập class DSHS, rồi feed nguyên cái mảng chứa HS thẳng vào std::sort. Phần hậu xử lí thì là bài cơ bản.

2 Likes

Em cảm ơn ạ, để e nghiên cứu tiếp rồi e nhờ mnguoi giúp đỡ nữa ạ

Mình không quen viết OOP, mình sẽ viết 1 hàm boolean so sánh để cho bạn hiểu. Về code thì bạn tự viết.

Đây là hàm so sánh dựa trên code của bạn:

bool cmp(int i, int j) { //so sánh 2 học sinh i và j
    return ((dt[i] > dt[j]) || ((dt[i] == dt[j]) && (namsinh[i] <= namsinh[j])));
}

Lúc sort thì: sort(...)
Vấn đề ở đây: Hàm sort của C++ chỉ cho phép sort trên 1 mảng/vector, mà hàm cmp thì liên quan đến 2 mảng. Rõ ràng bạn không thể viết class hocsinh như thế kia được. Bạn phải cải tiến lại là class này biểu diễn thông tin cho 1 học sinh chứ không phải cho nhiều học sinh, như vậy có thể sort được.

Lúc đó hàm so sánh viết lại thành:

bool cmp(int i, int j) { //vẫn so sánh 2 học sinh i và j
    return ((hs[i].dt > hs[j].dt) || ((hs[i].dt == hs[j].dt) && (hs[i].namsinh <= hs[j].namsinh)));
}

[spoiler]P/s: Mình lại giúp đến tận chân răng rồi :v đáng ra chỉ giúp đến tay thôi…[/spoiler]

2 Likes

Em cảm ơn anh nhiều ạ!
Khi nào e viết ra code nhờ mọi người xem giúp e

  • Đề bài yêu cầu nhập danh sách học sinh với các thông tin khác, tức là có 2 hướng:
  • Quản lí theo lớp: như bạn đã code
  • Quản lí theo học sinh: tạo 1 CTDL chứa thông tin học sinh (ở đây là tên, năm sinh và tổng điểm)
  • Vì đề còn có yêu cầu sắp xếp học sinh theo thông tin, tức là các thông tin gắn chặt vào học sinh và thông số so sánh là 1 thông tin của học sinh. Rõ ràng, nếu như quản lí theo lớp thì khi sắp xếp ta gặp phải vấn đề như mình đã đề cập ở cmt trên, bạn đọc lại, nếu bạn không hiểu chỗ nào thì nói.
  • Bắt sang topic này, về bản chất là tất cả các bài kiểu này đều làm giống nhau hết. struct hay class chỉ là vấn đề ngôn ngữ. Có thể bạn sửa code của bạn, không dùng class nữa (bài này dùng class mình cảm thấy hơi không cần thiết), có thể lúc đấy mới vỡ ra vấn đề.
2 Likes

Bạn đang viết class cho danh sách HS nhưng bạn chưa xây dựng class HS trước nên càng làm càng rối và không sử dụng được thư viện. Để mô hình hóa danh sách các X bạn phải có mô hình X phù hợp với yêu cầu.

1 Like
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<cstring>
#include<string.h>
using namespace std;
class hocsinh{
public:
    char hoten[50];
    int namsinh;
    float diemtong;
    void nhap();
    void xuat();

};
void hocsinh::nhap()
{
        cout<< "Nhap Ten Hoc Sinh :";
        cin.ignore();
        gets(hoten); 
		fflush(stdin);
        cout<< "Nam Sinh :";
        cin>> namsinh;
        cout<< "Diem Tong : ";
        cin>> diemtong;
}
void hocsinh::xuat(){
    cout<< "\nTen Hoc Sinh: "<<hoten<<endl;
    cout<< "Nam sinh:"<<namsinh<<endl;
    cout<< "Diem Tong:"<<diemtong<<endl;
}
void sapxep(hocsinh a[100], int n)
{
    int i,j;
    hocsinh tg;
    for(i = 0 ; i < n ; i++)
        for( j = i +1; j < n; j ++)
           {
               if(a[i].diemtong < a[j].diemtong)
                {
                    tg = a[j];
                    a[j] = a[i];
                    a[i] = tg;
                        if(a[i].diemtong = a[j].diemtong)
                            a[i].namsinh <a [j].namsinh;


                }


           }
}
int viethoa()
{
    int i,n;
    char hoten[50];
        for (i=0;i<=n;i++)
                    if (hoten[i]== ' ' && hoten[i+1]!=' ')
                       if(int(char(hoten[i+1]))>97 && int(char(hoten[i+1]))<=122) // Ep Kieu
                           hoten[i+1]=char(int(hoten[i+1]-32));                   //Ep Kieu
                           cout<<"In Danh Sach: "<<hoten<<endl;
}
int main()
{

    int n,i;
    hocsinh a[100];
    cout<< "Nhap So Luong Hoc Sinh:";
    cin>>n;
    for(i = 0 ; i <n ; i ++)
    {
        a[i].nhap();
    }
    cout<< "Danh Sach Hoc Sinh :";
    for(i = 0 ; i <n ; i ++)
    {
        a[i].xuat();
    }
    cout<< "Danh Sach Hoc Sinh Theo Diem Giam Dan ";
    sapxep(a,n);
    for(i = 0 ; i < n ; i++)
        a[i].xuat();
    viethoa();
    cout<< "Danh Sach Hoc Sinh Duoc Viet Hoa Chu Cai Dau";
    for(i = 0 ; i < n ; i++)
    {
        a[i].xuat();
    }
}

Mình cũng đang làm bài này …
nhưng phần sắp xếp với phần viết Hoa vẫn bị lỗi khi điểm thi trung nhau và khác năm sinh, các bác xem sửa lại giúp e được ko ạ !

1 Like

@Maknae:

  • Code bạn xấu quá. Bạn indent hơi vô tội vạ.
  • Mã chữ thường là từ 97 đến 122, tức là ở chỗ dấu > 97 sửa thành >= 97.
1 Like

Em sửa lại vẫn ko được anh ạ, với chỗ sắp xếp


cứ 2 ng điểm giống nhau là bị sai chương trình, em đang tìm lãi lỗi mà chưa được :frowning:

Phải là == chứ.

Chỗ này bạn chưa sắp xếp lại. Bạn viết ra cái so sánh này để làm gì?
Nói chung là cả đoạn này

sai tất, vì if (a[i].diemtong == a[j].diemtong) có vai trò ngang hàng với if (a[i].diemtong > a[j].diemtong), phải là

if (a[i].diemtong < a[j].diemtong) {
    //swap
} else if (a[i].diemtong == a[i].demtong) {
    if (a[i].namsinh < a[j].namsinh) {
        //swap
    }
}

Lần sau nhớ viết ra vai trò của các câu lệnh so sánh ra giấy thì viết code chính xác hơn.

1 Like

cái dưới so sánh năm sinh để năm sinh thấp hơn sẽ được in ra trước ạ
Em sửa lại và đã được, em cảm ơn ạ, còn khúc mắc chỗ sửa viết hoa e sửa vẫn ko đc .

Bạn khai báo biến char hoten[50] này là biến cục bộ của hàm viethoa, khi sửa chữ viết hoa thì hàm này chỉ sửa biến cục bộ thôi, bạn phải sửa hàm viethoa này thành

void viethoa(hocsinh a) {
    //sửa cách viết hoa của a.hoten
}
1 Like

Em chỉ sửa những ký tự đầu tiên thôi , chứ ko sửa hết họ tên thành Viết Hoa

    //swap
}
``` với cả trong đoạn anh viết bên trên ấy ạ, swap này có tác dụng gì anh ?
E bỏ đi là bị báo lỗi

@Maknae: Giời ạ, //swap là chú thích, mình chú thích vào để bạn tự viết đoạn swap phần tử :expressionless:

1 Like

Cảm ơn mọi người ạ, e là mem mới nên bị hạn chế số lần rep và viết bài, hôm nay mới vào trả lời được !
Cảm ơn anh Đức @Maknae và anh @sueruan012 cũng như anh @rogp10 nhiều ạ !

Anh ơi thế cái chỗ viết hoa của anh Đức với phần sắp xếp sửa lại như nào ạ anh ?

Mình đã hướng dẫn bạn ấy sửa rồi. Bạn tự đọc lại. Vấn đề của bạn ấy là truyền sai biến thôi.
Mình không muốn trở thành spoon-feeder. Mong bạn hiểu.

1 Like
void sapxep(hocsinh a[100], int n)
{
    int i,j;
    hocsinh tg;
    for(i = 0 ; i < n ; i++)
        for( j = i +1; j < n; j ++)
           {
               if(a[i].diemtong < a[j].diemtong)
                {
                    tg = a[j];
                    a[j] = a[i];
                    a[i] = tg;
                }
           }

}

void sapxep1(hocsinh a[100], int n)
{
    int i,j;
    for(i = 0 ; i < n ; i++)
        for( j = i +1; j < n; j ++)
        {
            if(a[i].diemtong == a[j].diemtong)
                a[i].namsinh > a[j].namsinh;
        }
}

e tách thành 2 cái sắp xếp, nhưng vẫn chưa thấy ổn… haizzz
hại não quá

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?