第8周中级练习(dnewuibfe)

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

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

例如输入:202.117.0.20,输出:11001010011101010000000000010100

输入格式:

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

输出格式:

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

输入样例:

202.117.0.20

输出样例:

//IP地址转换十进制转换为二进制
#include<iostream>
#define N 2
using namespace std;
void  getnum(char s[], int a[])//s字符串中的数字存入数组a
{
	char* p = s;
	int* q = a;
	while (*p)//遍历字符串的字符
	{
		
		if (*p == '.')
		{
			p++;
			q++;
			continue;//遇到'.'则储存下一个数,且将'.'跳过
		}
		*q = (*p - '0') + *q * 10;
		p++;
	}

}
void output(int num)//十进制数字转换为二进制输出
{
	int a[8] = {0};//都要输出8位,不够也要输出0
	int i = 0;
	while (num)
	{
		a[i]=(num % N);
		num /= N;
		i++;
	}
	for (int j = 7; j >= 0; j--)//输出八位
		cout << a[j];
}
int main()
{
	char s[30];
	cin >> s;
	int a[5] = { 0 };//储存十进制数
	getnum(s, a);
	for (int i = 0; i < 4; i++)
		output(a[i]);
	return 0;
}

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

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

例如输入:11001010011101010000000000010100,输出202.117.0.20

输入格式:

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

输出格式:

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

输入样例:

11001010011101010000000000010100

输出样例:

202.117.0.20

//将32位二进制IP地址转换为十进制点分IP地址
#include<iostream>
using namespace std;
void getnum(char s[], int *p);//s中的八位二进制数转换为十进制存储到*p指向的内存空间中
int main()
{
  char s[50];
  cin >> s;
  int a[4];
  for (int i = 0; i < 4; i++)
  	getnum(s+8*i, a+i);
  cout << a[0];
  for (int i = 1; i < 4; i++)
  	cout << "." << a[i];
  return 0;
}
void getnum(char s[], int* p)
{
  int sum=0;
  char* q = s;
  for (int i = 0; i < 8; i++)
  {
  	sum *= 2;
  	sum += (*q - '0');
  	++q;
  }
  *p = sum;
}

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

//找出一个字符串中的所有数据然后加9输出
#include<iostream>
using namespace std;
void findnum(char* s);
int main()
{
	char s[201];
	cin.getline(s, 200);
	findnum(s);
	return 0;
}
void findnum(char* s)
{
	char* p = s;
	while (*p)
	{
		if (*p >= '0' && *p <= '9')
		{
			double temp = 0;
			char* q = p;
			while (*q >= '0' && *q <= '9')
			{
				temp = temp * 10 + (*q - '0');
				q++;//q指向连续数字的最后一位的下一位
			}
			if (*q == '.')//出现了小数点
			{
				char* r = q + 1;//r指向小数点后第一位
				double m = 10;//换为小数要除多少个10
				while (*r >= '0' && *r <= '9')
				{
					temp += (double)(*r-'0')/ m;
					m *= 10;
					r++;
				}
				q = r-1;//q指针就指向小数点后的最后一位连续数字
			}
			if (*(p - 1) == '-')
				temp = -temp;
			cout << (9 + temp) << endl;//加9输出
			p = q;
		}
		p++;
	}
}

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

//指针实现矩阵相加
#include<iostream>
using namespace std;
int M, N;
void plus_output(int a[][100],int b[][100]);
int main()
{
	cin >> M >> N;
	int a[100][100], b[100][100];
	for (int i = 0; i < M; i++)
		for (int j = 0; j < N; j++)
			cin >> a[i][j];
	for (int i = 0; i < M; i++)
		for (int j = 0; j < N; j++)
			cin >> b[i][j];
	plus_output(a, b);
	return 0;
}
void plus_output(int a[][100], int b[][100])
{
	int c[100][100];
	for (int i = 0; i < M; i++)
		for (int j = 0; j < N; j++)
			c[i][j] = a[i][j] + b[i][j];
	for (int i = 0; i < M; i++)
	{
		cout << c[i][0];
		for (int j = 1; j < N; j++)
			cout << " " << c[i][j];
		cout << endl;
	}
}

5指针实现矩阵相乘(10分)
题目内容:

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

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

输入格式:

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

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

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

输出格式:

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

输入样例:

2 3

1 1 0

2 1 1

3 2

1 2

2 1

1 0

输出样例:

3 3

5 5

//使用指针传递和指针运算,实现两个矩阵的乘积
#include<iostream>
using namespace std;
void product(int**, int**, int**, int, int, int, int);
int main()
{
	int** a;//二阶指针,即指向指针的指针
	int m, n;
	cin >> m >> n;//第一个矩阵行列数
	a = new int* [m];//a存放m个指针
	for (int i = 0; i < m; i++)
		a[i] = new int[n];//a[i]存放一行数
	for (int i = 0; i < m; i++)
		for (int j = 0; j < n; j++)
			cin >> a[i][j];
	
	int x, y;
	cin >> x >> y;//第二个矩阵行列数
	int** b;
	b = new int* [x];
	for (int i = 0; i < x; i++)
		b[i] = new int[y];
	for (int i = 0; i < x; i++)
		for (int j = 0; j < y; j++)
			cin >> b[i][j];
	/
	int** c;
	c = new int* [m];
	for (int i = 0; i < m; i++)
		c[i] = new int[y];//但c数组要置零
	for (int i = 0; i < m; i++)
		for (int j = 0; j < y; j++)
			c[i][j] = 0;
	/
	product(a, b, c, m, n, x, y);//调用函数,c储存结果
	
	for (int i = 0; i < m; i++)
	{
		cout << c[i][0];
		for (int j = 1; j < y; j++)
		{
			cout << " " << c[i][j];
		}
		cout << endl;
	}
	/
	//释放内存
	for (int i = 0; i < m; i++)
		delete[] a[i];
	for (int i = 0; i < x; i++)
		delete[] b[i];
	for (int i = 0; i < m; i++)
		delete[] c[i];
	delete[] a;
	delete[] b;
	delete[]c;
	/
	return 0;
}
void product(int** a, int** b, int** c, int m, int n, int x, int y)
{
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < y; j++)
		{
			for (int k = 0; k < n; k++)
				c[i][j] += a[i][k] * b[k][j];
		}
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值