Không thể nhập giá trị vào struct?

Do hôm nay em nghỉ học phần cấu trúc nên em đọc lại bài giảng vẫn không hiểu lắm.Em thử làm bài tập đề thế này : Định nghĩa cấu trúc điểm gồm các thành phần(Điểm miệng,15 phút,1 tiết,học kỳ,điểm tb).Viết chương trình nhập và in thông tin điểm trong đó điểm tb =(đmiệng+đ15+2đ1t+3đhk)/7.Trong đó việc nhập và in thông tin được viết thành 1 hàm.
Bài của em :

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
    float dm,d15,d1t,dhk,dtb;
} diem;
void nhapdiem( diem d)
{
    printf("Nhap diem mieng : \n");
    scanf("%f",&d.dm);
    printf("Nhap diem kiem tra 15 phut :\n");
    scanf("%f",&d.d15);
    printf("Nhap diem 1 tiet : \n");
    scanf("%f",&d.d1t);
    printf("Nhap diem hoc ky :\n");
    scanf("%f",&d.dhk);
    d.dtb = (d.dm + d.d15 + 2*d.d1t + 3*d.dhk)/7;
}
void indiem(diem d)
{
    printf("Diem mieng la :%f \n",d.dm);
    printf("Diem 15 phut  la :%f \n",d.d15);
    printf("Diem 1 tiet la :%f \n",d.d1t);
    printf("Diem hoc ky la :%f \n",d.dhk);
    printf("Diem trung binh la : %f ",d.dtb);
}
int main()
{
    diem d;
    nhapdiem(d);
    system("cls");
    indiem(d);
    return 0;
}

Chạy điểm toàn bị lỗi.Mong mọi người giúp em.

KHông biết sao em viết mấy cái thư viện lại bị lỗi thế kia

Em xem cách hướng dẫn post code ở đây.

Về phần code, khi em nhập struct vào, và em muốn sủa struct đó thì em phải dùng con trỏ. Anh sửa lại bài của em như thế này:

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
    float dm,d15,d1t,dhk,dtb;
} diem;
void nhapdiem(diem * d)
{
    printf("Nhap diem mieng : \n");
    scanf("%f",&d->dm);
    printf("Nhap diem kiem tra 15 phut :\n");
    scanf("%f",&d->d15);
    printf("Nhap diem 1 tiet : \n");
    scanf("%f",&d->d1t);
    printf("Nhap diem hoc ky :\n");
    scanf("%f",&d->dhk);
    d->dtb = (d->dm + d->d15 + 2*d->d1t + 3*d->dhk)/7;
}
void indiem(diem d)
{
    printf("Diem mieng la :%f \n",d.dm);
    printf("Diem 15 phut  la :%f \n",d.d15);
    printf("Diem 1 tiet la :%f \n",d.d1t);
    printf("Diem hoc ky la :%f \n",d.dhk);
    printf("Diem trung binh la : %f ",d.dtb);
}
int main()
{
    diem d;
    nhapdiem(&d);
    system("cls");
    indiem(d);
    return 0;
}
2 Likes

Lỗi của e xảy ra vì e chưa khởi tạo giá trị ban đầu trước khi sử dụng đối với biến d. Nếu e không muốn dùng con trỏ thì e làm thế này :smile: Nếu a k nhầm thì struct trong C/C++ là kiểu giá trị, e nhạp thì e phải truyền tham biến chứ nhỉ :

void nhapdiem( diem &d)
{
    printf("Nhap diem mieng : \n");
    scanf("%f",&d.dm);
    printf("Nhap diem kiem tra 15 phut :\n");
    scanf("%f",&d.d15);
    printf("Nhap diem 1 tiet : \n");
    scanf("%f",&d.d1t);
    printf("Nhap diem hoc ky :\n");
    scanf("%f",&d.dhk);
    d.dtb = (d.dm + d.d15 + 2*d.d1t + 3*d.dhk)/7;
} 
1 Like

Câu này @Su_Su hỏi C mà, C không có & đâu @tuancoi2506.

1 Like

zị ah a? we quá chạy luôn :running: .

1 Like

người ta hỏi mà các chú cứ thay nhau chạy là sao :trollface: @ltd @tuancoi2506

1 Like

Khó quá chạy trước cho chắc =))

1 Like

Anh @ltd cho em hỏi với.Trong đoạn code thầy giáo em đưa có 1 đoạn thế này.

printf(“Kiem tra 1 tiet “); scanf(”%f”, &d.kt1t);scanf("%*c");

Em không hiểu chỗ> scanf("%*c") có nghĩa là gì?
Trong khi đó thầy vẫn sử dụng & (void nhapDiem(Diem &d)). Mà trong khi đó anh có nói là trong C không có &.Em thực sự không hiểu…:frowning:

Cái này có nghĩa là đọc vào một ký tự, nhưng bỏ đi. Không lưu vào trong biến nào cả. Mục đích của lệnh này là để bỏ đi một ký tự cuối.

Trong C không có &. Thầy em đang sử dụng khái niệm reference hay còn gọi là tham chiếu của C++. IDE của thầy em đang dùng là gì? Project thầy em tạo ra là C++ hay C?

Em thử tạo một project C. Và viết hàm void nhapDiem(Diem &d) thì sẽ nhận có báo lỗi ngay.

Lỗi trong code của bạn thì anh Đạt đã chỉ rõ ra rồi.Nếu bạn học C thì mình sửa lại như thế này.

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
typedef struct
{
    float dm,d15,d1t,dhk,dtb;
} diem;
diem nhapdiem()
{
	diem d;
    printf("Nhap diem mieng : \n");
    scanf("%f",&d.dm);
    printf("Nhap diem kiem tra 15 phut :\n");
    scanf("%f",&d.d15);
    printf("Nhap diem 1 tiet : \n");
    scanf("%f",&d.d1t);
    printf("Nhap diem hoc ky :\n");
    scanf("%f",&d.dhk);
    d.dtb = (d.dm + d.d15 + 2*d.d1t + 3*d.dhk)/7;
	return d;
}
void indiem(diem d)
{
    printf("Diem mieng la :%f \n",d.dm);
    printf("Diem 15 phut  la :%f \n",d.d15);
    printf("Diem 1 tiet la :%f \n",d.d1t);
    printf("Diem hoc ky la :%f \n",d.dhk);
    printf("Diem trung binh la : %f ",d.dtb);
}
int main()
{
    diem d;
    d=nhapdiem();
    system("cls");
    indiem(d);
    return 0;
}
2 Likes

Cảm ơn @14520054 nhé.Mình hiểu rồi!!!

1 Like

@Su_Su anh đã nói em là nên dùng con trỏ giống anh @ltd rồi mà.Khi dùng đối số đầu ra hàm này sẽ phải copy giá trị cho biến cần nhập nên khi chạy sẽ mất thời gian và stack hơn cách dùng đối con trỏ.

Em muốn hiểu thêm ở chổ khi gọi hàm nhập điểm nhapdiem(&d), và khi gọi định nghĩa hàm void nhapdiem(diem*){//…}, ở bước nhập scanf("%f", &d->dm); tại sao không thể nhập scanf("%f", d.dm) như thông thường? em cảm ơn

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