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