/*auto readmore*/ /*auto readmore*/ /* an hien script*/ // an hien password /*an hien ma chuong trinh cong tru */ /*Scrollbox thanh cuon*/ /***Nhung CODE***/ /* dòng xanh dòng trắng */ /* https://cdnjs.com/libraries/prism lay thu vien, can vao ten file ma goi 1. copy link vao vi du:prism-python.min.js 2. ten ngon nua la python */ /*=== New posts ===*/ /*header slider*/ /*=== bai viet lien quan===*/ /*===tabcode===*/

[Tự Học Lập Trình C - Qua Các Bài Tập] COM108_Nhập Môn Lập Trình - Bài 8 - Cấu Trúc (Structure) Trong C - P1

MỤC TIÊU:
  • Biết cách định nghĩa kiểu dữ liệu cấu trúc
  • Biết cách sử dụng thuật toán sắp xếp, tìm kiếm

LÝ THUYẾT:


Cấu trúc hay struct:
  • Một kiểu dữ liệu do người dùng tự định nghĩa (user defined datatype), cho phép bạn kết hợp các dữ liệu khác kiểu nhau.
  • Mỗi phần tử của một cấu trúc được gọi là một thành viên (member).

Khởi tạo:
  • Khởi tạo structure bằng cách sử dụng từ khóa struct.
  • Struct có dạng:
struct <structure_name>
{
   data_type member1;
   data_type member2;
    ...
   data_type memeberN;
} [một hoặc nhiều biến cấu trúc];

Ví dụ: Tạo cấu trúc có tên SinhVien gồm các trường dữ liệu: maSinhVien, tenSinhVien, diemTrungBinh;
Code:
struct SinhVien{
	char maSinhVien[10];
	char tenSinhVien[50];
	float diemTrungBinh;
};

Khai báo trong hàm main:
#include<stdio.h>
struct SinhVien{
	char maSinhVien[10];
	char tenSinhVien[50];
	float diemTrungBinh;
};

int main(){
	struct SinhVien a;
}

Khai báo dùng alias:
#include<stdio.h>
struct SinhVien{
	char maSinhVien[10];
	char tenSinhVien[50];
	float diemTrungBinh;
};

typedef struct SinhVien SV;

int main(){
	SV a;
}

Cách truy cập:
Truy cập các thành viên trong struct sử dụng dấu chấm (.), nếu viết dạng con trỏ thì sử dụng dấu trừ + mũi tên  "->"

Ví dụ 1:
#include<stdio.h>
struct SinhVien{
	char maSinhVien[8];
	char tenSinhVien[50];
	float diemTrungBinh;
};

typedef struct SinhVien SV;

int main(){
	SV a = {"PS12345", "Nguyen Van A", 8.5};
	printf ("\nThong tin sinh vien 'a'");
	printf ("\nMa so SV: %s", a.maSinhVien);
	printf ("\nHo ten SV: %s", a.tenSinhVien);
	printf ("\nDiem trung binh cac mon: %.1f", a.diemTrungBinh);
	
}

Ví dụ 2: Chỉ hoạt động trên C (lưu file .C), KHÔNG chạy trên C++
#include<stdio.h>
struct SinhVien{
	char maSinhVien[8];
	char tenSinhVien[50];
	float diemTrungBinh;
};

typedef struct SinhVien SV;

int main(){
	// cách khai báo này chỉ hoạt động trên C, KHÔNG chạy trên C++
	SV b = {.maSinhVien = "PS56789", .tenSinhVien = "Nguyen Van B", .diemTrungBinh = 9.5};
	printf ("\n\nThong tin sinh vien 'b'");
	printf ("\nMa so SV: %s", b.maSinhVien);
	printf ("\nHo ten SV: %s", b.tenSinhVien);
	printf ("\nDiem trung binh cac mon: %.1f", b.diemTrungBinh);	
}

Ví dụ 3: 
  • Cú pháp bị lỗi: [Error] assignment to expression with array type
int main(){
	
	SV c;
	c.maSinhVien = "PS99999";
	c.tenSinhVien = "Tony Teo";
}

  • Hướng khắc phục: Gán giá trị thành chuỗi, sử dụng hàm strcpy
int main(){
	
	SV c;
	strcpy(c.maSinhVien, "PS99999");
	strcpy(c.tenSinhVien, "Tony Teo");
}

Full code:
#include<stdio.h>
struct SinhVien{
	char maSinhVien[8];
	char tenSinhVien[50];
	float diemTrungBinh;
};

typedef struct SinhVien SV;

