學習筆記《計算機程序設計C++》第7週中級練習

第7週中級練習
本週作業一律用指針和函數完成。不同指針和函數,沒有意義。

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

溫馨提示:

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

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

1指針實現向量的內積計算(10分)
題目內容:

兩個向量a = [a1, a2,…, an]和b = [b1, b2,…, bn]的內積定義爲:

a·b=a1b1+a2b2+……+an*bn

編寫函數,使用指針實現兩個向量的內積的計算。要求函數中不出現下標運算。

編寫主函數,分別輸入兩個向量,均以-9999爲結束標誌,維數相同。調用函數計算內積,在主函數中輸出。向量爲實數向量,維數不超過100。

輸入格式:

兩行用空格隔開的實數,每行以-9999爲結束標誌。

輸出格式:

一個實數。

輸入樣例:

1 2 3 -9999

4 5 6 -9999

輸出樣例:

32

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

#include <iostream>
using namespace std; 
void sumj(double * a,double *b,double *c){
	*c=0;
	while(*a!=-9999 && *b!=-9999){
		*c+=*a**b;
		a++;++b;
	}
}
void inputa(double *a){
	cin>>*a;
	while(*a!=-9999){
		a++;
		cin>>*a;
	}	
}
int main() {
	double *a=new double[120],*b=new double[120],*sum=new double;
	double *a1=a,*a2=b;
	inputa(a);inputa(b);
	sumj(a1,a2,sum);
	cout<<*sum;
	return 0;
}

用例測試結果 運行時間 佔用內存 提示 得分
用例1通過 2ms 248kb
3
用例2通過 2ms 248kb
3
用例3通過 2ms 248kb
2
用例4通過 2ms 256kb
2
提交答案本次得分/總分:10.00/10.00分
2使用指針的插入排序(10分)
題目內容:

編寫函數,使用指針對一維整型數組進行插入排序。要求函數中不出現下標運算。

編寫主函數,輸入若干整數,以-9999爲結束標誌。調用函數排序,在主函數中輸出。元素總個數不超過100個。

輸入格式:

若干用空格隔開的整數,以-9999爲結束標誌。

輸出格式:

用空格隔開的從小到大排序的整數,用空格隔開,末尾無空格。

輸入樣例:

20 4 3 10 34 -9999

輸出樣例:

3 4 10 20 34

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

#include <iostream>
#include <cmath>
using namespace std; 
#define element_type int
#define MAXINT 0x7ffff
typedef struct linkednode // 結點類型
{ int data; // 值域
struct linkednode *next; // 鏈域
} snode, *ptr; // 結點類型名snode 和指針類型名ptr
ptr head,p,q; 
ptr creatlinkedBC( )
{ptr head, f,s,p; element_type x ;
 head=new snode;
 head->data=MAXINT; //MAX 公共監督元
 head->next=head; // 構造空鏈表
 scanf("%d", &x);
 while (x!=-9999)
 { p=new snode; p->data=x;
 f=head, s=f->next; // 置搜索指針初值
 while(s->data<x)f=s,s=s->next; // 有序搜索
 f->next=p, p->next=s;  // 有序插入
 scanf("%d", &x); // 讀入下一個元素
}
 return(head);}
void outa(ptr a){
	a=a->next;
	cout<<a->data;
	a=a->next;
	while(a){
		if(a->data==MAXINT)break;
		cout<<" "<<a->data;
		a=a->next;
	}
}
int main() {
	ptr a1=creatlinkedBC( );
	outa(a1);
	return 0;
}

用例測試結果 運行時間 佔用內存 提示 得分
用例1通過 3ms 256kb
2
用例2通過 2ms 372kb
2
用例3通過 2ms 256kb
2
用例4通過 3ms 256kb
2
用例5通過 2ms 236kb
2
提交答案本次得分/總分:10.00/10.00分
3指針實現成績排序(10分)
題目內容:

編寫函數,使用指針對學生成績單進行冒泡排序,從小到大。成績單的內容包括學號和成績,學號和成績都是整數,成績相同時學號小的在前。要求函數中不出現下標運算。

編寫主函數,輸入若干學生的學號和成績,以0 0 爲結束標誌。調用函數排序,在主函數中輸出。學生總人數不超過100個。

輸入格式:

若干行,每行是一個學生的學號和成績,用空格隔開。以最後一行是0 0 ,爲結束標誌。

輸出格式:

若干行,按成績從大到小排序的名單。每行是一個學生的學號和成績,用一個空格隔開。

