Hàm tính trung bình các số chính phương có trong mảng code C/C++

0
5008
ham tinh gia tri trung binh cac so chinh phuong trong mang c 1

Bài viết chia sẻ cho bạn đọc code kiểm tra số chính phương trong C/C++. Hàm tính giá trị trung bình các số chính phương có trong mảng một chiều bằng ngôn ngữ C/C++

1. Giới thiệu bài toán

Số chính phương hay còn gọi là số vuông. Trong các bài tập C/C++ thường có phần kiểm tra xem một số nguyên có phải là số chính phương hay không.

Đề bài mình sẽ giải quyết trong bài viết:

Viết hàm tính giá trị trung bình các số chính phương trong mảng một chiều a có n phần tử. Hàm trả về giá trị trung bình của các phần tử là số chính phương. Ngược lại hàm trả về giá trị 0.

Bài toán yêu cầu kết hợp thuật toán tính trung bình có điều kiện, thuật toán kiểm tra số chính phương.

Theo quan điểm cá nhân, đây là một bài toán khá hay ở mức độ trung bình.

2. Giải quyết bài toán

2.1 Hàm kiểm tra số chính phương trong C/C++

Để giải bài toán này, trước tiên bạn cần phải hiểu số chính phương là số như thế nào?

Số chính phương là số bằng bình phương đúng của một số nguyên. Tức là số đó có căn bậc 2 là một số nguyên

Ví dụ về số chính phương:

4= 2*2; 9=3*3; 16=4*4 . . .

Thuật toán kiểm tra 1 số nguyên có phải là số chính phương không bằng ngôn ngữ C/C++ (có nhiều thuật toán khác nhau, thuật toán mình đưa ra nếu thấy phù hợp thì bạn có thể tham khảo).

Mình sẽ viết một hàm kiểm tra số chính phương, hàm truyền vào một số nguyên để kiểm tra và hàm trả về giá trị 1, 0 (tương đương đúng, sai).

Trong hàm, mình sử dụng một vòng for, vòng for chạy từ 1 tới <=n/2 (tiết kiệm thời gian của vòng for). Nếu i*i = n return 1 (đúng).

Ngược lại, không có số i nào thỏa mãn i*i=n, return 0 (sai)

Mình sẽ thêm một dòng if(n==1) thì return 1. Vì chỉ có số 1 là bình phương của chính nó, do đó vòng for chạy tới n/2 sẽ bỏ qua số chính phương là 1.

Code C/C++:

int ktrasochinhphuong(int n){
	if(n==1)
		return 1;
    for(int i=1;i<=n/2;i++)
   		if(i*i==n)
   			return 1;
   	return 0;
   	
}

2.2 Hàm tính giá trị trung bình các số chính phương có trong mảng một chiều

Hàm tính giá trị trung bình cần 3 biến: một biến tổng, một biến đếm, và một biến là giá trị trung bình

Thuật toán của mình là: Khi duyệt mảng a, nếu thấy phẩn tử nào thỏa mãn điều kiện là số chính phương (sử dụng hàm kiểm tra số chính phương bên trên để kiểm tra) thì tiến hành tăng biến đếm, cộng thêm giá trị vào biến tổng.

Cuối cùng gán biến giá trị trung bình = tổng/đếm

Nếu đếm = 0, tức là không có giá trị nào trong mảng là số chính phương, return 0.

Code C/C++:

float tinhtb(int a[], int n){
	float tb, tong=0;
	int dem=0;
	for(int i=0;i<n;i++){
		if(ktrasochinhphuong(a[i])){
			tong=tong+a[i];
			dem++;
		}
	}
	
	if(dem==0)
		return 0;
	else
		{
			tb=tong/dem;
			return tb;
		}
}

2.3 Chương trình hoàn chỉnh

Ta lắp thêm phần hàm main, hàm nhập xuất mảng là có chương trình thỏa mãn yêu cầu của để bài rồi.

