30/09/2018, 16:16

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 : 
");
    scanf("%f",&d.dm);
    printf("Nhap diem kiem tra 15 phut :
");
    scanf("%f",&d.d15);
    printf("Nhap diem 1 tiet : 
");
    scanf("%f",&d.d1t);
    printf("Nhap diem hoc ky :
");
    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 
",d.dm);
    printf("Diem 15 phut  la :%f 
",d.d15);
    printf("Diem 1 tiet la :%f 
",d.d1t);
    printf("Diem hoc ky la :%f 
",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.

Pham Anh viết 18:28 ngày 30/09/2018

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

Nguyễn Minh Dũng viết 18:23 ngày 30/09/2018

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;
}
Phạm Hoàng Tuấn viết 18:28 ngày 30/09/2018

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 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;
} 
Nguyễn Minh Dũng viết 18:28 ngày 30/09/2018

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

Phạm Hoàng Tuấn viết 18:24 ngày 30/09/2018

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

X viết 18:17 ngày 30/09/2018

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

Nguyễn Minh Dũng viết 18:30 ngày 30/09/2018

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

Pham Anh viết 18:31 ngày 30/09/2018

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…

Nguyễn Minh Dũng viết 18:24 ngày 30/09/2018

scanf("%*c")

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.

Mà trong khi đó anh có nói là trong C không có &.Em thực sự không hiểu…

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.

BaoLe viết 18:21 ngày 30/09/2018

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;
}
Pham Anh viết 18:30 ngày 30/09/2018

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

Người Cô Đơn viết 18:27 ngày 30/09/2018

@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ỏ.

Phat Nguyen viết 18:32 ngày 30/09/2018

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

Bài liên quan
0