2023.3.2上机练习

1.画图
问题描述
在一个定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形,指将横坐标范围从x1到x2,纵坐标范围从y1到y2之间的区域涂上颜色。
下图给出了一个画了两个矩形的例子。第一个矩形是(1,1) 到(4, 4),用绿色和紫色表示。第二个矩形是(2, 3)到(6, 5),用蓝色和紫色表示。
图片2.png
图中,一共有15个单位的面积被涂上颜色,其中紫色部分被涂了两次,但在计算面积时只计算一次。在实际的涂色过程中,所有的矩形 都涂成统一的颜色,图中显示不同颜色仅为说明方便。给出所有要画的矩形,请问总共有多少个单位的面积被涂上颜色。
输入说明
输入的第一行包含一个整数n,表示要画的矩形的个数,1<=n<=100
接下来n行,每行4个非负整数,分别表示要画的矩形的左下角的横坐标与纵坐标,以及右上角的横坐标与纵坐标。0<=横坐标、纵坐标<=100。
输出说明
输出一个整数,表示有多少个单位的面积被涂上颜色。
输入样例
2
1 1 4 4
2 3 6 5
输出样例
15

#include<iostream>
using namespace std;
int main()
{
	int num[100][100] = { 0 }, n, i, j, k, sum, s[100][4];
	//输入
	cin >> n;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < 4; j++)
			cin >> s[i][j];
	}
	//上色,用1表示上色,之后可以相加来表示上色面积
	for (i = 0; i < n; i++)
	{
		for (j = s[i][0]; j < s[i][2]; j++)
		{
			for (k = s[i][1]; k < s[i][3]; k++)
				num[j][k] = 1;
		}
	}
	//求面积
	for (i = 0, sum = 0; i < 100; i++)
	{
		for (j = 0; j < 100; j++)
			sum += num[i][j];
	}

	cout << sum << endl;
	return 0;
}

在这里插入图片描述

2.矩阵相乘
描述
输入2×3矩阵A和3×2矩阵B各元素值,计算2×2矩阵C并输出其结果,矩阵相乘公式如下:Cmn=Amp*Bpn

输入说明
输入整形数据,如矩阵元素A={{1,2,3},{4,5,6}},B={{1,2},{3,4},{5,6}}。

输出说明
格式输出:输出矩阵A、B和A*B的结果,矩阵形式,分行分列输出,矩阵之间空一行。

提示
采用三重循环结构实现计算过程,数据输出格式%5d。

输入样例
1 2 3 4 5 6
1 2 3 4 5 6

输出样例
1 2 3
4 5 6

1 2
3 4
5 6

22 28
49 64

#include<iostream>
using namespace std;
int main()
{
	int a[2][3]={0}, b[3][2]={0}, c[2][2]={0};
	for (int i = 0; i < 2; i++)
		for (int j = 0; j < 3; j++)
			cin >> a[i][j];
	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 2; j++)
			cin >> b[i][j];
			
**## *//矩阵相乘三重循环实现***

	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 2; j++)
		{
			for (int p = 0; p < 3; p++)
			{
				c[i][j] += a[i][p] * b[p][j];
			}
		}
	}
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			cout << a[i][j] << " ";
		}
		cout << endl;
	}
	cout << endl;
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 2; j++)
		{
			cout << b[i][j];
		}
		cout << endl;
	}
	cout << endl;
	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 2; j++)
		{
			cout << c[i][j] << " ";
		}
		cout << endl;
	}
	return 0;
}

在这里插入图片描述

3.目录操作
问题描述
在操作系统中,文件系统一般采用层次化的组织形式,由目录(或者文件夹)和文件构成,形成一棵树的形状。
有一个特殊的目录被称为根目录,是整个文件系统形成的这棵树的根节点,在类Linux系统中用一个单独的 “/”符号表示。
因此一个目录的绝对路径可以表示为“/d2/d3”这样的形式。
当前目录表示用户目前正在工作的目录。为了切换到文件系统中的某个目录,可以使用“cd”命令。
现在给出初始时的当前目录和一系列目录操作指令,请给出操作完成后的当前目录。
输入说明
第一行包含一个字符串,表示当前目录。
后续若干行,每行包含一个字符串,表示需要进行的目录切换命令。
最后一行为pwd命令,表示输出当前目录
注意:
所有目录的名字只包含小写字母和数字,cd命令和pwd命令也都是小写。最长目录长度不超过200个字符。
当前目录已经是根目录时,cd … 和cd /不会产生任何作用
输出说明
输出一个字符串,表示经过一系列目录操作后的当前目录
输入样例
/d2/d3/d7
cd …
cd /
cd /d1/d6
cd d4/d5
pwd
输出样例
/d1/d6/d4/d5

#include<iostream>
#include<string.h>
using namespace std;

void copy(char* n, char* m)
{
	int i, j;
	for (i = 3, j = 0; n[i] != '\0'; i++)
		m[j++] = n[i];
	m[j] = '\0';
}

