Free pascal bị lỗi không gõ được dấu ngoặc năm 2024

Hầu hết chúng ta đều biết và sử dụng ngôn ngữ lập trình Pascal. Đó là ngôn ngữ được sử dụng nhiều nhất trong các kì thi tin học ở nước ta hiện nay. Tuy nhiên, C cũng là một ngôn ngữ được sử dụng rộng rãi để giải các bài toán tin học; đôi khi nó cung cấp một số thuận lợi nhất định so với Pascal.

Chủ đề này sẽ giúp các bạn nắm được các khái niệm cơ bản của C, thông qua đối chiếu với ngôn ngữ Pascal, từ đó áp dụng vào việc giải các bài toán tin học, hoặc chỉ đơn giản là muốn chuyển từ môi trường Pascal sang C. Sau khi đọc xong bài viết này, bạn cũng có thể chuyển đổi một chương trình giải toán bằng Pascal sang ngôn ngữ C.

Nếu bạn đã thông thạo ngôn ngữ Pascal, thì bài viết này sẽ giúp bạn hiểu C nhanh chóng hơn việc đọc tòan bộ một quyển giáo trình dạy C.

Đều là những ngôn ngữ lập trình có cấu trúc nên mỗi khái niệm trong Pascal có một khái niệm tương ứng , hoặc tương tự, trong C; chỉ có cú pháp, câu lệnh là khác nhau. C tương đối khó hơn vì cú pháp của nó tự do hơn, dẫn đến những lỗi khó phát hiện trong khi viết chương trình.

Trong bài viết này, bạn cũng gặp một số khái niệm của ngôn ngữ C mà Pascal không có. Phần lớn những khái niệm này liên quan đến con trỏ (pointer).

Một số lưu ý cơ bản:

  1. C không cho phép các thủ tục lồng nhau, vì vậy bạn phải lọai bỏ các thủ tục lồng nhau trong chương trình Pascal trước khi chuyển nó sang ngôn ngữ C.
  2. Ngôn ngữ C phân biệt ký tự thường và ký tự hoa: AAA, aaa và Aaa là 3 tên gọi khác nhau.

Dưới đây là một chương trình C rất đơn giản tính giai thừa của 6. Bạn nên gõ lại chứ đừng copy đoạn mã; như thế sẽ giúp bạn thuộc cú pháp của C nhanh hơn.

Dòng C Pascal 0 program samp; 1

include uses crt; 2

define VALUE 6 const value=6; 3 int i,j; var i,j:integer; 4 void main() 5 { begin 6 j=1; j:=1; 7 for (i=1; i<=VALUE; i++) for i:=1 to value do 8 j=j*i; j:=j*i; 9 printf(“Giai thừa của %d là %d\n”,VALUE,j); writeln(‘Giai thừa của ‘,value,’ là ‘,j); 10 } end.

Bạn có thể thấy tương ứng giữa những câu lệnh. Khác biệt duy nhất là đọan chương trình C bắt đầu bằng

include . Dòng này đưa thư viện I/O chuẩn vào chương trình để bạn có thể đọc/viết các giá trị, xử lý file văn bản, v.v… C có rất nhiều các thư viện chuẩn như stdio, string, time, math, v.v… Còn phía Pascal, đó là lệnh uses.

Ngoài ra, Pascal có program để đặt tên cho chương trình, tuy nhiên, C thì không cần nên nó có thể coi là vô dụng.

Dòng

define định nghĩa một hằng. Lệnh int i,j; khai báo 2 biến tòan cục kiểu số nguyên Các kiểu dữ liệu thông dụng khác là float (số thực), char (ký tự), cả hai đều có thể định nghĩa theo cùng cú pháp như trên. Pascal sử dụng const để khai báo các hằng.

Dòng main() khai báo thủ tục chính. Mọi chương trình C đều phải có một thủ tục có tên “main”. Trong C, 2 dấu ngoặc kép { và } thay thế cho begin và end của Pascal. Tượng tự, phép gán = thay thế cho :=. Vòng lặp for và lệnh printf hơi lạ một chút, nhưng chúng có cùng chung chức năng như các dòng lệnh tương ứng trong chương trình Pascal (write và writeln). Lưu ý C sử dụng dấu ngoặc kép thay vì dấu nháy đơn (‘ ‘) đối với chuỗi ký tự.

Khi bạn quen, lệnh printf của C sẽ dễ sử dụng hơn lệnh write/writeln trong Pascal. Phần trong dấu ngoặc kép được gọi là chuỗi định dạng (format string); nó mô tả dữ liệu được định dạng thế nào khi viết ra. Chuỗi định dạng chứa những chữ như Giai thừa của x, \n (kí tự xuống dòng), và các toán tử xác định vị trí của các biến. Hai toán tử trong chuỗi định dạng trên (%d %d) cho biết các giá trị nguyên trong chuỗi tham số phía sau sẽ được in ra tại vị trí này. Có những toán tử khác dành cho số thực, kí tự, chuỗi, v.v… Bạn có thể dùng phần hướng dẫn của Turbo C chẳng hạn để xem danh sách các toán tử này. Một điều quan trọng là các tham số đi đằng sau phải có kiểu đúng như các toán tử trong chuỗi định dạng. Ví dụ bạn không thể viết %d nhưng tham số tương ứng đằng sau lại là một biến kiểu float.

Chương trình trên chạy tốt, nhưng có thể được cải tiến bằng cách đọc thẳng giá trị thay vì sử dụng hằng số. Bạn hãy sửa lại chương trình, lọai bỏ hằng VALUE, thay vào đó khai báo value như một biến toàn cục. Sau đó thêm hai dòng sau vào đầu thủ tục main (tương ứng với Pascal):

Dòng Pascal C 1 write(‘Nhập giá trị:’); printf(“Nhập giá trị:”); 2 readln(value); scanf(“%d”,&value);

Lệnh scanf cùng sử dụng một kiểu chuỗi định dạng như printf (bạn hãy xem phần help để biết thêm chi tiết). Bạn cũng cần lưu ý dấu & trước biến value. Đây là toán tử địa chỉ (address operator) của C: nó trả về địa chỉ của biến; nhưng chúng ta sẽ bàn điều này sau khi đề cập đến kiểu con trỏ. Bạn phải sử dụng dấu & trong lệnh scanf trước bất kỳ biến nào kiểu char, int, float, hoặc kiểu những kiểu record (chúng ta sẽ để cập kiểu record sau). Nếu bạn gõ thiếu dấu &, bạn sẽ gặp lỗi “segmentation fault” khi chạy chương trình.

Những lỗi cần tránh:

  • Quên dấu & trong lệnh scanf.
  • Quên dấu */ ở cuối của dòng chú thích.

Đây là phần mở đầu giữa sự khác biệt căn bản trong cấu trúc của C và Pascal. Bài tiếp theo chúng ta sẽ xem những thay đổi cú pháp trong các vòng lặp.