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\n", "Ho ten", "Nam sinh", "He so luong");
	for (int i = 1; i <= n; i++) 
	{
		printf("%-20s %10d %15.2f\n", 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:\n", 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: \n");
	printf("%-20s %10s %15s %-10s\n", "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\n", 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: \n", 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:\n");
	 
	InNV(a,n);
	  
	getch();
	return 0;
}
2 Likes


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à :slight_smile:

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è.

4 Likes

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.

1 Like

Mình mới tham gia nhóm nên chưa biết. Thanks bạn nha.

2 Likes

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.

5 Likes

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 :smiley:

1 Like

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 :blush:

1 Like
#include <iostream>
#include <conio.h>

using namespace std;

struct matrix{
	int column;int row;
	int* data;
};

int Alloc(int **M,int row,int column);
void freeMatrix(int *M);
matrix InputMatrix(int column,int row);
void OutputMatrix(matrix M);
matrix operator+(matrix a, matrix b);
matrix operator*(matrix a, matrix b);


int Alloc(int** A, int row, int column){
	*A=new int[row*column];
	if(*A==NULL){
		return 0;
	}else{
		return 1;
	}
}

void freeMatrix(int *M){
	if(M!=NULL){
		delete []M;
	}
}

matrix InputMatrix(int column,int row){
	matrix mt;mt.column=column;mt.row=row;
	if (!Alloc(&mt.data,row,column)){
		cout<<"Khong con du bo nho!"<<endl;
	}
	int I,J;
	for(I=0;I<mt.row;++I)
		 for(J=0;J<mt.column;++J)
		{
			cout<<"data"<<"["<<I<<"]["<<J<<"]=";
			cin>>mt.data[I*mt.column+J];
		}
	return mt;
}



void OutputMatrix(matrix M){
	int i,j;
	for(i=0;i<M.row;i++){
		for(j=0;j<M.column;j++){
			cout<<M.data[i*M.column+j]<<"\t";
		}
		cout<<endl;
	}
}

matrix operator+(matrix a, matrix b){
	matrix c;c.row=a.row;c.column=a.column;
	if(Alloc(&c.data,c.row,c.column)==0){
		cout<<"\nKhong du bo nho cho ma tran tich!";
	}
	int i,j;
	for(i=0;i<a.row;i++){
		for(j=0;j<a.column;j++){
			c.data[i*a.column+j]=a.data[i*a.column+j]+b.data[i*a.column+j];
		}
	}
	return c;
}

matrix operator*(matrix a, matrix b){
	
	//Ma tran tich thi co dk so cot ma tran a bang so dong ma tran b khi nhap row and colum thi row=column
	matrix c;
	if(a.column!=a.row){
		cout<<"\nKhong the nhan hai ma tran nay!"; return c;
	}
	c.row=a.row;c.column=a.column;
	if(Alloc(&c.data,c.row,c.column)==0){
		cout<<"\nKhong du bo nho cho ma tran tich!";
	}
	int i,j,k;int sum=0;
	for(i=0;i<a.row;i++){
		for(j=0;j<a.row;j++){
			sum=0;
			for(k=0;k<a.row;k++){
				sum=sum+a.data[i*a.row+k]+b.data[k*a.row+i];
			}
			c.data[i*a.row+j]=sum;
		}
	}
	return c;
}

int main(){
	int column,row;
	matrix A,B,C,D;
	cout<<"\nInput column numbers : ";cin>>column;
	cout<<"\nInput row numbers : ";cin>>row;
	cout<<"\nNhap ma tran A : \n";A=InputMatrix(column,row);
	cout<<"\nMa tran sau khi nhap la : \n";OutputMatrix(A);
	cout<<"\nNhap ma tran B : \n";B=InputMatrix(column,row);
	cout<<"\nMa tran sau khi nhap la : \n";OutputMatrix(B);
	C=A+B;
	cout<<"\nMa tran C=A+B la : \n";OutputMatrix(C);
	D=A*B;
	cout<<"\nMa tran D=A*B la : \n";OutputMatrix(D);
	
}

Em làm được hết mà sau chạy chương trình thì đúng hết chỉ có cái tích ma trận bị sai. Em thấy thuật toán đúng hết mà. Ai giúp em tìm lỗi với ạ

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