Bài tập mảng 1 chiều trong C có lời giải – Lập trình C / C++
Chào các bạn lập trình viên! Hôm nay chúng ta sẽ đi sâu vào một chủ đề nền tảng trong ngôn ngữ lập trình C: mảng một chiều. Dù bạn là người mới học lập trình hay đã có kinh nghiệm, bài viết này sẽ cung cấp những kiến thức từ cơ bản đến nâng cao về mảng một chiều cùng các bài tập kèm lời giải chi tiết.
Mảng một chiều trong C là gì?
Mảng một chiều trong C là một cấu trúc dữ liệu cho phép lưu trữ nhiều phần tử có cùng kiểu dữ liệu trong các ô nhớ liên tiếp. Mỗi phần tử trong mảng được truy cập thông qua chỉ số (index), bắt đầu từ 0.
“Mảng là công cụ mạnh mẽ giúp quản lý và xử lý dữ liệu hiệu quả trong lập trình C, đặc biệt khi làm việc với bộ dữ liệu lớn.”
Cú pháp khai báo mảng một chiều:
kiểu_dữ_liệu tên_mảng[kích_thước];
Ví dụ:
int numbers[5]; // Khai báo mảng 5 số nguyên
Các thao tác cơ bản với mảng một chiều trong C
1. Khởi tạo mảng
Có nhiều cách để khởi tạo mảng trong C:
- Khởi tạo khi khai báo:
int arr[5] = {1, 2, 3, 4, 5};
- Khởi tạo từng phần tử:
int arr[5]; arr[0] = 1; arr[1] = 2; // ...
- Khởi tạo từ input người dùng:
int arr[5]; for(int i = 0; i < 5; i++) { scanf("%d", &arr[i]); }
2. Truy xuất phần tử trong mảng
Để truy xuất một phần tử, ta sử dụng chỉ số của nó:
int value = arr[2]; // Lấy giá trị của phần tử thứ 3 (chỉ số 2)
Lưu ý: Chỉ số mảng trong C bắt đầu từ 0, không phải 1.
Top 5 Bài tập mảng một chiều trong C kèm lời giải
Dưới đây là 5 bài tập phổ biến về mảng một chiều trong C mà mọi lập trình viên nên nắm vững:
Bài 1: Tìm giá trị lớn nhất và nhỏ nhất trong mảng
Yêu cầu: Viết chương trình tìm phần tử lớn nhất và nhỏ nhất trong mảng một chiều.
#include <stdio.h>
int main() {
int arr[] = {3, 5, 7, 2, 8};
int max = arr[0], min = arr[0];
int n = sizeof(arr) / sizeof(arr[0]);
for (int i = 1; i < n; i++) {
if (arr[i] > max) max = arr[i];
if (arr[i] < min) min = arr[i];
}
printf("Giá trị lớn nhất: %dn", max);
printf("Giá trị nhỏ nhất: %dn", min);
return 0;
}
Giải thích: Chương trình khởi tạo biến max và min bằng phần tử đầu tiên, sau đó duyệt qua từng phần tử còn lại để cập nhật giá trị lớn nhất và nhỏ nhất.
Bài 2: Đảo ngược mảng
Yêu cầu: Viết chương trình đảo ngược thứ tự các phần tử trong mảng.
#include <stdio.h>
int main() {
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr) / sizeof(arr[0]);
printf("Mảng ban đầu: ");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
// Đảo ngược mảng
for (int i = 0; i < n/2; i++) {
int temp = arr[i];
arr[i] = arr[n-i-1];
arr[n-i-1] = temp;
}
printf("nMảng sau khi đảo ngược: ");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
return 0;
}
Giải thích: Chương trình hoán đổi các phần tử đối xứng qua trung tâm mảng. Vòng lặp chỉ cần chạy đến giữa mảng vì mỗi lần lặp đã hoán đổi 2 phần tử.
Bài 3: Tính tổng và trung bình cộng
Yêu cầu: Viết chương trình tính tổng và trung bình cộng các phần tử trong mảng.
#include <stdio.h>
int main() {
int arr[] = {10, 20, 30, 40, 50};
int sum = 0;
float avg;
int n = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < n; i++) {
sum += arr[i];
}
avg = (float)sum / n;
printf("Tổng các phần tử: %dn", sum);
printf("Trung bình cộng: %.2fn", avg);
return 0;
}
Giải thích: Chương trình duyệt qua từng phần tử và cộng dồn vào biến sum. Sau đó tính trung bình cộng bằng cách chia tổng cho số lượng phần tử.
Mẹo: Sử dụng phép ép kiểu (float) để đảm bảo kết quả trung bình cộng là số thực.
Bài 4: Tìm kiếm phần tử trong mảng
Yêu cầu: Viết chương trình kiểm tra xem một giá trị cụ thể có tồn tại trong mảng hay không.
#include <stdio.h>
int main() {
int arr[] = {4, 7, 1, 9, 3};
int target = 7;
int found = 0;
int n = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < n; i++) {
if (arr[i] == target) {
found = 1;
printf("Phần tử %d được tìm thấy tại vị trí %dn", target, i);
break;
}
}
if (!found)
printf("Không tìm thấy phần tử %d trong mảngn", target);
return 0;
}
Giải thích: Chương trình duyệt qua từng phần tử và so sánh với giá trị cần tìm. Nếu tìm thấy, in ra vị trí và thoát khỏi vòng lặp. Nếu không tìm thấy, thông báo cho người dùng.
Bài 5: Sắp xếp mảng
Yêu cầu: Viết chương trình sắp xếp mảng theo thứ tự tăng dần sử dụng thuật toán Bubble Sort.
#include <stdio.h>
int main() {
int arr[] = {64, 34, 25, 12, 22};
int n = sizeof(arr) / sizeof(arr[0]);
printf("Mảng ban đầu: ");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
// Bubble Sort
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
printf("nMảng sau khi sắp xếp: ");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
return 0;
}
Giải thích: Thuật toán Bubble Sort so sánh từng cặp phần tử liền kề và hoán đổi nếu chúng không theo thứ tự mong muốn. Quá trình này được lặp lại cho đến khi mảng được sắp xếp.
So sánh các phương pháp sắp xếp mảng trong C
Dưới đây là bảng so sánh các thuật toán sắp xếp phổ biến:
Thuật toán | Độ phức tạp thời gian trung bình | Độ phức tạp không gian | Ổn định |
---|---|---|---|
Bubble Sort | O(n²) | O(1) | Có |
Selection Sort | O(n²) | O(1) | Không |
Insertion Sort | O(n²) | O(1) | Có |
Quick Sort | O(n log n) | O(log n) | Không |
Merge Sort | O(n log n) | O(n) | Có |
Các lỗi thường gặp khi làm việc với mảng và cách khắc phục ⚠️
- Truy cập vượt quá chỉ số mảng: Luôn kiểm tra chỉ số trước khi truy cập phần tử.
- Quên khởi tạo mảng: Mảng nên được khởi tạo trước khi sử dụng.
- Nhầm lẫn về kích thước mảng: Sử dụng sizeof(arr)/sizeof(arr[0]) để lấy số phần tử.
- Lỗi off-by-one: Cẩn thận với điều kiện dừng trong vòng lặp.
Ứng dụng thực tế của mảng một chiều
Mảng một chiều có rất nhiều ứng dụng trong thực tế:
- Lưu trữ và xử lý dữ liệu trong các phần mềm Photoshop
- Xử lý hình ảnh trong Illustrator
- Quản lý dữ liệu trong cơ sở dữ liệu
- Hiển thị danh sách trong giao diện người dùng
- Lưu trữ tọa độ trong các phần mềm Autocad
Ví dụ, trong Autocad, mảng được sử dụng để lưu trữ các tọa độ của đối tượng, giúp hiển thị và thao tác với chúng trên màn hình.
Những câu hỏi thường gặp về mảng một chiều trong C ❓
1. Mảng và con trỏ trong C có liên quan như thế nào?
Trong C, tên mảng thực chất là một con trỏ hằng trỏ đến phần tử đầu tiên của mảng. Vì vậy, bạn có thể sử dụng ký hiệu con trỏ để truy cập phần tử mảng:
int arr[5] = {1, 2, 3, 4, 5};
printf("%d", *(arr + 2)); // In ra giá trị của arr[2], tức là 3
2. Làm thế nào để truyền mảng vào hàm trong C?
Khi truyền mảng vào hàm, thực chất bạn đang truyền con trỏ đến phần tử đầu tiên:
void processArray(int arr[], int size) {
// Xử lý mảng
}
int main() {
int numbers[5] = {1, 2, 3, 4, 5};
processArray(numbers, 5);
return 0;
}
3. Làm sao để tính kích thước của mảng?
Sử dụng toán tử sizeof:
int arr[5] = {1, 2, 3, 4, 5};
int size = sizeof(arr) / sizeof(arr[0]); // size = 5
4. Có thể thay đổi kích thước mảng sau khi khai báo không?
Không, trong C, kích thước mảng tĩnh không thể thay đổi sau khi khai báo. Nếu cần mảng có kích thước động, bạn nên sử dụng cấp phát động (malloc, calloc) hoặc cấu trúc dữ liệu như linked list.
Kết luận
Mảng một chiều là cấu trúc dữ liệu cơ bản nhưng vô cùng quan trọng trong lập trình C. Việc nắm vững các thao tác với mảng sẽ giúp bạn xây dựng nền tảng vững chắc để tiếp cận các cấu trúc dữ liệu phức tạp hơn.
Hy vọng bài viết này đã giúp bạn hiểu rõ hơn về mảng một chiều trong C và cách giải quyết các bài tập thông dụng. Hãy thực hành nhiều để củng cố kiến thức nhé!
Bạn đang tìm kiếm thêm tài nguyên học lập trình? Hãy khám phá thêm các phần mềm đồ họa hoặc 3DS MAX tại phanmemdohoa.com - website chia sẻ phần mềm và thủ thuật miễn phí, đã được xác minh 100%.
Bạn có câu hỏi hoặc góp ý gì về bài viết này? Hãy để lại bình luận bên dưới nhé!