Hôm qua mình có đọc được trên group KTPM bài tập loại này: tuy nhiên, cũng ko ít bạn thắc mắc là bài này hơi "kỳ". "Kỳ" ở chỗ là làm sao chỉ dùng 1 vòng for để thực hiện được đồng thời 3 nhiệm vụ (nhập, đếm và tìm MAX). Cuối cùng topic đã dừng lại với một bài code hơi "lạ" và theo nhiều bạn đã nói bài code này quá "dài" và kiến thức không được phổ thông cho lắm! Ngoài ra, bài code cũng được một bạn đánh giá là phù hợp với chuẩn của Microsoft gì đó.... Và nó đây:
BT : nhập mảng 1 chiều, xuất ra phần tử max, và số lần xuất hiện xủa
max
(DÙNG 1 VÒNG LẶP FOR)
#include <stdio.h>
#include <windows.h>
#define MAX 100
int main()
{
int a[MAX], n, max, sl;
printf("nhap so phan tu : ");
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
printf("nhap a[%d] ", i + 1);
scanf("%d", a + i);
printf("\n");
if (i == 0)
{
max = *(a + i);
sl = 1;
}
else
{
if (*(a + i) > max)
{
max = *(a + i);
sl = 1;
}
else
{
if (*(a + i) == max)
{
sl += 1;
}
}
}
}
printf("\n max la %d, so luong %d \n", max, sl);
system("pause");
return 0;
}
Sau gần 1h đồng hồ đọc từng dòng code trên đây mình chẳng hiểu gì cả! Ko hiểu được ý đồ của bạn ấy là gì? Và kiểu gọi địa chỉ scanf("%d", a+1) cùng thư viện <window.h> ko biết bạn ấy học ở đâu ra. Nó quá cao siêu chăng? Mình nghĩ nó chỉ là kiến thức của người học trước thì biết trước thôi!
In my opinion, trong lớp học đến đâu thì chỉ áp dụng giới hạn của lượng kiến thức ấy có lẽ sẽ hay hơn rất nhiều! Sau một hồi tra tài liệu mình đã tìm thấy đáp số
tối ưu cho bài này. Đặt biệt, chỉ dùng ~ kiến thức phổ thông thì cũng có thể thực hiện tốt, thậm chí còn ngắn hơn bài trên một chút nữa!. Tùy theo cảm nhận của các bạn thôi!
Ý tưởng trong cuốn sách như sau:
- Đặt vấn đề nếu chỉ dùng một vòng for thì việc nhập vào một mảng, quá trình đếm và tìm MAX phải diễn ra đồng thời trong vòng lặp! Ta sẽ tiến hành cả 3 quá trình trong từng lần nhập các phần tử của mảng. Ví dụ, khi nhập a[1] thì đồng thời các quá trình tìm MAX, quá trình đếm cũng được lồng ghép vào đây, cho đến khi cả 3 quá trình hoàn tất. Tiếp đó, trong quá trình nhập a[2] cũng diễn ra đồng thời 2 quá trình trên, vòng for sẽ cứ tiếp diễn như thế cho đến a[n].
Chú ý, sau mỗi quá trình thì giá trị "MAX và dem" có một giá trị cụ thể.
Và cuối cùng là đoạn code:
#include<stdio.h>
#include<conio.h>
main()
{
int i, a[20], n, max, dem;
printf("So phan tu = "); scanf("%d",&n);
printf("Nhap a[1] = "); scanf("%d",&a[0]);
dem = 0;
max = a[0];
for(i=1;i<n;i++)
{
printf("Nhap a[%d] = ",i+1);
scanf("%d",&a[i]);
if(a[i] == max)
dem++;
if(a[i]>max)
{
max = a[i];
dem = 1;
}
}
printf("MAX = %d, gia tri nay da xuat hien %d lan trong mang.", max, dem);
getch();
}
BT : nhập mảng 1 chiều, xuất ra phần tử max, và số lần xuất hiện xủa
max
(DÙNG 1 VÒNG LẶP FOR)
#include <stdio.h>
#include <windows.h>
#define MAX 100
int main()
{
int a[MAX], n, max, sl;
printf("nhap so phan tu : ");
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
printf("nhap a[%d] ", i + 1);
scanf("%d", a + i);
printf("\n");
if (i == 0)
{
max = *(a + i);
sl = 1;
}
else
{
if (*(a + i) > max)
{
max = *(a + i);
sl = 1;
}
else
{
if (*(a + i) == max)
{
sl += 1;
}
}
}
}
printf("\n max la %d, so luong %d \n", max, sl);
system("pause");
return 0;
}
Sau gần 1h đồng hồ đọc từng dòng code trên đây mình chẳng hiểu gì cả! Ko hiểu được ý đồ của bạn ấy là gì? Và kiểu gọi địa chỉ scanf("%d", a+1) cùng thư viện <window.h> ko biết bạn ấy học ở đâu ra. Nó quá cao siêu chăng? Mình nghĩ nó chỉ là kiến thức của người học trước thì biết trước thôi!
In my opinion, trong lớp học đến đâu thì chỉ áp dụng giới hạn của lượng kiến thức ấy có lẽ sẽ hay hơn rất nhiều! Sau một hồi tra tài liệu mình đã tìm thấy đáp số
tối ưu cho bài này. Đặt biệt, chỉ dùng ~ kiến thức phổ thông thì cũng có thể thực hiện tốt, thậm chí còn ngắn hơn bài trên một chút nữa!. Tùy theo cảm nhận của các bạn thôi!
Ý tưởng trong cuốn sách như sau:
- Đặt vấn đề nếu chỉ dùng một vòng for thì việc nhập vào một mảng, quá trình đếm và tìm MAX phải diễn ra đồng thời trong vòng lặp! Ta sẽ tiến hành cả 3 quá trình trong từng lần nhập các phần tử của mảng. Ví dụ, khi nhập a[1] thì đồng thời các quá trình tìm MAX, quá trình đếm cũng được lồng ghép vào đây, cho đến khi cả 3 quá trình hoàn tất. Tiếp đó, trong quá trình nhập a[2] cũng diễn ra đồng thời 2 quá trình trên, vòng for sẽ cứ tiếp diễn như thế cho đến a[n].
Chú ý, sau mỗi quá trình thì giá trị "MAX và dem" có một giá trị cụ thể.
Và cuối cùng là đoạn code:
#include<stdio.h>
#include<conio.h>
main()
{
int i, a[20], n, max, dem;
printf("So phan tu = "); scanf("%d",&n);
printf("Nhap a[1] = "); scanf("%d",&a[0]);
dem = 0;
max = a[0];
for(i=1;i<n;i++)
{
printf("Nhap a[%d] = ",i+1);
scanf("%d",&a[i]);
if(a[i] == max)
dem++;
if(a[i]>max)
{
max = a[i];
dem = 1;
}
}
printf("MAX = %d, gia tri nay da xuat hien %d lan trong mang.", max, dem);
getch();
}
Comment