//back要注意当前目录已经是根目录的情况
void back(char* n)
{
	int i, index = 0;
	//找到最后一个'/'
	for (i = 0; n[i] != '\0'; i++)
	{
		if (n[i] == '/')
			index = i;
	}
	if (index >= 1)//不是根目录,用'\0'截断原来的字符串
		n[index] = '\0';
	else
		n[1] = '\0';
}

//relative还是要注意当前目录已经是根目录的情况
//不是的话还要自己加个'/'
void relative(char* n, char* m, int len_n, int len_m)
{
	int i, j;
	if (len_m > 1)
	{
		m[len_m] = '/';
		for (i = 3, j = len_m + 1; i < len_n; i++)
			m[j++] = n[i];
	}
	else
	{
		for (i = 3, j = len_m; i < len_n; i++)
			m[j++] = n[i];
	}
	m[j] = '\0';
}

int main()
{
	char cmd[200], dir[200];
	void copy(char* n, char* m);
	void back(char* n);
	void relative(char* n, char* m, int len_n, int len_m);
	gets_s(dir, 200);
	gets_s(cmd, 200);
	while (strcmp(cmd, "pwd"))
	{
		if (cmd[3] == '/')
			copy(cmd, dir);
		else if (cmd[3] == '.')
			back(dir);
		else
			relative(cmd, dir, strlen(cmd), strlen(dir));
		gets_s(cmd, 200);
	}
	puts(dir);
	return 0;
}

4.字符串相似度
问题描述
最长公共子串指给定的两个字符串之间最长的相同子字符串(忽略大小写),最长公共子串长度可用来定义字符串相似度。
现给出两个字符串S1和S2,S1的长度为Len1,S2的长度为Len2,假设S1和S2的最长公共子串长度为LCS,则两个字符串的相似度定义为2
现给出两个字符串,请计算它们的相似度结果保留3位小数。

输入说明
输入为两行,分别表示两个字符串S1和S2,每个字符串长度不超过100个字符,所有字符均为可打印字符,包括大小写字母,标点符号和空格。

输出说明
输出两个字符串的相似度,结果四舍五入保留3位小数。

输入样例1
App

Apple

输出样例1
0.750

输入样例2
apple

pineapple

输出样例2
0.714

#include<iostream>
#include<string>
using namespace std;
int main()
{
	char s1[100], s2[100];
	int len1, len2;
	float lcs, max = 0.0;  //max表示最大长度
	int a[100][100] = { 0 };
	gets_s(s1);
	gets_s(s2);
	len1 = strlen(s1);
	len2 = strlen(s2);
	
	//递推动态规划

	for (int i = 0; i < len1; i++)
	{
		for (int j = 0; j < len2; j++)
		{
			if (s1[i] == s2[j] || abs(s1[i] - s2[j]) == 32)
			{
				if (i != 0 && j != 0)
					a[i][j] = a[i - 1][j - 1] + 1;
				else
					a[i][j] = 1;
			}
		}
	}
	for (int i = 0; i < len1; i++)
	{
		for (int j = 0; j < len2; j++)
		{
			//更新最大长度
			if (a[i][j] > max)
				max = a[i][j];
		}
	}
	cout << max << endl;
	lcs = 2 * max / (len1 + len2);  //lcs公式
	printf("%.3f", lcs);  //C语言格式化输出
	return 0;
}

在这里插入图片描述
在这里插入图片描述

5.字符串查找
问题描述
给出一个字符串和多行文字,输出在这些文字中出现了指定字符串的行。
程序还需要支持大小写敏感选项:
当选项打开时,表示同一个字母的大写和小写看作不同的字符;
当选项关闭时,表示同一个字母的大写和小写看作相同的字符。

输入说明
输入数据第一行包含一个字符串s,由大小写英文字母组成,长度不超过100。
第二行包含一个数字,表示大小写敏感选项。当数字为0时表示大小写不敏感,当数字为1时表示大小写敏感。
第三行包含一个整数n,表示给出的文字行数。
接下来n行,每行包含一个字符串,字符串由大小写英文字母组成,不含空格和其他字符。每个字符串长度不超过100。

输出说明
输出多行,每行包含一个字符串,按出现的顺序依次给出那些包含了字符串s的行。

输入样例
Hello
1
5
HelloWorld
HiHiHelloHiHi
GrepIsAGreatTool
HELLO
HELLOisNOTHello

输出样例
HelloWorld
HiHiHelloHiHi
HELLOisNOTHello
在这里插入图片描述

#include<iostream>
#include<ctype.h>
#include<string.h>
using namespace std;
int main()
{
	char x[100], y[100][100];//二维字符数组
	int n, m, i;
	void lower(char* s);

	cin >> x;
	cin >> n >> m;;
	for (i = 0; i < m; i++)
		cin >> y[i];

	//小写
	if (n == 0)
	{
		lower(x);
		for (i = 0; i < m; i++)
			lower(y[i]);
	}
	for (i = 0; i < m; i++)
	{
		if (strstr(y[i], x))
			puts(y[i]);
	}

}

void lower(char* s)
{
	char* p = s;
	for (; *p != '\0'; p++)
		*p = tolower(*p);
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值