Ngôn ngữ lập trình C với những gì cơ bản nhất
Trang 1NGÔN NGỮ LẬP TRÌNH
1/Ngôn ngữ lập trình:
Ngôn ngữ lập trình là hệ thống các ký hiệu tuân theo các qui ước vềngữ pháp và ngữ nghĩa, dùng để xây dựng thành các chương trìnhcho máy tính
Một chương trình được viết bằng một ngôn ngữ lập trình cụ thể (ví
dụ Pascal, C…) gọi là chương trình nguồn, chương trình dịch làmnhiệm vụ dịch chương trình nguồn thành chương trình thực thi được trên máy tính
2/Khái niệm chương trình:
Chương trình là một chuỗi chỉ thị hay các câu lệnh điều khiển sự hoạt động của máy, nằm trong hệ thống quy ước về ý nghĩa và thứ tự thực hiện
Mỗi ngôn ngữ lập trình có những đặc trưng riêng, phù hợp để giải quyết một nhóm vấn đề nào đó
3/Phương pháp để giải quyết một bài toán:
- Phân tích vấn đề, xác định yêu cầu của bài toán
- Đưa ra cách giải quyết
- Cài đặt thuật toán
- Thực thi chương trình và kiểm chứng
* Cách viết một chương trình căn bản:
- Đề: Cho 2 số nguyên a = 5, b = 9 Tính tổng 2 số đó và xuất kết quả ra màn hình
Trang 2}
Trang 3Chương 2: CÁC THÀNH PHẦN TRONG NGÔN NGỮ C
Các tên đúng:
delta, a_1, Num_ODD, Case
Các tên sai:
3a_1 (ký tự đầu là số)
num-odd (sử dụng dấu gạch ngang)
int (đặt tên trùng với từ khóa)
del ta (có khoảng trắng)
f(x) (có dấu ngoặc tròn)
Lưu ý: Trong C, tên phân biệt chữ hoa, chữ thường
2/Kiểu dữ liệu(Data types):
Có năm kiểu dữ liệu cơ sở: ký tự(char), số nguyên(int), số thực (float), số thực có độ chính xác gấp đôi (double), và kiểu vô định void
Dạng khai báo tổng quát:
Kiểu dữ liệu [khoảng trắng] tên biến
Ví dụ: int a;
Gán dữ liệu:
C1:
int a;
Trang 4Dạng tổng quát của casting là
(type) expression hoặc type(expression)
Ví dụ:
float kq;
kq = 7/2;
Do 7/2 là phép chia nguyên nên kết quả không có phần thập phân =>
kq = 3, nên cần phải ép kiểu
Trang 5NHẬP XUẤT DỮ LIỆU TRONG C
Lưu ý: Hàm scanf không nhập được khoảng trắng Để nhập được dòng
ký tự có khoảng trắng ta phải viết:
scanf(“%[^\n]”,a); // a là chuỗi(xâu) ký tự được nhập
3 Hàm gets
Gets(Tên của mảng ký tự);
Hàm này cho phép nhận một chuỗi từ bàn phím Cho phép nhập khoảng trắng giữa các từ
Lưu ý về các hàm scanf, gets:
Hai hàm trên nhận dữ liệu từ stdin (dòng nhập chuẩn có thể hiểu nhưmột vùng nhớ đặc biệt) Chúng nhận dữ liệu theo nguyên tắc sau:
- Nếu trên stdin có đủ dữ liệu thì chúng sẽ nhận một phần dữ liệu mà nó yêu cầu Phần dữ liệu còn lại vẫn nằm ở trên stdin
Trang 6- Nếu stdin không đủ dữ liệu theo yêu cầu của hàm, thì máy tạm dừng để chờ người sử dụng đưa dữ liệu từ bàn phím lên stdin( cho đến khi gặp phím).
- Hàm gets sẽ xóa ký tự \n trong stdin
- Hàm scanf không xóa \n trông stdin
Lý thuyết thì như thế, nói tóm lại khi sử dụng hàm scanf cùng với hàm gets hoặc getchar dữ liệu nhập từ bàn phím sẽ bị trôi Để các hàm hoạt động đúng chúng khử ký tự \n bằng lệnh ffush(stdin) sau lệnh scanf
Ví dụ:
#include <stdio.h>
void main() {
Trang 7Chương 3: CÁC CẤU TRÚC ĐIỀU KHIỂN TRONG C
1 Giới thiệu:
Có 3 loại cấu trúc điều khiển để xây dựng nên một chương trình máy tính: cấu trúc tuần tự, lựa chọn, lặp
Cấu trúc tuần tự: thực hiện các lệnh từ trên xuống dưới
Cấu trúc lựa chọn: Dựa vào kết quả của biểu thức điều kiện mà
thực hiện lệnh(khối lệnh) này hay lệnh(khối lệnh) khác Các cấu trúc lựa chọn gồm if, switch
Cấu trúc lặp: Dựa vào điều kiện thực hiện khối lệnh cho đến khi
nào biểu thức điều kiện sai Các cấu trúc lặp gồm for,
while,do while
Lưu ý: Các câu lệnh như break, continue, goto còn ảnh hưởng đến
thứ tự thực hiện các lệnh của chương trình
1.1 Câu lênh, khối lệnh:
Mỗi câu lệnh thực hiện một chức năng nào đó, kết thúc bởi một dấu chấm phẩy
Khối lệnh là một dãy các câu lệnh được đặt trong dấu { }, về mặt
cú pháp khối lệnh tương đương với một câu lệnh
2 Cấu trúc điều khiển if
2.1 Dạng 1:
if( biểu thức điều kiện)
<lệnh>;
Nếu biểu thức cho kết quả <> 0 (true) thì thực hiện lệnh Nếu có từ
2 lệnh trở lên ta phải đặt trong dấu {}
printf("So ban nhap lon 10\n");
printf("%d la so ban nhap.",a);
}
Kết quả:
Nhap vao mot so nguyen: 20 <enter>
Trang 8So ban nhap lon hon 10
Nếu biểu thức điều kiện cho kết quả <> 0( true) thì thực hiện lệnh
1, ngược lại thực hiện lệnh 2
printf("So ban nhap nho lon 10\n");
printf("%d la so ban nhap.",a);
}
Kết quả:
Nhap vao mot so nguyen: 9 <enter>
So ban nhap nho hon 10
9 la so ban nhap.
3 Cấu trúc lựa chọn (Switch)
Cấu trúc switch là cấu trúc lựa chọn có nhiều nhánh Khi có nhiều sự lựa chọn thì đây là cấu trúc phù hợp thay vì phải dùng nhiều lệnh if…else lồng nhau
3.1 Cú pháp
Switch(biểu thức
{
Trang 9case n1:
các câu lệnh case n2:
các câu lệnh
………
case nk:
các câu lệnh [default: các câu lệnh]
}
Ni là các hằng số nguyên, ký tự
Phụ thuộc vào giá trị của biểu thức viết sau switch, nếu:
+ Giá trị này bằng ni thì thực hiện các câu lệnh của case ni
+Khi giá trị biểu thức khác tất cả các ni thì thực hiện lệnh default nếu có
Khi thực hiện xong câu lệnh của một ni thì nó sẽ tự thực hiện các lệnh thuộc ni bên dưới, vì vậy phải dùng lệnh break để dừng
Ví dụ:
Yêu cầu người thực hiện chương trình nhập vào một số nguyên dương
là tháng trong năm và in ra số ngày của tháng đó
+ Tháng 31 ngày: 1, 3, 5, 7, 8, 10, 12
+ Tháng 30 ngày: 4, 6, 9, 11
+ Riêng tháng 2 có 28 hoặc 29 ngày tùy năm
+ Nếu nhập số <1 hoặc >12 thì in ra câu thông báo “Số bạn nhập không
Trang 10if((nam % 400 == 0) || (nam % 4 == 0 && nam % 100 != 0))
nhuan = 1;
switch(thang) {
Trang 111 Tính giá trị biểu thức 1
2 Tính giá trị biểu thức 2
3 Nếu bước 2 <> 0 (true) thì thực hiện các lệnh của vòng lặp, ngược lại thoát khỏi vòng for
4 Tính giá trị biểu thức 3 rồi quay lại bước 2
Ví dụ: Viết chương trình tính tổng số nguyên từ 1 -> 10
sum = sum + i;
i++;
} println(“Ket qua: %d”,sum);
Trang 12sum = sum + i;
i++;
}while(i<=10) println(“Ket qua: %d”,sum);
}
Trang 13Chương 4: MẢNG (Array)
1 Giới thiệu mảng:
Mảng là một tập hợp các phần tử có cùng kiểu dữ liệu nằm liên tiếp trong bộ nhớ và được tham chiếu bởi một tên chung(tên mảng) Mỗi phần tử trên mảng được tham chiếu thông qua chỉ số (index)
2.1 Cách khai báo và khởi tạo mảng
Dạng tổng quát để khai báo mảng một chiều là:
Trang 14void main()
{
int a[5];//Khai báo mảng a int n = 5;//Số phân tử trong mảng //Nhập dữ liệu
for(int i = 0; i < n ; i++) {
printf(“a[%d]=”,i);
scanf(“%d”,&a[i]);
} //Xuất dữ liệu for(int i = 0; i < n ; i++) {
printf(“a[%d]=%d\n”,i,a[i]);//a[i] chính là giá trị của phần tử thứ i
} }
2.3 Các bài tập về mảng một chiều cơ bản
for(int i = 0; i < n ; i++) {
printf(“a[%d]=”,i);
scanf(“%d”,&a[i]);
} //Xuất dữ liệu for(int i = 0; i < n ; i++) {
Trang 15printf(“a[%d]=%d\n”,i,a[i]);//a[i] chính là giá trị của phần tử thứ i
} //Tính tổng phần tử dùng hàm for duyệt từ đầu mảng đến cuối
int sum = 0;
for(int i = 0; i < n ; i++) {
sum += a[i];
} printf(“Tong cua phan tu trong mang la: %d”,sum); }
for(int i = 0; i < n ; i++) {
printf(“a[%d]=”,i);
scanf(“%d”,&a[i]);
} //Xuất dữ liệu for(int i = 0; i < n ; i++) {
printf(“a[%d]=%d\n”,i,a[i]);//a[i] chính là giá trị của phần tử thứ i
} // Dùng hàm for duyệt từ đầu mảng đến cuối
Trang 16printf(“Cac phan tu chan trong mang\n”); for(int i = 0; i < n ; i++)
{
if(a[i] % 2==0) printf(“%d\t”, a[i]);
} }
3 Mảng hai chiều:
3.1 Các khai báo và khởi tạo một mảng:
Dạng tổng quát để khai báo mảng 2 chiều là:
Row1
Trang 17printf(“a[%d][%d]=”,i,j); scanf(“%d”,&a[i][j]);
} //Xuat du lieu for(int i = 0; i < n; i++) {
for(int j = 0; j < n ; j++) {
printf(“a[%d][%d]=”,a[i][j]); }
printf(“\n”);
} }
3.3 Một số bài tập cơ bản mảng 2 chiều:
Trang 18for(int i = 0; i < n; i++)
for(int j = 0; j < n ; j++) {
printf(“a[%d][%d]=”,i,j); scanf(“%d”,&a[i][j]);
} //Tinh Tong int sum = 0;
for(int i = 0; i < n; i++)
for(int j = 0; j < n ; j++) {
sum += a[i][j];
} printf(“Tong mang 2 chieu la:%d”,a[i][j]); }
Trang 19Chương 5: HÀM VÀ CẤU TRÚC CHƯƠNG TRÌNH
1.Vài nét về hàm và chương trình
1.1 Khái niệm về hàm
Hàm là một khối lệnh được đặt tên thực hiện trọn vẹn một công việc nhất định, rồi trả về một giá trị cho chương trình gọi nó
Hàm còn được gọi là chương trình con Hàm có thể trả về giá trị hay không Không cho phép xây dựng hàm trong một hàm khác
//khai bao mang 2 chieu const int n = 3;
int a[n],b[n];
//Nhap du lieu vao mang 1 printf("Nhap du lieu vao mang 1\n");
for(int i = 0; i < n; i++) {
printf("a[%d]=",i);
scanf("%d",&a[i]);
} //tinh tong mang 1 int sum1 = 0;
for(int i = 0; i < n; i++)
sum1 += a[i];
//Nhap du lieu vao mang 2
printf("Nhap du lieu vao mang 1\n");
for(int i = 0; i < n; i++)
Trang 20printf("b[%d]=",i);
scanf("%d",&b[i]);
} //tinh tong mang 2
printf("Tong mang 1: %d\nTong mang 2:
%d\n",sum1,sum2);
printf("Mang 1 lon hon mang 2\n");
} else {
printf("Tong mang 1: %d\nTong mang 2:
%d\n",sum1,sum2);
printf("Mang 2 lon hon mang 1\n");
} }
Rất dài dòng, ta có thể viết hai hàm nhập và tính tổng mảng sẽ làm ngắn gọn chương trình
#include <stdio.h>
void NhapMang(int a[], int n);
int TinhTong(int a[], int n);
void main() {
//khai bao mang 2 chieu const int n = 3;
int a[n],b[n];
//Nhap du lieu vao mang 1
Trang 21//tinh tong mang 1
int sum1 = TinhTong(a,n);
//Nhap du lieu vao mang 2
NhapMang(b,n);
//tinh tong mang 2
int sum2 = TinhTong(b,n);
//so sanh
if(sum1 > sum2) {
printf("Tong mang 1: %d\nTong mang 2:
%d\n",sum1,sum2);
printf("Mang 1 lon hon mang 2\n");
} else {
printf("Tong mang 1: %d\nTong mang 2:
%d\n",sum1,sum2);
printf("Mang 2 lon hon mang 1\n");
} }
void NhapMang(int a[],int n)
{
//Nhap du lieu vao mang 1
printf("Nhap du lieu vao mang 1\n");
Trang 22Return: Kiểu giá trị trả về, không có giá trị trả về thì dùng void
FunctionName: Tên của hàm Tên của hàm nên ngắn gọn và thể hiện ý nghĩa của hàm
Paramaterlist: Danh sách các tham số hình thức, là danh sách các tên biến và kiểu dữ liệu tương ứng Nếu hàm không có tham số thì danh sách rỗng
int n = 5;
binhphuong(n);
printf("Gia tri n ngoai ham: %d\n",n);
} void binhphuong(int n) {
n = n*n;
printf("Gia tri n trong ham: %d\n",n);
}
Kết quả:
Trang 23Kết luận: Khi truyền n = 5 vào tham số n của hàm binhphuong thì cách truyền như thế gọi là truyền tham trị Trong thân hàm binhphuong, tham số n bình phương và có giá trị là 25.Khi hàm binhphuong kết thúcgiá trị n trong hàm main vẫn không đổi.
2.2 Truyền tham chiếu:
Ví dụ:
#include <stdio.h>
void tong(int *n);
void main() {
int a = 5;
binhphuong(&a);
printf("Gia tri a ngoai ham: %d\n",a);
} void tong(int *n) {
3 Đệ qui
Trang 24Một hàm mà gọi lại chính nó được gọi là đệ qui
Ví dụ: Xem xét chương trình tính giai thừa của n
Trang 25Chương 6: STRING (chuỗi)
1 Giới thiệu chuỗi:
Trong C hiểu chuỗi là một mảng ký tự với ký tự null ở cuối chuỗi
Ký tự null (‘\0’) là ký tự dùng để kết thúc chuỗi Như vậy, một chuỗibao gồm các ký tự tạo nên chuỗi và theo sau là ký tự null
2 Khai báo và khởi tạo chuỗi
Có 2 cách khai báo và khởi tạo chuỗi Giả sử khai báo và khởi tạo chuỗi “Hello”
Cách 1: Dùng mảng một chiều
char str[] ={‘h’, ‘e’, ‘l’, ‘l’, ‘o’, ‘\0’};
Lưu ý: trong trường hợp này, ta phải them ký tự null vào cuối
Cách 2:
char str[] = “Hello”;
3 Nhập chuỗi, xuất chuỗi
Để nhập dữ liệu cho biến chuỗi, ta nên dùng hàm gets() hơn là hàm scanf vì:
Hàm scanf: chương trình sẽ tự động ngắt chuỗi khi gặp ký tự khoảngtrắng
Để xuất dữ liệu chuỗi ra màn hình ta có thể dùng 2 hàm
puts(stringname) hoặc printf(stringname);
4 Một số hàm thư viện thao tác trên chuỗi
Để sử dụng các hàm này, ta phải khai báo thư viện string.h
strcpy(s1,s2) Sao chéo chuỗi s2 vào chuỗi s1
strcat(s1,s2) Nối chuỗi s2 vào cuối chuỗi s1
strlen(s1) Trả về độ dài của chuỗi
char s1[80], s2[80];
printf("Input the first string: ");
gets(s1);
Trang 26printf("Input the second string: ");
gets(s2);
printf("Length of the of s1 = %d\n",strlen(s1)); printf("Length of the of s2 = %d\n",strlen(s2)); if(!strcmp(s1,s2))
printf("These strings are equal\n");