学习笔记《计算机程序设计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 
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
提交答案

你可能感兴趣的:(C++学习笔记)