PDA

View Full Version : Một số bài tập về hàm và mảng


hoangthienthach
04-06-2008, 07:45 PM
/* Bai tap:
1; Viết nhập, xuất các số nguyên tố gồm n phần tử .
2; Viết hàm tính tổng các phần tử trong mảng
3;Viết hàm tính tổng các phần tử chẵn trong mảng.
4; Viet tong cac phần tử lẻ trong mang
5; Xuất ra số nguyên tố
6; Tinh tong cac so nguyen to trong mang */

Ví dụ:
Nhập a[4]
a[0]=1
a[1]=2
a[2]=5
a[3]=7
S= 1 +2+5 +7 = 15
Tổng chẵn = 2
Tổng lẻ = 13
Số nguyên tố là số chia hết cho chính nó và chia hết cho 1;
a[4] không phải là số nguyên tố
Trong mảng đó có 2 .......... 5....................... 7 là số nguyên tố
Tổng của số nguyên tố : 2 + 5 + 7 = 14

#include<stdio.h>
#include<conio.h>
#define MAXSIZE 100
void nhap(int a[], int &n);
void xuat (int a[], int n);
int tong(int a[], int n);
int tongchan(int a[],int n);
int tongle(int a[], int n);
void xuatSNT(int a[], int n);
int KTSNT(int n);
int tongSNT(int a[],int n);
void main()
{
clrscr();
int n,a[MAXSIZE];
nhap(a,n);
xuat(a,n);
printf("\n Tong gia tri trong mang:%d", tong(a,n));
printf("\n Tong gia tri cac phan tu chan trong mang:%d", tongchan(a,n));
printf("\n Tong gia tri cac phan tu le trong mang:%d", tongle(a,n));
int nt=KTSNT(n);
if(nt==1)
printf("\n%d la so nguyen to",n);
else
printf("\n%d Khong la so nguyen to",n);
xuatSNT(a,n);
printf("\n Tong cac so nguyen to trong mang :%d", tongSNT(a,n));
getch();
}
void nhap(int a[], int &n)
{
printf("\n Nhap so phan tu mang:");
scanf("%d",&n);
for (int i=0;i<n;i++)
{
printf("\n a[%d]=",i);
scanf("%4d",&a[i]);
}
}
void xuat (int a[], int n)
{
for (int i=0;i<n;i++)
printf("%d",a[i]);
}
int tong(int a[], int n)
{
int S=0;
for(int i=0;i<n;i++)
S=S+a[i];
return S;
}
int tongchan(int a[],int n)
{
int S=0;
for(int i=0;i<n;i++)
if(a[i]%2==0)
S=S+a[i];
return S;
}
int tongle(int a[], int n )
{
int S=0;
for(int i=0;i<n;i++)
if(a[i]%2!=0)
S=S+a[i];
return S;
}
int KTSNT( int n)
{
int d=0;
if(n<=1)
return 0;
int i=1;
while (i<=n)
{
if(n%i==0)
d++;
i++;
}
if (d==2)
return 1;
else
return 0;
}
void xuatSNT(int a[], int n)
{
printf("\nCac so nguyen to trong mang la:");
for(int i=1;i<=n;i++)
if (KTSNT (a[i])==1)
printf("%4d",a[i]);
}
int tongSNT(int a[],int n)
{
int S=0;
int i;
for (i=0;i<n;i++)
if(KTSNT (a[i])==1 )
S=S+a[i];
return S;
}
:118:

hoangthienthach
04-06-2008, 08:11 PM
Liệt kê các vị trị bằng giá trị âm đầu
yêu cầu: hảy liệt kê các vị trí trong mảng một chiều các số thực mà giá trị đó bằng giá trị âm đầu tiên trong mảng
#include <stdio.h>
#include <conio.h>
float AmDau(float a[],int n)
{
for(int i=0;i<n;i++)
if(a[i]<0)
return a[i];
return 1;
}
void LKViTri(float a[],int n)
{
for(int i=0;i<n;i++)
if(a[i]==AmDau(a,n))
printf("%3d",i);
}
void main()
{
int n;
float a[100];
printf("Nhap so phan tu mang: ");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("Nhap a[%d]: ",i);
scanf("%f",&a[i]);
}
LKViTri(a,n);
}

