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!
- Ma Trận Danh Sách Kề Của Đồ Thị Vô Hướng
- Cấu trúc dữ liệu và giải thuật - CĐN Công nghiệp Hà Nội - 18
- Cấu trúc dữ liệu và giải thuật - CĐN Công nghiệp Hà Nội - 19
- Cấu trúc dữ liệu và giải thuật - CĐN Công nghiệp Hà Nội - 21
- Cấu trúc dữ liệu và giải thuật - CĐN Công nghiệp Hà Nội - 22
- Cấu trúc dữ liệu và giải thuật - CĐN Công nghiệp Hà Nội - 23
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");
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);