Chào các bạn, hôm nay Lập trình Không khó sẽ cùng các bạn giải quyết một số bài tập mảng 1 chiều nhé. Hiện tại, đề bài này chưa cho phép sử dụng hàm con nên code sẽ được thực thi toàn bộ trong hàm main nhé các bạn.
- Nếu bạn chưa có kiến thức cơ bản về mảng 1 chiều, hãy đọc bài học Mảng 1 chiều trong C/C++ trước để có kiến thức nhé.
- Nếu bạn mong muốn thực hành các bài tập lập trình được đánh giá đúng sai, hãy thực hành tại luyện code nha.
Các bài tập mảng 1 chiều phổ biến
Đây là một bài tập tổng hợp về kiến thức mảng 1 chiều.
Đề bài tập mảng 1 chiều như sau:
Nhập từ bàn phím mảng số nguyên gồm n phần tử.
- Tính trung bình cộng các số lẻ ở vị trí chẵn
- Tìm số lớn nhất trong mảng vừa nhập
- Tìm vị trí các số nhỏ nhất trong mảng
- Đếm các số chính phương có trong mảng
- Hiện thị các số nguyên tố có trong mảng lên màn hình
- Thay thế các phần tử âm có trong mảng bằng giá trị 0
- Xóa các phần tử âm có trong mảng
- 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, do mình không sử dụng ma trận copy để làm câu 6 và 7. Mà hai câu 6 và 7 có sự xung đột. Do đo, khi chạy code các bạn lưu ý:
- Comment phần số 6 nếu muốn chạy phần số 7, và ngược lại
- Bỏ comment như mô tả trong code để xem kết quả thay đổi
Lời giải
Trong code dưới đây, các phần mình đều có comment giải thích code rõ ràng. Các phần cũng đã được chia theo bố cục rõ ràng. Các bạn có thể sử dụng code này làm lời giải tham khảo cho bài tập trên.
Đây là lời giải đề thi nhập môn tin học – bài tập mảng 1 chiều sử dụng ngôn ngữ C.
#include <stdio.h> #include <math.h> // Su dung ham sqrt const int MAX = 100000; int arr[MAX]; int main(){ int n; printf("nNhap so luong phan tu n = "); scanf("%d", &n); // Nhap mang for(int i = 0;i < n; ++i){ printf("nNhap a[%d] = ", i); scanf("%d", &arr[i]); } /*------------------------------------*/ // 1 .Tinh trung binh cong cac so le o vi tri chan // Chu y: Vi tri chan = chi so le int sum = 0; int count = 0; for(int i = 1; i < n; i+=2){ if(arr[i] % 2 == 1){ ++count; sum += arr[i]; } } printf("nTrung binh cong = %f", (float)sum/count); /*------------------------------------*/ // 2. Tim so lon nhat trong mang vua nhap int maxNum = arr[0]; for(int i = 1;i < n;++i){ if(arr[i] > maxNum) maxNum = arr[i]; } printf("nPhan tu lon nhat: %d", maxNum); /*------------------------------------*/ // 3. Tim vi tri cac so nho nhat trong mang // Can lam 2 buoc: // 1. Tim gia tri nho nhat minNum. // 2. In ra cac vi tri co gia tri = minNum // Luu y: Vi tri = chi so + 1 // Tim gia tri nho nhat int minNum = arr[0]; for(int i = 1;i < n;++i){ if(arr[i] < minNum) minNum = arr[i]; } // In ra vi tri co gia tri nho nhat printf("nVi tri co gia tri nho nhat la: "); for(int i = 0;i < n;++i){ if(arr[i] == minNum) printf("%d ", i+1); } /*------------------------------------*/ // 4. Dem cac so chinh phuong co trong mang // So chinh phuong la so co can la so nguyen nhu: 1, 4, 9,... int scp = 0; float rs; for(int i = 0;i < n;++i){ rs = sqrt(arr[i]); if(rs == (int)rs) ++scp; } printf("nMang co %d so chinh phuong!", scp); /*------------------------------------*/ // 5. Hien thi cac so nguyen to co trong mang // So nguyen to la so chi co 2 uoc duy nhat la 1 va chinh no. // So nguyen to nho nhat la so 2 printf("nCac so nguyen to co trong mang la: "); bool snt; for(int i = 0;i < n;i++){ // Kiem tra a[i] co phai so nguyen to? // gia su no la so nguyen to // Neu no chia het cho so bat ky trong [2, a[i]] -> khong phai so nguyen to snt = true; for(int j = 2;j < arr[i]; ++j){ if(arr[i] % j == 0) snt = false; } if(arr[i] >= 2 && snt == true) printf("%d ", arr[i]); } /*------------------------------------*/ // 6. Thay the cac phan tu am trong mang = 0. for(int i = 0;i < n;++i){ if(arr[i] < 0) arr[i] = 0; } // Muon xem thay doi thi bo comment // printf("nMang sau khi thay the la: "); // for(int i = 0;i < n;++i){ // printf("%d ", arr[i]); // } // 7. Xoa cac phan tu am co trong mang // Neu muon xem ket qua phan nay thi comment phan so 6 lai nhe // Cai nay ma giai thich bang ca 1 bai van luon ^^ 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; } } // Muon xem thay doi thi bo comment // printf("nMang sau khi xoa phan tu am la: "); // for(int i = 0;i < n;++i){ // printf("%d ", arr[i]); // } /*------------------------------------*/ // 8. Sap xep mang da nhap theo chieu tang dan int tg; for(int i = 0;i < n-1;++i){ for(int j = i+1; j < n;++j){ if(arr[i] > arr[j]){ // Hoan vi tg = arr[i]; arr[i] = arr[j]; arr[j] = tg; } } } // Muon xem thay doi thi bo comment printf("nMang sau khi sap xep tang dan la: "); for(int i = 0;i < n;++i){ printf("%d ", arr[i]); } }
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 1 dãy số nguyên. Hiển thị dãy số đó ra màn hình.
#include<stdio.h> #include<conio.h> main() { int a[50]; int i,n; printf("Nhap so phan tu mang: "); scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&a[i]); } printf("nMang vua nhap la:"); for(i=0;i<n;i++) { printf("%5d",a[i]); } getch(); }
Bài tập in ra các số nguyên tố trong mảng
Nhập 1 dãy số nguyên đưa ra màn hình các số nguyên tố có trong mảng, vị trí các số đó trong mảng.
#include<stdio.h> #include<conio.h> main() { int a[50]; int i,n,j,kt; printf("Nhap so luong phan tu:"); scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&a[i]); } printf("nCac so nguyen to co trong mang va vi tri cac so do trong mang la:"); for(i=0;i<n;i++) { kt=0; for(j=2;j<=a[i]/2;j++) { if(a[i]%j==0) kt=1; } if(kt==0) printf("nso nguyen to %d vi tri %d trong mang ", a[i], i ); } getch(); }
Bài tập sắp xếp mảng, tìm trung bình cộng
Nhập 1 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 màn hình số lớn nhất có 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<stdio.h> #include<conio.h> main() { int a[50]; int i,n,tg,max,j,s=0; printf("nhap vao so phan tu: "); scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d", &a[i]); } max=a[0]; for(i=1;i<n;i++) { if(a[i]>max) { max =a[i]; } } printf("nSo lon nhat =%d",max); printf("nvi tri cua gia tri lon nhat trong day la: "); for(i=0;i<n;i++) { if (a[i]==max) { printf("%6d", i+1); } } //sap xep day so theo thu tu tang dan for(i=0;i<n-1;i++) for(j=i+1; j<n; j++) { if(a[i]>a[j]) { tg=a[i]; a[i]=a[j]; a[j]=tg; } } printf("nday so sau khi sap xep la:"); for(i=0;i<n;i++) { printf("%6d",a[i]); } //Tinh tong va trung binh cong cac so trong day for(i=0;i<n;i++) { s=s+a[i]; } printf("nTong cac so trong day la: %d",s); printf("nTrung binh cong cac so trong day la: %f", (float)s/n); getch(); }
Bài tập chèn phần tử vào mảng
Nhập 1 dãy n số nguyên (0<n<30), 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 gái trị các phần tử vẫn giảm dần(x nhập từ bàn phím.
#include<stdio.h> #include<conio.h> main() { int a[30],i,j, n,tg,v,x; printf("Nhap vao so phan tu: "); scanf("%d", &n); for(i=0;i<n;i++) { scanf("%d",&a[i]); } //hien thi ra man hinh day so vua nhap printf("day so vua nhap la:"); for(i=0;i<n;i++) { printf("%5d",a[i]); } //dua ra man hinh cac so chan va vi tri trong day printf("nCac so chan trong day va vi tri cac so do trong day la:"); for(i=0;i<n;i++) { if(a[i]%2==0) { printf("nso %d dung thu %d trong day", a[i], i+1); } } // sap xep day so theo gia tri cac phan tu giam dan for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) { if(a[i]<a[j]) { tg=a[i]; a[i]=a[j]; a[j]=tg; } } printf("nDay so sau khi sap xep la:"); for(i=0;i<n;i++) { printf("%5d",a[i]); } //chen so x vao day sao cho sau khi chen gia tri cac phan tu van tang dan (x nhap tu ban phim) printf("nNhap gia tri can chen X:"); scanf("%d", &x); v=0; i=0; while(a[i]>x) { i++; } v=i; for(i=n-1;i>=v;i--) { a[i+1]=a[i]; } a[v]=x; printf("n Day so sau khi chen la:"); for(i=0;i<n+1;i++) { printf("%5d", a[i]); } getch(); }
Bạn có thể xem bài hướng dẫn chi tiết: Thêm, xóa phần tử trong mảng 1 chiều
Bài tập tính tổng số dương, xóa các số âm
Nhập 1 dãy số thực không quá 50 phần tử, đư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 có trong dãy.
#include<stdio.h> #include<conio.h> main() { int i, j, n,a[50],s=0; printf("Nhap vao so phan tu "); scanf("%d", &n); for(i=0;i<n;i++) { scanf("%d",&a[i]); } for(i=0;i<n;i++) { if(a[i]>0) { s=s+a[i]; } } printf("Tong cac so duong trong day la:%d",s ); // Xoa tat ca cac so am trong day for(i=0;i<n;i++) { if(a[i]<0) { for(j=i;j<n-1;j++) { a[j]=a[j+1]; } n=n-1; } } printf("n Day so sau khi xoa la:"); for(i=0;i<n;i++) { printf("%5d", a[i]); } getch(); }
Bài tập tổng hợp
Nhập 1 dãy số nguyên không quá 50 phần tử, đưa ra màn hình trung bình cộng các số chia hết cho 3 có trong dãy. Chèn số X vào vị trí thứ k trong dãy(x,k nhập từ bàn phím)
#include<stdio.h> #include<conio.h> main() { int a[50]; int i,n,t=0,k,x,d=0; printf("Nhap vao so phan tu: "); scanf("%d", &n); for(i=0;i<n;i++) { scanf("%d",&a[i]); } // in ra man hinh trung binh cong cac so chia het cho 3 for(i=0;i<n;i++) { if(a[i]%3==0) { t=t+a[i]; d=d+1; } } if(d==0) { printf("khong co so chia het cho 3 trong day"); } else { printf("TBC so chia het cho 3 trong day la %f", (float)t/d); } // chen so x vao vi tri thu k trong day printf("nNhap gia tri va vi tri can chen x,k= "); scanf("%d%d", &x,&k); for(i=n-1;i>=k;i--) { a[i+1]=a[i]; } a[k]=x; printf("n Day so sau khi chen la:"); for(i=0;i<n+1;i++) { printf("%5d", a[i]); } getch(); }
Các bạn có thể viết lời giải của các đề bài trên bằng cách sử dụng hàm nhé!
Nên tham khảo thêm: 1000 bài tập lập trình C/C++ có lời giải
Kết luận
Như vậy, bài viết này mình đã hướng dẫn và cung cấp lời giải đề thi nhập môn tin học đại học Điện Lực. Mình mong muốn các bạn chuyển source code này về dạng hàm để tối ưu và rút gọn số dòng code này. Hãy coi như đó là một bài tập dành cho các bạn.
Chúc các bạn học tốt!
Để lại một bình luận