Cấu trúc dữ liệu và giải thuật - CĐN Công nghiệp Hà Nội - 20

break; case 2:

InMchuoi(p,n); getch();

break; case 3:

SXMchuoi(p,n); break;

default: printf("n Ban chon chua dung!");

}

} while (chon!=0); free(p);

}

int Menu()

{ int chon; clrscr();

Có thể bạn quan tâm!

Xem toàn bộ 200 trang tài liệu này.

printf("n MOT SO THUAT TOAN VE MANG CHUOInn");

printf(" 1. Nhap ho tenn");

Cấu trúc dữ liệu và giải thuật - CĐN Công nghiệp Hà Nội - 20

printf(" 2. Hien danh sach ho tenn"); printf(" 3. Sap xep ho tenn");

printf(" 0. Thoat khoi chuong trinhn");

printf(" Nhan so tuong ung de chon chuc nang:n"); scanf("%d",&chon);

return (chon);

}

void NhapMchuoi(char xau[][10],char *p[], int n)

{ int i; char x[10]; fflush (stdin);

for (i=0; i < n ; i++)

{

printf("n Nhap chuoi thu %d ",i); gets(xau[i]);p[i]=xau[i];

}

}

void InMchuoi( char *p[], int n)

{

int i;

for (i=0; i < n ; i++) puts(p[i]);

}

void SXMchuoi( char *p[], int n)

{ int i, j; char *tg;

for (i=0; i<n-1; i++)

for (j=i+1; j<n; j++)

if (stricmp (p[i],p[j]) >0)

{

tg=p[i]; p[i]=p[j]; p[j]=tg;

}

}

Ví dụ 20: Dùng mảng con trỏ chuỗi p để chứa xâu ký tự

/*thay hàm nhapMCTchuoi vào chương trinh trên và chạy thử, nhận xét kết quả*/

void NhapMCTchuoi(char *p[], int n)

{ char x[10]; int i;

fflush (stdin);

for (i=0; i < n ; i++)

{ p[i]=(char*)malloc(10 * sizeof(char)); printf("n Nhap chuoi thu %d ",i); gets(x); strcpy(p[i],x);

}

} /*lưu ý dùng hàm free(p) giải phóng bộ nhớ động trước khi kết thúc chương trình */

4.5. Con trỏ và kiểu cấu trúc.

a. Con trỏ cấu trúc (con trỏ bản ghi):

- Trong C có 2 cách định nghĩa cấu trúc một bản ghi đó là dùng struct và typedef struct :

struct Date

{

unsigned char day; unsigned char month; unsigned int year;

};

Hoặc typedef struct

{

unsigned char day; unsigned char month; unsigned int year;

} Date;

- Định nghĩa 2 bản ghi lồng nhau. Giả sử để lưu trữ thông tin về một sinh viên có sử dụng kiểu Date lưu thông tin ngày sinh như sau:

struct SinhVien

{

char Hten [35];

struct Date Ngsinh; /*sử dụng kiểu Date được định nghĩa

ở cách 1*/

float LaptrinhCB, KientrucMT, MangMT, DiemTB;

}sv1, sv2; //sv1, sv2 là 2 biến bản ghi SinhVien

Hoặc

typedef struct SinhVien

{

char Hten [35];

Date Ngsinh; /*sử dụng kiểu Date được định nghĩa ở

cách 2*/

float TinDC, LaptrinhCB, KientrucMT, MangMT, DiemTB;

} s1, s2 ; /*s1, s2 và SinhVien là các kiểu bản ghi

có cấu trúc giống nhau*/

- Khai báo biến bản ghi và biến con trỏ bản ghi:

Theo cách 1:


Theo cách 2:

struct SinhVien sv, *p;


SinhVien sv, *p;

Việc khai báo một biến con trỏ kiểu bản ghi cũng tương tự như khai báo một biến con trỏ có kiểu dữ liệu khác, tức là đặt thêm dấu * vào trước tên biến.

Cú pháp: struct <Tên cấu trúc> * <Tên biến con trỏ>;

//theo định nghĩa cách 1

