Bài giảng Ngôn ngữ lập trình C - Nguyễn Quang Huy
CHƯƠNG 1
CƠ BẢN VỀ NGÔN NGỮ C
l Tổng quan về ngôn ngữ C
l Cấu trúc chung của một chương trình C
l Các thành phần cơ bản của ngôn ngữ
l Các kiểu dữ liệu cơ bản
l Các cấu trúc lệnh cơ bản trong C
l Vào ra trong C
ude Hàm printf() và scanf()20Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Vào ra trong C (2/5) Hàm printf():printf( [,, ...] );: xâu định dạng: các tham số tương ứngVí dụ: printf("n = %d\n", -10); /* --> -10 */ printf("n = %u\n", -10); /* --> 65526 */ printf("A : %4c\n", 'A'); /* --> A */ printf("A : %d\n", 'A'); /* --> 65 */ printf("f = %4.2f", 123.4); /* --> 123.40 */21Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Vào ra trong C (3/5) Định dạng Kiểu Ghi chú %d int Só nguyên %i int Hệ 10 có dấu %o int Hệ 8 không dấu %u int Số nguyên không dấu %x int Hệ 16 không dấu %X int Hệ 16 không dấu %e, %E float, double Dấu chấm động %f, %lf float, double Dấu phẩy tĩnh %g. %G float, double Dấu phẩy tĩnh hoặc động %c char Ký tự %s char * Xâu ký tự22Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Vào ra trong C (4/5) Hàm scanf():scanf(, {, ...} );: xâu định dạng: địa chỉ của các tham số tương ứngVí dụ: int n; long l; float f; double d; printf("Nhập các giá trị cho các biến n,l,f,d:"); scanf("%d%ld%f%lf", &n, &l, &f, &d);23Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Vào ra trong C (5/5) Định dạng Kiểu Ghi chú %d int Só nguyên %o int Hệ 8 không dấu\ %x int Hệ 16 không dấu %c char Ký tự %s char * Xâu ký tự %f float %lf double %ld long 24Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Ví dụ 1 : Tính tổng hai số#include int main() { int a, b, c; printf("Enter the first value:"); scanf("%d", &a); printf("Enter the second value:"); scanf("%d", &b); c = a + b; printf("%d + %d = %d\n", a, b, c); return 0;} 25Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Ví dụ 2 : Đổi nhiệt độ#include int main() { int a = 0; while (a int main() { float a = 0; while (a #include void main(void){ float a,b; /* doc du lieu tu ban phim */ printf("\n Nhap hai so A,B :"); scanf("%f %f2",&a,&b); /* giai phuong trinh */ if (a==0) if (b==0) printf("Phuong trinh co vo so nghiem!\n"); else printf("Phuong trinh vo nghiem\n"); else printf("Phuong trinh co nghiem la : x=%f\n",-b/a); printf("An phim bat ky de ket thuc ..."); getch();} 30Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Chương 2 Hàm trong C Khai báo hàmPhạm vi của biếnTruyền tham sốĐệ qui31Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Khai báo hàm[] ([])[]{...return ;...}Ví dụ:float fct1(a,b)int a, float b;{...}fct2(float x, char c) {...}void toto(int n); {...}Trả về giá trị của hàm32Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Khai báo hàm (t.)Ví dụ 1: Hàm fact() tính giai thừa n!:long fact(int n){long i,gt = 1;for(i=1; i 100) {...}34Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Tham số của hàm Truyền theo tham trị Hai kiểu tham số: tham số thực và tham số con trỏ. Làm thế nào để sử dụng tham biến? -> sử dụng con trỏ!void swap(a,b)float* a, float* b;{ float tmp; tmp = (*a); (*a) = (*b); (*b) = tmp;}...swap(&x, &y);35Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Tham số của hàm (tiếp) Tham số của hàm main:void main() {...}main(int argc, char *argv[]) {...} Ví dụ: In ra các tham số dòng lệnh#include main (int argc, char *argv[]) { int i; for (i=0; iVí dụ: Một số thư viện thông dụngstdio.hconio.hstdlib.hstring.hmath.h38Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Cấp lưu trữ và phạm vi biến Phạm vi sử dụng (scope): local, global Thời gian tồn tại (life time) Cấp lưu trữ (storage class) Cấp lưu trữ động và phạm vi cục bộ: auto (mặc định) register Cấp lưu trữ tĩnh và phạm vi toàn cục: static extern39Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Cấp lưu trữ và phạm vi biến Ví dụ:#include void foo();void main() { int i; clrscr(); for (i=1; i * ;Ví dụ:int * pi = NULL;char * pchar;Hằng NULL.Toán tử & và *:&*Ví dụ:int n = 10;int *pi = &n;*pi = 20;44Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Kiểu con trỏ (3/6)Phép gán hai con trỏ cùng kiểu:Ví dụ:int n, *pi = &n, *qi;qi = pi; Hai con trỏ khác kiểu: phải ép kiểu!Ví dụ:int *pi;float *pf;...qf = pi; // ERROR!qf = (float *)pi; // OK45Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Kiểu con trỏ (4/6)Phép cộng con trỏ với số nguyên:Ví dụ:int n = 0x0102, *pi = &n;char *pc = (char *)pi;printf("%d",*pc); // 2printf("%d",*(pc+1)); // 1Phép trừ hai con trỏ cùng kiểu:Ví dụ:int m = 5 n = 30;int *pi = &m, *qi = &n;printf("%d",qi-pi); // 1Các phép so sánh các con trỏ cùng kiểu.46Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Kiểu con trỏ (5/6)Con trỏ void*: là con trỏ có thể nhận địa chỉ của bất kỳ vùng nhớ nào.Ví dụ:void *px, *py;int n = 1;float x = 0.5;px = &n;py = &x; Không thể thực hiện các phép tính số học trên con trỏ void47Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Kiểu con trỏ (6/6)Con trỏ hàm: trỏ tới điểm xâm nhập của hàm.[Kiểu_trả_về] (*con_trỏ_hàm) [ds_tham_số]);Ví dụ:long (*fact_ptr)(int);Lời gọi hàm gián tiếp qua con trỏ hàm:Ví dụ:fact_ptr = fact;printf("%ld",fact_ptr(10));Dùng con trỏ hàm làm tham số hình thức của hàm:Ví dụ:void sapXep(int *a, int (*cmp)(int, int)) { ... if (cmp(a[i],a[j])) { ...}48Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Kiểu mảng (1/3)Khai báo mảng một chiều:Kiểu biến_mảng[số phần tử];Ví dụ: int a[100];float x[1000];Khởi gán các phần tử của mảng:Ví dụ: int a[5] = {1,2,3,4,5}; float b[] = {0.5, 1.1, 3.2, 4.0};Khai báo mảng nhiều chiều:Kiểu biển_mảng[NO1][NO2]...;Ví dụ: int a[10][10];float x[255][255];49Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Kiểu mảng (2/3)Truy nhập vào các phần tử của mảng:biến_mảng[chỉ số]Ví dụ: a[0]=1;Sử dụng mảng làm tham số cho hàm: dùng con trỏ!Ví dụ: void tong(int *); Con trỏ và mảng: ta có thể sử dụng tên của một mảng như con trỏ và ngược lại:int a[100], *pi = a;(pi+i) &a[i]*(pi+i) a[i]Ví dụ:50Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Kiểu mảng (3/3): Example#include #define SOPHANTU 3 main(){ int list[SOPHANTU] = {239,241,159} ,i; printf(“cac dia chi la:”); for(i=0; i 52Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Kiểu xâu ký tự (2/3)Một số hàm xử lý xâu thông dụng:int strlen(char *st);void strcpy(char *des,char src);void strncpy(char *des, char *src, unsigned n);void strcat(char *st1, const char *st2,unsigned n );int strcmp(char *st1, char *st2);int strncmp(char *st1, char *st2,unsigned n);int stricmp(char *st, char ch);char *strrchr(char *st, char ch); 53Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Kiểu xâu ký tự (3/3): ExampleVí dụ : Hàm atoi() sau tính giá trị nguyên của một xâu ký tự biểu diễn một số:atoi(s)char s[];{int i,n = 0;for(i=0; s[i]>=‘0’ && s[i]number = 100;57Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Kiểu cấu trúc (4/5)Cấu trúc thường được dùng để xây dựng một bảng các cấu trúc:Ví dụ:TAddress addrs[50];Cấu trúc được sử dụng trong các danh sách móc nối:struct Simple { TAddress addr; struct Simple *next;};58Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Kiểu cấu trúc (5/5)Cấu trúc bit:struct Tên_kiểu { /* khai báo các trường ở đây */ ... tên_trường : độ_dài; ...};Ví dụ:struct Person { char name[50]; unsigned short age:6; // 0..64 int sex:1; // 0..1};59Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Kiểu hợp (1/2)Khai báo kiểu hợp :union Tên_kiểu { type_1 trường_1 : độ_rộng_1; type_2 trường_2 : độ_rộng_2; ...} tên_biến;Các trường đều có cùng địa chỉ Kích thước của hợp là kích thước của trường dài nhấtCác thao tác trên hợp cũng giống như trên cấu trúc.60Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Kiểu hợp (2/2)Ví dụ:union Registers { struct WORDREGS { unsigned int ax,bx,cx,dx,si,di,cflag,flags; } x; struct BYTEREGS { unsigned char al,ah,bl,bh,cl,ch,dl,dh; } h;};...union Registers reg;reg.h.ah = 1;reg.x.cx = 15;61Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Kiểu tệpTrong C có hai loại tệp: tệp nhị phân và tệp văn bảnKhai báo tệp: con trỏ tệpFILE *fp;Các thao tác trên tệp: Hệ thống vào ra mức 2 (mức cao) : làm việc qua các kênh vào/ra.Hệ thống vào ra mức 1 (mức thấp) : làm việc qua các thẻ tệp.62Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Kiểu tệp : Hệ thống vào ra mức 2fopen(): mở một tệp tin :FILE *fopen(char *filename,char *mode);Các chế độ mở tệp: “r” ”rb” ”rt” ”r+b” ”r+t” “w” ”wb” ”wt” ”w+b” ”w+t” “a” ”ab” ”at” ”a+b” ”a+t”Ví dụ:fp=fopen(“exercise”,”w”);fclose(): đóng tệp tin đã được mở trước đó bởi fopen():int fclose(FILE *fp);63Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Kiểu tệp : Hệ thống vào ra mức 2Một số hàm cơ bản : putc()getc()fseek()fprintf()fscanf()fflush()feof()ferror()rewind()64Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Hệ thống vào ra mức 2: ExampleVí dụ: Tạo tệp backup của autoexec.bat: #include int main(void){ FILE *in, *out; if ((in = fopen("\\AUTOEXEC.BAT", "rt")) == NULL) { fprintf(stderr, "Cannot open input file.\n"); return 1; } 65Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Hệ thống vào ra mức 2: Example (t.)if ((out = fopen("\\AUTOEXEC.BAK", "wt")) == NULL) { fprintf(stderr, "Cannot open output file.\n"); return 1; }while (!feof(in)) fputc(fgetc(in), out); fclose(in); fclose(out); return 0;} 66Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Kiểu tệp : Hệ thống vào ra mức 1Một số hàm cơ bản : read()write()open()close()lseek()67Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Hệ thống vào ra mức 1: ExampleVí dụ: Tạo một tệp văn bản bằng hàm open#include #include #include #include int main(void){ int handle; char msg[] = "Hello world";68Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000Hệ thống vào ra mức 1: Example (t.)if ((handle = open("TEST.$$$", O_CREAT | O_TEXT)) == -1) { perror("Error:"); return 1; } write(handle, msg, strlen(msg)); close(handle); return 0;}69Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000ENDThank you!70Bai giang ngon ngu lap trinh C - (c) Nguyen Quang Huy 12/2000
File đính kèm:
- Bai giang ngon ngu lap trinh CPPT.ppt