hoangthienthach
05-06-2008, 09:23 AM
Tìm max, min của một dẫy số:
Ví dụ : nhập:
1 3 5 7 2 9 3 5 Xuất ra số lớn nhất trong dãy là : 9
Xuất ra số nhỏ nhất trong dãy là : 1
#include<stdio.h>
#include<conio.h>
#define MAXSIZE 100
void nhapmang(int a[], int &n);
void xuatmang(int a[],int n);
int timmax(int a[], int n);
int timmin(int a[], int n);
void main()
{
int n, x[MAXSIZE];
nhapmang(x,n);
xuatmang(x,n);
printf("\nGia tri lon nhat trong mang:%d",timmax(x,n));
printf("\nGia tri nho nhat trong mang la:%d", timmin(x,n));
getch();
}
void nhapmang(int a[], int &n)
{
printf("\nNhap so phan tu mang:");
scanf("%d",&n);
for (int i=0;i<n;i++)
{
printf("\n a[%d]=",i);
scanf("%d",&a[i]);
}
}
void xuatmang(int a[],int n)
{
for(int i=0;i<n;i++)
{
printf(" %d",a[i]);
}
}
int timmax (int a[], int n)
{

int max=a[0];
for (int i=0;i<n;i++)
{
if(max < a[i])
max=a[i] ;
}
return max ;

}
int timmin(int a[],int n)
{
int min=a[0];

for (int i=0;i<n;i++)
{
if (min > a[i] )
min=a[i];
}
return min;

}






Chúc các bạn thành công

hoangthienthach
05-06-2008, 09:51 AM
1.Chuyển các bài toán đã làm thành hàm:
a.1 + 2+ 3+ ...+ n
b.1+2/(1*2)+ 3 / (1*2*3) +...+ n/n!
c.1 - 2 + 3 - 4 +...+ - (n)
d. x mũ y
#include<stdio.h>
#include<conio.h>
#include<math.h>
int tonga(int n)
{
int s=0;
for (int i=1;i<=n;i++)
s=s+i;
return s;
}
float tongb(int n)
{
float s=0;
int tich=1;
for(int i=1;i<=n;i++)
{
tich=tich*i;
s=s+((i*1.0)/tich);
}
return s;
}
int tongc(int n)
{
int s=0,dau=1;
for(int i=1;i<=n;i++)
{
s=s+(i*dau);
dau=dau*(-1);
}
return s;


}
int caud(int x)
{
int y,s=0;
printf("\n Nhap mu y");
scanf("%d",&y);
s=pow(x,y);
return s;
}
void nhap(int &n)
{
printf("\n nhap x =");
scanf("%d",&n);
}

void main()
{
clrscr();
int m;
nhap(m);
int kq;
kq = tonga(m);
printf("\n tonga la %d",kq);
float b;
b=tongb(m);
printf("\n tongb la %f",b);
int c;
c=tongc(m);
printf("\n tongc la %d",c);
int d;
d=caud(m);
printf("\n Caud la %d",d);
getch();

}

hoangthienthach
05-06-2008, 08:14 PM
Nhập vào mảng số nguyên 1 chiều và sắp xếp mảng theo chiều tăng dần. Nếu có số trùng nhau thì xóa đi và chỉ giữ lại 1 số