int main(){
	
	SV c;
	strcpy(c.maSinhVien, "PS99999");
	strcpy(c.tenSinhVien, "Tony Teo");
	c.diemTrungBinh = 9.5;
	
	printf ("\n\nThong tin sinh vien 'c'");
	printf ("\nMa so SV: %s", c.maSinhVien);
	printf ("\nHo ten SV: %s", c.tenSinhVien);
	printf ("\nDiem trung binh cac mon: %.1f", c.diemTrungBinh);	
}

Ví dụ: 
Viết chương trình nhập thông tin sinh viên bao gồm các trường: maSinhVien, tenSinhVien, diemTrungBinh
Input: Nhập thông tin maSinhVien, tenSinhVien, diemTrungBinh từ bàn phím
Output: Xuất ra thông tin sinh viên vừa nhập

a. Viết thông thường:
#include<stdio.h>
struct SinhVien{
	char maSinhVien[8];
	char tenSinhVien[50];
	float diemTrungBinh;
};

typedef struct SinhVien SV;

int main(){
	
	SV sv;
	printf("\nNhap ma so SV: "); scanf("%s", &sv.maSinhVien);
	
	printf("\nNhap ho ten SV: "); 
	getchar(); // để đọc phím enter, nếu không có sẽ trôi lệnh gets
	//fflush(stdin); // xóa vùng nhớ đệm
        gets(sv.tenSinhVien);// đọc chuỗi nhập từ bàn phím, CHẤP NHẬN chuỗi có khoảng trắng
	
	printf("\nNhap diem trung binh: "); scanf("%f", &sv.diemTrungBinh);
	
	printf ("\n\nThong tin sinh vien:");
	printf ("\nMa so SV: %s", sv.maSinhVien);
	printf ("\nHo ten SV: %s", sv.tenSinhVien);
	printf ("\nDiem trung binh cac mon: %.1f", sv.diemTrungBinh);	

} 
Noted:
  • getchar(); để đọc phím enter, nếu không có sẽ trôi lệnh gets
  • có thể dùng fflush(stdin) thay vì getchar(); để xóa vùng nhớ đệm
  • gets(sv1.tenSinhVien); đọc chuỗi nhập từ bàn phím, CHẤP NHẬN chuỗi có khoảng trắng
  • scanf("%[^\n]s", &tenBien); đọc chuỗi nhập từ bàn phím, CHẤP NHẬN chuỗi có khoảng trắng
b. Viết dạng hàm:

Có thể dùng SV thay vì SinhVien (dùng alias)
#include<stdio.h>
struct SinhVien{
	char maSinhVien[8];
	char tenSinhVien[50];
	float diemTrungBinh;
};

typedef struct SinhVien SV;
		
Muốn truy cập vào các thành viên của struct dùng dấu chấm (.)
void xuatSinhVien(SV sv){
	printf ("\n\nThong tin sinh vien:");
	printf ("\nMa so SV: %s", sv.maSinhVien);
	printf ("\nHo ten SV: %s", sv.tenSinhVien);
	printf ("\nDiem trung binh cac mon: %.1f", sv.diemTrungBinh);
}
		
Hàm nhập dạng trả về struct
SV nhapSinhVien(){
	SV sv;
	printf("\nNhap ma so SV: "); scanf("%s", &sv.maSinhVien);
	
	printf("\nNhap ho ten SV: "); 
	getchar();

	gets(sv.tenSinhVien);
	printf("\nNhap diem trung binh: "); scanf("%f", &sv.diemTrungBinh);
	return sv;
}
		
Hàm nhập trên C++ (lưu file file .CPP)
void nhapSinhVien_CPP(SV &sv){
	printf("\nNhap ma so SV: "); scanf("%s", &sv.maSinhVien);
	
	printf("\nNhap ho ten SV: "); 
	getchar();

	gets(sv.tenSinhVien);
	printf("\nNhap diem trung binh: "); scanf("%f", &sv.diemTrungBinh);
}
		
Hàm nhập dạng con trỏ: (sử dụng dấu trừ + dấu lớn "->")
void nhapSinhVienConTro(SV *sv){
	printf("\nNhap ma so SV: "); scanf("%s", &sv->maSinhVien);
	
	printf("\nNhap ho ten SV: "); 
	getchar();

	gets(sv->tenSinhVien);
	printf("\nNhap diem trung binh: "); scanf("%f", &sv->diemTrungBinh);
}
		
