Bài đăng phổ biến

Thứ Hai, 26 tháng 11, 2012

BÀI 2: BÀI TẬP NGHIÊN CỨU.


ĐỀ BÀI:
Trong đó MaxMin lần lượt là giá trị lớn nhất, nhỏ nhất của số thực (được nhập vào từ thiết bị nhập chuẩn) a0, a1, …, an-1
Chỉ dùng duy nhất 1 vòng lặp (for hoặc while), đề xuất cách thức để nhập số thực như trên và tính giá trị của biểu thức Aver, xuất kết quả tính ra thiết bị xuất chuẩn. Viết chương trình để minh họa đề xuất đó.
Lưu ý: Phần này sinh viên chưa học về mảng, như vậy vấn đề chính của bài toán này là không thể dùng mảng để lưu giá trị của số thực nói trên. Như vậy phải đề xuất một giải pháp “thông minh” để nhập và tính toán mà không đưa trước các số thực này vào mảng.
PHÂN TÍCH:
Chúng ta thấy đây, đây sẽ là một bài rất dễ dàng nếu như chúng ta được sử dụng mảng phải không!
Nhưng rất tiếc, điều đó không được cho phép sử dụng trong đề bài này. Vậy làm sao có thể vừa nhập vừa đọc hết và lưu lại hết các giá trị mà không được cái gì lưu lại (ở đây có thể nói là mảng).
Do vậy, cách tốt nhất có thề đó chúng ta làm cho việc tính (ai - Max) và tính (ai-Min) được tách hẳn ra thành việc tính ai, Max, Min.
THUẬT TOÁN:
Dựa vào nhận định trên, ta sẽ phân tích Aver ra để dễ dàng tính toán:
Ta thấy đó, như vậy công việc còn lại rất là nhẹ nhàng, chỉ với một vòng lặp, ta có thể:
* Tính sum1= 

* Tính sum2= 
* Đồng thời tìm Max, Min.
Cuối cùng sau vòng lặp ta dễ dàng tính được tổng Aver.
VÀ ĐÂY LÀ CODE THAM KHẢO:
#include <stdio.h>
#include <conio.h>
#include <math.h>
void main()
{
int n,i;
float a,Min,Max,sum1,sum2;
double Aver;
printf("Nhap vao so phan tu n \n");
scanf("%d",&n);
printf("Nhap vao n phan tu \n");
sum1=0;
sum2=0;
for (i=0;i<n;i++)
{
scanf("%f",&a);
if (i==0)
{
Max=a;
Min=a;
}
else
{
if (Max<a) Max=a;
if (Min>a) Min=a;
}
sum1+=pow(a,2);
sum2+=(2*a);
}
Aver=2*sum1+n*pow(Max,2)+n*pow(Min,2)-(Max+Min)*sum2+(n/2.0)*(Max-Min)*(Max-Min);
printf("Gia tri Aver = %f",Aver);
getch();
}

CẢM ƠN CÁC BẠN ĐÃ THEO DÕI.



Không có nhận xét nào:

Đăng nhận xét