Lập trình C: Bài 2 – Kiểu dữ liệu và nhập xuất trong C
Bài hôm nay nhìn tương đối dài tuy nhiên thì khi thực hành sẽ thấy rất là đơn giản. Đây là mục lục bài viết
Nội dung
A. Kiểu dữ liệu trong C
1. Các ký tự điều khiển
- \n : Nhảy xuống dòng kế tiếp canh về cột đầu tiên.
- \t : Canh cột tab ngang.
- \r : Nhảy về đầu hàng, không xuống hàng.
- \a : Tiếng kêu bip.
- \\ : In ra dấu \
- \” : In ra dấu “
- \’ : In ra dấu ‘
- %%: In ra dấu %
Đây chỉ là một số ký tự điểu khiển quen thuộc, hay dùng, ngoài ra còn một só ký tự điều khiển khác các bạn có thể xem thêm trong các tài liệu.
Dể hiểu rõ về các ký tự điều khiển các bạn hãy chạy thử chương trình sau và tự rút ra nhận xét cho riêng mình.
#include <stdio.h> int main(){ printf("\a"); printf("Hinh nhu vua co tieng gi keu @@\n"); printf("Ban dang o dong thu 2\nBay gio xuong dong 3 roi ne ^^\n"); printf("\tDong nay cach ra 1 tab thi phai?\n"); printf("\t\t\t\t\t\tCach ra nhieu tab qua \rVe dau dong thoi\n"); printf("Dau \\ \nDau \'\nDau \" \nDau %%"); // day la mot dong ghi chu /* Day la mot doan ghi chu Doan ghi chu nay co 2 dong */ // system("pause"); // su dung de dung man hinh neu ban dung dev-C return 0; }
2. Từ khóa
Là các từ mà ngôn ngữ C đã xây dựng sẵn, chúng ta không nên định nghĩa lại chúng.
3. Kiểu và biến
a. Kiểu dữ liệu
Kiểu dữ liệu giống như là các thùng chứa, vật dụng để đựng đồ dùng của chúng ta. VD ca uống nước để đựng nước, cái rổ để đựng rau,…
Mỗi loại dữ liệu có kích thước khác nhau và tương ứng với miền giá trị và loại giá trị mà nó có thể thực hiện. VD kiểu int chiếm 2 byte bộ nhớ và để chứa các số nguyên,…
b. Biến – hằng
Tương ứng với mỗi kiểu dữ liệu chúng ta có các biến, hằng thuộc các kiểu đó và có miền giá trị tương ứng như trên dùng để lưu giá trị. Các bạn cần phân biệt kiểu và biến.
VD cái rổ A để đựng rau muống, cái rổ B để đựng rau cần thì tương ứng biến a lưu giá trị số 5, còn biến b lưu giá trị số 9 mặc dù chúng cùng kiểu
Biến có thể thay đổi trong quá trình thực hiện chương trình còn hằng thì không thể.
Cách khai báo biến: kiểu_dữ_liệu tên_biến;
– Tên biến hợp lệ là một chuỗi ký tự liên tục gồm: Ký tự chữ, số và dấu gạch dưới. Ký tự đầu của tên phải là chữ hoặc dấu gạch dưới. Khi đặt tên không được đặt trùng với các từkhóa.
Ví dụ1 :
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
Ví dụ2 : number khác Number ; case khác Case (case là từ khóa, do đó bạn đặt tên là Case vẫn đúng)
Cú pháp: kiểu danh_sach_cac_bien;
VD:
#include <stdio.h> int main(){ int a, b; // khai bao 2 bien kieu so nguyen float c, d; // khai bao 2 bien kieu so thuc a = 1; b = 2; c = 3.4; d = 5.6; int e = 4, f = 6; printf("a = %d; b = %d\n", a, b); printf("c = %f; d = %f\n", c, d); printf("e = %d; f = %d\n", e, f); // system("pause"); // su dung de dung man hinh neu ban dung dev-C return 0; }
Như trên các bạn thấy cấu trúc khai báo rồi đó. Còn về lệnh xuất ra màn hình các giá trị thì có một số điều khác đó là cách sử dụng %d, %f . Cái này mình sẽ nói cụ thể ở phần sau, đến đây các bạn cứ viết theo để thấy được cách khai báo biến là ok roài. !
Vị trí khai báo biến:
Khi lập trình, bạn phải nắm rõ phạm vi của biến. Nếu khai báo và sử dụng không đúng, không rõ ràng sẽ dẫn đến sai sót khó kiểm soát được, vì vậy bạn cần phải xác định đúng vị trí, phạm vi sử dụng biến trước khi sử dụng biến.
Khai báo biến ngoài (biến toàn cục): Vị trí biến đặt bên ngoài tất cả các hàm, cấu trúc… Các biến này có ảnh hưởng đến toàn bộ chương trình. Chu trình sống của nó là bắt đầu chạy chương trình đến lúc kết thúc chương trình.
Khai báo biến trong (biến cục bộ): Vị trí biến đặt bên trong hàm, cấu trúc…. Chỉ ảnh hưởng nội bộ bên trong hàm, cấu trúc đó…. Chu trình sống của nó bắt đầu từ lúc hàm, cấu trúc được gọi thực hiện đến lúc thực hiện xong.
Lý thuyết đôi khi mơ hồ, các bạn làm ví dụ sau và chạy sẽ thấy rõ hơn nhiều.
#include <stdio.h> int a = 1, b = 5; // khai bao bien toan cuc, no se duoc dung o bat ky dau int main(){ // khai bao 2 bien trong ham main, no se duoc dung trong toan bo ham main ke tu dong nay int c = 4, d = 6; { int e = 6, d = 8; c = 7; printf("gia tri cac bien trong khoi:\n"); printf("e = %d \t d = %d \t c = %d\n", e, d, c); } printf("gia tri cac bien trong ham main:\n"); printf("c = %d \t d = %d\n", c, d); printf("gia tri cac bien toan cuc:\n"); printf("a = %d \t b = %d\n", a, b); // system("pause"); // su dung de dung man hinh neu ban dung dev-C return 0; }
Các bạn chạy chương trình, xem kết quả và tự rút ra nhận xét nhá, nếu vẫn chưa rõ có thể hỏi trực tiếp trên blog.
Cách khai báo hằng: Khai báo hằng bạn có thể khai báo ở bất kỳ đâu trong chương trình, khai báo ở đâu thì từ đó hằng sẽ được xác định.
Cú pháp: #define ten_hang gia_tri (Không có dấu chấm phảy ở cuối nhá)
Chú ý chúng ta không dùng cấu trúc const như một số người dùng vì khi dùng const trong một số trường hợp ta vẫn thay đổi được giá trị của hằng.
#include <stdio.h> #define a 6 // hang so #define c 'a' // hang ky tu #define s "nguyenvanquan7826" // hang chuoi int main(){ printf("hang a = %d\n", a); printf("hang c = %c\n", c); printf("hang s = %s\n", s); // system("pause"); // su dung de dung man hinh neu ban dung dev-C return 0; }
Các bạn chạy và cảm nhận nhá
B. Nhập, Xuất trong C
1. Chuỗi định dạng dữ liệu
Trước khi đến với phần nhập, xuất dữ liệu cho các biến mình sẽ nói về một số định dạng để nhập và xuất. Sau đây là các dấu mô tả định dạng:
- %c : Ký tự đơn
- %s : Chuỗi
- %d : Số nguyên hệ 10 có dấu
- %f : Số chấm động (VD 5.54 khi in sẽ ra 5.540000)
- %e : Số chấm động (ký hiệu có số mũ)
- %g : Số chấm động (VD 5.54 khi in sẽ in ra 5.54)
- %x : Số nguyên hex không dấu (hệ 16)
- %o : Số nguyên bát phân không dấu (hệ 8)
- l : Tiền tố dùng kèm với %d, %x, %o để chỉ số nguyên dài (ví dụ%ld)
2. Xuất dữ liệu: printf();
Chúng ta sử dụng hàm printf để xuất dữ liệu ra màn hình console.
#include <stdio.h> int main(){ int a = 12; float b = 13.5; char c = 'Q'; long d = 3454; char* s = "nguyenvanquan7826"; // khai bao kieu chuoi printf("tong cua %d va %f la %f \n", a, b, a+b); printf("tich cua %d va %ld la %ld \n", a, d, a*d); printf("ky tu c la: %c \n", c); printf("chuoi s la: %s \n", s); printf("dinh dang so mu cua b la %e \n", b); printf("so he 16 va he 8 cua %d la %x va %o \n", a, a, a); printf("ma ASCII cua %c la %d", c, c); // system("pause"); // su dung de dung man hinh neu ban dung dev-C return 0; }
Mình xin giải thích 1 câu lệnh để làm rõ hơn việc xuất của chúng ta.
Các bạn cũng chú ý là đối với số nguyên và ký tự có sự qua lại với nhau thông qua mã ASCII nên chúng ta có thể in mã của ký tự bằng định dạng %d và cũng có thể in ký tự có mã là số nào đó thông qua định dạng %c. Tuy nhiên bản chất của biến không thay đổi. Ở Vd trên câu lệnh in mã ASCII của c sẽ cho số nguyên nhưng bản chất c vẫn là một biến kiểu char.
Các bạn hãy chạy và cảm nhận !
Tiếp nhá, một vài cách xuất có định dạng:
- %5c : Xuất ký tự có bề rộng 5
- %5d : Số nguyên có bề rộng 5
- %20s : Xuất chuỗi có bề rộng 20
- %5.3f : Xuất số thực có bề rộng 5 trong đó có 3 số sau dấu phẩy
- %-5d : Số nguyên có bề rộng 5 nhưng căn lề trái
Chạy và cảm nhận vd !
#include <stdio.h> int main(){ int a = 12; float b = 13.5; char c = 'Q'; long d = 3454; char* s = "nguyenvanquan7826"; // khai bao kieu chuoi printf("%6d %5.3f %.3f \n", a, b, a+b); printf("%-5d %5ld %5ld \n", a, d, a*d); printf("%5c \n", c); printf("%30s \n", s); // system("pause"); // su dung de dung man hinh neu ban dung dev-C return 0; }
3. Nhập dữ liệu: scanf();
Ta sử dụng hàm scanf để nhập liệu từ bàn phím
#include <stdio.h> int main(){ int a; float b; printf("Nhap so nguyen a = "); scanf("%d", &a); printf("Nhap so thuc b = "); scanf("%f", &b); printf("a = %d \t b = %.3f", a, b); // system("pause"); // su dung de dung man hinh neu ban dung dev-C return 0; }
Từ ví dụ này ta thấy cú pháp để nhập: scanf (“chuỗi định dạng”[, đối 1, đối 2,…]);
Chú ý đừng quên ký tự & trước mỗi biến. Nếu không sẽ sai.
Chuỗi định dạng được đặt trong ngoặc kép: “ ” và các định dạng tương tự như khi chúng ta xuất dữ liệu.
Tương ứng với mỗi định dạng là một kiểu tương ứng, nếu khác kiểu sẽ dần đến sai sót.
4. Nhập chuỗi trong C
Nếu các bạn dùng hàm scanf để nhập chuỗi thì bạn sẽ thấy rằng không thể nhập được chuỗi có dấu cách hoặc nếu trước đó bạn nhập số thì sau đó không nhập được chuỗi nữa. Nếu không tin bạn có thể thử chạy với chương trình sau:
#include <stdio.h> int main(){ int tuoi = 0; // khai bao chuoi co toi da 30 ky tu char ten[30], tenNguoiYeu[30]; printf("Ho va ten cua ban ten la gi?"); scanf("%s", ten); // nhap chuoi khong can dau & printf("Ban bao nhieu tuoi roi?"); scanf("%d", &tuoi); printf("Nguoi yeu cua ban ten la gi?"); scanf("%s", tenNguoiYeu); printf("\n====\n"); printf("%s \n%d \n%s", ten, tuoi, tenNguoiYeu); // system("pause"); // su dung de dung man hinh neu ban dung dev-C return 0; }
Kết quả là bạn sẽ không nhập được tuổi và tên người yêu như hình sau.
Lý do là scanf chỉ đọc được dữ liệu không có khoảng trắng (đấu cách, dấu tab, enter, …) và các khoảng cách này sẽ được lưu vào bộ đệm bàn phím do đó bạn chỉ nhận được chuỗi đầu tiên trước đấu cách mà thôi (chữ Nguyen), sau mỗi dấu cách, các giá trị tiếp theo nếu phù hợp với kiểu dữ liệu của các biến tiếp theo thì nó sẽ gán luôn cho chúng và bạn sẽ không được nhập nữa. Do tuoi kiểu nguyên nên không nhận được, tenNguoiYeu sẽ nhận giá trị tiếp theo trong các giá trị nhận được là chữ Van.
5. Hiện tượng trôi lệnh
Hiện tượng như trên được gọi là hiện tượng trôi lệnh. Nếu bây giờ bạn thực hiện cho nhập số trước và chuỗi ngay sau đó thì hiện tượng này cũng xảy ra vì scanf không đọc được phím enter khi bạn nhấn lúc nhập xong số, nó được lưu vào bộ đệm và khi đọc giá trị nhập cho chuỗi nó tìm trong bộ đệm thấy ký tự enter là kiểu chuỗi nên nó gán luôn cho chuỗi đó.
Để nhập được chuỗi có khoảng trắng (dấu cách) chúng ta sử dụng hàm gets.
Để không bị trôi lệnh khi nhập số trước và chuỗi sau ta cần xóa bộ đệm bàn phím bằng lệnh fflush(stdin); ngay sau khi nhập số.
#include <stdio.h> int main(){ int tuoi = 0; // khai bao chuoi co toi da 30 ky tu char ten[30], tenNguoiYeu[30]; printf("Ho va ten cua ban ten la gi?"); gets(ten); // nhap chuoi khong can dau & printf("Ban bao nhieu tuoi roi?"); scanf("%d", &tuoi); fflush(stdin); printf("Nguoi yeu cua ban ten la gi?"); gets(tenNguoiYeu); printf("\n====\n"); printf("%s \n%d \n%s", ten, tuoi, tenNguoiYeu); // system("pause"); // su dung de dung man hinh neu ban dung dev-C return 0; }
Nếu bạn dùng Linux thì fflush(stdin); sẽ không hoạt động, bạn hãy đọc bài fflush(stdin) trong ubuntu (linux) hoặc gets() and fget() in C/C++ để biết cách khắc phục.
Cho em hỏi thêm về cach khai báo kiểu dữ liệu như thêt nào cho đúng trong chương trình nha cảm ơn nhiều:)
Bạn muốn khai báo biến hay là định nghĩa kiểu dữ liệu của riêng bạn?
Khai báo biến thì cứ:
kieu_du_lieu ten_bien;
VD: int a;
Khai báo kiểu dữ liệu mới thì dùng
typedef ten_kieu dinh_nghia_kieu;
VD:
typedef kieu_nguyen int;
typedef struct sinhvien {
int tuoi;
float diem;
}
Xem thêm bài kiểu cấu trúc
Bài anh hay + dễ hiểu quá
Có 1 chỗ em vẫn chưa hiểu là cái chỗ bộ đệm , bộ đệm là gì ?, và nó chứa những gì trong đó vậy ạ ?
anh có thể giải thích rõ hơn giúp em được ko ạ.
em cảm ơn anh 🙂
Bộ đệm hiểu đơn giản như phần trung gian, phần chứa thông tin khi gõ phím trước khi chương trình đọc nó lên.
A vâng. em hiểu rồi ạ. e cảm ơn anh 🙂
Ở chỗ “2. Xuất dữ liệu: printf();” mình có viết code như bạn viết đó, chạy thì hiện lỗi “[Warning] deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]” ở dòng 8, mình không biết khắc phục sao, bạn có thể chỉ cho mình được không ? 😀
Cám ơn bạn rất nhiều vì bài viết. 😀
Warning là cảnh báo thôi, ko sao đâu bạn
Cũng ở trong phần này, bạn cho mình hỏi: Lỗi In function ‘int main()’ là thế nào vậy? và cách sửa lỗi như thế nào hả bạn?
Đây không phải tên lỗi bạn ah. Nó đang báo lỗi trong hàm main này, nhưng là lỗi ở 1 dòng lệnh nào đó trong hàm này.
xin hỏi anh cách khai báo này là có ý nghĩa gì, mong anh giải thích giúp! Em xin cảm ơn!
float omega_2252[] = {
8.5806e+01f,
-2.2470e-01f,
3.5516e-04f,
-3.7928e-07f,
2.4997e-10f,
-9.8478e-14f,
2.1195e-17f,
-1.9228e-21f
};
Đây là cách khai báo và gán giá trị luôn cgo mảng đó bạn.
bài viết hay lắm..dễ hiểu nữa..
chỉ có một thắc mắc nhỏ mong bạn giúp đỡ:
Mình đang đọc bài 2 mà kéo lên kéo xuống không tìm thấy link bài 3 hay 4 đâu,,chỉ có 12-16.
Chẳng lẽ phải search lại từ đầu à bạn?
thanks
Cảm ơn bạn.
Ở cuối bài mình có để link đến loạt bài lập trình c cơ bản đó bạn.
em có một bài tập là :
viết công trình tính cước xe taxi như sau
1km = 10000
30km = 8000
hơn 30km = 6000
anh có thể giúp e viết công thức dc không ạ
Bạn đọc bài 4 để làm nhé. Dùng lệnh rẽ nhánh if else
E muốn xuất 1 số nguyên có sỗ mũ thì làm sao ạ. ví dụ như nhập giá trị nguyên bất kì là a. xuất giá trị a mũ 2 (a2), a3, a4
Bạn dùng hàm pow(a,b) tức là a mũ b nhá. Thư viện dùng là math.h
admin giải thích giúp nội dung câu lệnh sau giúp mình với:
sprintf(command, “%s%c”, command, ch);
thanks !
Cái lệnh này mình chưa thấy bao giờ.
Tại sao lại return 0; rồi đâu có khai báo thư viện #include mà lại system ; C chuẩn dùng #include sau đó về cuối getch(); mà. Rồi void main() chứ sao lại viết hàm int main() mình thấy sai code nhiều đó bạn.
chuẩn là int main nhé bạn. getch là hàm trong conio.h, đây không phải thư viện chuẩn của c
bai viet hay va de hieu
Cam on ban
Cuối bài mình không dùng lệnh return 0 được không
Thay vì dùng int main() mình dùng main() được không? Vi sao?
Cũng được, nhưng mà đúng chuẩn đi thi quốc tế thì là int main và trả về 0
Em muốn in một số nguyên kiểu long long ra màn hình thì dùng định dạng nào ạ ?
Bạn có thể xuất là %ld
sao mình không ghi cau syster ra như bài 1 vậy
Nếu màn hình không tự động dừng thì bạn dùng, còn nếu nó dừng rồi thì thôi khỏi cần. hầu hết các phiên bản mới đều tự dừng màn hình để chúng ta xem kết quả.
#include
int main()
{
printf(“\a”);
printf(“Hinh nhu vua co tieng gi keu @@\n”);
printf(“Ban dang o dong thu 2\nBay gio xuong dong 3 roi ne ^^\n”);
printf(“\tDong nay cach ra 1 tab thi phai?\n”);
printf(“\t\t\t\t\t\tCach ra nhieu tab qua \rVe dau dong thoi\n”);
printf(“Dau \\ \nDau \’\nDau \” \nDau %%”);
// day la mot dong ghi chu
/*
Day la mot doan ghi chu
Doan ghi chu nay co 2 dong
*/
//system(“pause”); // su dung de dung man hinh neu ban dung dev-C
return 0;
}
code này khi f9 và chạy thì màn hình ko đứng lại,e sử dung system thì nó báo lỗi ngay system lun (e cũng xài dev C).
Vậy bạn sài gì? Nếu dùng turbo hoặc cái khác có thể dùng getch()
e đang xài dev-C va nếu sử dụng system(“pause”); e fải khai thêm #include
Đúng rồi 🙂
#include
int a = 1, b = 5; // khai bao bien toan cuc, no se duoc dung o bat ky dau
int main(){
// khai bao 2 bien trong ham main, no se duoc dung trong toan bo ham main ke tu dong nay
int c = 4, d = 6;
{
int e = 6, d = 8;
c = 7;
printf(“gia tri cac bien trong khoi:\n”);
printf(“e = %d \t d = %d \t c = %d\n”, e, d, c);
}
printf(“gia tri cac bien trong ham main:\n”);
printf(“c = %d \t d = %d\n”, c, d);
printf(“gia tri cac bien toan cuc:\n”);
printf(“a = %d \t b = %d\n”, a, b);
// system(“pause”); // su dung de dung man hinh neu ban dung dev-C
return 0;
}
Cho mình hỏi tại sao các biến trong hàm main c phải bằng 4 sao lại bằng 7 (sau khi mình đã chạy thử).Mong bạn giải thích dùm.Thanks
Vid biến c được khai báo ở đâu thì mọi sự thay đổi trkng phạm vi của nó sẽ làm nó thay đổi
printf(“gia tri cac bien trong ham main:\n”);
printf(“c = %d \t d = %d\n”, c, d);
cùng câu hỏi với bạn trên, nếu c =7 thì tại sao d = 6 mà không phải là d = 8, mong bạn giải thích dùm, thanks.
Vì biến d được khai báo lại nên nó hoàn toàn khác với biến d bên ngoài.
“nhập vào số N. tìm tổng các số trong nó (vd: 1234 tổng=10)”
bạn cho mình cái ý tưởng về bài tập này chứ mình cạn kiệt ý tưởng rồi,cảm ơn
Bạn tách từng số ra rồi cộng lại. Tách có thể dùng phép chia lấy dư và phép chia hết (/ vs %)
Anh oi!có bai tập phần tin học dai cuong chuyen doi cơ số voi ly thuyet ko anh?e gan thi roi mk ko biet on cho nao anh ak.e cam on!
Rất tiếc mình ko có.
em cũng làm thử theo nhưng nó báo “no source compiler founded”, trước e dùng code block cũng bị thế? a có thể cho e biết nguyên nhân và cách giải quyết k ạ?
Hình như bạn chưa cài đúng trình biên dịch
#include
int main(){
int a = 12;
float b = 13.5;
printf(“tong cua %d va %f la %f \n”, a, b, a+b);
cái %f thứ 2 có nghĩa là phép cộng số thực hả bạn? Nếu mình đổi giá trị b là so nguyên thì sao bạn?
printf(“tich cua %d va %ld la %ld \n”, a, d, a*d);
%ld là sao thế bạn? Mình xem qua rồi nhưng mình k hiểu
anh oi pjo muon viet 1 chuong trinh atm thi lam tn a
Thì cần xác định yêu cầu, đầu vào đầu ra. Rồi viết
làm sao để nhập vào 1 chuỗi rồi in ra hai lần chuỗi đó, cách nhau một dấu cách thế a?
anh ơi có thể chỉ em cách cho in ra phần thập phân sau dấu , được ko và cách tính tổng các số sau dấu ,
lấy 2 số sau dấu phẩy bằng cách trừ đi phần nguyên của nó rồi nhân 100 và lại lấy phần nguyên.
Ví dụ a = 4.56123
Lấy 56 qua biến b;
b = a – (int)a;
b = b * 100;
b = (int)b;
Thề đọc xong bài này em dễ hiểu kinh khủng :)) cảm ơn anhhh
Cam ơn ban 🙂
Cái đoạn code phần nhập chuỗi trong C ấy anh, nó chỉ mới giải thích là không nhập đc chuỗi có khoảng trắng, còn chỗ nếu đã nhập số thì không đc nhập chuỗi nữa thì nó ntn vậy anh?
Cứu mình với =((( không in được chữ a
#include
#include
#include
/* run this program using the console pauser or add your own getch, system(“pause”) or input loop */
int main(int argc, char *argv[]) {
int i1,i2;
char a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z;
char A[13][2]= {
{a,b},
{c,d},
{e,f},
{g,h},
{i,j},
{k,l},
{m,n},
{o,p},
{q,r},
{s,t},
{u,v},
{w,x},
{y,z},
};
printf(“%c”,A[0][0]);
getch();
return 0;
}
Biến a của bạn ko có giá trị. Nó là biến ko phải giá trị biến.
Em mới bắt đầu học C mà thầy em dạy khó hiểu quá. May mà có blog của anh làm em có động lực học hẳn.
Em cảm ơn anh :))
Cảm ơn bạn rất nhiều 🙂
Bài viết rất hay nhưng tại sao ở cuối chương trình mình để system(“pause”); mà nó báo sai vậy bạn ?
Có thể bạn khai báo thiếu thư viện hoặc code ở một IDE khác, mình đang code ở DEV-C++
Bài viết rất hay nhưng tại sao ở cuối chương trình mình để system(“pause”); mà nó báo sai vậy bạn ?
Nó báo sai như nào bạn? Bạn có thể xóa đi nhé. Mình đang dùng Dev-C nên không sao, có thể bạn dùng IDE khác nên thế.
Cho em hỏi phần khai báo char có thêm dấu * bên cạnh để làm gì thế anh??? Em xóa nó đi thì khi chạy codeblock crash luôn @@
Nó là khai báo con trỏ.
mình muốn hỏi bạn 1 câu
mình muốn xuất ra khoảng hơn 8 triệu dòng thì c không xuất ra được hết ma ghi đè lên. vậy mình muốn xuất hết tất cả hơn 8 triệu dòng ra thi2 có được không? giúp mình với
Có lẽ bạn ghi ra nhiều lần hoặc nhiều file khác nhau
cụ thể mình muốn liệt kê ra tất cả các trường hợp của tổ hợp chập 6 của 48 mà muốn màn hình xuất ra đầy đủ hơn 8000000 dòng mà không bị ghi đè lên thì phải làm như thế nào vậy? bạn có thể giúp mình được không?
min = (a < b ? (c++, a) : (d–, b));
mình ko hiểu câu lệnh này lắm
mong bạn giải thích hộ mình câu lệnh này ở bài 3. tks
Ban xem o dây nhe: https://www.cachhoc.net/2014/12/10/lap-trinh-c-bai-3-phep-toan-toan-tu-trong-c/#6Toan_tu_dieu_kien
Anh làm thêm phần bài tập nữa đi anh
Từ cơ bản đến nâng cao đi ạ.
Bài rất hay và dễ hiểu. Thks a. A có thể giải thích cho em côg dụg của các thư viện conio.h hay stdio.h và khi nào thì nên dùng các thư viện đó được không ạ
conio.h thì mình không dùng, stdio.h std (standard – chuẩn), io (input, output – nhập, xuất) -> Thư viện nhập xuất chuẩn.
a có thể giải thích rõ hơn giúp e chức năng của từng thư viện được ko ạ e cảm ơn
Thư viện thì có rất nhiều, mình không giải thích được hết. Cần thư viện nào bạn google công dụng của nó là được rùi.
Phần 3 code thứ 2 dòng 11 thiếu chữ int nhé :(((( làm t làm mãi mà nó ko ra gtri c=4 :'(
Không thiếu đâu bạn ah. 🙂 Mục đích của mình là biến c đó chính là biến c trong hàm main mà.
#include
int main(){
int tuoi = 0;
// khai bao chuoi co toi da 30 ky tu
char ten[30], tenNguoiYeu[30];
printf(“Ho va ten cua ban ten la gi?”);
gets(ten); // nhap chuoi khong can dau &
printf(“Ban bao nhieu tuoi roi?”);
scanf(“%d”, &tuoi);
fflush(stdin);
printf(“Nguoi yeu cua ban ten la gi?”);
gets(tenNguoiYeu);
printf(“\n====\n”);
printf(“%s \n%d \n%s”, ten, tuoi, tenNguoiYeu);
// system(“pause”); // su dung de dung man hinh neu ban dung dev-C
return 0;
}
Anh ơi khi em thêm scanf(“%s”,tenNguoiYeu); và scanf(“%s”,ten); thì chỉ nhận được chuỗi trước chứ không nhận được chuỗi sau ntn nè a :
Nhập Nguyen Phong Duy thì chỉ nhận được Phong Duy thôi chứ em không nhận được Nguyen
Bạn đọc phần trôi lệnh nhé. https://cachhoc.net/2014/12/04/lap-trinh-c-bai-2-kieu-du-lieu-va-nhap-xuat-trong-c/#5_Hien_tuong_troi_lenh
#include
int a = 1, b = 5; // khai bao bien toan cuc, no se duoc dung o bat ky dau
int main(){
// khai bao 2 bien trong ham main, no se duoc dung trong toan bo ham main ke tu dong nay
int c = 4, d = 6;
{
int e = 6, d = 8;
c = 7;
printf(“gia tri cac bien trong khoi:\n”);
printf(“e = %d \t d = %d \t c = %d\n”, e, d, c);
}
printf(“gia tri cac bien trong ham main:\n”);
printf(“c = %d \t d = %d\n”, c, d);
printf(“gia tri cac bien toan cuc:\n”);
printf(“a = %d \t b = %d\n”, a, b);
// system(“pause”); // su dung de dung man hinh neu ban dung dev-C
return 0;
}
cho em hỏi cái này sao in ra c= 7 ở dòng thứ 2 ạ?
gia tri cac bien trong khoi:
e = 6 d = 8 c = 7
gia tri cac bien trong ham main:
c = 7 d = 6
gia tri cac bien toan cuc:
a = 1 b = 5
Em nghĩ dòng 2 nó phải là 4 như d=6 vậy ạ?
{ dòng 1 đc đặt trong đây nên lấy giá trị trong đây ạ?
}
Trong khối lệnh chúng ta khai báo 2 biến e và d, do vậy 2 biến này hoàn toàn khác với các biến trước đó đã khai báo. Còn biến c ko khai báo mới tức là nó vẫn là biến cũ. Khi gán giá trị thì biến d ở trong khối là biến mới, nó ko phải biến cũ nên d ở lần 2 vẫn là d ban đầu, còn c do ko khai báo mới nên c thay đổi.
Cho e hỏi sao mình không nhập chuỗi trc r ms nhập só sau ạ…như v thì có thể k cần dùng fflush(stdin) nữa đúng k ạ????
Nhưng vấn đề là trong nhiều bài toán cần phải nhập số trước ấy bạn. VD đề yêu cầu là nhập 1 danh sách n chuỗi, khi đó phải nhập n trước rồi mới đến nhập các chuỗi.
a ơi, em muốn thêm 1 học sinh vào danh sách có sẵn thì code ntn.
thêm chuỗi vào mảng chuỗi ấy anh,
Thì em phải tạo mảng mới, rồi copy những cái đã có vào mảng đó sau đó thêm mới vào. Còn nếu mảng định kích thước sẵn mà nó nhiều phần tử (VD khai báo mảng 100 phần tử) thì cứ thế mà cho vào cuối mảng, sau đó tăng số lượng (n) lên.
“Hiện tượng như trên được gọi là hiện tượng trôi lệnh. Nếu bây giờ bạn thực hiện cho nhập số trước và chuỗi ngay sau đó thì hiện tượng này cũng xảy ra vì scanf không đọc được phím enter khi bạn nhấn lúc nhập xong số”
Em chạy thử thì thấy vẫn được đối với scanf định dạng %s (chuỗi), chỉ khi ở dạng %c mới bị phím enter thôi.
Anh kiểm tra lại thử xem phải không ạ?
Quan trọng là bạn nhập số trước hay nhập chuỗi trước nhé. Nếu nhập số trước thì vẫn bị như trên 🙂
em chạy thử thì thấy như sau:
1. Vẫn bị như trên, nếu nhập số trước rồi dùng hàm gets(), nên phải xóa bộ đệm trc
2. Không bị như trên, nếu nhập số trc rồi dùng hàm scanf() lấy chuỗi [không có khoảng cách] bằng định dạng %s
Đây là đoạn code em thử:
#include
#include
int main()
{
int tuoi = 0;
char ten[30], tenNguoiYeu[30];
printf(“Ho va ten cua ban ten la gi?”);
gets(ten);
printf(“Ban bao nhieu tuoi roi?”);
scanf(“%d”, &tuoi);
//fflush(stdin);
printf(“Nguoi yeu cua ban ten la gi?”);
//gets(tenNguoiYeu); // phải có fflush(stdin) sau nhập số
scanf(“%s”, tenNguoiYeu); //Không cần fflush(stdin) sau nhập số, nhưng chỉ lấy đc 1 chữ
printf(“\n====\n”);
printf(“%s \n%d \n%s”, ten, tuoi, tenNguoiYeu);
return 0;
}
Ah, Có lẽ bạn đã đúng. Mình cũng chưa nghĩ đến TH này. Cảm ơn bạn nhé.
Dạ, em cũng mới tập tành viết code thôi.
Cảm ơn anh rất nhiều về chuỗi các bài viết C, rất có ích cho em.
Cảm ơn bạn 🙂
Bài viết rất rõ ràng dễ hiểu !
Nhưng có chỗ e chưa rõ, tại sao bỏ fflush(stdin); đi thì chương trình lại không chạy đúng yêu cầu ạ. Và khi nào thì cần thên fflush(stdin); khi nào không cần thêm ạ?
Thank you a !
Ở bên trên mình đã lấy ví dụ và nêu rõ rồi. 🙂
anh ơi em có 3 thắc mắc mong anh trả lời
#include
int a = 1, b = 5; // khai bao bien toan cuc, no se duoc dung o bat ky dau
int main(){
// khai bao 2 bien trong ham main, no se duoc dung trong toan bo ham main ke tu dong nay
int c = 4, d = 6;
{
int e = 6, d = 8;
c = 7;
printf(“gia tri cac bien trong khoi:\n”);
printf(“e = %d \t d = %d \t c = %d\n”, e, d, c);
}
printf(“gia tri cac bien trong ham main:\n”);
printf(“c = %d \t d = %d\n”, c, d);
printf(“gia tri cac bien toan cuc:\n”);
printf(“a = %d \t b = %d\n”, a, b);
// system(“pause”); // su dung de dung man hinh neu ban dung dev-C
return 0;
}
cái dấu ngoặc ở giữa là cho khối anh có thể giải thích khối với lại vai trò không ạ
2.
#include
int main(){
char a,b;
printf(“Nhap so nguyen a = “);
scanf(“%c”, &a);
printf(“Nhap so thuc b = “);
scanf(“%c”, &b);
printf(“a = %d \t b = %d”, a,b);
// system(“pause”) su dung de dung man hinh neu ban dung dev-C
return 0;
}
em biến dổi tý để chạy nhập ký tự nhưng khi chạy lại bị trôi lệnh ạ! anh giải thích vì sao giúp em
3.
#include
int main(){
int tuoi = 0;
// khai bao chuoi co toi da 30 ky tu
char ten[30], tenNguoiYeu[30];
printf(“Ho va ten cua ban ten la gi?”);
scanf(“%s”, ten); // nhap chuoi khong can dau &
printf(“Ban bao nhieu tuoi roi?”);
scanf(“%d”, &tuoi);
printf(“Nguoi yeu cua ban ten la gi?”);
scanf(“%s”, tenNguoiYeu);
printf(“\n====\n”);
printf(“%s \n%d \n%s”, ten, tuoi, tenNguoiYeu);
// system(“pause”); // su dung de dung man hinh neu ban dung dev-C
return 0;
}
chương trình của anh mà anh ns là nhập số sau đó chuỗi thì bị trôi lệnh nhưng em có nhập họ và tên là “123nguyenvana” mà sao nó vẫn nhận anh.
mong anh giải đáp. bài giảng của anh rất có tâm huyết dễ hiểu cho những người như em .em cảm ơn ạ
1. Khối lệnh là một tập hợp 1 hay nhiều câu lệnh nằm trong cặp dấu {}.
2. Do bạn nhập ký tự, khi nhập thì có phím enter đằng sau, nên lần nhập sau nó bị lấy ký tự enter. Tương tự như mình giải thích trong bài viết.
3. Do bạn nhập tên không chứa dấu cách nên không vấn đề gì nhé.
Làm sao để mình nhìn vào sơ đồ khối và biết là phải dùng cấu trúc gì để giải 1 bài toán đó ạ. Tại em thấy mấy bạn em nó nhìn vào sơ đồ khối và nó biết dùng cấu trúc gì cho 1 bài toán và làm trong khi em vẫn loay hoay mãi vẫn không biết phải dùng loại cấu trúc gì và cách thức để giải bài toán đó ra sao vd như toán phương trình bậc nhất ấy ạ. Anh thông cảm vì em mới học à nên có gì mong anh chỉ giúp em cách làm toán bằng cách lập trình đi ạ. Em cám ơn anh ạ
Muốn biết sử dụng cấu trúc gì thì bạn cần nắm chắc tác dụng, nguyên lý hoạt động của chúng. Sau đó nhìn vào sơ đồ mới biết được. VD sơ đồ giải phương trình bậc nhật có đoạn kiểm tra điều kiện a = 0 hay a # 0, mỗi TH thì làm cái gì đó. Vậy cấu trúc nào phù hợp? Mình nghĩ lại các cấu trúc phù hợp để kiểm tra điều kiện thì nghĩ ra cấu trúc if – else…
Chào mọi người! Em là người mới toàn tập.
Cho em hỏi khi gắn giá trị cho Biến mà giá trị nằm ngoài miền giá trị của Kiểu thì chương trình sẽ như thế nào ạ. Có phải cứ chọn Kiểu nào có miền lớn thoải mái là được không?
Mong mọi người chỉ bảo. Em cảm ơn nhiều!
Bạn cần xác định phạm vi giá trị có thể cần lưu trữ. Không nên chọn kiểu có miền lớn vì sẽ tốn bộ nhớ RAM khi chương trình chạy làm máy chậm, cũng không nên chọn kiểu có miền nhỏ khi giá trị vượt quá sẽ làm chương trình bị sai.
Cảm ơn anh!
dạ e là người mới cho e hỏi khi gặp trường hợp nhập dữ liệu mình chưa enter thì nó đã nhảy lên cái dữ liệu luôn ạ, e chưa enter thì nó hiện ra luôn . e cám ơn
\
Chưa enter mà đã hiện luôn? Chắc hiện tượng trôi lệnh.
em viết code này ở visual thì n chạy k đc, sang devC++ thì n lại chạy đc,vậy là sao vậy anh,mong anh trả lời giúp em, em cảm ơn
#include
int main()
{
int a,b;
printf(“nhap nam: “);
scanf(“%d”, &a);
printf(“nhap thang: “);
scanf(“%d”,&b);
if ( a%4 == 0&& a%100 !=0|| a%400==0){
if(b==2)
printf(“%d la nam nhuan, thang %d co 29 ngay”,a,b);
if (b==1 || b==3 ||b==5|| b==7|| b==8|| b==10|| b==12){
printf(“%d la nam nhuan, thang %d co 31 ngay”,a,b);
}else{
printf(“%d la nam nhuan, thang %d co 30 ngay”,a,b);
}
}
else{
if(b==2)
printf(“%d la nam khong nhuan, thang %d co 28 ngay”,a,b);
if (b==1 || b==3 ||b==5|| b==7|| b==8|| b==10|| b==12){
printf(“%d la nam ko nhuan, thang %d co 31 ngay”,a,b);
}else{
printf(“%d la nam ko nhuan, thang %d co 30 ngay”,a,b);
}}
}
Mình ko dùng VS nên không rõ. Có thể trình biên dịch của nó khác.
#include
using namespace std;
int main()
{
char x;
cin>>x;
if(int(x)>=int(‘a’)&&(int(x)<=int('x')))
int(x)=int(x)+32;
cout<< x;
else cout<< "Day ko la ky tu in thuong";
return 0;
}
//Bài này ctrlf9 nó ra error: else without a previous if là sao? Đè bai nhâp số in thường biến nó thành in hoa. Giúp mình cái
Trong lệnh if bạn thực hiện 2 lệnh int x = … và cout, bạn phải đưa nó vào trong ngoặc {} nếu không sau lệnh thứ nhất coi như hết lệnh if, và lệnh else đằng sau sẽ không tương ứng với lệnh if nào cả.
Anh ơi em chưa hiểu rõ yêu cầu của đề bài, nhập vào sử dụng con trỏ thì thao tác như nào ạ, anh có thể viết ví dụ cho em không ạ ?
Em cảm ơn !
*/ Xây dựng một cấu trúc xếp hạng gồm các thông tin sau: Tên đội bóng, số trận thắng, số trận hoà, số trận thua. Viết chương trình thực hiện các công việc sau:
a. Khai báo một mảng cấu trúc Bangxephang sử dụng con trỏ và nhập vào thông tin n đội bóng từ bàn phím.
vậy còn số nguyên hệ 2 thì dùng chuỗi định dạng dữ liệu nào ạ ??
Cái này không có nhé.
Tôi đang bắt đầu học thêm lập trình và tôi thấy bạn viết như thế này rất dễ hiểu cho người mới bắt đầu học lập trình. Trang này rất hay tôi sẽ thường xuyên học.