Bài tập

Bài 53. Bài tập mảng 1 chiều có lời giải

Huy Erick

Chào các bạn! Hôm nay chúng ta sẽ giải quyết một số bài tập về mảng 1 chiều. Đề bài yêu cầu viết code trong hàm main và không được sử dụng hàm con. Hãy...

Chào các bạn! Hôm nay chúng ta sẽ giải quyết một số bài tập về mảng 1 chiều. Đề bài yêu cầu viết code trong hàm main và không được sử dụng hàm con. Hãy cùng tìm hiểu và giải quyết các bài tập thú vị này!

Các bài tập mảng 1 chiều phổ biến

Đầu tiên, hãy xem qua một bài tập tổng hợp về kiến thức về mảng 1 chiều.

Ảnh minh họa: Đề thi nhập môn tin học phần mảng 1 chiều

Đề bài tập mảng 1 chiều như sau:

  1. Nhập từ bàn phím mảng số nguyên gồm n phần tử.
  2. Tính trung bình cộng các số lẻ ở vị trí chẵn.
  3. Tìm số lớn nhất trong mảng vừa nhập.
  4. Tìm vị trí các số nhỏ nhất trong mảng.
  5. Đếm các số chính phương có trong mảng.
  6. Hiển thị các số nguyên tố có trong mảng lên màn hình.
  7. Thay thế các phần tử âm trong mảng bằng giá trị 0.
  8. Xóa các phần tử âm trong mảng.
  9. Sắp xếp mảng đã nhập theo thứ tự tăng dần.

Với bài tập mảng 1 chiều này, chú ý khi chạy code:

  • Để chạy câu 6, hãy comment câu 7 và ngược lại.
  • Bỏ comment như mô tả trong code để xem kết quả thay đổi.

Lời giải

Dưới đây là lời giải cho các bài tập mảng 1 chiều. Mình đã comment giải thích code rõ ràng. Bố cục của code cũng đã được chia theo từng câu hỏi. Bạn có thể sử dụng lời giải này làm tham khảo cho các bài tập tương tự.

#include 
#include  // Sử dụng hàm sqrt

const int MAX = 100000;
int arr[MAX];

int main(){
    int n;
    printf("Nhập số lượng phần tử n = ");
    scanf("%d", &n);

    // Nhập mảng
    for(int i = 0; i  n; ++i){
        printf("Nhập a[%d] = ", i);
        scanf("%d", &arr[i]);
    }

    /*-*/
    // 1. Tính trung bình cộng các số lẻ ở vị trí chẵn
    // Chú ý: Vị trí chẵn = chỉ số lẻ
    int sum = 0;
    int count = 0;
    for(int i = 1; i  n; i+=2){
        if(arr[i] % 2 == 1){
            ++count;
            sum += arr[i];
        }
    }
    printf("Trung bình cộng = %f", (float)sum/count);
    /*-*/

    // 2. Tìm số lớn nhất trong mảng vừa nhập
    int maxNum = arr[0];
    for(int i = 1; i  n; ++i){
        if(arr[i] > maxNum)
            maxNum = arr[i];
    }
    printf("Phần tử lớn nhất: %d", maxNum);
    /*-*/

    // 3. Tìm vị trí các số nhỏ nhất trong mảng
    // Cần làm 2 bước:
    // 1. Tìm giá trị nhỏ nhất minNum.
    // 2. In ra các vị trí có giá trị = minNum
    // Lưu ý: Vị trí = chỉ số + 1
    // Tìm giá trị nhỏ nhất
    int minNum = arr[0];
    for(int i = 1; i  n; ++i){
        if(arr[i]  minNum)
            minNum = arr[i];
    }
    // In ra vị trí có giá trị nhỏ nhất
    printf("Vị trí có giá trị nhỏ nhất là: ");
    for(int i = 0; i  n; ++i){
        if(arr[i] == minNum)
            printf("%d ", i+1);
    }
    /*-*/

    // 4. Đếm các số chính phương có trong mảng
    // Số chính phương là số có căn là số nguyên như: 1, 4, 9,...
    int squareNum = 0;
    float sqrtResult;
    for(int i = 0; i  n; ++i){
        sqrtResult = sqrt(arr[i]);
        if(sqrtResult == (int)sqrtResult)
            ++squareNum;
    }
    printf("Mảng có %d số chính phương!", squareNum);
    /*-*/

    // 5. Hiển thị các số nguyên tố có trong mảng lên màn hình
    // Số nguyên tố là số chỉ có 2 ước duy nhất là 1 và chính nó.
    // Số nguyên tố nhỏ nhất là số 2
    printf("Các số nguyên tố có trong mảng là: ");
    bool isPrime;
    for(int i = 0; i  n; i++){
        // Kiểm tra arr[i] có phải là số nguyên tố?
        // Giả sử là số nguyên tố
        // Nếu nó chia hết cho bất kỳ số trong khoảng [2, arr[i]] -> không phải số nguyên tố
        isPrime = true;
        for(int j = 2; j  arr[i]; ++j){
            if(arr[i] % j == 0)
                isPrime = false;
        }
        if(arr[i] >= 2 && isPrime == true)
            printf("%d ", arr[i]);
    }
    /*-*/

    // 6. Thay thế các phần tử âm trong mảng bằng giá trị 0
    for(int i = 0; i  n; ++i){
        if(arr[i]  0)
            arr[i] = 0;
    }
    // Muốn xem kết quả thay đổi thì bỏ comment
    // printf("Mảng sau khi thay thế là: ");
    // for(int i = 0; i  n; ++i){
    //     printf("%d ", arr[i]);
    // }
    /*-*/

    // 7. Xóa các phần tử âm trong mảng
    // Nếu muốn xem kết quả phần này thì comment phần 6 lại nhé
    for(int i = 0; i  n; ++i){
        if(arr[i]  0){
            for(int j = i; j  n-1; ++j){
                arr[j] = arr[j+1];
            }
            --n;
        }
    }
    // Muốn xem kết quả thay đổi thì bỏ comment
    // printf("Mảng sau khi xóa phần tử âm là: ");
    // for(int i = 0; i  n; ++i){
    //     printf("%d ", arr[i]);
    // }
    /*-*/

    // 8. Sắp xếp mảng đã nhập theo thứ tự tăng dần
    int temp;
    for(int i = 0; i  n-1; ++i){
        for(int j = i+1; j  n; ++j){
            if(arr[i] > arr[j]){
                // Hoán vị
                temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
    // Muốn xem kết quả thay đổi thì bỏ comment
    printf("Mảng sau khi sắp xếp tăng dần là: ");
    for(int i = 0; i  n; ++i){
        printf("%d ", arr[i]);
    }

    return 0;
}

Một số bài tập mảng 1 chiều khác

Nhập, xuất mảng 1 chiều

Nhập vào một dãy số nguyên và hiển thị dãy số đó ra màn hình.

#include
#include
main() {
    int a[50];
    int i,n;
    printf("Nhập số phần tử mảng: ");
    scanf("%d",&n);
    for(i=0;i

Bài tập in ra các số nguyên tố trong mảng

Nhập một dãy số nguyên và hiển thị các số nguyên tố có trong mảng, kèm theo vị trí của các số đó trong mảng.

#include
#include
main() {
    int a[50];
    int i,n,j,kt;
    printf("Nhập số lượng phần tử: ");
    scanf("%d",&n);
    for(i=0;i

Bài tập sắp xếp mảng, tìm trung bình cộng

Nhập một dãy số nguyên không quá 50 phần tử. In ra màn hình dãy số đã nhập. Đưa ra số lớn nhất trong dãy và vị trí của nó trong dãy. Sắp xếp dãy số theo giá trị các phần tử tăng dần. Tính tổng và trung bình cộng các số có trong dãy.

#include
#include
main() {
    int a[50];
    int i,n,temp,max,j,s=0;
    printf("Nhập vào số phần tử: ");
    scanf("%d",&n);
    for(i=0;imax) {
            max =a[i];
        }
    }
    printf("Số lớn nhất = %d",max);
    printf("Vị trí của giá trị lớn nhất trong dãy là:");
    for(i=0;ia[j]) {
                temp=a[i];
                a[i]=a[j];
                a[j]=temp;
            }
        }
    printf("Dãy số sau khi sắp xếp là:");
    for(i=0;i

Bài tập chèn phần tử vào mảng

Nhập một dãy n số nguyên (0 n 30) và in ra màn hình dãy số đã nhập. Đưa ra màn hình các số chẵn và vị trí số chẵn đó trong dãy. Sắp xếp dãy số theo giá trị các phần tử giảm dần. Chèn số X vào dãy sao cho sau khi chèn, giá trị các phần tử vẫn giảm dần (X và k nhập từ bàn phím).

#include
#include
main() {
    int a[30],i,j, n,temp,v,x;
    printf("Nhập vào số phần tử: ");
    scanf("%d", &n);
    for(i=0;i=k;i--) {
        a[i+1]=a[i];
    }
    a[k]=x;
    printf("Dãy số sau khi chèn là:");
    for(i=0;i

Bài tập tính tổng số dương, xóa các số âm

Nhập một dãy số thực không quá 50 phần tử và đưa ra màn hình tổng các số dương trong dãy. Xóa tất cả các số âm trong dãy.

#include
#include
main() {
    int i, j, n,a[50],s=0;
    printf("Nhap vào số phần tử: ");
    scanf("%d", &n);
    for(i=0;i0) {
            s=s+a[i];
        }
    }
    printf("Tổng các số dương trong dãy là: %d",s );
    // xóa tất cả các số âm trong dãy
    for(i=0;i

Bài tập tổng hợp

Nhập một dãy số nguyên không quá 50 phần tử, sau đó đưa ra màn hình trung bình cộng các số chia hết cho 3 trong dãy. Chèn số X vào vị trí thứ k trong dãy (X và k nhập từ bàn phím).

#include
#include
main() {
    int a[50];
    int i,n,t=0,k,x,d=0;
    printf("Nhập vào số phần tử: ");
    scanf("%d", &n);
    for(i=0;i=k;i--) {
        a[i+1]=a[i];
    }
    a[k]=x;
    printf("Dãy số sau khi chèn là:");
    for(i=0;i

Kết luận

Như vậy, bài viết này đã hướng dẫn và cung cấp lời giải cho đề thi nhập môn tin học Đại học Điện Lực. Mình hi vọng rằng bạn có thể chuyển source code này thành các hàm để tối ưu và rút gọn số dòng code. Hãy coi đây như một bài tập thú vị dành cho bạn.

Chúc bạn học tốt!

1