HƯỚNG DẪN LẬP TRÌNH C pdf

36 522 4
HƯỚNG DẪN LẬP TRÌNH C pdf

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

HƯỚNG DẪN LẬP TRÌNH C Mục Lục Trang CHƯƠNG 1: Cơ bản Lập Trình C 1. Lịch Sử Của C++ 2 2. 1 chương trình C 2 3. Các kiểu dữ liệu 2 4. Khai báo Biến 2 5. BiỂU THỨC (EXPRESSION) 3 6. Khai báo mảng của các kiểu dữ liệu 3 7. Nhập xuất cơ bản 3 8. Hàm Con 4 9. Lệnh điều kiện if else if else 4 10. Lệnh switch( ) 5 11. Lệnh vòng lặp while(điều kiện lặp) 5 12. Lệnh vòng lặp do{} while() 5 13. Lệnh vòng lặp for 5 14. Xử lý Hàm 6 CHƯƠNG 2: Mảng 1 chiều 1. Định nghĩa 7 2. Truyền mảng vào hàm 7 3. Kĩ thuật tìm 7 4. Kỹ thuật đặt lính canh 7 5. Kĩ thuật liệt kê vị trí 8 6. Kĩ thuật tính tổng 8 7. Kĩ thuật đếm 8 8. Kĩ thuật thêm 8 9. Kĩ thuật xoá 8 10. Một số bài tập minh hoạ 9 CHƯƠNG 3: Ma trận – Con trỏ 1. Ma trận 12 2. Con Trỏ 12 3. Một số bài tập minh hoạ 13 CHƯƠNG 4: Trừu tượng hoá dữ liệu 1. Định nghĩa 15 2. Nhập – Xuất 15 3. Các bài tập minh hoạ 15 CHƯƠNG 5: Đệ Quy – Độ phức tạp của thuật toán (tham khảo) 1. Đệ quy 18 2. Độ phức tạp thuật toán 19 CHƯƠNG 6: Tìm kíêm 1. Tìm kíêm tuyến tính 20 2. Tìm kiếm nhị phân 20 CHƯƠNG 7: Sắp Xếp Mảng 1. Sắp xếp tuần tự (InterchangeSort) 21 2. Sắp xếp chèn (InsertionSort) 21 3. Sắp xếp chọn (SelectionSort) 21 4. Sắp xếp nổi bọt (BubbleSort) 22 5. Một số bài tập minh hoạ 22 6. Sắp xếp ma trận tăng dần 23 CHƯƠNG 8: Danh sách Liên Kết 1 1. Danh sách liên kết đơn 24 2. Danh sách liên kết kép (tham khảo) 25 3. Bài tập minh hoạ 26 CHƯƠNG 9: STACK & QUEUE (tham khảo) 1. STACK (Ngăn Xếp) 27 2. Queue (Hàng Đợi) 27 CHƯƠNG 10: CÂY 1. Cấu trúc Cây 28 2. Cây nhị phân 28 3. Cây Nhị Phân Tìm Kiếm 30 CHƯƠNG 11: Chuyển qua lại các Dạng Cấu Trúc CHƯƠNG 1: Cơ bản Lập Trình C 1. Lịch Sử Của C++ • C++ dựa trên ngôn ngữ lập trình C. C được phát minh trước 1970 bởi Dennis Ritchie, là ngôn ngữ cài đặt hệ thống cho hệ điều hành Unix. • C++ được phát minh bởi Bijarne Stroustroup, bắt đầu năm 1979. • Các chuẩn ngôn ngữ C++ hiện tại được điều khiển bởi ANSI và ISO 2. CHƯƠNG trình C gồm 3 phần chính: a) Khai báo thư viện, định nghĩa (define) các bíên ko đổi b) Khai báo các hàm con c) Khai báo void main() #include<conio.h> #include<stdio.h> #define swap(a,b){ int t = a; a = b; b = t; } #define MAX 50 void nhap(int a[], int &n){ … } void xuat(int a[], int n){ … } void main(){ clrscr(); int a[MAX], n; getch(); } 3. Các kiểu dữ liệu: Có 2 loại: • Kiểu thông thường, sẵn có trg C: o int : số nguyên _ dung lượng 2byte _ VD: -7, -2, 0, 3, 5, 15, 200, … o long : số nguyên dài _ dung lượng 4byte _ VD: 0951020158, 1234567890 o float : số thực _ dung lượng 4byte _ VD: -5.6, -8.0, -1, 0, 15.3, … o char : kí tự _ dung lượng 1byte _ VD: a, b, c, +, -,…. o char* : chuỗi kí tự _ dung lượng n _ VD: dsdsds, Tran Anh Minh, … (n là độ dài chuỗi) o char[n] : chuỗi kí tự _ dung lượng n (nhưng ko thể thay đổi n, khác với char* có thể thay đổi ) • Kiểu mới, do ng` dùng định nghĩa (sử dụng struct): o sv : kiểu sinh viên _ gồm hoten(kiểu char[30] ), MaSV( kiểu long ), tb( kiểu float ) o nv : kiểu nhân viên _ gồm hoten(kiểu char[30] ), MaNV( kiểu long ), luong( kiểu float ) • Lưu ý : Các kiểu mới tuỳ theo đề bài sẽ có thay đổi (VD MaSV là kiểu char[5]), 2 kiểu trên là thường đc sử dụng. 4. Khai báo Biến: • Khai báo rồi mới khởi tạo biến. VD: int a; a = 5; • Vừa khai báo, vừa khởi tạo biến.VD: int a = 5; • Biến mặt nạ: &”tên biến” = “biến” : chỉ là 1 tên gọi khác của biến kia, tức nếu có xử lý trên biến mặt nạ thì biến kia cũng bị thay đổi y như vậy, do đó cũng chỉ là 1 tên khác 2 a b c VD: int a = 5; int &b = a; a++; b++; printf(“%d”,a); printf(“%d”,b); Khai báo như vậy có nghĩa: - ta khai báo 1 biến số nguyên a, gán cho a = 5. - Sau đó ta đặt 1 tên khác cho a, là b. - khi lệnh a++ đc thực hiện thì a = b = 6. - Và khi b++ đc thực hiện thì a = b = 7. - Khi printf a và b đều cho ra kết quả là 7 - Nếu xuất ra địa chỉ của a và b thì ta sẽ thấy chúng cùng địa chỉ, b chỉ là 1 tên khác của a • Biến đồng cấp: “biến 1” = “bíên 2”: bíên 1 sẽ là 1 biến độc lập so với biến 2, khác địa chỉ của biến 2, có giá trị giống biến 2. Những gì xảy ra cho “biến 1” ko ảnh hưởng gì “biến 2” VD: int a = 5; int b = a; a = a + 5; b = b + 2; printf(“a = %d\n”,a); printf(“b = %d”,b); Khi xuất ra màn hình ta sẽ có: a = 10 b = 7 Nếu xem địa chỉ thì sẽ thấy địa chỉ 2 biến sẽ khác nhau 5. BiỂU THỨC (EXPRESSION) 6. Khai báo mảng của các kiểu dữ liệu (mảng là 1 tập hợp các ptử cùng kiểu dữ liệu): • MAX là do ng` dùng định nghĩa bằng cách : #define MAX 100 // có thể là 100 hoặc 1 số khác • Khai báo 1 mảng số nguyên: int a[MAX]; • Khai báo 1 mảng số nguyên dài: long a[MAX]; • Khai báo 1 mảng số thực: float a[MAX]; • Khai báo 1 mảng kí tự: char a[MAX]; => Mảng kí tự chính là 1 chuỗi cố định • Khai báo 1 mảng sv: sv a[MAX]; 7. Nhập xuất cơ bản: • Nhập: scanf(“ … ”, &… ); và gets(…); o int : scanf(“%d”, &a); o long : scanf(“%ld”, &a); o float : scanf(“%f”, &a); o char : scanf(“%c”, &a); o char* : gets(a); // Lưu ý: trước dòng gets(a); phải có flushall(); o char[n] : gets(a); // Lưu ý: trước dòng gets(a); phải có flushall(); • Xuất : printf(“ % ”, … ); hoặc printf(“ 1 câu văn ”); hoặc printf(“ 1 câu văn % ”, …); o int : printf(“%d”, a); o long : printf(“%ld”, a); o float : printf(“%f”, a); o char : printf(“%c”, a); o char* : printf(“%s”, a); o char[n] : printf(“%s”, a); #include<conio.h> #include<stdio.h> void main(){ clrsrcr(); int n; 3 char* s; printf(“ Moi nhap so nguyen n “); scanf(“%d”,&n); printf(“Moi nhap 1 chuoi”); flushall(); gets(s); printf(“So nguyen vua nhap la : %d,” n); printf(“Chuoi vua nhap la : %s”,s); getch(); } 4 Các câu lệnh nhập Các câu lệnh xuất 8. Hàm Con: có thể chuyển VD trên thành 1 CT có 2 hàm con, đó là hàm nhập & xuất Dòng #include<conio.h> #include<stdio.h> void nhap(int &n, char* &s){ printf(“ Moi nhap so nguyen n “); scanf(“%d”,&n); printf(“Moi nhap 1 chuoi”); flushall(); gets(s); } void xuat(int n, char *s){ printf(“So nguyen vua nhap la : %d,” n); printf(“Chuoi vua nhap la : %s”,s); } void main(){ clrscr(); int n; char* s; nhap(n,s); xuat(n,s); getch(); } Khi ta sửa đổi 1 biến (nhập, tăng thêm, giảm đi, xoá …) thì khi truyền vào hàm con, ta phải thêm & Khi xuất ra hay ko thay đổi ảnh hưởng tới biến thì ko cần & Lưu ý: thay đổi trên mảng thì ko cần & VD: void nhap(int a[], int &n) { … } Tham số truyền vào hàm trong void main() ko nhất thíet phải trùng tên với trong hàm con (dòng 3 và dòng 18), VD hàm nhập ta có thể sửa lại như sau và vẫn đúg: void nhap(int &a, char* &b){ printf(“ Moi nhap so nguyen n “); scanf(“%d”,&a); printf(“Moi nhap 1 chuoi”); flushall(); gets(b); } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 9. Lệnh điều kiện if else if else: Chỉ 1 điều kiện Chỉ 2 điều kiện Hơn 2 đk Cấu trúc if( điều kiện ) <Xử lý>; if( điều kiện ) <Xử lý>; else <Xử lý>; if( điều kiện ) <Xử lý>; else if( điều kiện ) <Xử lý>; ……………… else if( điều kiện ) <Xử lý>; else <Xử lý>; VD if( a > b) printf(“%d”,a); if( dem == 0 ) printf(“Ko co ptu ”); else printf(“Co ptu”); if( tb > 9) printf(“Xuat sac”); else if( tb > 8 ) printf(“Gioi”); ……………… else if( tb > 7 ) printf(“Kha”); else printf(“loại”); Nhận xét Dùng cho các điều kiện chỉ có 2 giả thuyết. VD: đúng/sai, khác hoặc bằng, >= hoặc < , tồn tại hay ko tồn tại… Câu lệnh sẽ xét từ trên xuống, nếu đúg đk trog if thì xử lý và thoát ra, nếu ko sẻ đi tới cuối và xử lý của else cuối sẽ đc thực hiện VD: tb = 8 thì sẽ bỏ qua 2 if đầu và xuất ra “Khá” VD: tb = 2 thì sẽ bỏ qua 3 if đầu và xuất ra “Loại”. • Nếu có nhiều hơn 2 xử lý thì các xử lý nằm trong {…}. VD: if( a > b) { printf(“ %d ”, b); return; } • Nếu ko có {…} thì lệnh xử lý gần if nhất là của if, các lệnh còn lại thì ko phải. VD: if( a > b) printf(“ %d ”, b); printf(“%d”,a); • Nếu có nhiều hơn 2 giả thuyết (phần nằm trong if ) thì các giả thuyết liên kết bởi “&&” hoặc “||” tuỳ TH. VD: if( a > b && b > 0 ) printf(“%d”,a); Chỉ thực hiện “xử lý” xuất ra a khi a dương và lớn hơn b ( do a > b > 0 ) if( x == 1 || x == 2 ) printf(“Thoả ”); Chỉ thực hiện “xử lý” xuất ra “Thoả” khi x = 1 hoặc x = 2 10. Lệnh switch( ) : 5 • Cấu trúc: switch(“biến”) { case “giá trị” : “xử lý”; break; …… case “giá trị” : “xử lý”; break; } • “biến” có thể trong 3 kiểu dữ liệu: int / long / char • Hàm switch đc dùng thay cho if else if else khi số if else lớn, khó nhìn. Nhưng cũng có mặt hạn chế là ko dùng cho float / chuỗi, và ko so sánh đc. • Khi “biến” có giá trị = với “giá trị” ở case thì các lệnh xử lý ở case đó sẽ đc thực thi đến khi gặp lệnh break VD: switch(thang) // thang la bien kieu int { case 1 : printf(“Thang 1”); break; …… case “12” : printf(“Thang 12”); break; } VD: switch(c) // c la bien kieu char { case ‘a’ : printf(“a”); break; …… case “z” : printf(“z”); break; } 11. Lệnh vòng lặp while(điều kiện lặp): Đkiện lặp sẽ xét trước khi thực hiện các “xử lý” sau nó. V D while( a > b ) { a ; b++; } while( a > b ) a ; b++; while( a > b && a > 0) a ; b++; Nếu có { } thì các lệnh trg dấu ngoặc đều thuộc vòng lặp, sẽ đc thực hiện đến khi nào đk lặp sai (tức a <= b) Nếu ko có { } thì lệnh gần while nhất sẽ thuộc vòng lặp & sẽ đc thực hiện đến khi nào đk lặp sai (tức a <= b) còn b++ chỉ xãy ra khi a <= b Liên kết 2 đk lặp cũng giống như if() 12. Lệnh vòng lặp do{} while(): Giống while nhưng khác là các hàm xử lý trong do { } sẽ diễn ra trước khi xét đk lặp ở while() VD do { a ; b++; } while( a > b ); do { a ; b++; } while( a > b && a > 0 ); Nếu có { } thì các lệnh trg dấu ngoặc đều thuộc vòng lặp, sẽ đc thực hiện đến khi nào đk lặp sai (tức a <= b) Liên kết 2 đk lặp cũng giống như if() 13. Lệnh vòng lặp for(“biểu thức 1” ; ”biểu thức 2” ; ”biểu thức 3”) : d) Biểu thức 1 dùng khởi tạo các bíên, biến đếm, biến cộng, biến con trỏ , … VD: int i = 0 ; node* p = h; … e) Biểu thức 2 dùng làm đk lặp, nếu đk này sai thì for dừng. VD : i<n; p (tương đương với p != NULL) ;… f) Biểu thức 3 dùng để xử lý biến đếm g) Các biểu thức đi theo trình tự : xảy ra biểu thức 1 -> so sánh trong biểu thức 2 -> thực thi các xử lý vòng for -> xử lý trog biểu thức 3 h) Biểu thức 1 & 3 ko có cũng đc, nhưng biểu thức 2 nếu ko có thì for sẽ lặp lại mãi vì ko có đk dừng V D for(;;) for(int i=0; i<n; i++) t++; a++; for(int i=0; i<n; i++) { t++; a++; } for(int i=0; i<n; i++); t++; a++; for lặp lại mãi t++ sẽ đc thực hiện n lần còn a++ chỉ xảy ra sau khi vòng for dừng t++ & a++ xãy ra n lần Cả a++ và t++ đều ko thuộc vòng for do có dấu “;” cuối vòng for. 6 14. Xử lý Hàm void xuly(int a, int b){ int a++; int b ; printf(“a = %d\n”,a); printf(“b = %d”,b); } void tong(){ int x = 5, y = 3; xuly(x,y); printf(“x = %d\n”,x); printf(“y = %d”,y); } Lúc này nếu trong void main ta gọi đến hàm tong() , thì sau khi khai báo x = 5, y = 3, CT sẽ gọi đến hàm xuly(x,y) … lúc này trước khi vào thân hàm xuly, sẽ xảy ra các câu lệnh sau: int a = x; int b = y; => ta gán 2 bíên khác, là a và b, có giá trị bằng với x và y => Khi xử lý a,b trong hàm xuly thì x,y ở ngoài ko thay đổi giá trị ban đầu. Khi ta xuất a, b ra màn hình thì a = 6 b =2 Nhưng khi thoát khỏi xuly(x,y) trở lại tong(), ta xuất x, y ra màn hình thì vẫn đc gía trị x, y ban đầu : x = 5, y = 3 void xuly(int &a, int &b){ int a++; int b ; printf(“a = %d\n”,a); printf(“b = %d”,b); } void tong(){ int x = 5, y = 3; xuly(x,y); printf(“x = %d\n”,x); printf(“y = %d”,y); } Lúc này nếu trong void main ta gọi đến hàm tong() , thì sau khi khai báo x = 5, y = 3, CT sẽ gọi đến hàm xuly(x,y) … lúc này trước khi vào thân hàm xuly, sẽ xảy ra các câu lệnh sau: int &a = x; int &b = y; => ta gán 2 bíên mặt nạ, hay nói cách khác, đặt lại tên cho x,y để có thể dùng trong hàm, là a và b, có giá trị bằng với x và y => Khi xử lý a,b trong hàm xuly thì x,y ở ngoài sẽ thay đổi y như vậy. Khi ta xuất a, b ra màn hình thì: a = 6 b =2 Và khi thoát khỏi xuly(x,y), trở lại tong(), ta xuất x, y ra màn hình thì đc gía trị x, y như a,b trong hàm: x = 6 y = 2 void xuly(int &x, int y){ int a++; int b ; printf(“a = %d\n”,a); printf(“b = %d”,b); } void tong(){ int x = 5, y = 3; xuly(x,y); printf(“x = %d\n”,x); printf(“y = %d”,y); } Lưu ý : Tên biến trong và ngoài hàm có thể khác nhau hoặc giống nhau. Chỉ có tên biến trong cùng 1 hàm thì phải khác nhau. Dù cho tên biến trong và ngoài hàm có giống nhau, nhưng nếu đó ko phải khai báo biến mặt nạ, thì cũng ko làm thay đổi khi ra khỏi hàm. VD bên: Biến x thay đổi trong hàm xuly sẽ làm x ngoài hàm tong thay đổi theo. Nhưng biến y thì ko Trong TH này, kiểu khai báo x ta gọi là khai báo tham số (thay đổi sau lới gọi hàm), y ta gọi là khai báo tham trị (ko thay đổi sau lời gọi hàm) 7 CHƯƠNG 2: Mảng 1 chiều 1. Định nghĩa: Mảng 1 chiều thực chất là 1 tập hợp các biến có cùng kiểu, có địa chỉ sát bên nhau. VD : thay vì khai báo a,b,c,d,e,f,g,h là các biến số nguyên, ta có thể khai báo int a[8]. Ta sẽ có a[0], a[1], ,a[7] là các biến int cũng giống như a,b,c,d,e,f,g,h, nhưng dễ dàng quản lý bởi vòng for: for( int i=0; i<n; i++ ) 2. Truyền mảng vào hàm: Khi truyền vào hàm con, ta luôn truyền theo cách tham số: thay đổi cả trong & ngoài hàm. VD về nhập xuất mảng: #include<conio.h> #include<stdio.h> #define MAX 50 void nhap(int a[ ], int &n){ printf(“ Moi nhap n “); scanf(“%d”,&n); printf(“Moi nhap mang ”); for( int i=0; i<n; i++ ) nhap1ptu(a[i]); } void xuat(int a[ ], int n){ printf(“Mang vua nhap: ”); for( int i=0; i<n; i++ ) xuat1ptu(a[i]); } void main(){ int a[MAX]; int n; nhap(a,n); getch(); } #include<conio.h> #include<stdio.h> #define MAX 50 void nhap(float a[ ], int &n){ printf(“ Moi nhap n “); scanf(“%d”,&n); printf(“Moi nhap mang ”); for( int i=0; i<n; i++ ) nhap1ptu(a[i]); } void xuat(float a[ ], int n){ printf(“Mang vua nhap: ”); for( int i=0; i<n; i++ ) xuat1ptu(a[i]); } void main(){ float a[MAX]; int n; nhap(a,n); getch(); } #include<conio.h> #include<stdio.h> #define MAX 50 void nhap(sv a[ ], int &n){ printf(“ Moi nhap n “); scanf(“%d”,&n); printf(“Moi nhap mang ”); for( int i=0; i<n; i++ ) nhap1ptu(a[i]); } void xuat(sv a[ ], int n){ printf(“Mang vua nhap: ”); for( int i=0; i<n; i++ ) xuat1ptu(a[i]); } void main(){ sv a[MAX]; int n; nhap(a,n); getch(); o Ta phải gọi n bằng cách tham số trong hàm nhập do n trước & trong khi gọi hàm nhập có sự thay đổi, và ta muốn lưu sự thay đổi này để dùng cho các hàm sau đó như hàm xuất mảng. o Trong hàm xuất ta ko cần gọi n theo tham số do ko có sự thay đổi n trong hàm xuat() o Còn mảng a thì mặt định là đã dùng theo cách tham số 3. Kĩ thuật tìm ptử đầu / cuối thoả yêu cầu: bằng cách gặp ptử thoả yêu cầu thì return. Tương tự cho tìm vị trí. int duong_dau(int a[], int n) { for(int i=0; i<n; i++) if(a[i]>0) return a[i]; return -1; } int chan_cuoi(int a[], int n) { for(int i=n-1; i>=0 ; i ) if(a[i]%2==0) return a[i]; return -1; } int vitri_ngto_dau(int a[], int n) { for(int i=1; i<n; i++) if(a[i]%2==0) return i; return -1; } 4. Kỹ thuật đặt lính canh: gán 1 biến # bằng ptử thứ nhất của mảng. so sánh bíên đó với các ptử còn lại để tìm: lớn nhất, nhỏ nhất, tìm ptử chẵn/lẻ/ngtố lớn nhất/ nhỏ nhất. Hoặc tìm vị trí của chúng. int ptu_max(int a[], int n) { int ln=a[0]; for(int i=0; i<n; i++) if(a[i] > ln) ln=a[i]; return ln; } int duong_min (int a[], int n) { int vt = vitri_duong_dau(a,n); if( vt == -1 ) return 0; int dnn = a[vt]; for(int i = vt; i<n; i++) if( a[i] < dnn && a[i] > 0 ) dnn = a[i]; return dnn; } int ptu_ngto_max(int a[], int n) { int vt = vitri_ngto_dau(a,n); if( vt == -1 ) return 0; int ln = a[vt]; for(int i = vt; i<n; i++) if( xetngto(a[i]) && a[i] > ln ) ln = a[i]; return ln; } int ptu_max(int a[], int n) { int t=0; for(int i=0; i<n; i++) if( a[i] > a[t] ) t=i; return t; } int vitri_ptu_min (int a[], int n) { int vt = 0; for(int i=1; i<n; i++) if(a[i] < a[vt]) vt = i; return t; } int vitri_duong_min (int a[], int n) { int vt = vitri_duong_dau(a,n); if( vt == -1 ) return 0; for(int i = vt; i<n; i++) if( a[i] < a[vt] && a[i] > 0 ) vt = i; return vt; } 8 5. Kĩ thuật liệt kê vị trí: Thay vì return như kĩ thuật tìm vị trí đầu, cuối, với mỗi ptử thoã yêu cầu, ta xuất ra màn hình vị trí của nó. VD: liệt kê vị trí các ptử max, liệt kê vị trí các ptử dương min, hay liệt kê các ptử ngtố void lietke_ptu_lonhon_k(int a[], int n, int k) { for(int i = vt; i<n; i++) if( a[i] > k ) printf("%5d",a[i]); } void lietke_ptu_chan(int a[], int n) { for(int i = vt; i<n; i++) if( a[i]%2 == 0 ) printf("%5d",a[i]); } void lietke_ptu_ngto(int a[], int n) { for(int i = vt; i<n; i++) if( xetngto(a[i]) ) printf("%5d",a[i]); } void lietke_vitri_ptu_max(int a[], int n) { int t = ptu_max(a,n); for(int i=0; i<n; i++) if(a[i] == t) printf("%5d",i); } int lietke_vitri_duong_min (int a[], int n) { int t = duong_min(a,n); if( t == 0 ) return 0; for(int i = vt; i<n; i++) if( a[i] == t ) printf("%5d",i); return 1; } 6. Kĩ thuật tính tổng: Đặt 1 biến s = 0 trước khi vào vòng for. Kiểm tra từng ptử a[i], ptử nào thoả yêu cầu thì cộng dồn vào s. long tong(int a[], int n) { long s=0; for(int i=0; i<n; i++) s += a[i]; return s; } long tong_duong(int a[], int n) { long s=0; for(int i=0; i<n; i++) if( a[i] > 0 ) s += a[i]; return s; } long tong_ngto(int a[], int n) { long s=0; for(int i=0; i<n; i++) if( xetngto(a[i]) ) s += a[i]; return s; } 7. Kĩ thuật đếm: Đặt 1 biến đếm d = 0 trc khi vào vòng for, Kiểm tra từng ptử a[i], ptử nào thoả yêu cầu thì tăg biến đếm lên 1. int dem_chan(int a[], int n) { int dem=0; for(int i=0; i<n; i++) if ( a[i]%2==0 ) dem+ +; return dem; } int dem_ngto(int a[], int n) { int dem=0; for(int i=0; i<n; i++) if ( xet_so_nt(a[i])==1 ) dem++; return dem; } int dem_ptu_max( int a[], int n ) { int dem=0; int ln=lonnhat(a,n); for(int i=0; i<n; i++) if(a[i]==ln) dem++; return dem; } 8. Kĩ thuật thêm: Thêm 1 ptử t vào vị trí k Cho 1 mảng tăng. Thêm t vào mà mảng vẫn tăng void them_ptu(int a[],int &n, int k, int t) { for (int i=n; i>k; i ) a[i]=a[i-1]; a[k] = t; n=n+1; } void them_tang(int a[],int &n int t) { for (int i=n-1; i>=0 && a[i] > t; i ) a[i+1]=a[i]; a[i+1] = t; n=n+1; } 9. Kĩ thuật xoá: Xoá ptử ở vị trí k Xoá các ptử lớn nhất mảng void xoa_ptu(int a[], int &n,int k) { for (int i=vitrixoa; i<n; i++) a[i]=a[i+1]; n=n-1; } void xoa_max(int a[], int &n) { int ln=ptu_max(a,n); for(int i=0; i<n; ) if( a[i] == ln ) xoavitri(a,n,i); else i++; } 9 10. Một số bài tập minh hoạ: • Tính tổng các ptử dương trong mảng các số thực #include<conio.h> #include<stdio.h> #define maximum 100 void nhap(float a[],int &n) { printf("Nhap vao tong cac phan tu :"); scanf("%d", &n); printf("Bat dau nhap cac ptu cua mang : \n"); for( int i=0; i<n; i++) { printf("Ptu thu %d : ",i+1 ); scanf("%f",&a[i]); } } void xuat(float a[], int n) { for(int i=0; i<n; i++) printf("%4.1f",a[i]); } float tongptuduong(float a[], int n) { float s=0; for(int i=0; i<n; i++) if(a[i]>0) s = s + a[i]; return s; } void main() { clrscr(); int n; float a[maximum]; nhap(a,n); printf("\nMang vua nhap : "); xuat(a,n); float s = tongptuduong(a,n); printf("\nTong cac ptu duong trong mang : %4.1",s); getch(); } • Tính tổng các giá trị chính phương trong mảng các số nguyên #include<conio.h> #include<stdio.h> #include<math.h> #define maximum 100 void nhap(int a[],int &n) { printf("Nhap vao tong cac phan tu, luu y phai <=100 va >0 :"); scanf("%d", &n); printf("Bat dau nhap cac ptu cua mang : \n"); for( int i=0; i<n; i++) { printf("So thu %d : ",i+1 ); scanf("%d",&a[i]); } } void xuat(int a[], int n) { for(int i=0; i<n; i++) printf("%4d",a[i]); } int xet_chinh_phuong(int k) { if(k<4) return 0; else if( sqrt(k) == (int) sqrt(k) ) return 1; return 0; } long tongptu_chinhphuong(int a[], int n) { long s=0; for(int i=0; i<n; i++) if ( xet_chinh_phuong(a[i])==1 ) s += a[i]; return s; } void main() { clrscr(); int n,a[maximum]; nhap(a,n); printf("\nMang vua nhap : "); xuat(a,n); long s = tongptu_chinhphuong(a,n); if(s==0) printf("\nMang ko co ptu chinh phuong. "); else printf("\nTong cac ptu chinh phuong: %ld",s); getch(); } • Đếm số lượng giá trị dương chia hết cho 7 trong mảng các số thực #include<conio.h> #include<stdio.h> #define maximum 100 void nhap(float a[],int &n) { printf("Nhap vao tong cac phan tu:"); scanf("%d", &n); printf("Bat dau nhap cac ptu cua mang : \n"); for( int i=0; i<n; i++) { printf("So thu %d : ",i+1 ); scanf("%f",&a[i]); } } void xuat(float a[], int n) { for(int i=0; i<n; i++) printf("%4.1f",a[i]); } int demchiahetbay(float a[], int n) { int dem=0; for(int i=0; i<n; i++) if ( a[i] – (int) a[i] == 0 ) if( a[i]%7==0 && a[i]>0 ) dem++; return dem; } void main() { clrscr(); int n; float a[maximum]; nhap(a,n); printf("\nMang vua nhap : "); xuat(a,n); int dem = demchiahetbay(a,n); printf("\nMang co %d ptu duong chia het cho 7 ",dem); getch(); } 10 [...]... float kq = chuvi(A); printf("\nChu vi duong tron A la : %4.1f",kq); getch(); } nhapdiem(A.I); scanf("%f",&t); Tính chu vi tam gi c #include #include #include float chuvi( tg P) { float ab = khoangcach(P.A,P.B); float bc = khoangcach(P.B,P .C) ; float ac = khoangcach(P.A,P .C) ; return ab+bc+ac; } typedef struct diem { float x,y; }dm; typedef struct tamgiac { dm A,B ,C; }tg; void... đầu tiên c a queue q.a[q.head] Kiểm tra queue rỗng int IsEmpty(queue q){ return (q.head == q.tail); } 32 CHƯƠNG 10: C Y 1 • • • • C u tr c Cây Nút g c: Nút lá: Nút nhánh: Chiều cao: nút ko c nút cha nút ko c nút con nút ko phải lá ho c g c số m c trên c y = m c cao nhất trong c y+1 (g c có m c 0) 2 C y nhị phân: mỗi nút c tối đa 2 nút con, mỗi nút gồm 3 tp: giá trị( info ), liên kết tới nút con trái... lưu vào 1 biến con trỏ nút [h] Như vậy h chứa địa chỉ nút d (như trên) • Trong 1 số TH ta c ng c n sử dụng đến con trỏ t để bíêt c địa chỉ nút cuối c ng  [t] chứa địa chỉ nút s • C u tr c 1 nút : Danh sách c c số nguyên struct node{ int info; node* next; }; Nội dung Khai báo Danh sách c c số th c struct node{ float info; node* next; }; Code Gọi đến tp giá trị c a nút Gọi đến tp giá trị c a nút kiểu... stack đầu tiên sẽ lấy ra sau c ng, c c X bỏ vào stack sau c ng sẽ lấy ra đầu tiên • VD: C 1 mảg gồm 5 X: a b c d e Bỏ lần lượt (từ a -> e) từng X vào stack Khi lấy ra c ng lấy từng ptử thì sẽ c thứ tự ngc lại : ( e -> a ) • Ứng dụng: dùng khử Đệ Quy (tháp HN, QuickSort, C c hàm xử lý c y NP…), dùng cho c c bài toán c n làm ngc thứ tự (xuất mảng ngc, xuất 1 mảng đang tăng dần thành giảm dần …) • C u... tên prt1 o Con trỏ này c ng là 1 biến, nên c ng c địa chỉ, nó nằm ở địa chỉ 2000 trên bộ nhớ o Con trỏ chứa địa chỉ c a biến num  giá trị c a con trỏ là 1000 o Khi ta xuất *ptr1, ta sẽ xuất ra giá trị nằm ở địa chỉ mà con trỏ ptr1 chứa, t c giá trị tại vị trí 1000  xuất ra 10 C p phát: c ch dễ nhất là dùng new: KDL * = new KDL[bề rộng vùng c p phát] o int *p = new int; // C p phát 1... nguyên = random Xuất DS Tính tổng c c nút là số ng.tố Danh sách c c sinh viên struct node{ sv info; node* next; }; Chú thích Khai báo ban đầu DS rỗng C KDL int C KDL sv C KDL long C KDL int C KDL char[30] C KDL float C KDL địa chỉ 2byte Gán p = địa chỉ c a nút đầu, th c hiện {…} Ở đk lặp ta c : p , tươg đươg với p != NULL Hàm Tạo khoảng trống bộ nhớ vừa đủ cho 1 nút mới rồi gán giá trị x vào... (l>r)?l:r; } 3 C y Nhị Phân Tìm Kiếm: • Hàm xử lý c y NPTK ~ như c c hàm xử lý trên c y NP thông thg` # ở c c hàm : o Hàm Insert node & InputTree o Hàm Delete 1 node o C c hàm tìm kiếm ptử o Hàm xuất c y tăng dần chính là LNR, xuất c y giảm dần là RNL • C y nhị phân tìm kíêm cc y nhị phân c đ c điểm nút con trái nhỏ hơn nút cha nhỏ hơn nút con phải, nhỏ hơn theo kiểu dữ liệu đang xét o VD C y nhị phân... c c lk tới ptử kế • DSLK đơn là 1 dãy c c nút, mỗi nút c 2 bộ phận, phần giá trị và phần địa chỉ nút tiếp theo o VD: C 1 DSLK c c nút: d -> e -> l -> k -> p -> q -> w -> s • Khi đang xét nút k, ta bíêt c giá trị c a k (k->info) & địa chỉ c a nút tiếp - địa chỉ c a p, lưu trong k->next • Theo k->next ta sẽ tới c nút tiếp theo c a k – là nút p Từ p ta lại c p->info, p->next … • Như vậy địa chỉ c a... = tich_le(a,m,n); printf(“\nTich cac so lecua ma tran: %4.1f”,kq); getch(); } Tính trung bình c ng c c số dương trong ma trận c c số nguyên #include #include #define mx 30 void nhaphangcot( int &m, int &n ) { printf("Nhap vao so hang ma tran:"); printf("Nhap vao so cot ma tran:"); } scanf("%d", &m); scanf("%d", &n); void nhap( int a[][mx],int m, int n ) { printf("Bat dau nhap cac ptu... printf("\n"); } } C c kĩ thuật đếm, tính tổng, tìm kiếm, đặt c hiệu th c tương tự mảng 1 chiều, chỉ kh c ở 2 vòng for 2 Con Trỏ: • Định nghĩa: Con trỏ đơn giản chỉ là địa chỉ c a một vị trí bộ nhớ và cung c p c ch gián tiếp để truy xuất dữ liệu • • trong bộ nhớ VD: o Trong VD bên, ta khai báo 1 biến int tên num c giá trị = 10 o Biến num nằm ở địa chỉ 1000 trên bộ nhớ o Ta khai báo tiếp 1 con trỏ kiểu . HƯỚNG DẪN LẬP TRÌNH C M c L c Trang CHƯƠNG 1: C bản Lập Trình C 1. Lịch Sử C a C+ + 2 2. 1 chương trình C 2 3. C c kiểu dữ liệu 2 4 c c Dạng C u Tr c CHƯƠNG 1: C bản Lập Trình C 1. Lịch Sử C a C+ + • C+ + dựa trên ngôn ngữ lập trình C. C đư c phát minh trư c 1970 bởi Dennis Ritchie, là

Ngày đăng: 22/03/2014, 23:20

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan