[c++]实验五 指针(二维指针空间的开辟与释放)


实验5-1(A)

【题目描述】
在进行文章重复度检查时,经常需要统计一段英文中的单词数量,并找出长度最长的单词。
设有如下定义:char str[500];
编写程序,通过利用cin.getline(str,500);实现从键盘输入一小段英文(其中可以包含空格,但在同一行),利用函数统计该段英文中包含几个单词,输出统计出的单词数量、最长单词的长度以及长度最长的单词,空格隔开。
注意:函数声明使用void split(char *str);如果有最长的单词不只一个,输出最先找到的那个。
【输入形式】
一小段英文,不要超过500个字符
【输出形式】
单词数量、最长单词的长度以及长度最长的单词,空格隔开。
【样例输入】

welcome to china university of mining and technology

【样例输出】

8 10 university
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
void words(char s[])
{
	int t,s_length=strlen(s),i=-1,res=0,max_a=0;
	char ans[500],j[500];
	while (++i<s_length)
	{
		t=0;
		while (s[i]!=' '&&i<s_length)		//通过空格确定单词
		{
			t++;
			j[t-1]=s[i];
			i++;	
		}
		res++;
		if (t>max_a) {			//记录最长单词
			max_a=t;
			strcpy(ans,j);
		}
	}
	cout<<res<<" "<<max_a<<" ";
	for (int i=0;i<max_a;i++) cout<<ans[i];
	//cout<<endl; 
}

int main()
{
	char str[500];
	cin.getline(str,500);
	words(str);	
}

实验5-2(B)

【题目描述】
编程序,按如下方法求A矩阵的转置矩阵B:输入两个正整数m和n,而后通过使用指针配合new运算符生成一个m行n列的二维动态数组A以及另一个n行m列的二维动态数组B,之后为A输入数据(A矩阵数据),逐行逐列输入,进而求出其转置矩阵B(即将A中的行存放成B中的列)并输出结果,逐行逐列输出,每一行数字占一行,同一行的数空格隔开。
注意:输入保证全是整数。
【输入形式】
输入m和n,逐行逐列输入数组A的数据
【输出形式】
逐行逐列输出矩阵B
【样例输入】

3 2
119 65
629 679
721 564

【样例输出】

119 629 721
65 679 564
  • 正常方法(二维指针)
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
int main()
{
	int m,n;
	cin>>m>>n;
	int **A = 0,**B = 0;		//开辟二维指针数组空间
	A = new int *[m];
	B = new int *[n];
	for (int i=0;i<m;i++) A[i]=new int[n];
	for (int i=0;i<n;i++) B[i]=new int[m];
	for (int i=0;i<m;i++)			//读入并转换
		for (int j=0;j<n;j++)
		{
			cin>>A[i][j];
			B[j][i]=A[i][j];
		}
	for (int i=0;i<n;i++)		//输出
	{
		for (int j=0;j<m;j++)
			cout<<B[i][j]<<" ";
		cout<<endl;
	}
	for (int i=0;i<m;i++) delete []A[i];	//释放
	for (int i=0;i<n;i++) delete []B[i];
}
  • 邪道做法(不用指针一样能过
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int main()
{
	int n,m;
	cin>>m>>n;
	int a[100][100],b[100][100];
	for (int i=1;i<=m;i++)
		for (int j=1;j<=n;j++)
		{
			cin>>a[i][j];
			b[j][i]=a[i][j];
		}
	for (int i=1;i<=n;i++)
	{
		for (int j=1;j<=m;j++)
		{
			cout<<b[i][j]<<" ";
		}
		cout<<endl;
	}
}

实验5-3(C)

【题目描述】
编写如下原型的函数:
void split(double x,intiPart,doublefPart);
提取出数据x的整数部分与小数部分,分别放于iPart与fPart处,由于形参iPart与fPart都是指针,从而可实现将这两个结果“带回”到主函数中。
在主函数中输入一个数,输出它的整数部分和小数部分,用空格隔开。
提示:一个double类型数,强制类型转换后就是int,也就是整数部分,差为小数部分。这两个值用指针iPart和指针fPart带回(通过修改指针的目标变量值。)
【输入形式】
一个数
【输出形式】
整数部分 小数部分,用空格隔开
【样例输入】

12.3

【样例输出】

12 0.3
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
void split(double x,int*iPart,double*fPart)
{
	*iPart=int(x);
	*fPart=x-int(x);
}

int main()
{
	int ipart;
	double n,fpart;
	cin>>n;
	split(n,&ipart,&fpart);
	cout<<ipart<<" "<<fpart<<endl; 
}

实验5-4(D)

【题目描述】
编制具有如下原型的函数findLast:
c h a r ∗ f i n d L a s t ( c h a r ∗ s o u r c e S t r , c h a r ∗ s u b S t r ) ; char*findLast(char*sourceStr,char*subStr); charfindLast(charsourceStr,charsubStr);
findLast函数则要返回源串sourceStr中最后一次出现subStr子字符串的头字符位置。
而后编制主函数,输入两个字符串,将它们用作实参来调用这两个函数,如果返回NULL输出-1,否则输出子字符串出现时头字符在原字符串的下标,每个结果占一行。
要求实现程序中不可使用“string.h”头文件内有关寻找子串的标准库函数。
【输入形式】
输入源串sourceStr,子字符串subStr。
【输出形式】
子字符串subStr最后一次在源串sourceStr中出现的位置
【样例输入】

 welcometochinauniversityofminingandtechnology
in

【样例输出】

30
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
char*findLast(char*sourceStr,char*subStr)
{
	int res=-1,i=-1,j=0;
	while (*(sourceStr+(++i))!='\0')
	{
		while(*(sourceStr+i)!=*(subStr+j)&&*(sourceStr+i)!='\0') i++; 	//寻找与subStr[0]相等的位置
		while (*(sourceStr+i)==*(subStr+j)&&*(subStr+j)!='\0') {j++;i++;}	//确定是否与subStr完全一致
		i--;		//避免一致情况下的判断后,i的过度后移
		if (*(subStr+j)=='\0') res=i-j+1;
		j=0;
	}
	cout<<res<<endl;
}

int main()
{
	char str[500],sub[500];
	cin.getline(str,500);
	cin.getline(sub,500);
	findLast(str,sub);
}

实验5-5(E)

【题目描述】
编写具有如下原型的函数:
int f(unsigned long x, int n,int & Lxn);
它负责将整数x的第n位(从左边数第n位,n>0)的数值放到引用Lxn中(将作为结果返回到主调函数的对应实参变量中),并将倒数第n位(从右边数第n位,n>0)的数值作为函数结果返回去。
例如当x=123456789,n=7时,执行语句Rxn=f(x,n, Lxn);将使返回的Lxn为7,并使Rxn变为3;而执行语句 Rxn=f(12345,6,Lxn);将使Lxn与Rxn都变为0(超出数的“长度”即总位数时返回0)
【输入形式】
输入x,输入n
【输出形式】
输出Rxn,Lxn
【样例输入】

1234567 5

【样例输出】

3 5
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int f(unsigned long x, int n,int &Lxn)
{
	int a=x,i,Rxn;
	for (i=0;a>0;i++,a/=10);		//求位数
	if (n>i) return 0;
	Lxn=(int(x/pow(10,i-n)))%10; 	//从左向右截取
	Rxn=(int(x/pow(10,n-1)))%10;	//从右向左截取
	return Rxn;
}

int main()
{
	int x,n,Lxn=0,Rxn=0;
	cin>>x>>n;
	Rxn=f(x,n,Lxn);
	cout<<Rxn<<" "<<Lxn<<endl;
}

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值