C++基础(25)信息学奥赛初学者指南字符串应用解析

作业名师帮2019-01-10 16:36:21





点击蓝字「作业名师帮」可快速关注
微信号:zuoyemingshibang






习题解析

1、整理药名

http://ybt.ssoier.cn:8088/problem_show.php?pid=1139

【题目描述】

医生在书写药品名的时候经常不注意大小写,格式比较混乱。现要求你写一个程序将医生书写混乱的药品名整理成统一规范的格式,即药品名的第一个字符如果是字母要大写,其他字母小写。如将ASPIRIN、aspirin整理成Aspirin。

【输入】

第一行一个数字n,表示有n个药品名要整理,n不超过100。

接下来n行,每行一个单词,长度不超过20,表示医生手书的药品名。药品名由字母、数字和-组成。


【输出】

n行,每行一个单词,对应输入的药品名的规范写法。

【输入样例】

4
AspiRin
cisapride
2-PENICILLIN
Cefradine-6

【输出样例】

Aspirin
Cisapride
2-penicillin
Cefradine-6


【参考程序】


#include <cstdio>
#include <cstring>
char a[21];
int main()
{    int n;    scanf("%d",&n);    for(int i=1;i<=n;i++) {                scanf("%s",&a);        int len=strlen(a);        if(a[0]>='a'&&a[0]<='z')//首字母            a[0]=a[0]-32;        for(int j=1;j<len;j++)            if('A'<=a[j]&&a[j]<='Z')                a[j]=a[j]+32;        printf("%s\n",&a);    }    return 0;
}

2、单词翻转

http://ybt.ssoier.cn:8088/problem_show.php?pid=1144

【题目描述】

输入一个句子(一行),将句子中的每一个单词翻转后输出。

【输入】

只有一行,为一个字符串,不超过500个字符。单词之间以空格隔开。

【输出】

翻转每一个单词后的字符串,单词之间的空格需与原文一致。

【输入样例】

hello world

【输出样例】

olleh dlrow


【参考程序】

#include <cstdio>
#include <cstring>
char a[501];
int main()
{    char c;    int k=0,len,i=0,cnt,j;    while((c=getchar())!='\n')        a[k++]=c;    a[k]='\0';    len=strlen(a);    while(i<len) {        cnt=0;        while(i<len&&a[i]==' ')i++; //没到最后一个字母且没读到空格符        while(i+cnt<len&&a[i+cnt]!=' ')
           cnt++;
//遇到空格表示读到了一个新单词
       for(j=0;j<cnt/2;j++) {            c=a[i+j];
           a[i+j]=a[i+cnt-1-j];
           
a[i+cnt-1-j]=c;        }
//逆序颠倒字符        i+=cnt;
//读到的字符数增加,直到读到最后一个字符    }    printf("%s",a);    return 0;
}


3、字符串p型编码

http://ybt.ssoier.cn:8088/problem_show.php?pid=1145

【题目描述】

给定一个完全由数字字符(‘0’,‘1’,‘2’,…,‘9’)构成的字符串str,请写出str的p型编码串。

例如:字符串122344111可被描述为"1个1、2个2、1个3、2个4、3个1",因此我们说122344111的p型编码串为1122132431;

类似的道理,编码串101可以用来描述1111111111;00000000000可描述为"11个0",因此它的p型编码串即为110;

100200300可描述为"1个1、2个 0、1个2、2个0、1个3、2个0",因此它的p型编码串为112012201320。

【输入】

输入仅一行,包含字符串str。每一行字符串最多包含1000个数字字符。

【输出】

输出该字符串对应的p型编码串。

【输入样例】

122344111

【输出样例】

1122132431


【参考程序】

#include <cstdio>
#include <cstring>
char a[1001];
int main()
{ int i=0,len,cnt; scanf("%s",a); len=strlen(a); while(i<len) { cnt=0; while(i+cnt<len&&a[i]==a[i+cnt]) cnt++;
//按题目要求找到编码串数量 printf("%d%d",cnt,a[i]-'0');
//输出P型编码串 i+=cnt;
//读到的字符数增加,直到读到最后一个字符 } return 0;
}


4、最高分数的学生姓名

http://ybt.ssoier.cn:8088/problem_show.php?pid=1147

【题目描述】

输入学生的人数,然后再输入每位学生的分数和姓名,求获得最高分数的学生的姓名。

【输入】

第一行输入一个正整数N(N ≤ 100),表示学生人数。接着输入N行,每行格式如下:

       分数 姓名

分数是一个非负整数,且小于等于100;

姓名为一个连续的字符串,中间没有空格,长度不超过20。

数据保证最高分只有一位同学。


【输出】

获得最高分数同学的姓名。

【输入样例】

5
87 lilei
99 hanmeimei
97 lily
96 lucy
77 jim

【输出样例】

hanmeimei


【参考程序】

#include<cstdio>
#include<cstring>
int n,score,max;
char name[21],ans[21];
int main()
{ scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d %s",&score,&name);
//读入每个学生的成绩、姓名
if(i==1||score>max) { max=score; strcpy(ans,name); }
//如果新读入的学生成绩更高,则记下更高的成绩和姓名 } printf("%s\n",ans); return 0;
}


5、连续出现的字符

http://ybt.ssoier.cn:8088/problem_show.php?pid=1148

【题目描述】

给定一个字符串,在字符串中找到第一个连续出现至少k次的字符。

【输入】

第一行包含一个正整数k,表示至少需要连续出现的次数。1 ≤ k ≤ 1000。

第二行包含需要查找的字符串。字符串长度在1到2500之间,且不包含任何空白符。


【输出】

若存在连续出现至少k次的字符,输出该字符;否则输出No。

【输入样例】

3
abcccaaab

【输出样例】

c


【参考程序】

#include <cstdio>
#include <cstring>
char b[1001];
int main()
{ int k,i=0,len,cnt; scanf("%d %s",&k,b); len=strlen(b); while(i<len) { cnt=0; while(i+cnt<len&&b[i+cnt]==b[i]) cnt++;
//统计相同字符的数量
if(cnt>=k) { printf("%c",b[i]); break; }
//如果找到相同字符数量等于k的则输出 i+=cnt; }
if(cnt<k) printf("No");
//如果找到的相同数量少于k则输出"No"
return 0;
}


扫码加入中山2018小学升学群聊

- END -

授人以鱼,不如授人以渔。作业名师帮,不仅教你做作业,更教你学会做作业!致力于为全国中小学生提供全学段的学习辅导服务。免费提供一线名校、名师的教学方法;提供名校名师的学习资料、课件、试卷等。“互联网+”让教育公平触手可及!