Bài tập lập trình C: Hello World, kiểu dữ liệu và biểu thức

Bài tập lập trình C cơ bản

  1. Trên Dev C++, viết chương trình xuất ra màn hình câu "Hello World!". (Hãy nộp mã nguồn kèm ảnh chụp kết quả chạy bằng cú pháp Markdown của CSDN; các bài sau làm tương tự, không nhắc lại.)

    #include <stdio.h>
    
    int main() {
        const char *thongDiep = "Hello World!";
        printf("%s\n", thongDiep);
        return 0;
    }
    
  2. Trên Dev C++, tạo một dự án mới, nhập chương trình dưới đây và quan sát kết quả.

    #include <stdio.h>
    
    int main() {
        int soNguyen = 1;
        float soThuc = 2.5;
        char kyTu = 'A';
    
        printf("soNguyen = %d\n", soNguyen);   // Xuất biến soNguyen theo định dạng số nguyên
        printf("soThuc = %f\n", soThuc);       // Xuất biến soThuc theo định dạng số thực
        printf("kyTu = %c\n", kyTu);           // Xuất biến kyTu theo định dạng ký tự
        printf("end of program\n");            // Xuất một dòng chuỗi
        return 0;
    }
    
  3. Trên Dev C++, tạo một dự án mới, nhập chương trình dưới đây và quan sát kết quả.

    #include <stdio.h>
    
    int main() {
        const char *tenKieu[] = {"char", "int", "short int", "long int", "float", "double"};
        size_t kichThuoc[] = {sizeof(char), sizeof(int), sizeof(short int), sizeof(long int), sizeof(float), sizeof(double)};
        int soLuong = 6;
    
        printf("Data type              Number of bytes\n");
        printf("-----------       -------------------------\n");
        for (int i = 0; i < soLuong; ++i) {
            printf("%-20s %d\n", tenKieu[i], (int)kichThuoc[i]);
        }
        return 0;
    }
    
  4. Nhập chương trình "Chuyển đổi nhiệt độ" trong sách (trang P48) và quan sát kết quả.

    #include <stdio.h>
    
    double chuyenDoiNhietDo(double doF) {
        return 5 * (doF - 32) / 9;
    }
    
    int main() {
        double nhietDoF = 100;
        double nhietDoC = chuyenDoiNhietDo(nhietDoF);
        printf("Nhiet do %5.2f do F tuong ung voi %5.2f do C\n", nhietDoF, nhietDoC);
        return 0;
    }
    
  5. Nhập chương trình "Chu vi tam giác" trong sách (trang P52) và quan sát kết quả.

    #include <stdio.h>
    
    int tinhChuVi(int a, int b, int c) {
        return a + b + c;
    }
    
    int main() {
        int canh1 = 6, canh2 = 5, canh3 = 5;
        int chuVi = tinhChuVi(canh1, canh2, canh3);
        printf("Chu vi tam giac la: %d\n", chuVi);
        return 0;
    }
    
  6. Bài toán tràn số:

    short giaTri = 32767;
    giaTri += 1;
    printf("%d", giaTri);
    

    Kết quả in ra là: giaTri = -32768. Hãy phân tích vì sao lại có giá trị này.

    Trả lời: Kiểu short chiếm 2 byte, giá trị tối đa là 32767. 2 byte = 16 bit nên có 216 = 65536 giá trị biểu diễn được. Do đó, miền giá trị của short là -32768 đến 32767. Khi thực hiện giaTri += 1 với giaTri = 32767, phép cộng gây ra tràn số và dẫn đến hiệu ứng quay vòng: giá trị quay trở lại đầu miền, tức là -32768.

  7. Tính giá trị các biểu thức:

    • (a) -30 * 3 + 21 / 6 = -6.5
    • (b) -30 + 3 * 21 / 6 = -19.5
    • (c) 30 / 3 * 21 % 6 = 0
    • (d) -30 / 3 * 21 % 4 = -2
  8. Giả sử i, j, k đều là số nguyên, hãy giải thích ý nghĩa của biểu thức i != j < k.

    Trả lời: Với i, j, k đều là số nguyên, biểu thức bắt đầu bằng việc kiểm tra j < k, thu được một giá trị boolean, sau đó kiểm tra i != j. Ví dụ, giả sử a = 1, b = 2, c = 3: trước tiên kiểm tra b < c, tức 2 < 3 là đúng; sau đó kiểm tra a != b, tức 1 != 2 là đúng.

  9. Giả sử có khai báo:

    int i;
    double d;
    

    Sau khi thực hiện các phép gán, giá trị của i và d là bao nhiêu?

    • (a) d = i = 3.5; — i = 3, d = 3.0
    • (b) i = d = 3.5; — i = 3, d = 3.5
  10. Hãy tra cứu tài liệu để tìm hiểu về "toán tử điều kiện" (conditional operator): cú pháp, ví dụ,…

    Trả lời: Toán tử điều kiện, còn gọi là toán tử ba ngôi, là toán tử ba ngôi duy nhất trong C. Cú pháp của nó là:

    biểu_thức_1 ? biểu_thức_2 : biểu_thức_3
    

    Ý nghĩa: nếu biểu_thức_1 nhận giá trị đúng, toàn bộ biểu thức nhận giá trị của biểu_thức_2; ngược lại, nó nhận giá trị của biểu_thức_3.

    Ví dụ:

    • Tìm giá trị lớn nhất trong hai số: max = (a > b) ? a : b;
    • Tính phí mạng: nếu số ngày mua từ 30 trở lên thì tính 0,75 * số ngày, ngược lại tính theo giá gốc: price = (days >= 30) ? 0.75 * days : days;

Thẻ: C Dev-C++ Data Types conditional operator integer overflow

Đăng vào ngày 19 tháng 8 lúc 16:28