https://gribblelab.org/CBootCamp/
Thanh navigation
Hiển thị các bài đăng có nhãn Lập trình C. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn Lập trình C. Hiển thị tất cả bài đăng
Thứ Ba, 24 tháng 11, 2020
Multidimesion Array & Pointer
https://www.oreilly.com/library/view/understanding-and-using/9781449344535/ch04.html
https://stackoverflow.com/questions/1052818/create-a-pointer-to-two-dimensional-array
https://dyclassroom.com/c/c-pointers-and-two-dimensional-array
https://www.geeksforgeeks.org/pointer-array-array-pointer/
Thứ Năm, 5 tháng 9, 2019
Tin học cơ sở 3
1. Ghi danh ở đây:
- Lớp thực hành sáng Thứ 2, tiết 4-5, phòng 408-T5: https://forms.gle/pT1TAwTWZrCRgqrU7
- Lớp thực hành chiều Thứ 2, tiết 6-7, phòng 408-T5: https://forms.gle/35BenBND7NgEXhQa9
- Lớp thực hành chiều Thứ 2, tiết 9-10, phòng 408-T5: https://forms.gle/9JvAvigoFw57jnQq9
- Lớp thực hành chiều Thứ 4, tiết 6-7, phòng 408-T5: https://forms.gle/22mpNHjceoqL7zCU9
2. Bài tập: Danh mục các bài tập và Đề cương môn học.
3. Tài liệu: Tài liệu và công cụ cho môn lập trình C.
4. Sách: Sách tham khảo.
5. Phần mềm:
a. C trên Windows: Soạn thảo, dịch và chạy chương trình C trên Windows. Một số lỗi thường gặp khi viết chương trình.
b. C trên Linux: Soạn thảo, dịch và chạy chương trình C trên Linux.
Thứ Bảy, 8 tháng 12, 2018
Một số vấn đề khi nhập dữ liệu trong C
Mục này sẽ nói về một số vấn đề và cách giải quyết chúng khi gặp các bài tập có:
- nhập chuỗi ký tự chứa dấu cách.
- kết hợp lệnh scanf và gets trong một chương trình (các bài tập ở phần cấu trúc - struct).
Ví dụ 1: Dùng hàm gets nhập vào một chuỗi ký tự. In chuỗi vừa nhập ra màn hình.
#include<stdio.h>
main()
{
char a[100];
printf("Nhap chuoi: ");
gets(a);
printf("Chuoi vua nhap la: %s ", a);
}
Ví dụ 2: Dùng hàm scanf nhập vào một chuỗi ký tự. In chuỗi vừa nhập ra màn hình.
#include<stdio.h>
main()
{
char a[100];
printf("Nhap chuoi: ");
scanf("%s", a);
printf("Chuoi vua nhap la: %s ", a);
}
1) Trong ví dụ 1(gets), a lưu được cả chuỗi có dấu cách.
2) Trong ví dụ 2(scanf), nếu chuỗi ký tự nhập vào có dấu cách (khoảng trống) thì từ dấu cách trở về sau sẽ không được lưu vào biến a. Chẳng hạn, nếu nhập vào chuỗi kí tự "Tran Hung Dao" thì a chỉ lưu được chữ "Tran" còn phần sau của chuỗi sẽ không được lưu vào a.
Vậy làm thế nào để hàm scanf có thể nhận được cả chuỗi có khoảng trống?. Ta sẽ sửa dòng scanf trong ví dụ 2 lại như sau:
scanf("%[^\n]", a);
Ví dụ 3: Nhập vào một số nguyên và nhập vào một chuỗi ký tự. In kết quả ra màn hình.
#include<stdio.h>
main()
{
int N;
char a[100];
printf("Nhap vao so N ");
scanf("%d", &N);
printf("Nhap chuoi: ");
gets(a);
printf("So vua nhap la: %d \n",N) ;
printf("Chuoi vua nhap la: %s \n", a);
}
Khi biên dịch và chạy ví dụ 3 chúng ta thấy rằng, lệnh gets bị bỏ qua ! Điều gì đã xảy ra ?
Trong lập trình C có một khái niệm là stdin (standard input - bàn phím). Nó được gọi là dòng vào chuẩn, dữ liệu nhận từ stdin sẽ được lưu vào bộ nhớ đệm (input buffer). Tất cả dữ liệu từ bàn phím khi đưa vào cho máy tính xử lý, sẽ được lưu ở bộ nhớ đệm trước.
Khi các hàm nhận dữ liệu từ bàn phím (gets, scanf, fgets, ...) được thực hiện thì ngoài dữ liệu được gõ vào, ta phải xác nhận kết thúc các lệnh đó bằng cách gõ Enter (\n).
Hàm gets sẽ nhận dữ liệu từ stdin và LOẠI bỏ ký tự \n khỏi bộ nhớ đệm của stdin.
Hàm scanf sẽ nhận dữ liệu từ stdin nhưng KHÔNG LOẠI bỏ được ký tự \n ra khỏi bộ đệm của stdin.
Nếu trong bufffer của stdin vẫn tồn tại \n thì sẽ làm TRÔI lệnh gets đứng ở phía sau. Như vậy ở trong ví dụ 3, phía trước hàm gets có sử dụng hàm scanf. Chính hàm scanf này sẽ để lại \n trong buffer của stdin và làm TRÔI lệnh gets.
Vậy làm thế nào để loại bỏ ký tự \n ra khỏi buffer stdin nếu trong bài tập của chúng ta sử dụng cả scanf và gets ? Có hai cách.
Cách 1. Dùng hàm fflush để làm sạch stdin ngay sau hàm scanf. Ví dụ 3 sửa lại như sau.
#include<stdio.h>
main()
{
int N;
char a[100];
printf("Nhap vao so N: ");
scanf("%d",&N);
fflush(stdin);
printf("Nhap chuoi: ");
gets(a);
printf("So vua nhap la: %d \n",N);
printf("Chuoi vua nhap la: %s \n",a);
}
Cách 2. Thêm đặc tả %*c và trong lệnh scanf. Ví dụ 3 sửa lại như sau.
#include<stdio.h>
main()
{
int N;
char a[100];
printf("Nhap vao so N: ");
scanf("%d%*c",&N);
printf("Nhap chuoi: ");
gets(a);
printf("So vua nhap la: %d \n",N);
printf("Chuoi vua nhap la: %s \n",a);
}
Hàm gets nó sẽ nhận ký tự từ bàn phím cho đến khi gặp được ký tự \n (bấm Enter) thì ngừng nhận. Như vậy nó không quan tâm đến giới hạn của biến mảng dùng để chứa ký tự. Trường hợp nhập vào số ký tự vượt quá kích thước của mảng, có thể gây lỗi. Để tránh trường hợp này có thể thay hàm gets bằng hàm fgets. Có thể đọc thêm ở đây. https://www.geeksforgeeks.org/fgets-gets-c-language/
Vì không có chỉ định đối với việc dùng fflush làm sạch stdin. Do đó, không nên dùng fflush để làm sạch stdin. Tuy nhiên, thực tế fflush vẫn làm sạch stdin trong một số trường hợp. Việc sử dụng fflush để làm sạch stdin có thể xem ở đây.
Cẩn thận ta nên xài cách 2 để loại bỏ \n trong stdin.
- nhập chuỗi ký tự chứa dấu cách.
- kết hợp lệnh scanf và gets trong một chương trình (các bài tập ở phần cấu trúc - struct).
I. Nhập chuỗi
Khi làm bài tập, có một số bài yêu cầu dữ liệu vào là chuỗi ký tự. Khi đó, ta có thể dùng hàm scanf hoặc gets để nhập.Ví dụ 1: Dùng hàm gets nhập vào một chuỗi ký tự. In chuỗi vừa nhập ra màn hình.
#include<stdio.h>
main()
{
char a[100];
printf("Nhap chuoi: ");
gets(a);
printf("Chuoi vua nhap la: %s ", a);
}
Ví dụ 2: Dùng hàm scanf nhập vào một chuỗi ký tự. In chuỗi vừa nhập ra màn hình.
#include<stdio.h>
main()
{
char a[100];
printf("Nhap chuoi: ");
scanf("%s", a);
printf("Chuoi vua nhap la: %s ", a);
}
Lưu ý
1) Trong ví dụ 1(gets), a lưu được cả chuỗi có dấu cách.
2) Trong ví dụ 2(scanf), nếu chuỗi ký tự nhập vào có dấu cách (khoảng trống) thì từ dấu cách trở về sau sẽ không được lưu vào biến a. Chẳng hạn, nếu nhập vào chuỗi kí tự "Tran Hung Dao" thì a chỉ lưu được chữ "Tran" còn phần sau của chuỗi sẽ không được lưu vào a.
Vậy làm thế nào để hàm scanf có thể nhận được cả chuỗi có khoảng trống?. Ta sẽ sửa dòng scanf trong ví dụ 2 lại như sau:
scanf("%[^\n]", a);
II. Nhập cả số và chuỗi
Nếu trong chương trình có sử dụng lệnh scanf và gets điều gì sẽ xảy ra ? Xem ví dụ sau đây.Ví dụ 3: Nhập vào một số nguyên và nhập vào một chuỗi ký tự. In kết quả ra màn hình.
#include<stdio.h>
main()
{
int N;
char a[100];
printf("Nhap vao so N ");
scanf("%d", &N);
printf("Nhap chuoi: ");
gets(a);
printf("So vua nhap la: %d \n",N) ;
printf("Chuoi vua nhap la: %s \n", a);
}
Khi biên dịch và chạy ví dụ 3 chúng ta thấy rằng, lệnh gets bị bỏ qua ! Điều gì đã xảy ra ?
Trong lập trình C có một khái niệm là stdin (standard input - bàn phím). Nó được gọi là dòng vào chuẩn, dữ liệu nhận từ stdin sẽ được lưu vào bộ nhớ đệm (input buffer). Tất cả dữ liệu từ bàn phím khi đưa vào cho máy tính xử lý, sẽ được lưu ở bộ nhớ đệm trước.
Khi các hàm nhận dữ liệu từ bàn phím (gets, scanf, fgets, ...) được thực hiện thì ngoài dữ liệu được gõ vào, ta phải xác nhận kết thúc các lệnh đó bằng cách gõ Enter (\n).
Hàm gets sẽ nhận dữ liệu từ stdin và LOẠI bỏ ký tự \n khỏi bộ nhớ đệm của stdin.
Hàm scanf sẽ nhận dữ liệu từ stdin nhưng KHÔNG LOẠI bỏ được ký tự \n ra khỏi bộ đệm của stdin.
Nếu trong bufffer của stdin vẫn tồn tại \n thì sẽ làm TRÔI lệnh gets đứng ở phía sau. Như vậy ở trong ví dụ 3, phía trước hàm gets có sử dụng hàm scanf. Chính hàm scanf này sẽ để lại \n trong buffer của stdin và làm TRÔI lệnh gets.
Vậy làm thế nào để loại bỏ ký tự \n ra khỏi buffer stdin nếu trong bài tập của chúng ta sử dụng cả scanf và gets ? Có hai cách.
Cách 1. Dùng hàm fflush để làm sạch stdin ngay sau hàm scanf. Ví dụ 3 sửa lại như sau.
#include<stdio.h>
main()
{
int N;
char a[100];
printf("Nhap vao so N: ");
scanf("%d",&N);
fflush(stdin);
printf("Nhap chuoi: ");
gets(a);
printf("So vua nhap la: %d \n",N);
printf("Chuoi vua nhap la: %s \n",a);
}
Cách 2. Thêm đặc tả %*c và trong lệnh scanf. Ví dụ 3 sửa lại như sau.
#include<stdio.h>
main()
{
int N;
char a[100];
printf("Nhap vao so N: ");
scanf("%d%*c",&N);
printf("Nhap chuoi: ");
gets(a);
printf("So vua nhap la: %d \n",N);
printf("Chuoi vua nhap la: %s \n",a);
}
Hàm gets nó sẽ nhận ký tự từ bàn phím cho đến khi gặp được ký tự \n (bấm Enter) thì ngừng nhận. Như vậy nó không quan tâm đến giới hạn của biến mảng dùng để chứa ký tự. Trường hợp nhập vào số ký tự vượt quá kích thước của mảng, có thể gây lỗi. Để tránh trường hợp này có thể thay hàm gets bằng hàm fgets. Có thể đọc thêm ở đây. https://www.geeksforgeeks.org/fgets-gets-c-language/
Vì không có chỉ định đối với việc dùng fflush làm sạch stdin. Do đó, không nên dùng fflush để làm sạch stdin. Tuy nhiên, thực tế fflush vẫn làm sạch stdin trong một số trường hợp. Việc sử dụng fflush để làm sạch stdin có thể xem ở đây.
Cẩn thận ta nên xài cách 2 để loại bỏ \n trong stdin.
Chủ Nhật, 14 tháng 10, 2012
Dev-C++
Updated: 28/09/2018
2. Lưu chương trình
3. Dịch chương trình
4. Chạy chương trình
I. Giới thiệu
Dev-C++ là một môi trường phát
triển tích hợp miễn phí được phân phối theo GNU General Public License
dành cho lập trình C++ và C. Nó sử dụng trình biên dịch dựa trên
nền tảng của GCC như MinGW hoặc Cygwin.
Dev-C++ chạy trên nền hệ điều hành Windows.
Dev-C++ được viết bằng ngôn ngữ Delphi.
Tải phần mềm Dev-C++ theo đường link sau:
https://sourceforge.net/projects/orwelldevcpp/
----------
[ Gọi là môi trường phát triển tích hợp (Integrated Development Environment) vì nó là một phần mềm gồm có trình soạn thảo (editor), trình dịch (compiler) và một số tiện ích khác để hỗ trợ lập trình viên khi viết chương trình ứng dụng.]
II. Sử dụng Dev-C++
Hình dưới là cửa sổ giao diện của Dev-C++.