Hay <Tên cấu trúc> * <Tên biến con trỏ>;

//theo định nghĩa cách 2

- Truy cập tới từng phần tử (từng trường) bản ghi:

Đối với biến bản ghi: Dùng dấu chấm (.) để phân cách giữa tên biến bản ghi và tên biến trường

<Tên biến bản ghi>.<Tên biến trường> ;

Ví dụ: sv.Hten=”Nguyen Tuan Nghia”

Đối với biến con trỏ bản ghi: Dùng dấu -> (là dấu – và dấu >) để phân cách giữa tên biến con trỏ bản ghi và tên biến trường

<Tên biến con trỏ bản ghi> -> <Tên biến trường>; Hay (*<Tên biến con trỏ bản ghi>) . <Tên biến trường>;

Ví dụ:


p=&sv; // cho con trỏ p trỏ vào vùng nhớ của biến sv printf(“ %s”,p->Hten); //truy nhập qua con trỏ Hay

printf(“ %s”,(*p).Hten); //truy nhập qua vùng nhớ con trỏ

Ta cũng có thể sử dụng phép toán * để truy cập vùng dữ liệu đang được quản lý bởi con trỏ cấu trúc để lấy thông tin cần thiết.

- Cấp phát động cho biến con trỏ bản ghi: Cũng dùng hàm malloc() hoặc calloc để cấp phát.

p=(struct SinhVien*)malloc(sizeof(struct SinhVien)); hay

p=(SinhVien*)malloc(sizeof(SinhVien));

Ví dụ 21: Sử dụng con trỏ bản ghi viết hàm nhập và hàm xuất giá trị của một bản ghi sinh viên.

//Khai báo tiền xử lý

#include<string.h>

#include<conio.h>

#include<stdio.h>

#include<alloc.h>

//định nghĩa bản ghi Date

typedef struct

{ unsigned char day; unsigned char month; unsigned int year;

} Date;

//định nghĩa bản ghi SinhVien

struct SinhVien

{ char Hten [35]; Date Ngsinh;

float LaptrinhCB, KientrucMT, MangMT, DiemTB;

};

// Định nghĩa hàm nhapSinhVien

void NhapSinhVien (struct SinhVien *p)

{ char ht[35]; unsigned char d; unsigned int n; float diem; fflush(stdin); //hàm xóa vùng đệm bàn phím printf("n Ho ten: "); gets(ht) ; strcpy(p->Hten,ht);

//Nhập ngày, tháng, năm sinh của sinh viên

printf("ngay sinh: "); scanf("%u", &d); p->Ngsinh.day=d; printf("thang sinh: "); scanf("%u", &d); p->Ngsinh.month=d; printf("nam sinh: "); scanf("%u", &n); p->Ngsinh.year=n;

//Nhập điểm cho sinh viên

printf("Diem Lap trinh CB: "); scanf("%f", &diem); p->LaptrinhCB=diem; printf("Diem Kien truc MT: "); scanf("%f", &diem); p->KientrucMT)=diem;

printf("Diem Mang MT: "); scanf("%f",&diem); p->MangMT=diem;

//Tính điểm trung bình

p->DiemTB=( p-> LaptrinhCB+ p-> KientrucMT+ p-> MangMT )/3;

}

//Định nghĩa hàm hiện thông tin về một bản ghi sinh viên

void HienSinhVien (struct SinhVien *p)

