提示:
下面代码仅供借鉴,并不是唯一正解!有些同学的方法比我巧妙的多!
T1 统计整数个数
题目描述:
输入一个字符串,其包括数字和非数字字符,如:a123x456 17935? 098tab,将其中连续的数字作为一个整数,依次存放到数组a中,统计共有多少个整数,并输出这些数。
分析:
此题的第一个难点是输入
对于一般的字符串输入是遇到空格就停止了,但是这道题显然有空格,所以我们不能用cin输入字符串,而是需要用
g
e
t
l
i
n
e
getline
getline输入一整行字符串
对于一个字符串 string s,我们可以用以下的输入方法:
g
e
t
l
i
n
e
(
c
i
n
,
s
)
getline(cin,s)
getline(cin,s)
这样就做到了一整行字符串的输入
第二个难点是如何把字符串里面的整数取出来呢?
我们先假设有一个全是数字的字符串,如果把这些字符串转化成数字?
例如有以下字符串:“1234”
我们采用老师上课讲的方法,当前我们已经取出来的数字是now,如果想要取出第i个数字,我们是需要令
n
o
w
=
n
o
w
∗
10
+
(
s
[
i
]
−
48
)
now=now*10+(s[i]-48)
now=now∗10+(s[i]−48)这样就能把第i位的数字取出来了(计算机内部采用ascal存储,0是48,1是49,以此类推)
用上述例子模拟一下:
i = 0:
s[0] = 1 , now = 0*10+1 = 1
i = 1:
s[1] = 2 , now = 1*10+2 = 12
i = 2:
s[2] = 3 , now = 12*10+3=123
i=3:
s[3] = 4 , now = 123*10+4=1234
这样就实现了数字的转换
第三个难点,如何将数字从字符串里面取出来呢?
我们首先设置一个布尔变量f来表示当前是否遇到数字
如果字符串的第
i
i
i位是一个数字并且f=0
说明这个时候我们是第一次遇到数字,我们令f=1表示已经遇到数字,而后按照上述规则取数
如果当前位是数字并且f=1,说明当前正在取数的过程中,按照上述规则取数即可
如果当前位不是数字且f=1
那么说明取数过程完毕,将当前取出来的数now存入数组即可,而后令now=0,f=0
等待下一次取数
此时还有一种特殊情况,就是当前字符串以数字结尾
那么按照上述规则我们可能取不出最后一个数
所以我们在字符串后面加上一个空格来保证上述情况下最后一个数字能被取出
Code
#include<bits/stdc++.h>
using namespace std;
string s;
int a[101010],cnt = 0;
int main(){
getline(cin,s);
int now = 0;
bool f = 0;
s+=' ';//加空格
for (int i = 0; i < s.size(); i++)//字符串s.size()表示返回字符串的长度
if ((s[i]<'0' || s[i]>'9')&&f)//如果当前不是字符并且当前出现过数字
a[++cnt] = now , now = 0,f = 0;//取出数字
else if (s[i]>='0' && s[i]<='9')f = 1 , now = now*10+(s[i]-'0');//不然如果当前是数字,就加上
printf("%d\n",cnt);
for (int i = 1; i <= cnt; i++)
printf("%d\n",a[i]);
return 0;
}
T2:字符串排序
题目描述:
有5个字符串,首先将它们按照字符串中字符个数由小到大排序,再分别取出每个字符串的第三个字母合并成一个新的字符串输出(若少于三个字符的输出空格)。要求:利用字符串指针和指针数组实现。
分析:
题目中要求指针,但我不会啊哈哈哈
前置知识:sort
此处我将介绍一下sort函数的用法
对于一个数组a[0…N]
我们想要将他从小到大排序
我们可以不必手写排序,而是可以用sort函数:
s
o
r
t
(
a
+
1
,
a
+
N
+
1
)
sort(a+1,a+N+1)
sort(a+1,a+N+1)
这样一个简单的语句就实现了a数组从小到大排序
大家不信的话可以自己上机实践一下
所以,sort函数有以下的模板:
s
o
r
t
(
a
+
x
,
a
+
y
+
1
)
sort(a+x,a+y+1)
sort(a+x,a+y+1)
上述sort实现了a数组
[
x
,
y
]
[x,y]
[x,y]之间从小到大的排序(sort默认从小到大排序)
有的人想说:
从大到小怎么办?
sort函数的一个方便之处就是我们可以定义一个布尔函数去 控制他的排序方式
s
o
r
t
(
a
+
1
,
a
+
n
+
1
,
c
m
p
)
sort(a+1,a+n+1,cmp)
sort(a+1,a+n+1,cmp)
其中cmp就是我们自己手写的一个控制排序方式的一个布尔函数
控制函数有以下模板
bool 函数名(类型 x,类型 y){
return 排序方式 ;(这个时候我们可以把x当做前面的数,y当做后面的数,这边就是写我们希望的前面的数和后面的数的关系)
}
其中x和y的类型和我们要排序的数组的类型相同
比如我们想实现从大到小排序,可以写如下函数:
bool cmp(int x,int y){
return x>y;
}
这边的 x > y x>y x>y表示我们希望前面的数比后面的数大,那就实现了从大到小排序
于是我们调用以下sort函数:
s
o
r
t
(
a
+
1
,
a
+
n
+
1
,
c
m
p
)
sort(a+1,a+n+1,cmp)
sort(a+1,a+n+1,cmp)
通过cmp控制函数,我们这样就实现了a数组从大到小的排序
实际上,cmp函数的写法多样,完全就是我们想要这个数组怎样去排序那么就可以怎么去写这个函数
接下来这道题就变得格外简单了
我们先定义一个字符串数组s[N]
将字符串数组s按照长度排序我们就可以用以下布尔函数去控制:
bool cmp(string x,string y){
return x.size()<.size() ;
}
即实现了s数组按照长度从小到大的排序
下面取出每一个字符串的第三个数不多说了,应该简单
Code
#include<bits/stdc++.h>
using namespace std;
int n = 5;
string s[10];
bool cmp(string x,string y){
return x.size()<y.size();
}
int main(){
for (int i = 1; i <= n; i++) cin>>s[i];
sort(s+1,s+5+1,cmp);//排序
for (int i = 1; i <= n; i++)
cout<<s[i]<<' ';//输出
cout<<endl;
string S = "";
for (int i = 1; i <= n; i++)
if (s[i].size()<3) S+=' ';
else S+=s[i][2];//取字符
printf("concatenate string:");
cout<<S;
return 0;
}
学会指针啦啊哈哈
Code2
#include<bits/stdc++.h>
using namespace std;
int n = 5;
string s[10];
int main(){
string *p[6];
for (int i = 1; i <= n; i++)
cin>>s[i],p[i] = &s[i];
for (int i = 1; i <= n; i++)
for (int j = i+1; j <= n; j++)
if ((*p[i]).size() > (*p[j]).size())
swap(*p[i],*p[j]);
for (int i = 1; i <= n; i++)
cout<<*(p[i])<<' ';
string ss = "";
for (int i = 1; i <= n; i++)
if ((*p[i]).size()<3) ss+=' ';
else ss+=(*p[i])[2];
cout<<endl<<ss;
return 0;
}
/*
test1234
123test
cumt
think
apples
*/
T3:插入字符串
题目描述:
从键盘输入一个字符串,并在串中的第一次出现的最大元素后边插入字符串”ab”。
分析:
没有思维难度
按照题意模拟找出最大字符记录他的下标位置
而后直接插入即可
对于插入,我们不一定要“插入”
可以分段输出
Code
#include<bits/stdc++.h>
using namespace std;
string s;
int main(){
getline(cin,s);
char Max = s[0];
int Maxx = 0;
for (int i = 1; i < s.size(); i++)
if (s[i] > Max) Max = s[i] , Maxx = i;//找出最大值并找出其下标
for (int i = 0; i <= Maxx; i++)
cout <<s[i];//先输出前面的
cout<<"ab";//输出插入的
for (int i = Maxx+1; i < s.size(); i++)
cout<<s[i];//输出后面的
return 0;
}