1. Tạo một file mới chương trình nguồn
Sau khi khởi động chương trình Dev-C++, cửa sổ làm việc chính của Dev-C++ xuất hiện. Để tạo một chương trình nguồn C mới. Bấm tổ hợp phím tắt Ctrl + N hoặc vào mục: File/New/Source File, một file mới với tên mặc định là Untitle1 xuất hiện. Lúc này chúng ta có thể viết chương trình.
2. Lưu file
Khi lưu chương trình nguồn, Dev-C++ sẽ đặt mặc định file có phần mở rộng (của C++) là cpp. Để tránh những bất tiện có thể gây ra lỗi về sau, chúng ta cần lưu file mới này với phần mở rộng là c như mô tả ở hình trên.
Trong hình trên, chương trình nguồn được lưu có tên là test với c là phần mở rộng. Chúng được phân tách nhau bởi dấu chấm ( test.c ).
3. Dịch chương trình
Bấm vào mục Execute trên thanh công cụ chọn mục Compile hoặc bấm phím tắt F9.
Nếu chương trình còn lỗi, cửa sổ Compiler sẽ xuất hiện với các mô tả báo về lỗi ở trong chương trình.
4. Chạy chương trình
Nếu file được dịch thành công (không còn lỗi), kích chuột vào mục Execute và chọn Run hoặc bấm phím tắt F10 để chạy chương trình.
III. Các lỗi đơn giản và cách sửa
Khi viết chương trình trên Dev-C++, việc gặp lỗi cú pháp (syntax error) là không thể tránh khỏi. Khi có lỗi, cửa sổ Compiler (xem vị trí của cửa sổ này ở hình trên) tự động được bật lên. Để biết vị trí của dòng lệnh bị lỗi, xem nội dung thông báo hiển thị trên cửa sổ đó và tiến hành sửa lỗi.