輸入樣例:

1 81

2 62

3 67

0 0

輸出樣例:

2 62

3 67

1 81

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

#include <iostream>
#include <cmath>
using namespace std; 
#define element_type int
#define MAXINT 0x7ffff
typedef struct linkednode // 結點類型
{ int a00,data; // 值域
struct linkednode *next; // 鏈域
} snode, *ptr; // 結點類型名snode 和指針類型名ptr
ptr head,p,q; 
ptr creatlinkedBC( )
{ptr head, f,s,p; element_type x,y ;
 head=new snode;
 head->data=MAXINT;head->a00=MAXINT; //MAX 公共監督元
 head->next=head; // 構造空鏈表
 cin>>y>>x;
 while (x||y)
 { p=new snode; p->data=x,p->a00=y;
 f=head, s=f->next; // 置搜索指針初值
 while(s->data<x||s->data==x&&s->a00<y)f=s,s=s->next; // 有序搜索
 f->next=p, p->next=s;  // 有序插入
 cin>>y>>x;//scanf("%d%d", &y,&x); // 讀入下一個元素
}
 return(head);}
void outa(ptr a){
	a=a->next;
	while(a->a00!=MAXINT||a->data!=MAXINT){
		cout<<a->a00<<" "<<a->data<<endl;a=a->next;
}}
int main() {
	ptr a1=creatlinkedBC( );
	outa(a1);
	return 0;
}

用例測試結果 運行時間 佔用內存 提示 得分
用例1通過 3ms 372kb
2
用例2通過 3ms 368kb
2
用例3通過 3ms 372kb
2
用例4通過 15ms 368kb
2
用例5通過 2ms 368kb
2
提交答案本次得分/總分:10.00/10.00分
4計算函數在某點的近似導數(10分)
題目內容:

設函數在x的近似導數爲:

                                           ,其中δ=0.001

編寫計算函數在某點近似導數的通用函數。

編寫主函數,輸入自變量x的值,調用函數名,計算sin(x),cos(x),sin(x)+cos(x)在該點的近似導數。數據類型用double。

輸入格式:

一個實數

輸出格式:

三個實數,用空格隔開。

輸入樣例:

1.57

輸出樣例:

0.000796327 -1 -0.999203

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

#include <iostream>
#include<cmath>
using namespace std; 
double const o=0.001;
double arrl( double (*f)(double),double x){
	return (f(x+o)-f(x-o))/(2*o);
}
int main() {
	double x;
	cin>>x;
	cout<<arrl(sin,x)<<" ";
	cout<<arrl(cos,x)<<" ";
	cout<<arrl(sin,x)+arrl(cos,x);
	return 0;
}

用例測試結果 運行時間 佔用內存 提示 得分
用例1通過 2ms 372kb
2
用例2通過 2ms 368kb
2
用例3通過 3ms 372kb
2
用例4通過 3ms 368kb
2
用例5通過 3ms 368kb
1
用例6通過 2ms 360kb
1
提交答案本次得分/總分:10.00/10.00分
5計算函數在指定區間的近似積分(10分)
題目內容:

設函數在區間[a,b]的近似積分公式爲:

其中δ=(b-a)/n,n=100。

編寫計算函數在某區間近似積分的通用函數,積分計算使用上述公式。

編寫主函數,輸入積分區間a,b,調用函數,計算sin(x),cos(x),sin(x)+cos(x)在[a,b]的近似積分。數據類型用double。

輸入格式:

兩個實數,表示積分區間。

輸出格式:

三個實數,用空格隔開,表示三個函數在指定區間的積分近似值。

輸入樣例:

0 3.14

輸出樣例:

1.99981 0.0329925 2.0328

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

#include <iostream>
#include<cmath>
using namespace std; 
double const o=0.001;
double arrl( double (*f)(double),double a,double b){
	double sum=0;	
	for(double i=0;i<100;++i){
		sum+=f(a+i*b);
	}
	return b*sum;
}
int main() {
	double a,b,x,sn,cn;
	cin>>a>>b;
	b=(b-a)/100;
	sn=arrl(sin,a,b);
	cn=arrl(cos,a,b);
	cout<<sn<<" "<<cn<<" "<<sn+cn;
	return 0;
}

用例測試結果 運行時間 佔用內存 提示 得分
用例1通過 3ms 256kb
2
用例2通過 15ms 372kb
2
用例3通過 2ms 380kb
2
用例4通過 3ms 368kb
2
用例5通過 3ms 368kb
2
提交答案

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