#include <stdio.h>
void XapMangTang(int a[],int n)
{
int temp;
for ( int i=0;i<n;i++)
{
for(int j=i;j<n;j++)
if(a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
printf(" %d",a[i]);
}
}
void xoaPhanTuMang(int a[],int &n,int index)
{
for(int i = index;i<n-1;i++)
{
a[i] = a[i+1];
}
n = n - 1;
}
void xoaPhanTuTrungNhau(int a[], int n)
{
for(int i=1;i<n;i++)
if(a[i]==a[i-1])
xoaPhanTuMang(a,n,i);
for(int k=0;k<n;k++)
printf(" %d",a[k]);
}
void main()
{
int a[100],n,phu[100];
printf("Moi ban nhap so phan tu cua mang: ");
scanf("%d",&n); for(int i=0;i<n;i++)
{
printf("Nhap a[%d]: ",i);
scanf("%d",&a[i]);
}
XapMangTang(a,n);
xoaPhanTuTrungNhau(a,n);
}

hoangthienthach
11-06-2008, 07:21 PM
/* Bai tap nhu sau
1: Viet ham nhap, xuat mang so thuc voi n phan tu.
2: Viet ham kiem tra so chinh phuong : Vd 9,16,25,36.
3: Viet ham dem trong mang co bao nhieu so chinh phuong.
4: Viet ham xuat cac so chinh phuong trong mang.
5: Sap xep mang theo thu tu tang dan.
6: Sap xep mang theo thu tu giam dan.
7: Nhap vao x. Tim kiem xem x co trong mang khong.
Neu co tra ve vi tri x. Nguoc lai tra ve -1 */

#include<stdio.h>
#include<conio.h>
#include<math.h>
#define MAXSIZE 100
void nhapmang(int a[],int &n);
void xuatmang(int a[],int n);
void xeptd(int a[], int n);
void xepgd(int a[], int n);
int DEMSCP(int a[], int n);
void xuatscp(int a[], int n);
int KTSCP(int n);
int timkiem(int a[],int n, int x);
void xuatsoCP(int a[],int n);
void main ()
{
clrscr();
int n,S, a[MAXSIZE];
nhapmang(a,n);
printf("\nMang truoc khi sap xep:");
xuatmang(a,n);
xeptd(a,n);
printf("\nMang sap xep theo thu tu tang dan:");
xuatmang(a,n);
xepgd(a,n);
printf("\nMang sap xep theo thu tu giam dan:");
xuatmang(a,n);
int x,vt;
printf("\nNhap x de thu:");
scanf("%d",&x);
vt=timkiem(a,n,x);
if (vt == -1)
printf("\nMang khong chua x");
else
printf("\nMang chua x tai %d",vt);
S= DEMSCP(a,n);
printf("\n Cac so chinh phuong la:%d",S);
xuatsoCP(a,n);
getch();
}
void nhapmang(int a[], int &n)
{
printf("\nNhap so phan tu:");
scanf("%d",&n);
for (int i=0;i <n;i++)
{
printf("\n a[%d]=",i);
scanf("%d",&a[i]);
}
}
void xuatmang(int a[],int n)
{
for(int i=0;i<n;i++)
printf("\t %d",a[i]);
}
void xuatsoCP(int a[],int n)
{
printf("\n Liet ket cac so chinh phuong: ");
for(int i=0;i<n;i++)
if(KTSCP(a[i])==1)
printf("%d ",a[i]);
}
void xeptd(int a[], int n)
{
int i,j;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if ( a[i] > a[j])
{
int tam= a[i];
a[i] = a[j];
a[j]= tam;
}
}
void xepgd(int a[], int n)
{
int i,j;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if ( a[i] < a[j])
{
int tam= a[i];
a[i] = a[j];
a[j]= tam;
}
}
int timkiem(int a[], int n, int x)
{
for(int i=0;i<n;i++)
if (a[i] == x)
return i;
return -1;
}
int KTSCP(int n)
{
if(n<=0)
return 0;
int i=1;
while (i<n)
{
if(i*i==n)
return 1;
i++;
}
return 0;
}
int DEMSCP(int a[], int n)
{
int S=0;
for(int i=0;i<n;i++)
if (KTSCP(a[i]) ==1)
S++;
return S;
}

babycutetn
13-10-2008, 11:35 PM
help bài này nhá
Nhập vào một mảng n>=4 và n<=50;
tính TBC các phần tử mảng
Nhập vào một số X kiểm tra X có trong mảng hay không?
In ra tất cả các số chia hết cho 2 và 3
In ra tất cả các số nguyên tố
--------------- số hoàn hảo
--------------- số chính phương
thank :D

hoangthienthach
14-10-2008, 01:21 AM
Mình chỉ đưa ra thuật toán bạn tự làm nha:
Câu 1: Nhập xuất hàm 1 chiều thì dễ rồi:
void nhap(int a[Max],int &n)
{

do{cout <<"Nhap n";
cin >>n;while(n<=4||n>=50);
for(int i=0;i<n;i++)

{
cin>>a[i];
}

}
void xuat(int a[Max],int n)
{
cout<<"Cac Phan tu cua ma tran"<<"\t";
for(int i=0;i<n;i++)

{
cout<<a[i]<<"\t";
cout<<endl;
}

}câu 2:Tính trung bình cộng là bạn tính tổng của cả mảng đó và chia cho n phần tử
int tbc(int a[],int n)
{
int S=0;
for(int i=0;i<n;i++)
{
S=S+a[i];
}
S=S/n;
cout <<S;
return float(S);
}Câu 3: Nhập 1 số x và tìm kiếm trong mảng có trong mảng hay không
int timkiem(int a[], int n, int x)
{
cout<<"Nhap x"
cin>>x;
for(int i=0;i<n;i++)
if (a[i] == x)
return i;
return -1;Câu 4:Bạn dùng điều kiện:

if(a[i]%2==0||a[i]%3==0);

Câu 5 In ra tất cả số nguyên tố
- Các số nguyên tố là số chia hết cho 1 và chính nó.
Câu 6:Số hoàn hảo: là số có tổng các ước số bằng chính no.
Ví du 6=1+2+3=1*2*3
Câu 7:In ra tất cả các số chính phương
Trước tiên ta dùng hàm kiểm tra số chính phương có 2 cách
Cách 1:

int KTSCP(int n)
{
if(n<=0)
return 0;
int i=1;
while (i<n)
{
if(i*i==n)
return 1;
i++;
}
return 0;
}

Cách 2:

int KTCP(int n)
{
return sqrt(n)==int (sqrt(n));
}
Sau đó ta dùng hàm xuất số chính phương

void xuatsoCP(int a[],int n)
{
cout <<"Liet ket cac so chinh phuong: ";
for(int i=0;i<n;i++)
if(KTSCP(a[i])==1)
cout<<a[i];
}Đây là một ngợi ý dành cho các bạn. Bạn hãy vận dụng để làm hoàn chỉnh bài tập này nha. Chúc bạn thành công:khi123:

linhnguyenit
14-10-2008, 12:34 PM
int KTSNT( int n)
{
int d=0;
if(n<=1)
return 0;
int i=1;
while (i<=n)
{
if(n%i==0)
d++;
i++;
}

Em có 1 kiến thức khá vững về lập trình rồi đó. Nhưng cần cải tiến code tốt hơn.
Ví dụ anh đưa vào 1 số thôi chứ không phái mảng và anh lấy hàm KTSNT của em là ví dụ.
Anh yêu cầu kiểm tra cho anh số 456789 có phải số nguyên tố hay không?
Xét theo hàm của em thì nó sẽ phải chạy while suốt đến khi biến i >n
mà như thế sẽ rất tốn time khi kiểm tra 1 số lớn. Nhìn rõ định nghĩa SNT là gì? là số mà bản thân nó chỉ chia hết cho 1 và chính nó. vậy em có thể nghĩ 1 code khác hoàn chỉnh hơn cải thiện tốc độ và thời gian cho nó.
Đó lá kiểm tra 1 số thôi mà nó sẽ phải chạy lâu như thế từ i=1 đến khi i >
456789. Chứ anh chưa nói 1 mảng nhé....
Viết lại anh xem nào. Cố lên ^^:khi176:

babycutetn
14-10-2008, 08:41 PM
cái code KTSNT em thấy hơi có vấn đề
if(n%i==0)
d++;
i++;
nếu chỉ xét n chia hết cho i mà nhận n là số Nguyên tố rồi ah;
VD n= 6 6chia hết cho 6 nhưng vẫn chia hết cho 2 và 3 mà

BangChuCaiBang
14-10-2008, 09:12 PM
mình đặt 1 cờ hiệu hoặc lính canh. cho chạy từ đến căn bậc 2 của n. nếu n chia hết cho i thì break => ko phải số nguyên tố.

linhnguyenit
15-10-2008, 12:02 AM
cái code KTSNT em thấy hơi có vấn đề
if(n%i==0)
d++;
i++;
nếu chỉ xét n chia hết cho i mà nhận n là số Nguyên tố rồi ah;
VD n= 6 6chia hết cho 6 nhưng vẫn chia hết cho 2 và 3 mà
Code hàm đó dư 1 chút nhưng vẫn đúng
nó chỉ là hàm kiểm tra, em đọc phía dưới nữa:
if (d==2) có nghĩa là d chỉ chia hết cho 1 và chính nó thì return =1;
nhưng hàm này không chuẩn lắm ^^
Em suy nghĩ viết hàm nào linh động hơn 1 chút nào. Dựa theo định nghĩa Số NT á:khi123:

hoangthienthach
15-10-2008, 01:51 AM
Code hàm kiểm tra SNT của hoangthienthach.các bạn tham khảo nha

int KTSNT(int n)
{
for(int i=2;i<n;i++)
if(n%i==0)
return 0;
return 1;
}

khigiadano
15-10-2008, 02:00 AM
Tìm kiếm số nguyên tố trong 1 hàm duy nhất không cần return


void snt(int n)
{
int dem=0;
for(int i=2;i<n;i++)
{
if(n%i==0)
dem++;
}
if(dem=0)
Cout<<"\n So "<<n<<" la so nguyen to";
else
Cout<<"\n So "<<n<<" ko phai la so nguyen to";
}

java87
29-10-2008, 04:58 AM
Tớ làm thế này mà lại bảo lỗi.

//tim so chinh phuong cua phan tu mang
for(i=0;i<n;i++)
if(a[i]>0)
if(pow((int)sqrt(a[i]),2)==a[i])
printf("\n so chinh phuong :%d",a[i]);
// tim so nguyen to cua phan tu mang
for(i=0;i<n;i++)
if(a[i]>0){
for(k=2;k<sqrt(a[i]);k++)
if(a[i]%k==0)
break;
if(k>sqrt(a[i]))
printf("\n so nguyen to %d",a[i]);



Các bạn xem lại hộ mình nhé!

hoangthienthach
29-10-2008, 03:47 PM
Bãn sử dụng hàm KTCP và KTSNT của mình xem sao
Mình có code này bạn tham khảo nha

int KTCP(int n)
{
return sqrt(n) == int (sqrt (n))
}




int KTNT (int n)
{
for(int i=2;i<n;i++)
if(n%i ==0)
return 0;
return 1;
}

linhnguyenit
29-10-2008, 08:20 PM
Bãn sử dụng hàm KTCP và KTSNT của mình xem sao
Mình có code này bạn tham khảo nha

int KTCP(int n)
{
return sqrt(n) == int (sqrt (n))
}




int KTNT (int n)
{
for(int i=2;i<n;i++)
if(n%i ==0)
return 0;
return 1;
}

Trước tiên anh thấy hàm KTSNT của em bị sai
theo hàm em làm, nếu kiểm tra 1 số là 0 hay 1 thì sao?
hàm của em vẫn trả về 1, là SNT ~~> sai
Hàm kiểm tra số nguyên tố của em cần thêm vào là:

int KTNT (int n)
{
if (n==1 or n==0) ' chi tiết và đúng hơn các em viết if(n<=1)
return 0;
for(int i=2;i<n;i++)
if(n%i ==0)
return 0;
return 1;
}

Kiểm tra số CP cách khác sẽ trả về 1 giá trị, khi gọi nó sẽ đơn giản code hơn, tránh sai sót. Khi muốn kiểm tra các em viết
if(KT_SCP(a[i])==1)
int sochinhphuong(int n)
{
int a = (int)sqrt(n);
if (a*a == n)
{
return 1;
}
return 0;
}
Chúc các em học tốt:khi176: