学习笔记《计算机程序设计C++》第8周中级练习

这篇学习笔记介绍了使用C++解决四个编程问题:将十进制IP地址转换为二进制,反之亦然,从字符串中查找并加9输出数值,以及使用指针实现矩阵相加和相乘。所有程序都通过了测试用例并达到了时间与内存限制的要求。
摘要由CSDN通过智能技术生成

第8周中级练习
本周作业应使用指针和函数实现,也可动态申请空间。

依照学术诚信条款,我保证此作业是本人独立完成的。

温馨提示:

1.本次作业属于Online Judge题目,提交后由系统即时判分。

2.学生可以在作业截止时间之前不限次数提交答案,系统将取其中的最高分作为最终成绩。

1IP地址转换1(10分)
题目内容:

编写程序,将十进制IP地址转换为二进制IP地址。

例如输入:202.117.0.20,输出:11001010011101010000000000010100

输入格式:

字符串形式的十进制点分IP地址。

输出格式:

字符串表示的32位二进制IP地址

输入样例:

202.117.0.20

输出样例:

11001010011101010000000000010100

时间限制:500ms内存限制:32000kb
C++

#include<iostream>
using namespace std;
void intput(int *a) {
	for (int i = 0;i < 4;++i) {
		cin >> a[i];
		cin.get();// != '.') || ((i == 3 && a[i] < 1) || a[i] < 0 || a[i]>255)) 	
	//		return 1;
	}
//	return 0;
}
void coutip32(int *a) {
	for (int i = 0;i < 4;++i) 
		for (int j = 7;j >= 0;--j) 
			cout << (a[i] >> j & 1);
}
int main(){
	int a[4];
	intput(a);
	coutip32(a);
	return 0;
}

用例测试结果 运行时间 占用内存 提示 得分
用例1通过 2ms 256kb
2
用例2通过 3ms 360kb
2
用例3通过 3ms 360kb
2
用例4通过 2ms 256kb
2
用例5通过 2ms 360kb
2
提交答案本次得分/总分:10.00/10.00分
2IP地址转换2(10分)
题目内容:

编写程序,将32位二进制IP地址转换为十进制点分IP地址。

例如输入:11001010011101010000000000010100,输出202.117.0.20

输入格式:

字符串表示的32位二进制IP地址

输出格式:

字符串形式的十进制点分IP地址。

输入样例:

11001010011101010000000000010100

输出样例:

202.117.0.20

时间限制:500ms内存限制:32000kb
C++

#include<iostream>
#include<cmath>
using namespace std;
void coutip32(char *a) {
	int n=0,k=0;
	for (int i = 0;i <4;++i) {
		for (int j = 7;j >=0;--j,++k) {
			if(a[k]=='1') n+=pow(2,j);
		}
		 cout<<n;
		if(i<3)	cout <<".";
		n=0;
	}
}
int main(){
	char a[33]={"11001010011101010000000000010100"};
	cin>>a;
	coutip32(a);
	return 0;
}

用例测试结果 运行时间 占用内存 提示 得分
用例1通过 3ms 360kb
2
用例2通过 2ms 372kb
2
用例3通过 2ms 376kb
2
用例4通过 3ms 360kb
2
用例5通过 3ms 360kb
2
提交答案本次得分/总分:10.00/10.00分
3找数据(10分)
题目内容:

编写程序,找出一个字符串中的所有数据然后加9输出(实数或整数)。

例如,China Daily | Updated: 2020-04-10 08:5.9,

输出:

2029

5

-1

17

14.9

单个正号或负号不算数据,但+0,-0都是数据。字符串总长度不超过200.

输入格式:

一个带空格的字符串。

输出格式:

若干行数据。

输入样例:

China Daily | Updated: 2020-04-10 08:5.9

输出样例:

2029

5

-1

17

14.9

时间限制:500ms内存限制:32000kb
C++

#include<iostream>
#include<cmath>
using namespace std;
int main() {
	char a[110] = { "China Daily | Updated: 2020-04-10 08:5.9," };
	cin.getline(a, 100);
	int bl = 0, fh = 1, i = 0, j = 1;
	double suz = 0;
	for (;;) {
		if (a[i] == '-' ) {
			fh = -1;++i;
		}
		while (a[i] >= '0'&&a[i] <= '9') {
			bl = 1;
			suz = 10 * suz + a[i] - '0';
			i++;
		}
		if (a[i] == '.') {
			int t = 1;
			i++;bl = 1;
			while (a[i] >= '0'&&a[i] <= '9') {
				suz += (a[i] - '0') / pow(10, t++);
				i++;
			}
		}
		if (bl)cout<<suz*fh+9<< endl;
		fh = 1;bl = 0;suz = 0;
		if (a[i] == '.' || a[i] == '-')continue;
		if (a[i++] == '\0')break;
	}
	return 0;
}