Hàm chính của chương trình
int main(){

//	SV sv = nhapSinhVien(); // gọi hàm nhập viết dạng trả về cấu trúc
	SV sv;
	nhapSinhVien_CPP(sv); // gọi hàm nhập viết dạng C++
//	nhapSinhVienConTro(&sv); // gọi hàm nhập viết dạng con trỏ

	xuatSinhVien(sv);	
}
		



YÊU CẦU:

BÀI 1: XÂY DỰNG CHƯƠNG TRÌNH LƯU THÔNG TIN SINH VIÊN
Input: Nhập vào từ bàn phím các thông tin sinh viên như: mã số sinh viên, tên sinh viên, ngành học, điểm trung bình.
Output: Xuất ra thông tin của tất cả sinh viên trên màn hình


BÀI 2: TRÊN CƠ SỞ BÀI 1
Input: nhập số lượng sinh viên muốn thêm từ bàn phím
Output: Xuất ra thông tin của tất cả sinh viên trên màn hình

BÀI 3: SẮP XẾP SINH VIÊN THEO ĐIỂM TĂNG DẦN
Hướng dẫn: Sử dụng lại bài số 1, trước khi hiển thị sinh viên ra màn hình thì chạy giải thuật sắp xếp

BÀI 4: TÌM KIẾM SINH VIÊN
Hướng dẫn: Sau khi đã nhập thông tin sinh viên vào mảng. Tìm kiếm sinh viên theo mã sinh viên

THỰC HIỆN:

BÀI 1: XÂY DỰNG CHƯƠNG TRÌNH LƯU THÔNG TIN SINH VIÊN
Input: Nhập vào từ bàn phím các thông tin sinh viên như: mã số sinh viên, tên sinh viên, ngành học, điểm trung bình.
Output: Xuất ra thông tin của tất cả sinh viên trên màn hình


code tham khảo:
#include<stdio.h>
struct SinhVien{
	char maSinhVien[8];
	char tenSinhVien[50];
	float diemTrungBinh;
};

typedef struct SinhVien SV;

void nhapSinhVienConTro(SV *sv){
	
	printf("\nNhap ma so SV: "); scanf("%s", &sv->maSinhVien);
	
	printf("\nNhap ho ten SV: "); 
	getchar();
	gets(sv->tenSinhVien);
	
	printf("\nNhap diem trung binh: "); scanf("%f", &sv->diemTrungBinh);
}

void xuatSinhVien(SV sv){
	printf ("\n\nThong tin sinh vien:");
	printf ("\nMa so SV: %s", sv.maSinhVien);
	printf ("\nHo ten SV: %s", sv.tenSinhVien);
	printf ("\nDiem trung binh cac mon: %.1f", sv.diemTrungBinh);
}
int main(){
	
	SV sv[100];
	int i;
	int n;
	printf ("\nNhap vao so luong SV muon them: ");
	scanf("%d", &n);
	
	for (i = 0; i < n; i++){
		nhapSinhVienConTro(&sv[i]);
	}
	
	for (i = 0; i < n; i++){
		xuatSinhVien(sv[i]);	
	} 
}   

BÀI 2: TRÊN CƠ SỞ BÀI 1
Input: nhập số lượng sinh viên muốn thêm từ bàn phím
Output: Xuất ra thông tin của tất cả sinh viên trên màn hình

code tham khảo:
#include<stdio.h>
struct SinhVien{
	char maSinhVien[8];
	char tenSinhVien[50];
	float diemTrungBinh;
};

typedef struct SinhVien SV;

void nhapSinhVienConTro(SV *sv){
	
	printf("\nNhap ma so SV: "); scanf("%s", &sv->maSinhVien);
	
	printf("\nNhap ho ten SV: "); 
	getchar();
	gets(sv->tenSinhVien);
	
	printf("\nNhap diem trung binh: "); scanf("%f", &sv->diemTrungBinh);
}

void xuatSinhVien(SV sv){
	printf ("\n\nThong tin sinh vien:");
	printf ("\nMa so SV: %s", sv.maSinhVien);
	printf ("\nHo ten SV: %s", sv.tenSinhVien);
	printf ("\nDiem trung binh cac mon: %.1f", sv.diemTrungBinh);
}
int main(){
	
	SV sv[100];
	int i;
	int n;
	printf ("\nNhap vao so luong SV muon them: ");
	scanf("%d", &n);
	
	for (i = 0; i < n; i++){
		nhapSinhVienConTro(&sv[i]);
	}
	
	for (i = 0; i < n; i++){
		xuatSinhVien(sv[i]);	
	} 
}