Xem code nhập xuất mảng

Code C:

#include<stdio.h>
void nhap(int a[], int &n){
	do{
		printf("Nhap n: ");
		scanf("%d",&n);
	}
	while(n<2||n>99);
	
	for(int i=0; i<n; i++){
		printf("a[%d]: ",i);
		scanf("%d",&a[i]);
	}
}

void xuat(int a[], int n){
	printf("Mang vua nhap la: \n");
	for(int i=0;i<n;i++){
		printf("%5d",a[i]);
	}
}

int ktrasochinhphuong(int n){
	if(n==1)
		return 1;
    for(int i=1;i<=n/2;i++)
   		if(i*i==n)
   			return 1;
   	return 0;
   	
}

float tinhtb(int a[], int n){
	float tb, tong=0;
	int dem=0;
	for(int i=0;i<n;i++){
		if(ktrasochinhphuong(a[i])){
			tong=tong+a[i];
			dem++;
		}
	}
	
	if(dem==0)
		return 0;
	else
		{
			tb=tong/dem;
			return tb;
		}
}
int main(){
	int a[100];
	int n;
	nhap(a,n);
	xuat(a,n);
	printf("\nGia tri trung binh la: %0.2f",tinhtb(a,n));	
	return 0;
}

Code C++ cho bạn nào tham khảo:

#include<bits/stdc++.h>
using namespace std;
void nhap(int a[], int &n){
	do{
		cout<<("Nhap n: ");
		cin>>n;
	}
	while(n<2||n>99);
	for(int i=0; i<n; i++){
		cout<<"a["<<i<<"]: ";
		cin>>a[i];
	}
}

void xuat(int a[], int n){
	cout<<"Mang vua nhap la:\n";
	for(int i=0;i<n;i++){
		cout<<"  "<<a[i];
	}
}

int ktrasochinhphuong(int n){
	if(n==1)
		return 1;
    for(int i=1;i<=n/2;i++)
   		if(i*i==n)
   			return 1;
   	return 0;
   	
}


float tinhtb(int a[], int n){
	float tb, tong=0;
	int dem=0;
	for(int i=0;i<n;i++){
		if(ktrasochinhphuong(a[i])){
			tong=tong+a[i];
			dem++;
		}
	}
	
	if(dem==0)
		return 0;
	else
		{
			tb=tong/dem; 
			return tb;
		}
}
int main(){
	int a[100];
	int n;
	nhap(a,n);
	xuat(a,n);
	cout<<"\nGia tri trung binh la: "<<setprecision(2)<<fixed<<tinhtb(a,n);	
	return 0;
}

Khi chạy chương trình trên sẽ cho kết quả như sau:

ham tinh gia tri trung binh cac so chinh phuong trong mang c 2

Trong ví dụ trên, có các số chính phương là: 1, 4, 9 có tổng là 14
14/3 làm tròn đến phần thập phân thứ 2 là 4.67

ham tinh gia tri trung binh cac so chinh phuong trong mang c 3

Một ví dụ khác khi nhập vào mảng không có số chính phương nào:

ham tinh gia tri trung binh cac so chinh phuong trong mang c 4

Bài viết cùa mình đến đây là hết, cảm ơn bạn đã quan tâm bài viết, đừng bỏ lỡ những bài tiếp theo nhé!

Xem tiếp bài 7: Hàm tính giá trị trung bình số chẵn và chia hết cho 3

Xem lại bải 5: Hàm tính giá trị trung bình số hoàn hảo trong C/C++

Tải về đề cương nhập môn lập trình

Trong quá trình tham khảo bài viết, làm bài tập. Bạn đọc có bất kì thắc mắc, ý kiến nào đừng ngại comment xuống dưới bài viết đề mình hỗ trợ nhé!

Rất mong nhận được ý kiến đánh giá của bạn đọc để bài viết của mình được hoàn thiện hơn!

LEAVE A REPLY

Please enter your comment!
Please enter your name here