Dưới đây là một số lỗi cơ bản mà người mới học lập trình hay bị mắc phải và cách sửa.
Lỗi 1: undefined refrence to '...'
Nội dung: Không xác định tên hàm nằm trong dấu '...'
Cách sửa lỗi: Xem tên hàm đó có tồn tại hay không, hoặc sửa lại tên hàm cho đúng.
Ví dụ: undefined reference to 'scant'
Đây là lỗi viết sai tên hàm scanf.
Lỗi 2: '...' undeclared (first use in this function)
Nội dung: Tên biến nằm trong dấu '...' chưa được khai báo, hoặc viết sai tên.
Cách sửa: Khai báo thêm biến nằm trong dấu '...' hoặc sửa lại biến đó cho đúng như đã khai báo phía trước đó.
Lỗi 3: expected ';' before '...'
Nội dung: Lỗi cú pháp liên quan đến việc thiếu dấu ; của câu lệnh phía trước hàm nằm trong dấu '...'
Cách sửa: Thêm dấu ; vào sau câu lệnh đứng trước hàm nằm trong dấu '...'
Lỗi 4: missing terminating " character
Nội dung: Thiếu dấu " trong câu lệnh.
Cách sửa: Thêm dấu " vào đúng vị trí của dòng lệnh được thông báo có lỗi này.
https://docs.google.com/file/d/0B5DnORqCTEIzcVAzSW9WOU9yQUE/edit
@2012-2018
Nội dung
I. Giới thiệu sơ lược về Dev-C++
II. Cách sử dụng Dev-C++
1. Tạo mới một chương trình2. Lưu chương trình
3. Dịch chương trình
4. Chạy chương trình
III. Các lỗi đơn giản hay gặp khi viết chương trình
I. Giới thiệu
Dev-C++ chạy trên nền hệ điều hành Windows.
Dev-C++ được viết bằng ngôn ngữ Delphi.
Tải phần mềm Dev-C++ theo đường link sau:
https://sourceforge.net/projects/orwelldevcpp/
----------
[ Gọi là môi trường phát triển tích hợp (Integrated Development Environment) vì nó là một phần mềm gồm có trình soạn thảo (editor), trình dịch (compiler) và một số tiện ích khác để hỗ trợ lập trình viên khi viết chương trình ứng dụng.]
II. Sử dụng Dev-C++
Hình dưới là cửa sổ giao diện của Dev-C++.
1. Tạo một file mới chương trình nguồn
Sau khi khởi động chương trình Dev-C++, cửa sổ làm việc chính của Dev-C++ xuất hiện. Để tạo một chương trình nguồn C mới. Bấm tổ hợp phím tắt Ctrl + N hoặc vào mục: File/New/Source File, một file mới với tên mặc định là Untitle1 xuất hiện. Lúc này chúng ta có thể viết chương trình.
2. Lưu file
Khi lưu chương trình nguồn, Dev-C++ sẽ đặt mặc định file có phần mở rộng (của C++) là cpp. Để tránh những bất tiện có thể gây ra lỗi về sau, chúng ta cần lưu file mới này với phần mở rộng là c như mô tả ở hình trên.
Trong hình trên, chương trình nguồn được lưu có tên là test với c là phần mở rộng. Chúng được phân tách nhau bởi dấu chấm ( test.c ).
3. Dịch chương trình
Bấm vào mục Execute trên thanh công cụ chọn mục Compile hoặc bấm phím tắt F9.
Nếu chương trình còn lỗi, cửa sổ Compiler sẽ xuất hiện với các mô tả báo về lỗi ở trong chương trình.
4. Chạy chương trình
Nếu file được dịch thành công (không còn lỗi), kích chuột vào mục Execute và chọn Run hoặc bấm phím tắt F10 để chạy chương trình.
III. Các lỗi đơn giản và cách sửa
Khi viết chương trình trên Dev-C++, việc gặp lỗi cú pháp (syntax error) là không thể tránh khỏi. Khi có lỗi, cửa sổ Compiler (xem vị trí của cửa sổ này ở hình trên) tự động được bật lên. Để biết vị trí của dòng lệnh bị lỗi, xem nội dung thông báo hiển thị trên cửa sổ đó và tiến hành sửa lỗi.

