30/09/2018, 21:38
Mảng Struct trong C
Mình có bài lập trình về Struct trong C. Có thắc mắc về phần hiển thị mảng Struct. Debug ko báo lỗi. Mà khi mình thực hiện 2 lệnh in mảng Struct thì chỉ được 1, đến lệnh hiển thị tiếp theo thì ko hiển thị mà báo lỗi ko chạy tiếp. Mong mọi người chỉ giúp. Thanks all!!!
#include"conio.h"
#include"stdio.h"
struct NhanVien
{
char HoTen[100];
int NamSinh;
float HSL;
};
void InNV(struct NhanVien a[], int n)
{
printf("%-20s %10s %15s %-10s
", "Ho ten", "Nam sinh", "He so luong");
for (int i = 1; i <= n; i++)
{
printf("%-20s %10d %15.2f
", a[i].HoTen, a[i].NamSinh, a[i].HSL);
}
}
int main()
{
struct NhanVien a[100];
int n, i;
// Nhap n nhan vien
printf("Nhap so luong nhan vien: "); scanf("%d", &n);
while (n <= 1 )
{
printf("Nhap lai so luong nhan vien > 1: "); scanf("%d", &n);
}
for (i = 1; i <= n; i++)
{
#define nv a[i]
printf("Nhap du lieu cho sinh vien thu %d:
", i);
printf("Ho ten: ");
// gets(nv.HoTen);
scanf("%s", &nv.HoTen);
fflush(stdin);
printf("Nam sinh: ");
scanf("%d", &nv.NamSinh);
printf("He so luong: ");
scanf("%f", &nv.HSL);
}
// Hien thi danh sach nhan vien co HSL duoi 3.67
printf("------Danh sach nhan vien co he so luong duoi 3.67:
");
printf("%-20s %10s %15s %-10s
", "Ho ten", "Nam sinh", "He so luong");
for (i = 1; i <= n; i++)
{
#define nv a[i]
if (nv.HSL < 3.67)
printf("%-20s %10d %15.2f
", nv.HoTen, nv.NamSinh, nv.HSL);
}
// Thay doi thong tin nhan vien thu k
int k;
struct NhanVien s;
printf("Nhap thu tu nhan vien can chinh sua thong tin (tu 1 den %d): ",n);
scanf("%d", &k);
while (k <= 0|| k > n)
{
printf("Nhap lai thu tu nhan vien can chinh sua thong tin: ");
scanf("%d", &k);
}
printf("Nhap thong tin moi cho nhan vien thu %d:
", k);
fflush(stdin);
printf("Ho ten: ");
//gets(nvs.HoTen);
scanf("%s", &s.HoTen);
fflush(stdin);
printf("Nam sinh: ");
scanf("%d", &s.NamSinh);
printf("He so luong: ");
scanf("%f", &s.HSL);
a[k] = s;
// Sap xep danh sach nhan vien theo nam sinh tang dan va hien thi
fflush(stdin);
struct NhanVien tg;
for(i = 1; i < n; i ++)
for(int j = i+1; j <= n; j ++)
{
if(a[i].NamSinh > a[j].NamSinh)
{
tg = a[i];
a[i] = a[j];
a[j] = tg;
}
}
printf("Danh sach da sap xep la:
");
InNV(a,n);
getch();
return 0;
}
Bài liên quan
Bạn xem lại các vòng lặp for, mảng trong C bắt đầu từ 0 chứ không phải 1
Mình biết nhưng mình muốn dùng từ phẩn tử 1 để tiện cho việc đánh số phần tử: Ví dụ: a[1] trữ thông tin nhân viên số 1.
Làm gì có vụ này ? Quy ước của nó là start từ 0 mà bạn lại gán 1 thì phần tử cuối ở đâu ? Chẳng lẽ bằng số lượng phần tử luôn ?
Bạn chỉ cẩn khai báo số phần tử cộng thêm 1 là ok. Ví dụ bạn sử dụng 50 phần tử thì bạn khai báo: int a[51]
Thế cũng không tiện lắm đâu và cũng không tốt chút nào !
Bạn khai báo a[0] rồi +1 cho nó cũng được mà
printf("%-20s %10s %15s %-10s\n", "Ho ten", "Nam sinh", "He so luong");
chỗ này bạn điền thiếu một đối số nè.
thanks bạn nhé. Lỗi đơn giản vậy mà mình ko soi ra. Cứ nghĩ sai ở cú pháp hay struct.
Mình mới tham gia nhóm nên chưa biết. Thanks bạn nha.
anh có thể giải thích rõ hơn về việc sử dụng %-20s không ạ, bình thường thì em dùng %4d nghĩa là nó sẽ giành 4 khoảng trống để viết số đó, vậy %-20s thì dấu “trừ” có ý nghĩa gì vậy ạ? ^^
Nó sẽ canh bên phải hoặc bên trái đó bạn.
Nếu được thì bạn nhấn dấu tích đã được trả lời giùm mình nhé. Trả lời bao lâu nay mà chưa được nhân dấu tick lần nào
Hi, mình mới tham gia nên ko biết! thanks bạn lần nữa nhé. Mong sẽ được học hỏi nhiều từ mọi người trong diễn đàn.
Cảm ơn bạn nhiều