第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
提交答案