學習筆記《計算機程序設計C++》第七週基礎練習

第7周基礎練習

依照學術誠信條款,我保證此作業是本人獨立完成的。

溫馨提示:

1.本次作業屬於Online Judge題目,提交後由系統即時判分。

2.學生可以在作業截止時間之前不限次數提交答案,系統將取其中的最高分作爲最終成績。

1兩個數的排序(10分)
編寫函數,對輸入的兩個參數排序,即在主函數中輸入a,b兩個整數,調用函數,若a>b交換a,b的值,使得在主函數a<=b。在主函數中輸出a,b。主函數如下:

輸入:兩個整數,用空格隔開。

輸出:兩個整數,從小到大,用空格隔開。

【注意】使用指針實現,不能用全局變量。排序不是問題,關鍵是用指針。

樣例1輸入:

4 2

樣例1輸出:

2 4

時間限制:500ms內存限制:32000kb
C++

#include <iostream>
using namespace std;
void sort(int *a,int *b){
	if(*a>*b){
		int tmp=*a;
		*a=*b;
		*b=tmp;
	}
}
int main() {
	int a,b;
	cin>>a>>b;
	sort(&a,&b);
	cout<<a<<" "<<b<<endl;
	return 0;
}

用例測試結果 運行時間 佔用內存 提示 得分
用例1通過 2ms 356kb
3
用例2通過 2ms 364kb
3
用例3通過 2ms 364kb
2
用例4通過 2ms 256kb
2
提交答案本次得分/總分:10.00/10.00分
2三個數的排序(10分)
編寫函數,對輸入的三個參數a,b,c排序,使得a<=b<=c。在主函數中輸入a,b,c;調用函數排序,在主函數中輸出a,b,c.排序使得主函數中的a,b,c滿足a<=b<=c。主函數如下:

輸入:三個整數,用空格隔開。

輸出:三個整數,從小到大,用空格隔開。

【注意】使用指針實現,不能用全局變量。可以使用前一題的兩個數的排序函數。

樣例1輸入:

3 2 1

樣例1輸出:

1 2 3

時間限制:500ms內存限制:32000kb
C++

#include <iostream>
using namespace std;
void sort(int *a,int *b){
	if(*a>*b){
		int tmp=*a;
		*a=*b;
		*b=tmp;
	}
}
void sort_3(int *a,int *b,int *c){
	sort(a,b);
	sort(a,c);
	sort(b,c);
}
int main() {
	int c,a,b;
	cin>>a>>b>>c;
	sort_3(&a,&b,&c);
	cout<<a<<" "<<b<<" "<<c;
	return 0;
}

用例測試結果 運行時間 佔用內存 提示 得分
用例1通過 2ms 356kb
2
用例2通過 19ms 376kb
2
用例3通過 3ms 364kb
2
用例4通過 2ms 360kb
2
用例5通過 2ms 364kb
2
提交答案本次得分/總分:10.00/10.00分
3返回數組的統計值(最大、最小、平均值、標準差)(10分)
編寫函數,“返回”,數組元素的最大值、最小值、平均值和標準差,函數的格式如下:

void statistics(double a[],int n,doube *max,double *min,double *avg,double *stdev);

編寫主函數,輸入以-9999爲結束標誌的一些列數據,調用函數計算其最大、最小、平均值和標準差,在主函數中依次輸出。

標準差的計算公式:

輸入:若干實數,空格隔開,以-9999爲結束標誌

輸出:最大、最小、平均值和標準差,空格隔開。

【注意】使用指針實現,在主函數中輸出,不能用全局變量。

樣例1輸入:

6 8 8 8 10 -9999

樣例1輸出:

10 6 8 1.26491

時間限制:500ms內存限制:32000kb
C++

#include <iostream>
#include<cmath>
using namespace std;
void statistics(double a[],int n,double *max,double *min,double *avg,double *stdev){
	*max=*min=a[0];double sum=0;
	for(int i=0;i<n;++i){
		sum+=a[i];
		if(a[i]>*max)*max=a[i];
		if(a[i]<*min)*min=a[i];
	}
	*avg=sum/n;
	double tmp=0;
	for(int i=0;i<n;++i)
		tmp+=(a[i]-*avg)*(a[i]-*avg);
	*stdev=sqrt(tmp/n);
}
int main() {
	int n=0;
	double a[888]={0},max,min,avg,stdev;
	do{
		cin>>a[n];
	}while(a[n++]!=-9999);
	statistics(a,n-1,&max,&min,&avg,&stdev);
	cout<<max<<" "<<min<<" "<<avg<<" "<<stdev;
	return 0;
}

用例測試結果 運行時間 佔用內存 提示 得分
用例1通過 2ms 356kb
3
用例2通過 2ms 256kb
3
用例3通過 2ms 360kb
2
用例4通過 2ms 356kb
2
提交答案本次得分/總分:10.00/10.00分
4通過指向函數的指針調用函數(10分)
(1)編寫自定義函數y=x^2,即x的平方,自變量和函數值均爲double。

