第6章指针与引用

一级目录

二级目录

三级目录

习题

实验课oj

1 找出最长的单词

问题 A: 高级语言程序设计实验5-1

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

学长的代码:

#include<iostream>
using namespace std;
void split(char *str)
{
	int num_word=0;
	int temp=0,maxlen=0,maxwhere=0;
	for(int i=0;str[i]!='\0';i++)
	{
		if(str[i+1]=='\0'&&str[i]>='a'&&str[i]<='z') str[i+1]=' ';
		if(str[i]==' ')
		{
			num_word++;
			if(temp>maxlen)
			{
				maxlen=temp;
				maxwhere=i-temp;
				temp=0;
			}
			else temp=0;
		}
		else
		{
			temp++;
		}
	}
	cout << num_word << " " << maxlen << " ";
	while(str[maxwhere]!=' ') cout << str[maxwhere++];

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

2-动态创建二维数组并用指针转置

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

#include <iostream>  
#include <iomanip>  
using namespace std;
int main()
{
    int m, n;
    cin>>m>>n;
    int ** A=new int*[m];
    int ** 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];
        }
    cout<<"A:"<<endl;;
    for (int i=0; i<m; ++i)        //m
    {
        for (int j=0; j<n; ++j)    //n
        {
            cout<<A[i][j]<<"  ";
        }
        cout<<endl;
    }
    cout<<endl<<"B:"<<endl;;
 
    for (int i=0; i<n; ++i)         //n
    {
        for (int j=0; j<m; ++j)     //m
        {
            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];
    }
    delete[] A;
    delete[] B;
    return 0;
}

mooc

1:插入字符

1插入字符串(30分)
题目内容:

从键盘输入一个字符串,并在串中的第一次出现的最大元素后边插入字符串”ab”。

输入格式:

任意输入一个字符串

输出格式:

在串中的最大元素后边插入字符串”ab”

输入样例:

123csCUMT

输出样例:

123csabCUMT

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string.h>
#include <math.h>
using namespace std;
int main ()
{
	char a[20];
	char b[20];
	cin.getline(a,20);
	int i=0,g=0;
	char temp=a[0];
	int add=0;
	for(;a[i]!='\0';i++)
	{
		if(temp<a[i])
		{
			temp=a[i];
			add=i;
		}
	}
	for(i=0;i<=add;i++,g++)
	{
		b[g]=a[i];
	}
	b[g++]='a';
	b[g++]='b';
	for(;a[i]!='\0';i++,g++)
	{
		b[g]=a[i];
	}
	cout<<b;
	return 0;
}

2:统计整数个数并输出

输入一个字符串,其包括数字和非数字字符,如:a123x456 17935? 098tab,将其中连续的数字作为一个整数,依次存放到数组a中,统计共有多少个整数,并输出这些数。

输入格式:

数字和非数字字符的字符串

输出格式:

1)整数个数2)分别输出整数

输入样例:

a123x456 17935? 098tab583【注意需要保留带有空格的字符串,请不要使用gets,cin,练习使用cin.getline(char *str, int maxnum)】

输出样例:

5

123

456

17935

98

583

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string.h>
#include <math.h>
using namespace std;
int main ()
{
	char a[200];
	char a1[200];
	int num=0;
	cin.getline(a,200);
	int i=0,g=0;
	for(;a[i]!='\0';i++)
	{
		if(a[i]>='0'&&a[i]<='9')
		{
			while(a[i]>='0'&&a[i]<='9')
			{
				a1[g]=a[i];
				i++; 
				g++;
				
			}
			a1[g]='\n';
			g++;//之前这里忘记g++;结果覆盖掉了'\n' 
			num++;
		}
	
	}
	a1[g-1]='\0';
	if(strlen(a1)!=0)
	cout<<num<<'\n';
	cout<<a1;

	return 0;
}

3: 5个字符串用指针数组排序

3字符串排序(30分)
题目内容:

有5个字符串,首先将它们按照字符串中字符个数由小到大排序,再分别取出每个字符串的第三个字母合并成一个新的字符串输出(若少于三个字符的输出空格)。要求:利用字符串指针和指针数组实现。

输入格式:

5个字符串,用回车分隔

输出格式:

输出一个字符串:按5个字符串中字符个数由小到大排序,每个字符串后面有一个空格;再分别取出每个字符串的第三个字母合并成一个新的字符串输出,若少于三个字符的输出空格

输入样例:

test1234

123test

cumt

think

apples

输出样例:

cumt think apples 123test test1234

concatenate string:mip3s

方法1:用string* p[5]
方法2:用char* p[];
方法3:用char (*p)[30]

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string.h>
#include <math.h>
using namespace std;
int main ()
{
	string s[5];
	string* p[5];
	for(int i=0;i<5;i++)
	{
		cin>>s[i];
		p[i]=&s[i];
	}
	int max=0;
	for(int i=0;i<4;i++)
	{
		for(int e=0;e<4-i;e++)
		{
			if((*p[e]).size()>(*p[e+1]).size())
			{
				string* tem=p[e];
				p[e]=p[e+1];
				p[e+1]=tem;
			}
		}
	}
	cout << endl << "concatenate string:";
	for(int i=0;i<5;i++)
	{
//		cout<<*p[i]<<" ";
		if((*p[i]).size()<3)cout<<' ';
		else
		{
			cout<<(*p[i])[2]<<" ";
		}
	}
	return 0;
}

方法二:

#include <iostream>
#include <string.h> 
using namespace std;
int main()
{
    char *ch[5];
	for(int i=0;i<5;i++) 
	{
		ch[i]=new char[10];
		cin>>ch[i];
	}
	for(int i=0;i<4;i++)
	  for(int j=0;j<4-i;j++)
	  {
	  	if(strlen(ch[j])>strlen(ch[j+1]))
	  	   {
	  	   	char *p=ch[j];
	  	   	ch[j]=ch[j+1];
			ch[j+1]=p;
			 }
	  }
	  for (int i=0;i<5;i++)  cout<<ch[i]<<" ";
	  cout << endl << "concatenate string:";
	  for(int i=0;i<5;i++)
	  {
	  	if(strlen(ch[i])<3)  cout<<" ";
	  	else cout<<ch[i][2];
	  	delete ch[i];
	  }
	  return 0;
 }

方法三:

#include <iostream>
#include <fstream>
#include <iomanip>
#include <string.h>
#include <math.h>
using namespace std;
int main ()
{
	char s[5][30];
	char*p [5];
	for(int i=0;i<5;i++)
	{
		cin>>s[i];
		p[i]=s[i];
	}
	for(int i=0;i<4;i++)
	{
		for(int e=0;e<4-i;e++)
		{
			if(strlen(p[e])>strlen(p[e+1]))
			{
				char *tem=p[e];
				p[e]=p[e+1];
				p[e+1]=tem;	
			}
		}
	}
	cout << endl << "concatenate string:";
	for(int i=0;i<5;i++)
	{
		if(strlen(p[i])<3)
		cout<<" ";
		else
		{
			cout<<p[i][2];
		}
	}
	
	return 0;
}

![在这里插入图片描述](https://img-blog.csdnimg.cn/20201223085901477.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tlZW5rZW5lbg==,size_16,color_FFFFFF,t_70#pic_center)
改成

```cpp
cout<<(*p[1]).size;

就对了
(是优先级结合性的隐患造成的)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值