【C++】第六章作业

本文介绍了如何用C++处理字符串,包括统计连续整数数量,按字符个数排序,并在特定位置插入字符串。涉及到isdigit函数和指针操作。
摘要由CSDN通过智能技术生成

目录

统计整数个数

字符串排序

插入字符串


统计整数个数

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

【输入形式】数字和非数字字符的字符串

【输出形式】多行,第一行输出整数个数,后面每行输出一个整数

【样例输入】a123x456 17935? 098tab583

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

【样例输出】

  5

  123

  456

  17935

  98

  583

【样例说明】第一个输出项为整数的个数,后面的分别为具体的整数。注意,不需要输出提示类文字,如:“整数为”,“分别为”等字样。直接输出结果。有一个数字的也要输出。测试用例中没有超过整数范围连续数字。当遇到0开头的数字应舍去0。

#include<iostream>
#include<cstring>
#include<cctype>

using namespace std;
void sum_Num(char* s) {
	int i = 0;
	int count = 0;
	while (*(s + i)) {
		if (isdigit(*(s + i))) {
			if (!isdigit(*(s + i + 1))) {
				count++;
			}
		}
		i++;
	}
	cout << count << endl;
	i = 0;
	while (*(s + i)) {
		if (isdigit(*(s + i))) {
			cout << *(s + i);
			if (!isdigit(*(s + i + 1))) { 
				cout << endl; }
		}
		i++;
	}
}
int main() {
	char str[50];
	cin.getline(str, 50);
	sum_Num(str);
	return 0;
}

我们发现,当使用这个代码的时候,无法实现开头数字为0的时候将0舍去,于是我们对代码进行更改

#include<iostream>
#include<vector>
#include<cctype>
#include<cstring>
using namespace std;
int main() {
	char s[50];
	cin.getline(s, 50);
	char* p;
	p = s;
	int num = 0;
	int count = 0;
	vector<int>number;
	int i = 0;
	while (*(p + i)) {
		if (isdigit(*(p + i))) {
			num = num * 10 + *(p + i) - '0';
			if (!isdigit(*(p + i + 1))||*(p+i)=='\0') {
				number.push_back(num);
				num = 0;
				count++;
			}
		}
		i++;
	}
	cout << count << endl;
	for (int i = 0; i < count; i++) {
		cout << number[i] << endl;
	}
	return 0;
}

`<cctype>` 中常用的函数包括:

1. `isalpha(c)`: 检查字符 `c` 是否为字母。
2. `isdigit(c)`: 检查字符 `c` 是否为数字。
3. `isalnum(c)`: 检查字符 `c` 是否为字母或数字。
4. `isspace(c)`: 检查字符 `c` 是否为空白字符(如空格、制表符)。
5. `islower(c)`: 检查字符 `c` 是否为小写字母。
6. `isupper(c)`: 检查字符 `c` 是否为大写字母。
7. `tolower(c)`: 将字符 `c` 转换为小写(如果可能)。
8. `toupper(c)`: 将字符 `c` 转换为大写(如果可能)。

这些函数通常接受一个 `char` 类型的参数,并返回一个布尔值(对于判断函数)或另一个字符(对于转换函数)。

字符串排序

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

【输入形式】5个字符串,用回车分隔

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

【样例输入】

  test1234

  123test

  cumt

  think

  apples

【样例输出】

  cumt think apples 123test test1234

  concatenate string:mip3s

【样例说明】输出的第一行中,每个字符串后面有一个空格。字符数量相等的串相对顺序不变。

按照题目要求,采用了字符串指针和指针数组来实现:

#include<iostream>

#include<cstring>

using namespace std;

int main() {

char strings[5][50];

char* p[5];

for (int i = 0; i < 5; i++){

cin.getline(strings[i], 50);

p[i] = strings[i];

}

for (int i = 0; i < 4; i++) {

for (int j = 0; j < 4-i; j++) {

if (strlen(p[j]) > strlen(p[j+1]))

{

char* temp;

temp = p[j];

p[j] = p[j+1];

p[j+1] = temp;

}

}

}

for (int i = 0; i < 5; i++) {

cout << p[i]<<" ";

}

    cout<<endl; 

char concatenatedString[6];

for (int i = 0; i < 5; i++) {

    if (strlen(p[i]) >= 3) {

        concatenatedString[i] = p[i][2];

    }

    else concatenatedString[i] = ' ';

}

concatenatedString[5] = '\0';

cout << "concatenate string:" << concatenatedString<<endl; 

return 0;



}

快速排序更加快捷高效,以下是一个快速排序实现的代码

#include <iostream>
#include<string>

using namespace std;

string str[5];

void quick_sort(int l,int r)
{
    if(l>=r)return;
    int x=str[l+r>>1].size();
    
    int i=l-1,j=r+1;
    while(i<j)
    {
        do i++;while(str[i].size()<x);
        do j--;while(str[j].size()>x);
        if(i<j)swap(str[i],str[j]);
    }
    
    quick_sort(l,j);
    quick_sort(j+1,r);
}
int main() 
{
    for(int i=0;i<5;i++)cin>>str[i];
    
    quick_sort(0,4);
    
    for(int i=0;i<5;i++)cout<<str[i]<<" ";
    
    char s[6];
    
    for(int i=0;i<5;i++)
    {
        if(str[i].size()>=3)s[i]=str[i][2];
        else s[i]=' ';
    }
    s[5]='\0';
    
    cout<<endl<<"concatenate string:";
    
    for(int i=0;i<5;i++)cout<<s[i];
    
    return 0;
}

插入字符串

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

【输入形式】任意输入一个字符串

【输出形式】在串中的最大元素后边插入字符串”ab”

【样例输入】123csCUMT

【样例输出】123csabCUMT

【样例说明】为了保证输入的字符串有空格,请使用cin.getline(char* , int); 本系统不支持使用gets。只插入一次ab。

#include<iostream>

#include<cstring>

using namespace std;

int main() 
{
    
    char str[100];
    cin.getline(str,100);
    
    int len=strlen(str);
    
    char *p;
    p=str;
    
    char max=p[0];
    int t=0;
    
    for(int i=0;i<len;i++){
        if(p[i]>max){
            max=p[i];
            t=i;
            
        }
    }
    
    for(int i=len;i>t;i--){
        *(p+i+2)=*(p+i);
    }
    len=len+2;
    *(p+t+1)='a';
    *(p+t+2)='b';
    
    cout<<p;
    
    return 0;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值