{ //hiện thông tin sinh viên

printf ("n Sinh vien %35s”, p->Hten);

printf ("n sinh ngay %2d thang %2d nam %4d “, p->Ngsinh.day,

p-> Ngsinh.month, p->Ngsinh.year); printf ("n Diem Lap trinh CB : %4.1f”, p->LaptrinhCB); printf ("n Diem Kien truc MT : %4.1f”, p->KientrucMT); printf ("n Diem Mang MT : %4.1f”, p->MangMT);

printf ("n Diem TB : %4.1f”, p->DiemTB); getch();

}

//Định nghĩa hàm main()

int main(void)

{ clrscr;

struct SinhVien *p, sv; /*khai báo biến con trỏ kiểu bản ghi

SinhVien*/

p=&sv; //cho con trỏ p trỏ vào vùng nhớ biến sv

// hoặc p=(struct SinhVien*)malloc(sizeof(struct SinhVien));

NhapSinhVien(p) ; //gọi hàm NhapSinhVien

printf(“n HIEN THONG TIN CHO MOT SINH VIEN:”);

HienSinhVien (p); // Gọi hàm hienSinhVien

//hoặc free(p);

return(0);

}//kết thúc hàm main.

b. Con trỏ mảng bản ghi

- Khai báo biến mảng bản ghi và biến con trỏ mảng bản ghi:

Theo cách 1:

struct SinhVien ds[100], *p;

Theo cách 2:

SinhVien ds[100], *p;

Khai báo biến con trỏ mảng bản ghi cũng giống như khai báo một biến con trỏ bản ghi, tức là đặt thêm dấu * vào trước tên biến.

- Truy cập tới phần tử của mảng bản ghi và trường:

Đối với biến mảng bản ghi:

<Tên biến bản ghi>[chỉ số phần tử].<Tên biến trường> ; Ví dụ: ds[1].Hten=”Nguyen Tuan Nghia”;

ds[2]=ds[1];

Đối với biến con trỏ mảng bản ghi

<Tên biến con trỏ bản ghi>[ chỉ số phần tử] . <Tên biến trường>;

Hay (*(<Tên biến con trỏ bản ghi> + < chỉ số phần tử>)) . <Tên biến

trường>;

Hay (<Tên biến con trỏ bản ghi> + < chỉ số phần tử>) -> <Tên biến

trường>;

Ví dụ:


p=ds; // cho con trỏ p trỏ vào vùng nhớ của biến ds printf(“ %s”,p[1].Hten); //truy nhập qua con trỏ Hay

printf(“ %s”,(*(p+1)).Hten); //truy nhập qua vùng nhớ con trỏ

hay

(p+i)-> LaptrinhCB= 9; //truy cập theo kiểu bản ghi

Ta phải thêm chỉ số phần tử vào sau tên biến bản ghi

- Cấp phát động cho biến con trỏ bản ghi: Cũng dùng hàm malloc() hoặc calloc để cấp phát

p=(struct SinhVien*)malloc(n*sizeof(struct SinhVien)); hay

p=(SinhVien*)malloc(n*sizeof(SinhVien)); n là số lượng bản ghi yêu cầu được cấp phát

Ví dụ 22: Sử dụng con trỏ mảng bản ghi viết hàm nhập và hàm xuất giá trị của một bản ghi sinh viên

//Khai báo tiền xử lý

#include<string.h>

#include<conio.h>

#include<stdio.h>

#include<alloc.h>

//định nghĩa bản ghi Date

typedef struct

{ unsigned char day; unsigned char month; unsigned int year;

} Date;

//định nghĩa bản ghi SinhVien

struct SinhVien

{ char Hten [35]; Date Ngsinh;

float LaptrinhCB, KientrucMT, MangMT, DiemTB;

};

// Định nghĩa hàm nhapDSSV

void NhapDSSV (struct SinhVien *p, int n)

{ char ht; unsigned char d; unsigned int nam; float diem; for (int i=0; i<n; i++)

{ fflush(stdin); //hàm xóa vùng đệm bàn phím

printf("n Ho ten: "); gets(ht); strcpy(p[i].Hten,ht);

//Nhập ngày, tháng, năm sinh của sinh viên

printf("ngay sinh: "); scanf("%d",&d); p[i].Ngsinh.day=d;

printf("thang sinh: "); scanf("%d", &d ); p[i]. Ngsinh.month=d;

printf("nam sinh: "); scanf("%d",&nam);

p[i].Ngsinh.year=nam;

//Nhập điểm cho sinh viên

printf("Diem Lap trinh CB: "); scanf("%f", &diem);

Xem toàn bộ nội dung bài viết ᛨ

..... Xem trang tiếp theo?
⇦ Trang trước - Trang tiếp theo ⇨

Ngày đăng: 19/11/2023