(2)編寫自定義函數y=2sin(23.142x+3.14)

設第1個函數的名字爲x2,第2個函數的名字爲mysin。編寫主函數,輸入自變量x ,通過指向函數的指針調用它們求函數值。主函數如下:

輸入:一個實數

輸出:兩個函數值,用空格隔開。

【提示】本題只要定義兩個函數x2和mysin,主函數照抄(但應理解)。sin(x)調用庫函數,須包含。

樣例1輸入:

1

樣例1輸出:

1 0.0159264

時間限制:500ms內存限制:32000kb
C++

#include <iostream>
#include<cmath>
using namespace std;
double x2(double x){
	return x*x;
}
double mysin(double x){
	return 2*sin(2*3.14*2*x+3.14);
}
int main() {
	double (*f)(double);
	double x;
	cin>>x;
	f=x2;
	cout<<f(x)<<" ";
	f=mysin;
	cout<<f(x)<<endl;
	return 0;
}

用例測試結果 運行時間 佔用內存 提示 得分
用例1通過 3ms 240kb
3
用例2通過 3ms 256kb
3
用例3通過 2ms 256kb
2
用例4通過 2ms 368kb
2
提交答案本次得分/總分:10.00/10.00分
5計算任意一元函數值的通用函數(10分)
(1)編寫函數,可以計算任意一元函數的值,格式如下:

double anyfun(double (*f)(double),double x);

其中f是指向函數的指針,x是自變量。函數anyfun中只要返回f(x)即可。

(2)編寫自定義函數計算y=x^2,即x的平方,自變量和函數值均爲double,函數名x2。

(3)編寫自定義函數計算y=2sin(23.142x+3.14),函數名爲mysin。

編寫主函數,輸入自變量x ,通過anyfun計算x2和mysin在x的函數值,主函數如下:

輸入:一個實數

輸出:兩個函數值,用空格隔開。

【提示】sin(x)調用庫函數,須包含。

【注意】本題與上題具有相同的計算結果,但調用函數的方式是不同的,這纔是關鍵!!

樣例1輸入:

1

樣例1輸出:

1 0.0159264

時間限制:500ms內存限制:32000kb
C++

#include <iostream>
#include<cmath>
using namespace std;
double x2(double x){
	return x*x;
}
double mysin(double x){
	return 2*sin(2*3.14*2*x+3.14);
}
double  anyfun(double (*f)(double),double x){
	return f(x);
}
int main() {
	double (*f)(double);
	double x;
	cin>>x;
	cout<<anyfun(x2,x)<<" ";
	cout<<anyfun(mysin,x)<<endl;
	return 0;
}

用例測試結果 運行時間 佔用內存 提示 得分
用例1通過 2ms 228kb
2
用例2通過 2ms 376kb
2
用例3通過 3ms 364kb
2
用例4通過 3ms 228kb
2
用例5通過 2ms 360kb
2
提交答案本次得分/總分:10.00/10.00分
6計算函數在指定區間的近似平均值(10分)
設函數爲f(x), 區間[a,b],本題中,函數f(x)在區間[a,b]的近似平均值定義爲

avg=(f(a)+f(a+h)+f(a+2h)+…+f(b))/(n+1)

其中n=1000, h=(b-a)/n;

編寫函數,計算函數在[a,b]區間上的平均值,函數通過指向函數的指針爲擦參數傳入,函數的格式爲:

double funavg(double (*f)(double x), double a,double b,int n);

編寫主函數,輸區間端點a,b,計算函數exp(x),sin(x),cos(x),[a,b]上的近似平均值。n取固定值1000。

輸入:實數a,b,用空格隔開。

輸出:三個函數在區間[a,b]上的近似平均值。用空格隔開。

【提示】exp(x),sin(x),cos(x)爲數學庫函數,須包含頭文件

樣例1輸入:

0 1

樣例1輸出:

1.71842 0.459659 0.8414

時間限制:500ms內存限制:32000kb
C++

#include <iostream>
#include <cmath>
using namespace std;
double funavg(double(*f)(double x), double a, double b,double n);
int main(){
	double a, b;
	cin >> a >> b;
	cout << funavg(exp, a, b, 1000.00) <<" "<< funavg(sin, a, b, 1000.00) << " "<< funavg(cos, a, b, 1000.00000) << endl;
	return 0;
}
double funavg(double(*f)(double x), double a, double b, double n){
	double avg = 0,h=(b-a)/n;
	for (int i = 0; i <= n; ++i){
		avg += f(a + i*h);
	}
	return avg / (n + 1);
}

用例測試結果 運行時間 佔用內存 提示 得分
用例1通過 2ms 380kb
3
用例2通過 3ms 368kb
3
用例3通過 3ms 372kb
2
用例4通過 3ms 368kb
2
提交答案本次得分/總分:10.00/10.00分

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章