BÀI 3: SẮP XẾP SINH VIÊN THEO ĐIỂM TĂNG DẦN
Hướng dẫn: Sử dụng lại bài số 1, trước khi hiển thị sinh viên ra màn hình thì chạy giải thuật sắp xếp

code tham khảo:
#include<stdio.h>
struct SinhVien{
	char maSinhVien[8];
	char tenSinhVien[50];
	float diemTrungBinh;
};

typedef struct SinhVien SV;

void nhapSinhVienConTro(SV *sv){
	
	printf("\nNhap ma so SV: "); scanf("%s", &sv->maSinhVien);
	
	printf("\nNhap ho ten SV: "); 
	getchar();

	gets(sv->tenSinhVien);
	printf("\nNhap diem trung binh: "); scanf("%f", &sv->diemTrungBinh);
}

void xuatSinhVien(SV sv){
	printf ("\n\nThong tin sinh vien:");
	printf ("\nMa so SV: %s", sv.maSinhVien);
	printf ("\nHo ten SV: %s", sv.tenSinhVien);
	printf ("\nDiem trung binh cac mon: %.1f", sv.diemTrungBinh);
}

void sapXep(SV sv[], int n){
	int i, j;
	for (i = 0; i < n - 1; i++){
		for (j = i + 1; j < n; j++){
			if (sv[i].diemTrungBinh > sv[j].diemTrungBinh){
				SV svtmp;
				svtmp = sv[i];
				sv[i] = sv[j];
				sv[j] = svtmp;
			}
		}
	}
}

int main(){
	
	SV sv[100];
	int i;
	int n;
	char maTimKiem[100];
	printf ("\nNhap vao so luong SV muon them: ");
	scanf("%d", &n);
	for (i = 0; i < n; i++){
		nhapSinhVienConTro(&sv[i]);
	}
	
	for (i = 0; i < n; i++){
		xuatSinhVien(sv[i]);	
	} 
	
	sapXep(sv, n);
	for (i = 0; i < n; i++){
		xuatSinhVien(sv[i]);	
	} 

} 

BÀI 4: TÌM KIẾM SINH VIÊN
Hướng dẫn: Sau khi đã nhập thông tin sinh viên vào mảng. Tìm kiếm sinh viên theo mã sinh viên

code tham khảo:
#include<stdio.h>
struct SinhVien{
	char maSinhVien[8];
	char tenSinhVien[50];
	float diemTrungBinh;
};

typedef struct SinhVien SV;

SV nhapSinhVien(){
	SV sv;
	printf("\nNhap ma so SV: "); scanf("%s", &sv.maSinhVien);
	
	printf("\nNhap ho ten SV: "); 
	getchar();

	gets(sv.tenSinhVien);
	printf("\nNhap diem trung binh: "); scanf("%f", &sv.diemTrungBinh);
	return sv;
}

void nhapSinhVienConTro(SV *sv){
	
	printf("\nNhap ma so SV: "); scanf("%s", &sv->maSinhVien);
	
	printf("\nNhap ho ten SV: "); 
	getchar();

	gets(sv->tenSinhVien);
	printf("\nNhap diem trung binh: "); scanf("%f", &sv->diemTrungBinh);
}

void xuatSinhVien(SV sv){
	printf ("\n\nThong tin sinh vien:");
	printf ("\nMa so SV: %s", sv.maSinhVien);
	printf ("\nHo ten SV: %s", sv.tenSinhVien);
	printf ("\nDiem trung binh cac mon: %.1f", sv.diemTrungBinh);
}

void timKiemSinhVien(SV sv[], int n, char maSoSinhVien[100]){
	int i;
	for (i = 0; i < n; i++){
		if (strcmp(maSoSinhVien, sv[i].maSinhVien) == 0){
			xuatSinhVien(sv[i]);
			return;
		}
	}
	printf("\nKhong tim thay sinh vien co ma %s", maSoSinhVien);
	
}
int main(){
	
	SV sv[100];
	int i;
	int n;
	char maTimKiem[100];
	printf ("\nNhap vao so luong SV muon them: ");
	scanf("%d", &n);
	for (i = 0; i < n; i++){
		nhapSinhVienConTro(&sv[i]);
	}
	
	for (i = 0; i < n; i++){
		xuatSinhVien(sv[i]);	
	} 
	
	printf("\nNhap vao ma sinh vien can tim: ");
	scanf("%s", maTimKiem);
	timKiemSinhVien(sv, n, maTimKiem);
}


Xong!

No comments:

Post a Comment

/*header slide*/