tổng hợp bài tập lt c có lời giải

25 976 14
tổng hợp bài tập lt c có lời giải

Đ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

Tổng hợp bài tập lập trình C có lời giải Đầu tiên là bài truyền kiếp của lập trình là tìm ước chung lớn nhất và bội chung nhỏ nhất của hai số: PHP Code: int UCLN(int a, int b) { while(a != b) { if(a > b) a = a - b; else b = b - a; } return a; } int BCNN(int a, int b) { return a*b/UCLN(a,b); } void main() { int a, b; printf("\nNhap a: "); scanf("%d", &a); printf("\nNhap b: "); scanf("%d", &b); int uc = UCLN(a,b); printf("\n=>Uoc Chung Lon Nhat %d, %d là: %d ",a,b,uc); printf("\n"); int bc = BCNN(a,b); printf("\n=>Boi Chung Nho Nhat %d, %d là: %d ",a,b,bc); printf("\n"); } Chương trình kiểm tra một số nguyên có phải là số nguyên tố hay không. PHP Code: int SNT(int n) { int dem=0; if(n return 0; for(int i=1; i { if(n%i == 0) dem ++; } if(dem==2) return 1; else return 0; } void main() { int n; printf("Nhap So Can Kiem Tra: "); scanf("%d", &n); int kq; kq = SNT(n); if(kq==1) printf("So: %d là so nguyen to.", n); else printf("So: %d khong là so nguyen to.", n); printf("\n"); } Viết chương trình đếm số chữ số của một số nào đó, Ví dụ: 21432 trả về: 5 vì có 5 chữ số. PHP Code: //dem so chu so cua n vd: 12342 -> tra ve: 5 int Dem(int n) { int dem=0; while(n != 0) { n=n/10; dem ++; } return dem; } void main() { int n; printf("Nhap n: "); scanf("%d", &n); int dem = Dem(n); printf(".:|Chu so cua so n la: %d", dem); printf("\n"); } Viết chương trình đảo ngược của 1 số: ví dụ nhập 123 -> trả về 321. PHP Code: //Dao nguoc cua so n int DaoSo(int n) { int kq=0; while(n!=0) { kq=kq*10 + n%10; n=n/10; } return kq; } void main() { int n; printf("Nhap n: "); scanf("%d", &n); printf("\nSo Dao Nguoc La: %d", DaoSo(n)); } Cú pháp ngôn ngữ (lập trình) C là tập hợp các qui tắc nhằm xác định cách thức để viết và dịch trong ngôn ngữ lập trình C. Thí dụ: // Dòng này sẽ được bỏ qua (không đọc) bởi trình dịch. /* Các dòng này cũng được bỏ qua bởi trình dịch */ (Tiếp tục mã C) Các hàm Cú pháp Một hàm C phải bao gồm một kiểu trả về (kiểu đó trả về void nếu không có giá trị trả về), một tên xác định, một danh sách các tham số để trong ngoặc đơn (nếu danh sách này không có tham số nào thì ghi là void bên trong dấu ngoặc), sau đó là khối các câu lệnh (hay khối mã) và/hay các câu lệnh return. (Nếu kiểu trả về là void thì mệnh đề này không bắt buộc phải có. Ngược lại, cũng không bắt buộc chỉ có một câu lệnh return mà tùy theo kỹ thuật, người lập trình có thể dẫn dòng mã sao cho mọi hướng chẻ nhánh đều được trả về đúng kiểu.) <kiểu_trả_về> tên_hàm(<danh sách tham số>) { <các_câu_lệnh> return <biến (hay giá trị) có kiểu là kiểu_trả_về>; } Trong đó, <danh sách tham số> của N biến thì được khai báo như là kiểu dữ liệu và tách rời nhau bởi dấu phẩy ,: <kiểu_dữ_liệu> var1, var2, , varN ; Toàn bộ danh sách này được đặt trong ngoặc đơn ngay sau tên_hàm. Thí dụ Hàm add tính tổng hai số có kiểu integer, hàm abs tính trị tuyệt đối của số có kiểu integer, và chương trình (hàm main) hiển thị hai dòng 1 + 1 = 2 và absolute value of -2 is 2 #include <stdio.h>; //Chú giải: dòng này khai báo tập tin bao gồm là stdio.h int add(int x, int y) { return x + y; } int abs(int x) { if (x > 0) return x; if (x < 0) return -x; if (x == 0) return 0; /* đây chỉ là thí dụ cho thấy C có khả năng dùng nhiều hơn 1 câu lệnh <code>return</code> hoàn toàn có thể dùng các câu lệnh khác đơn giản hơn. */ } int main(void) { int z = 1; int y = -2; printf("%d + 1 = %d\n", z, add(z, 1)); printf ("absolute value of %d is %d", y, abs(y)); return 0; } Chú ý: phần mã trên đã được thử thành công dùng trình dịch GNU (cho ANSI C và C99) Mô tả Trong các câu lệnh tiền xử lý, ở cấp độ cao nhất, một chương trình ngôn ngữ C luôn có một chuỗi các khai báo cho các tập tin bao gồm. Sau đó là các khai báo của phạm vi tập tin. Các khai báo này giới thiệu các hàm, các biến và các kiểu biến. Các hàm trong C nhìn tương tự với các chương trình con của Fortran hay các thủ tục của Pascal. Định nghĩa của hàm xuất hiện trong phần thân của nó (phần giữa bộ dấu ngoặc { và } theo sau nguyên dạng của hàm). Các chương trình trong C để tạo các ứng dụng trực tiếp đều cần phải có một hàm đặc biệt tên là main, đây sẽ là hàm đầu tiên được gọi khi chương trình bắt đầu thực thi. Sau đây là một chương trình đầy đủ mặc dù không có mấy ứng đụng thiết thực. int main (void) { return 0; } Hàm code>main thường gọi các hàm khác để giúp nó hoàn tất công việc (tuỳ theo sự lập trình của người dùng). Trọng một số trường hợp C được dùng không phải để tạo ra các ứng dụng trực tiếp mà để dùng với hệ điều hành hay các nơi khác (như là phát triển các bộ điều vận, các phần sụn, hay các thư viện ). Những trường hợp như vậy thì người lập trình hoàn toàn tự do trong việc giải quyết làm sao để xử lý khởi động chương trình, đặc biệt nó sẽ không cần định nghĩa hàm main. Các hàm có thể được viết ra bởi người lập trình hay được cung cấp sẵn bởi các thư viện. Các thư viện cần được khai báo (sử dụng) bằng cách nêu tên các tập tin tiêu dề trong câu lệnh dạng #include tập tin tiêu đề. Một số hàm thư viện như là printf đã được định nghĩa bởi chuẩn C, chúng được tham chiếu như là các hàm thư viện chuẩn. Một hàm có thể trả về một giá trị cho môi trường gọi nó. Khi hàm main trả về giá trị 0 chỉ dấu cho rằng toàn bộ chương trình đã hoàn tất thành công và kết thúc. Hàm printf cùng có giá trị trả về, đó là số lượng kí tự đã hiển thị, nhưng giá trị này thường bị bỏ qua không dùng. Truyền các biến Các biến trong C được truyền qua các hàm bằng giá trị trong khi nhiều ngôn ngữ khác lại được truyền bằng tham chiếu (hay bằng địa chỉ). Điều này có nghĩa là hàm chỉ chép lại các giá trị và không thể thay đổi các giá trị đó của các biến (hay đối số) đưa vào. Để có thể thay đổi được giá trị của các biến truyền vào, người lập trình có thể truyền địa chỉ của nó vào hàm và tham chiếu ngược nó trong hàm được dùng (xem thêm kiểu tham chiếu) void incInt(int *y) { (*y)++; // tăng giá trị của x trong <code>main<code> 1 đơn vị } int main(void) { int x = 0; incInt(&x); // chuyển một tham chiếu vào incInt cho 'x' return 0; } Để có thể chuyển một con trỏ (mà có thể cần đổi địa chỉ nó chỉ đến), có thể chuyển một tham chiếu cho con trỏ (tham chiếu này chỉ đến điạ chỉ của con trỏ): void setInt(int **p, int n) { *p = (int *) malloc(sizeof(int)); // đăng kí một vùng nhớ *p = n; // cài giá trị vào } int main(void) { int *p; //khai báo một con trỏ kiểu integer setInt(&p, 42); // chuyển giá trị của 'p' vào. return 0; } int **p sẽ định nghĩa một con trỏ chỉ đến con trỏ (thay vì chỉ đến các kiểu dữ liệu thông thường) tức là chỉ đến địa chỉ của con trỏ p. Hàm scanf làm việc theo cùng một cách thức: int x; scanf("%d", &x); Các cấu trúc dòng điều khiển Một cách cơ bản thì C là ngôn ngữ dạng tự do. Trong phần này, tất cả các chữ "mệnh đề" có nghĩa tương đương với chữ "câu lệnh". Các mệnh đề phức hợp[sửa] Câu lệnh phức hợp được bọc trong dấu ngoặc { và } còn được gọi là khối mã. Các câu lệnh phức hợp trong C có dạng. { <danh sách khai báo tùy chọn> <đanh sách câu lệnh tùy chọn> } Khối mã được dùng như là phần thân của một hàm hay đưọc đặt bất kì ở vị trí nào mà một câu lệnh đơn giản có thể đặt. Nghĩa là, về ý nghĩa văn phạm thì câu lệnh đơn giản và câu lệnh phức hợp là tương đương nhau. Các mệnh đề biểu thức Một câu lệnh (hay một mệnh đề) của C có dạng: <biểu thức tùy chọn>; là một mệnh đề biểu thức. Nếu biểu thức này không có nội dung (mà chỉ còn lại dấu ; thì biểu thức được gọi là mệnh đề null (hay mệnh dề rỗng). (Theo ngôn ngữ máy Assembler thì mệnh đề null sẽ tương đương với câu lệnh NOP; chiếm 1 byte chỉ làm nhiệm vụ tăng địa chỉ của chồng (stack) lên 1 đơn vị.) Các mệnh đề lựa chọn (hay điều kiện) Có 3 loại mệnh đề lựa chọn: hai loại dùng từ khóa if và một loại dùng từ khóa switch. Đó là: Dạng dùng từ khóa if:[sửa] if (<biểu thức>) <mệnh đề1> if (<biểu thức>) <mệnh đề1> else <mệnh đề2> Trong dạng này, nếu phần trong ngoặc đơn có giá trị khác 0 hay có giá trị "đúng" (true) thì dòng điều khiển sẽ chuyển vào để thực thi <mệnh đề1>. Nếu trong câu lệnh if có thêm từ khóaelse thì <mệnh đề2> sẽ được thực thi một khi <biểu thức> có giá trị 0 hay giá trị "sai". Nhắc lại: như trên thì vị trí mỗi mệnh đề đều có thể thay bằng một khối mã. Trong cách viết mã lồng nhau phức tạp bao gồm nhiều mệnh đề if thì từ khóa else sẽ được gán vào mệnh đề if phía trên gần nhất nào chưa được ghép. Để tránh sự nhầm lẫn cách tốt nhất là lồng chúng vào trong các dấu { và }. Dạng dùng từ khóa switch Mệnh đề switch sẽ gây ra việc chuyển dòng điều khiển sang một trong những mệnh đề con kế tiếp tùy theo giá trị của một biểu thức X (biểu thức này phải có kiểu nguyên). Các mệnh đề con này thường là các mệnh đề phức hợp. Đứng trước mỗi mệnh đề con sẽ là một từ khóa case, sau đó là một biểu thức hằng H i , và dấu hai chấm : gắn liền tiếp theo đó là mệnh đề con M i . Khi giá trị của X trùng với một giá trị H i được nêu ở đâu thì mệnh đề con đi gắn liền vói hằng tại đó (tức là M i ) sẽ được thực thi. Nếu X không bằng với bất kì giá trị H i nào thì người lập trình có thể dùng thêm từ khóa default, sau đó là dấu hai chấm : và tiếp theo là một mệnh đề con M default . Mệnh đề con này sẽ được thực thi khi mà giá trị của X khác với mọi giá trị hằng H i . Lưu ý:  Trong câu lệnh switch thì không cho phép có hai giá trị hằng bằng nhau. Nghĩa là khi X được đánh giá thì chỉ có tối đa một mệnh đề con được thực thi.  Các câu lệnh switch có thể được dùng trong dạng lồng vào nhau (nest), một từ khóa case hay default sẽ thuộc vào câu lệnh switch bên trong nhất (hay nhỏ nhất) chứa nó.  Một khi dòng điều khiển hoàn tất câu lệnh con M i thì nó sẽ tiếp tục thi hành các câu lệnh con M i+1 theo sau cho đến khi nó bị yêu cầu ngưng bởi câu lệnh nhảy (mà thường dược dùng nhiều nhất là câu lệnh break) Trong dạng thí dụ dưới đây, nếu <biểu thức X> có giá trị bằng <hằng H 2 > thì mệnh đề các biểu thức <mệnh đề M 2 >,<mệnh đề M 3 >, và <mệnh đề M default > sẽ lần lần lượt được thực thi theo thứ tự nếu như trong chúng không có câu lệnh break. Nhưng vì trong mã thí dụ có câu lệnh break nên dòng điều khiển sẽ ngưng và kết thúc câu lệnh switch khi thi hành lệnh breaknày. switch (<biểu thức X>) { case <hằng H 1 > : <mệnh đề M 1 > case <hằng H 2 > : <mệnh đề M 2 > break; case <hằng H 3 > : <mệnh đề M 3 > default : <mệnh đề M default > } Các mệnh đề tái lặp (hay vòng lặp)[sửa] C có 3 dạng câu lệnh vòng lặp: Vòng lặp do[sửa] do <mệnh đề> while (<biểu thức>); Trong mệnh đề này thì mệnh đề được thực thi lặp lại cho tới khi nào <biểu thức> được đánh giá (hay có giá trị) là true. Một khi <biểu thức> không còn có giá trị true nữa thì vòng lặp sẽ bị kết thúc. Vòng lặp while while (<biểu thức>) <mệnh đề> <mệnh đề> chỉ được thực thi hay thực thi lặp lại khi <biểu thức> có giá trị là true. Nếu <biểu thức> có giá trị false thì câu lệnh sẽ bị kết thúc ngay lập tức. Vòng lặp for[sửa] Dạng C89 của vòng lặp for là: for (<biểu thức 1> ; <biểu thức 2> ; <biểu thức 3>) <câu lệnh> Nó đã được tổng quát hóa trong C99 thành: for (<khai báo> <biểu thức 1> ; <biểu thức 2>) <câu lệnh> Khi cả ba biểu thức đều hiện diện trong một câu lệnh for, thì mệnh đề: for (e1; e2; e3) s; sẽ tương đương với e1; while (e2) { s; e3; } Bất kì biểu thức nào trong vòng lặp for có thể được loại bỏ. Một biểu thức bị mất (e2 chẳng hạn) có thể làm cho vòng lặp biến thành vòng lặp vô hạn. Thí dụ: vòng lặp for sau đây 3 biểu thức ở dạng phức hợp và ngăn cách nhau bởi dấu chấm phẩy ;: for (x=10,y=1;((x>4) && (y<8)); x ,y+=2) [...]... nhất c thể địa chỉ hóa đư c (bởi kiến tr c máy tính) thường là một byte với 8 bit Dạng th c đư c dùng để biểu thị c c số thập phân hay c c bộ phận hữu tỉ M c dù vậy chúng không hoàn toàn chính x c mà chỉ là c c biểu thị gần đúng C 3 kiểu giá trị th c bao gồm: loại c độ chính x c đơn (c đ c tả là float ), loại c độ chính x c kép (c đ c tả là double ), và loại c độ chính x c kép mở rộng (c đ c. .. chuẩn C9 9 C c hằng số x c định c c giá trị biên[sửa] Tập tin tiêu đề chuẩn limits.h sẽ x c định c c giá trị nhỏ nhất và lớn nhất c a c c kiểu nguyên c bản c ng như là x c định c c giới hạn kh c Tập tin tiêu đề chuẩn float.h sẽ x c định c c giá trị nhỏ nhất và lớn nhất c a c c kiểu float , double , và long double Nó c ng x c định c c giới hạn kh c liên quan tới vi c xử lý c c giá trị c a dấu chấm động... tính long long chỉ đư c hỗ trợ trong c c trình dịch thỏa mãn chuẩn C9 9 2— C c hằng LLONG_MIN , LLONG_MAX , và ULLONG_MAX chỉ đư c định nghĩa trong limits.h nếu trình dịch tương ứng thỏa mãn chuẩn C9 9 C c giá trị biên điển hình[sửa] Sau đây là danh sách kích c và c c biên điển hình c a c c kiểu nguyên C c giá trị này c thể kh c nhau tùy theo kiến tr c (máy và trình dịch) ISO C cung c p tiêu đề inttypes.h,... phần tử Chiều thứ hai sẽ c số_hàng * số _c t c c phần tử—một tập hợp c a số _c t c c phần tử mà mỗi phần tử là một chiều thứ nhất C c mảng đa chiều hoàn toàn c thể đư c xem như là dãy c a c c con trỏ Trong thí dụ trên, array2D (nếu số_hàng là 1) sẽ là một tham chiếu giá trị nguyên mà nó chỉ tới một mảng c a số _c t c c phần tử Dãy kí tự[sửa] Dãy kí tự c thể đư c thay đổi nội dung c a nó mà không c n đến... để biểu thị c c giá trị không nguyên trong một dạng kh c nhau C c kiểu nguyên c thể ho c là c dấu ( signed ) hay không dấu ( unsigned ) Nếu không chỉ rõ khi khai báo thì m c định (hiểu ngầm) sẽ là loại c dấu Một ngoại lệ là c c kiểu char , signed char và unsigned char đều kh c nhau, và kiểu char c thể là loại c dấu hay không c dấu Đối với loại c dấu, thì bit c nghĩa cao nhất đư c dùng để biểu... địa chỉ mà nó đang chỉ tới (nhằm tránh gây ra c c hiệu ứng phụ do vi c tham chiếu c a con trỏ này c thể gây ra) free(array); array = NULL; C c mảng đa chiều[sửa] C có hỗ trợ vi c dùng mảng đa chiều Vi c định nghĩa chúng giống như là tạo ra mảng c a c c mảng , m c dù vậy trong th c tế nó không hoàn toàn đúng C pháp sau: int array2D[số_hàng][số _c t]; sẽ định nghĩa một mảng hai chiều; chiều thứ nhất c ... khía c nh kỹ thuật c a c c cách th c xử lý và lưu trữ c c giá trị trong bộ nhớ Kiểu nguyên viết dưới dạng int đư c dùng để biểu thị c c số nguyên Kiểu nguyên c trong nhiều kích c kh c nhau tùy theo phân lượng bộ nhớ đư c dùng và độ lớn cao nhất1 C c từ khóa, c tên là c c định tính, đư c dùng thêm vào để điều chỉnh lại kích c là: short , long và long long 2 Kiểu kí tự mà từ khóa c a nó là char ,... viện chuẩn Tuy nhiên, thư viện này c nhiều hàm c thể dùng cho c dãy kí tự c kết th c 0 và mảng không c kí tự kết th c kiểu char Trong phần này từ "dãy" đư c để chỉ dãy kí tự C c hàm thường dùng là:  strcat(dest, source) - nối một dãy kí tự source tiếp vào vị trí cuối c a dãy kí tự dest  strchr(source, c) - tìm vị trí sự xuất hiện đầu tiên c a c trong dãy kí tự source và trả về con trỏ chỉ tới... giá[sửa] Một trình dịch C có thể đánh giá c c biểu th c theo thứ tự bất kì giữa dãy c c điểm Dãy c c điểm đư c định nghĩa bởi: C c kết th c của mệnh đề tại c c dấu chấm phẩy  Toán tử dãy: dấu phẩy  C c toán tử ngắn mạch: gồm phép và ( && ) và phép ho c ( || )   Toán tử điều kiện ( A?B :C ): Giá trị c a biểu th c A đư c đánh giá trư c Nếu A là đúng thì B sẽ đư c đánh giá bỏ qua biểu th c C Nếu A sai thì... này c định Sự khai báo c a mảng tĩnh c c pháp sau: int array[n]; trong đó, tên c a mảng là array sẽ c thể chứa đư c n giá trị c a kiểu c bản int Trong th c hành, phần bộ nhớ cho n giá trị nguyên này đư c để dành riêng và đư c gán cho mảng này (m c dù giá trị c a c c phần tử trong mảng chưa đư c x c định) Biến array th c chất là một kiểu tham chiếu c a kiểu nguyên; nó khởi thủy sẽ chỉ tới địa chỉ . chuỗi c c khai báo cho c c tập tin bao gồm. Sau đó là c c khai báo c a phạm vi tập tin. C c khai báo này giới thiệu c c hàm, c c biến và c c kiểu biến. C c hàm trong C nhìn tương tự với c c chương. đề ph c hợp[ sửa] C u lệnh ph c hợp đư c b c trong dấu ngo c { và } c n đư c gọi là khối mã. C c câu lệnh ph c hợp trong C có dạng. { < danh sách khai báo tùy chọn> < đanh sách c u lệnh. M c dù vậy chúng không hoàn toàn chính x c mà chỉ là c c biểu thị gần đúng. C 3 kiểu giá trị th c bao gồm: loại c độ chính x c đơn (c đ c tả là float), loại c độ chính x c kép (c đặc

Ngày đăng: 26/11/2014, 22:19

Từ khóa liên quan

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

Tài liệu liên quan