用例测试结果 运行时间 占用内存 提示 得分
用例1通过 25ms 372kb
2
用例2通过 3ms 368kb
2
用例3通过 18ms 368kb
2
用例4通过 3ms 368kb
2
用例5通过 19ms 368kb
2
提交答案本次得分/总分:10.00/10.00分
4指针实现矩阵相加(10分)
题目内容:

编写函数,使用指针传递和指针运算,实现两个矩阵的和。

编写主程序,输入两个矩阵,调用函数求和,在主函数中输出计算结果。每个矩阵的元素总个数不超过100,但行数、列数不定。矩阵元素为整数。

输入格式:

先输入两个整数,表示矩阵的行数和列数,然后分别依次按行输入两个矩阵的元素。

输出格式:

两个矩阵的和,按行、列显示,用一个空格隔开,每行末尾无空格。

输入样例:

2 4

1 2 3 4

5 6 7 8

1 2 3 4

5 6 7 8

输出样例:

2 4 6 8

10 12 14 16

时间限制:500ms内存限制:32000kb
C++

#include<iostream>
using namespace std;
int main(){
    int n,m;
	cin>>n>>m;
	int *a=new int[n*m],*b=new int[n*m],*ap=a,*bp=b;
	for(;ap<a+m*n;ap++) cin>>*ap;
	int i=1;
	for(;bp<b+m*n;bp++,a++,i++){
		cin>>*bp;
		cout<<*bp+*a;
		if(i%m)cout<<" ";
		else cout<<endl;
	}
	return 0;
}

用例测试结果 运行时间 占用内存 提示 得分
用例1通过 3ms 356kb
2
用例2通过 3ms 360kb
2
用例3通过 3ms 364kb
2
用例4通过 3ms 360kb
2
用例5通过 3ms 364kb
2
提交答案本次得分/总分:10.00/10.00分
5指针实现矩阵相乘(10分)
题目内容:

编写函数,使用指针传递和指针运算,实现两个矩阵的乘积。

编写主程序,输入两个矩阵,调用函数计算它们的乘积,在主函数中输出计算结果。每个矩阵的元素总个数不超过100,但行数、列数不定。矩阵元素为整数。

输入格式:

先输入两个整数,表示矩阵的行数和列数,然后按行输入第一个矩阵的元素。

再输入两个整数,表示第二个矩阵的行数和列数,然后按行输入第二个矩阵的元素。

输入保证第一个矩阵的列数和第二个矩阵的行数相等。

输出格式:

两个矩阵的乘积,按行、列显示,每行末尾无空格。

输入样例:

2 3

1 1 0

2 1 1

3 2

1 2

2 1

1 0

输出样例:

3 3

5 5

时间限制:500ms内存限制:32000kb
C++

#include <iostream>
using namespace std;
int main(){
	int m,n,p,q;
	cin >> m >> n;
	int *a=new int[m*n],*ap=a;
	for(;ap<a+m*n; ++ap)
		cin >> *ap;
	cin >> p >> q;
	int *b=new int[p*q],*bp=b;
	for(;bp<b+p*q; ++bp) 
		cin >> *bp;	
	int *c=new int(m*q);
	for(int i = 0; i < m; ++i) {
		for(int j = 0; j < q; ++j) {
			*(c+j+i*q) = 0;
			for(int k = 0; k < n; ++k)
			*(c+j+i*q) += *(a+i*n+k) *(*(b+j+q*k));
		}
	}
	for(int i = 0;i<m;++i){
		for(int j = 0; j < q; ++j) {
			cout << *(c+j+i*q);
			if(j<q-1)cout<< " ";	
		}
		cout << endl;
	}
return 0;
}

用例测试结果 运行时间 占用内存 提示 得分
用例1通过 2ms 256kb
2
用例2通过 2ms 372kb
2
用例3通过 3ms 256kb
2
用例4通过 2ms 256kb
2
用例5通过 2ms 480kb
2
提交答案本次得分/总分:10.00/10.00分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值