Dưới đây là một số lỗi cơ bản mà người mới học lập trình hay bị mắc phải và cách sửa.
Lỗi 1: undefined refrence to '...'
Nội dung: Không xác định tên hàm nằm trong dấu '...'
Cách sửa lỗi: Xem tên hàm đó có tồn tại hay không, hoặc sửa lại tên hàm cho đúng.
Ví dụ: undefined reference to 'scant'
Đây là lỗi viết sai tên hàm scanf.
Lỗi 2: '...' undeclared (first use in this function)
Nội dung: Tên biến nằm trong dấu '...' chưa được khai báo, hoặc viết sai tên.
Cách sửa: Khai báo thêm biến nằm trong dấu '...' hoặc sửa lại biến đó cho đúng như đã khai báo phía trước đó.
Lỗi 3: expected ';' before '...'
Nội dung: Lỗi cú pháp liên quan đến việc thiếu dấu ; của câu lệnh phía trước hàm nằm trong dấu '...'
Cách sửa: Thêm dấu ; vào sau câu lệnh đứng trước hàm nằm trong dấu '...'
Lỗi 4: missing terminating " character
Nội dung: Thiếu dấu " trong câu lệnh.
Cách sửa: Thêm dấu " vào đúng vị trí của dòng lệnh được thông báo có lỗi này.
https://docs.google.com/file/d/0B5DnORqCTEIzcVAzSW9WOU9yQUE/edit
@2012-2018
Đăng ký:
Bài đăng (Atom)
