320 Câu hỏi trắc nghiệm lập trình C có đáp án
Tổng hợp 320 câu hỏi trắc nghiệm lập trình C có đáp án đầy đủ nhằm giúp các bạn dễ dàng ôn tập lại toàn bộ các kiến thức. Để ôn tập hiệu quả các bạn có thể ôn theo từng phần trong bộ câu hỏi này bằng cách trả lời các câu hỏi và xem lại đáp án và lời giải chi tiết. Sau đó các bạn hãy chọn tạo ra đề ngẫu nhiên để kiểm tra lại kiến thức đã ôn.
Chọn hình thức trắc nghiệm (50 câu/60 phút)
Chọn phần
-
Câu 1:
Hàm nào dưới đây chỉ dùng để đọc 1 khối dữ liệu từ tệp:
A. fgets();
B. fputs();
C. fwrite();
D. fread();
-
Câu 2:
Hàm nào dưới đây chỉ dùng để ghi một khối dữ liệu vào file:
A. fgets();
B. fputs();
C. fwrite();
D. fread();
-
Câu 3:
Giả sử tệp DATA chứa 5 byte: “70, 26, 13, 10, 44”. Cho đoạn lệnh. Hãy cho biết kết quả của đoạn chương trình trên:
FILE * f; char ch; f = fopen(“DATA”, ”r”); while (!feof(f)) { ch = fgetc(f); printf(“ % c”, ch); }; fclose(f);
A. “70, 26, 13, 13, 10, 44”
B. “70, 26, 13, 10, 44”
C. “70, 26, 10, 44”
D. Đoạn lệnh có lỗi
-
Câu 4:
Cho tệp nhị phân DATA chứa dãy các cấu trúc liền nhau L struct T{…} x;và f là con trỏ tệp đến DATA. Chọn câu đúng nhất trong các câu sau:
A. Lệnh fseek(f,10,SEEK_END) định vị con trỏ tệp đến byte thứ 10 trong tệp.
B. Đoạn lệnh fseek(f, 10, SEEK_END); định vị con trỏ tới cuối tệp.
C. Giả sử tệp có n cấu trúc, lệnh fseek(f, n, SEEK_SET) sẽ đặt con trỏ tới cấu trúc cuối cùng của tệp.
D. Giả sử tệp có n cấu trúc, lệnh fseek(f, n, SEEK_CUR); sẽ không làm thay đổi vị trí con trỏ của tệp.
-
Câu 5:
f là con trỏ trỏ đến tệp nhị phân DATA chứa không quá 100 bản ghi( kiểu cấu trúc) liền nhau. Cho khai báo. Đoạn chương trình nào sau đây đọc toàn bộ các bảng ghi trong DATA vào x:
struct T { …}; struct T x[100]; int i = 0, n = 0;
A. fread(x+i++, sizeof(T), 1, f ); while (!feof(f)) fread(x+i++, sizeof(T), 1, f); fclose(f);
B. fseek(f,0,SEEK_END); n=ftell(f)/sizeof(T); fseek(f,0,SEEK_SET); fread(x, sizeof(T), n, f); fclose(f);
C. A và B đúng
D. A và B sai
-
Câu 6:
Phát biểu nào sau đây là đúng khi nói về chế độ truyền:
- Trong chế độ nhị phân, các byte được sử lí khác với giá trị trên thiết bị ngoại vi và có sự thực hiện chuyển đổi.
- Trong chế độ nhị phân, các kí tự được tổ chức thành từng dòng, được kết thúc bằng kí tự xuống dòng và có sự chuyển đổi.
- Trong chế độ văn bản, các kí tự được tổ chức thành từng dòng, mỗi dòng kết thúc bằng kí tự xuống dòng, có sự chuyển đổi của một số kí tự theo yêu cầu của môi trường.
- Trong chế độ nhị phân, các byte được sử lí đúng như giá trị trên thiết bị ngoại vi và không có sự thực hiện chuyển đổi nào.
A. 1 và 2
B. 1 và 3
C. 2 và 3
D. 2 và 4
-
Câu 7:
Phát biểu nào sau là đúng khi nói về hàm fgets():
A. Hàm đọc 1 kí tự từ tệp, nếu thành công hàm cho mã đọc được. Nếu gặp cuối tệp hoặc có lỗi, hàm cho kí tự EOF.
B. Hàm đọc 1 dãy kí tự từ tệp để lưu vào vùng nhớ mới.
C. Khi dùng hàm nếu gặp kí tự xuống dòng thì kí tự mã số 10 sẽ được thêm vào cuối xâu được đọc.
D. Khi dùng hàm, nếu gặp kí tự xuống dòng, thì kí tự mã số 10 và 13 sẽ được thêm vào cuối xâu được đọc.
-
Câu 8:
Hàm nào dưới đây chỉ dùng để ghi 1 xâu kí tự vào tệp:
A. putch();
B. puts();
C. fputc();
D. fputs();
-
Câu 9:
Phát biểu đúng nhất về mẫu lệnh( f là con trỏ tệp):
while ((ch = fgetc(f)) != EOF)…
A. Chọn 1 phần tử và kiểm tra xem có phải là EOF hay không.
B. Đọc các phần tử của tệp chừng nào kí tự đó chưa phải là kí tự xuống dòng.
C. Ghi một phần tử và kiểm tra xem có phải là EOF hay không.
D. Đọc các phần tử của tệp chừng nào kí tự đó chưa phải là kí tự kết thúc.
-
Câu 10:
Phát biểu nào đúng khi nói về câu lệnh fflush(FILE *f):
A. Hàm làm sạch vùng đệm của tệp f, nếu thành công cho giá trị số tệp đang mở, trái lại, trả về EOF.
B. Hàm làm sạch giá trị vùng đệm của tệp f, nếu thành công hàm cho giá trị EOF, trái lại, hàm trả vể 0.
C. Hàm làm sạch vùng đệm của tệp f, nếu thành công trả về 0, trái lại, trả về EOF.
D. Hàm xóa bộ nhớ đệm của bàn phím.
-
Câu 11:
Hàm nào dưới đây chỉ dùng để chuyển con trỏ về vị trí đầu tệp:
A. fseek();
B. rewind();
C. ftell();
D. seek();
-
Câu 12:
Đấu hiệu nào là đúng khi sử dụng hàm fread();
A. int fread( void *ptr, int size, FILE *f, int n);
B. int fread( FILE *f, void *ptr, int size, int n);
C. int fread( int size, void *ptr, int n, FILE *f);
D. int fread( void *ptr, int size, int n, FILE *f);
-
Câu 13:
Dấu hiệu nào là đúng khi sử dụng hàm fputs();
A. int puts(const char *s, FILE *f);
B. int puts( const char *s);
C. int puts(FILE *f, const char *s);
D. int puts(FILE *f);
-
Câu 14:
Dấu hiệu nào là đúng khi sử dụng hàm fopen() để mở một file đã tồn tại đọc theo kiểu nhị phân:
A. f=fopen(“du_lieu”,”r”);
B. f=fopen(“du_lieu”,”r+b”);
C. f=fopen(“du_lieu”,”a+t”);
D. f=fopen(“du_lieu”,”a+b”);
-
Câu 15:
Hàm nào trả lại kích thước của một tệp được mở:
A. long filelength(int the_file);
B. double filelength(int the_file);
C. int filelength(int the_file);
D. Không có đáp án nào đúng.
-
Câu 16:
Câu lệnh sau có ý nghĩa gì:
FILE * fopen(tep1, ”ab”);
A. Mở tệp nhị phân để ghi.
B. Mở tệp nhị phân đã có và ghi thêm dữ liệu nối tiếp vào tệp này.
C. Mở tệp nhị phân để ghi mới.
D. Mở tệp nhị phân để đọc.
-
Câu 17:
Hàm nào có thể thay đổi kích thước của tệp đang mở:
A. double chsize(int handle, long size);
B. long chsize(int handle, long size);
C. int chsize(int handle, long size);
D. Tất cả các đáp án trên.
-
Câu 18:
Trong chế độ văn bản, dấu hiệu kết thúc tệp là:
A. EOF
B. NULL
C. \n
D. Ctrl_Z
-
Câu 19:
Câu lệnh sau có ý nghĩa gì?
FILE * fopen(tep1, ”r + ”);
A. Mở tệp văn bản cho phép ghi.
B. Mở tệp văn bản cho phép đọc.
C. Mở tệp văn bản cho phép cả đọc cả ghi.
D. Mở tệp văn bản đã tồn tại để đọc.
-
Câu 20:
Câu lệnh sau có ý nghĩa gì?
int open(tep1, O_TRUNC);
A. Mở tệp nhị phân để ghi.
B. Xóa nội dung của tệp.
C. Mở tệp văn bản để đọc và ghi.
D. Tất cả các đáp án trên.
-
Câu 21:
Có thể truy cập thành phần của cấu trúc thông qua con trỏ như( với p là con trỏ cấu trúc, a là thành phần cấu trúc):
A. (*p).a;
B. *p->a;
C. A và B đều đúng
D. A và B đều sai
-
Câu 22:
Cho khai báo. Câu lệnh nào không hợp lệ?
struct T { int x; float y; } t, * p, a[10];
A. p=&t;
B. p=&t.x;
C. p=&a[5];
D. p=&a;
-
Câu 23:
Cho các khai báo sau. Hãy chọn câu đúng nhất:
struct ngay { int ng, th, n; } vaotruong, ratruong; typedef struct sinhvien { char hoten; ngay ngaysinh; };
A. Không được phép gán: vaotruong = ratruong;
B. “sinhvien” là tên cấu trúc, “vaotruong”, “ratruong” là tên biến cấu trúc.
C. Có thể viết “vaotruong.ng”, “ratruong.th”, “sinhvien.vaotruong.n” để truy xuất đến các thành phần tương ứng.
D. A, B, C đều đúng
-
Câu 24:
Trong các khởi tạo giá trị cho các cấu trúc sau, hãy chọn câu đúng:
struct S1 { int ngay, thang, nam; }; S1 = (2, 1, 3); struct S2 { char hoten[10]; struct S1 ngaysinh; }; S2 = { “ Ly Ly”, { 4, 5, 6 } };
A. S1 đúng
B. S2 đúng
C. S1 và S2 đều đúng
D. S1 và S2 đều sai
-
Câu 25:
Đối với kiểu có cấu trúc, cách gán nào sau đây là không được phép:
A. Gán biến cho nhau.
B. Gán hai phần tử mảng( kiểu cấu trúc) cho nhau.
C. Gán một phần tử mảng( kiểu cấu trúc) cho một biến hoặc ngược lại.
D. Gán hai mảng có cấu trúc có cùng số phần tử cho nhau.
-
Câu 26:
Cho đoạn chương trình sau. Chọn câu đúng nhất trong các câu sau:
struct { int to; float soluong; } x[10]; for (int i = 0; i < 10; i++) scanf(“ % d % f”, & x[i].to, & x[i].soluong);
A. Đoạn chương trình trên có lỗi cú pháp.
B. Không được phép sử dụng toán tử lấy địa chỉ đối với các thành phần “to” và “soluong”.
C. Lây địa chỉ thành phần “soluong” dẫn đến chương trình hoạt động không đúng đắn.
D. Cả 3 ý trên đều sai.
-
Câu 27:
Để tạo danh sách liên kết, theo bạn sinh viên nào dưới đây là khai báo đúng cấu trúc tự trỏ sẽ được dùng:
1. Sinh viên 1:
struct SV { char ht[25]; int tuoi; struct Sv * tiep; };
2. Sinh viên 2
typedef struct SV node; struct SV { char ht[25]; int tuoi; node * tiep; };
3. Sinh viên 3
typedef struct SV { char ht[25]; int tuoi; struct SV * tiep; } node;
A. 1
B. 2
C. 2, 3
D. 1,2 và 3
-
Câu 28:
Để dùng danh sách liên kết, xét hai khai báo sau(cần 1KB để lưu dữ thông tin về một sinh viên). (Với “thongtin” là một thành phần dữ liệu của cấu trúc); Chọn câu đúng nhất trong các câu sau:
1. Khai báo 1:
struct SV { thongtin; struct SV * tiep; };
2. Khai báo 2:
struct SV { thongtin }; struct DS { struct SV * sv; struct DS * tiep; };
A. Khai báo 1 tốn nhiều bộ nhớ hơn khai báo 2.
B. Khai báo 2 sẽ giúp chương trình chạy nhanh hơn khi đổi vị trí 2 sinh viên.
C. Khai báo 1 sẽ giúp tiết kiệm câu lệnh hơn khi viết hàm đổi vị trí 2 sinh viên.
D. Khai báo 2 sẽ giúp chương trình chạy nhanh hơn khi duyệt danh sách.
-
Câu 29:
Cho đoạn chương trình. Giá trị của c sẽ là:
char S[] = “Helen”; char * p = S; char c = * (p + 3);
A. ‘H’
B. ‘e’
C. ‘l’
D. ‘n’
-
Câu 30:
Chọn câu đúng:
A. “struct” là một kiểu dữ liệu do người dùng định nghĩa bao gồm nhiều thành phần có kiểu khác nhau.
B. “struct” là sự kết hợp của nhiều thành phần có thể có thể có kiểu khác nhau.
C. Cả 2 ý đểu đúng.
D. Cả 2 ý đểu sai.
-
Câu 31:
Toán tử nào sau đây sẽ truy xuất 1 thành phần của con trỏ cấu trúc:
A. “.”(Toán tử chấm)
B. “->”(Toán tử mũi tên)
C. Cả hai đều đúng.
D. Cả hai đều sai.
-
Câu 32:
Xem đoạn code sau. Giá trị của biến v là:
typedef struct ST { int d1, d2, d3; }; ST v = { 5, 6, 7 }; ST * p = & v; p.d1++;
A. {6, 6, 7};
B. {5, 6, 7};
C. Nhóm trị khác
D. Đoạn code gây lỗi
-
Câu 33:
Xem đoạn code sau. Giá trị trung bình của các trường trong biến v là gì:
typedef struct STUDENT { int d1, d2, d3; }; STUDENT v = { 2, 3, 4 }; v.d1++;
A. 3.0
B. 4.0
C. Giá trị khác
D. Có lỗi trong đoạn code
-
Câu 34:
Hãy khai báo một cấu trúc mô tả sinh viên, thông tin về mỗi sinh viên bao gồm: tên, điểm 3 môn học. Khai báo nào sau đây là đúng:
A. structure STUDENT {char Name[]; int s1,s2,s3;};
B. struct STUDENT {char Name[]; int s1, s2, s3;};
C. typedef struct STUDENT {char Name[]; float s1,s2,s3;};
D. typedef STUDENT { char Name[]; int s1, s2,s3;};
-
Câu 35:
Biến con trỏ có thể chứa:
A. Địa chỉ vùng nhớ của một biến khác.
B. Giá trị của một biến khác.
C. Cả a và b đều đúng.
D. Cả a và b đều sai.
-
Câu 36:
Kết quả của chương trình sau là gì:
#include <stdio.h> void main() { struct diem; { float k; float a; float l; }; struct diem m; m.k = 8; m.a = 6.5; m.l = 6; printf(“ % 0.1 f % 0.1 f % 0.1 f”, m.k, m.a, m.l); };
A. “8.06.56.0”
B. “86.56”.
C. “8.0000006.5000006.000000”
D. “86.5000006”
-
Câu 37:
Kiểu dữ liệu nào có thể chứa nhiều thành phần dữ liệu có thể có kiểu dữ liệu khác nhau thành một nhóm duy nhất:
A. Mảng
B. Con trỏ
C. Tập tin
D. Cấu trúc(struct)
-
Câu 38:
Chọn kết quả hợp lí cho chương trình sau:
void main() { struct sv { float d; char ht[10]; }; struct sv m, * p; p = & m; printf(“ % p”, & m); printf(“ % p”, p); };
A. “FFE6FFE6”
B. “FFE6FFE7”
C. “FFE66EFF”
D. “FFE4FFE4”
-
Câu 39:
Chọn kết quả đúng cho chương trình sau:
#include <stdio.h> void main() { clrscr(); struct sv { float d; char ht[10]; }; struct sv m, * p; p = & m; ( * p).d = p -> d = 10; strcpy(m.ht, ”NguyenVanTuan”); printf(“ % 0.1 f”, m.d); printf(“ % s”, m.ht); };
A. “10.000000NguyenVanTuan”
B. “10.0NguyenVanTuan”
C. Chương trình bị lỗi
D. Kết quả khác
-
Câu 40:
Chọn kết quả đúng cho chương trình sau:
#include <stdio.h> #include <string.h> void main() { struct S1 { float d; float d1; float d2; }; struct S1 m = { 12, 1 }; printf(“ % 0.1 f % 0.1 f % 0.1 f”, m.d, m.d1, m.d2); };
A. “12.01.00.0”
B. “12.0000001.0000000.000000”
C. Kết quả khác
D. Chương trình bị lỗi
-
Câu 41:
Chương trình sau cho kết quả là gì:
#include <stdio.h> void main() { int * px, * py; int a[] = { 1, 2, 3, 4, 5, 6 }; px = a; py = & a[5]; printf(“ % d”, ++px - py); };
A. -4
B. 2
C. 5
D. Không có kết quả đúng
-
Câu 42:
Có bao nhiêu cách khai báo biến cấu trúc?
A. 1
B. 2
C. 3
D. 4
-
Câu 43:
Khi sử dụng từ khóa typedef trước định nghĩa cấu trúc thì:
A. Khai báo biến cho cấu trúc đó ta không cần sử dụng từ khóa “struct” nữa.
B. Khai báo 1 biến cho loại cấu trúc đó ta cần sử dụng từ khóa “struct”.
C. Không thể khai báo thêm biến cấu trúc nào nữa.
-
Câu 44:
Cho khai báo sau. Số lượng bít sử dụng trong biến cấu trúc trên là bao nhiêu:
struct Date { unsigned int ngay: 5; unsigned int thang; unsigned int nam: 11; } sn1;
A. 16
B. 20
C. 32
D. 48
-
Câu 45:
Chọn đáp án đúng khi sử dụng trường kiểu bit:
A. Độ dài các trường không vượt quá 16 bít.
B. Áp dụng được cho các trường có kiểu số nguyên và số thực.
C. Cho phép lấy địa chỉ trường kiểu nhóm bít.
D. Xây dựng được các mảng kiểu nhóm bít.
-
Câu 46:
Đâu là định nghĩa đúng về cấu trúc tự trỏ:
A. Là một cấu trúc có một trường là con trỏ chứa địa chỉ của một biến cấu trúc.
B. Là dạng cấu trúc có một trường là con trỏ chứa địa chỉ của một biến cấu trúc có dạng dữ liệu giống nó.
C. Là dạng cấu trúc có một trường có kiểu dữ liệu giống nó.
D. Tất cả các ý trên.
-
Câu 47:
Trong các khai báo sau, khai báo nào không đúng:
A. struct Date{int ngay, thang, nam;};
B. struct { int ngay, thang, nam;} D1,D2;
C. typedef struct { int ngay, thang, nam;} Date;
D. struct Date { long int ngay:7; long int thang:6; long int nam:5; };
-
Câu 48:
Đâu là phát biểu dúng về danh sach moc nối:
A. Độ dài danh sách không thể thay đổi.
B. Các phần tử của nó được lưu trữ rải rác trong bộ nhớ RAM.
C. Để cài đặt danh sách móc nối phải sử dụng đến cấu trúc tự trỏ.
D. Chỉ có thể xóa được phần tử đầu tiên của danh sách.
-
Câu 49:
Phát biểu nào không đúng về onion:
A. Tất cả các trường chỉ dùng chung một vùng nhớ, và kích thước union bằng kích thước trường lớn nhất.
B. Các trường nằm rải rác trong bộ nhớ RAM và kích thước của các trường bằng tổng kích thước các trường.
C. Có thể khai báo các biến trong union có nhiều kiểu khác nhau.
D. Tại một thời điểm ta không thể chứa dữ liệu tại tất cả các thành phần của một biến union được.
-
Câu 50:
Cho đoạn chương trình. Kích thước của biến u là bao nhiêu byte:
struct ng { unsigned ngay; unsigned thang; unsigned nam; }; struct diachi { int sonha; char tenpho[20]; }; union u { struct ng date; struct diachi address; } diachi_ngaysinh;
A. 20
B. 22
C. 28
D. Đáp án khác