C/C++程序题(16-20)
2016-03-28 10:56
441 查看
16.
将一个字符串的元音字母复制到另一个字符串,并排序(30分)
问题描述:
有一字符串,里面可能包含英文字母(大写、小写)、数字、特殊字符,现在需要实现一函数,将此字符串中的元音字母挑选出来,存入另一个字符串中,并对字符串中的字母进行从小到大的排序(小写的元音字母在前,大写的元音字母在后,依次有序)。
说明:
1、 元音字母是a,e,i,o,u,A,E,I,O,U。
2、 筛选出来的元音字母,不需要剔重;
最终输出的字符串,小写元音字母排在前面,大写元音字母排在后面,依次有序。
要求实现函数:
void sortVowel (char* input, char* output);
【输入】 char* input,表示输入的字符串
【输出】 char* output,排好序之后的元音字符串。
【返回】 无
示例
输入:char *input = “Abort!May Be Some Errors In OutSystem. “
输出:char *output =“aeeeooAEIO “
注:
cin>>
可用于接受一个字符串,遇“空格”、“TAB”、“回车”都结束
cin.get()
用法1:
cin.get(字符变量名)可以用来接收字符。char ch; ch=cin.get;
用法2:cin.get(字符数组名,接收字符数目)用来接收一行字符串,可以接收空格。用法同cin.getline()。char
a[20]; cin.get(a,20);
详见:http://www.cnblogs.com/wanghao111/archive/2009/09/05/1560822.html
17.
身份证号码合法性判断
问题描述:
我国公民的身份证号码特点如下:
1、 长度为18位;
2、 第1~17位只能为数字;
3、 第18位可以是数字或者小写英文字母x。
4、 身份证号码的第7~14位表示持有人生日的年、月、日信息。
例如:511002198808080111或51100219880808011x。
请实现身份证号码合法性判断的函数。除满足以上要求外,需要对持有人生日的年、月、日信息进行校验。年份大于等于1900年,小于等于2100年。需要考虑闰年、大小月的情况。所谓闰年,能被4整除且不能被100整除 或 能被400整除的年份,闰年的2月份为29天,非闰年的2月份为28天。其他情况的合法性校验,考生不用考虑。
函数返回值:
1) 如果身份证号合法,返回0;
2) 如果身份证号长度不合法,返回1;
3) 如果身份证号第1~17位含有非数字的字符,返回2;
4) 如果身份证号第18位既不是数字也不是英文小写字母x,返回3;
5) 如果身份证号的年信息非法,返回4;
6) 如果身份证号的月信息非法,返回5;
7) 如果身份证号的日信息非法,返回6(请注意闰年的情况);
【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。
要求实现函数:
int verifyIDCard(char* input)
【输入】 char* input,表示输入的身份证号码字符串
【输出】 无
【返回】 判断的结果,类型为int
示例
1) 输入:”511002111222”,函数返回值:1;
2) 输入:”511002abc123456789”,函数返回值:2;
3) 输入:”51100219880808123a”,函数返回值:3;
4) 输入:”511002188808081234”,函数返回值:4;
5) 输入:”511002198813081234”,函数返回值:5;
6) 输入:”511002198808321234”,函数返回值:6;
7) 输入:”511002198902291234”,函数返回值:7;
8) 输入:”511002198808081234”,函数返回值:0;
18.
识别字符串中的整数并转换为数字形式(40分)
问题描述:
识别输入字符串中所有的整数,统计整数个数并将这些字符串形式的整数转换为数字形式整数。
要求实现函数:
void take_num(const char *strIn, int *n, unsigned int *outArray)
【输入】 strIn: 输入的字符串
【输出】 n: 统计识别出来的整数个数
outArray:识别出来的整数值,其中outArray[0]是输入字符串中从左到右第一个整数,
outArray[1]是第二个整数,以此类推。数组地址已经分配,可以直接使用
【返回】无
注:
I、 不考虑字符串中出现的正负号(+, -),即所有转换结果为非负整数(包括0和正整数)
II、 不考虑转换后整数超出范围情况,即测试用例中可能出现的最大整数不会超过unsigned int可处理的范围
III、 需要考虑 '0' 开始的数字字符串情况,比如 "00035" ,应转换为整数35;
"000" 应转换为整数0;"00.0035" 应转换为整数0和35(忽略小数点:mmm.nnn当成两个数mmm和nnn来识别)
IV、 输入字符串不会超过100 Bytes,请不用考虑超长字符串的情况。
示例
输入:strIn = "ab00cd+123fght456-25 3.005fgh"
输出:n = 6
outArray = {0, 123, 456, 25, 3, 5}
19.
.通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
比如字符串“abacacde”过滤结果为“abcde”。
示例
输入:“deefd” 输出:“def”
输入:“afafafaf” 输出:“af”
输入:“pppppppp” 输出:“p”
也可用string &find(); string &push_back(char);来实现。
20.
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
a. 仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc".
b. 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"
示例
输入:“cccddecc” 输出:“3c2de2c”
输入:“adef” 输出:“adef”
输入:“pppppppp” 输出:“8p”
#include<iostream>
using namespace std;
void main()
{
char *input=new char[100];
char *output=new char[100];
cin>>input;
int m=strlen(input);
int k=0;
for(int i=0;i<m;)
{
char temp=input[i];
int num=1;
while(1)
{
if(temp==input[++i])
num++;
else
break;
}
if(num==1)
output[k++]=input[i-1];
else
{
output[k++]=num+'0';
output[k++]=input[i-1];
}
}
output[k++]='\0';
cout<<output<<endl;
delete []input;
delete []output;
}
注:其思想主要是对“块”的处理,连续相同的字符串为一块18题连续的数字为一块。采用内循环while来切割块。
将一个字符串的元音字母复制到另一个字符串,并排序(30分)
问题描述:
有一字符串,里面可能包含英文字母(大写、小写)、数字、特殊字符,现在需要实现一函数,将此字符串中的元音字母挑选出来,存入另一个字符串中,并对字符串中的字母进行从小到大的排序(小写的元音字母在前,大写的元音字母在后,依次有序)。
说明:
1、 元音字母是a,e,i,o,u,A,E,I,O,U。
2、 筛选出来的元音字母,不需要剔重;
最终输出的字符串,小写元音字母排在前面,大写元音字母排在后面,依次有序。
要求实现函数:
void sortVowel (char* input, char* output);
【输入】 char* input,表示输入的字符串
【输出】 char* output,排好序之后的元音字符串。
【返回】 无
示例
输入:char *input = “Abort!May Be Some Errors In OutSystem. “
输出:char *output =“aeeeooAEIO “
#include <iostream> using namespace std; void sortVowel(char *input,char *output) { int n=strlen(input); char *p=new char ; char *P=new char ; //char p[100]; //char P[100]; char *q="aeiou"; char *Q="AEIOU"; int k=0,l=0,temp; for(int i=0;i<n;i++)//分别存储小写、大写元音字母 { for(int j=0;j<5;j++) { if(q[j]==input[i]) p[k++]=input[i]; if(Q[j]==input[i]) P[l++]=input[i]; } } for(int i=0;i<k;i++)//对小写排序 { for(int j=1;i+j<k;j++) { if(p[i]>p[i+j]) { temp=p[i]; p[i]=p[i+j]; p[i+j]=temp; } } } for(int i=0;i<l;i++)//大写排序 { for(int j=1;i+j<l;j++) { if(P[i]>P[i+j]) { temp=P[i]; P[i]=P[i+j]; P[i+j]=temp; } } } for(int i=0;i<k;i++) output[i]=p[i]; for(int i=k;i<l+k;i++)//合并 output[i]=P[i-k]; for(int i=0;i<l+k;i++) cout<<output[i]<<' '; delete []p; delete []P; } void main() { char *input=new char[100]; cin.get(input,100);//可接受空格 int n=strlen(input); char *output=new char ; sortVowel(input,output); delete []input; delete []output; }
注:
cin>>
可用于接受一个字符串,遇“空格”、“TAB”、“回车”都结束
cin.get()
用法1:
cin.get(字符变量名)可以用来接收字符。char ch; ch=cin.get;
用法2:cin.get(字符数组名,接收字符数目)用来接收一行字符串,可以接收空格。用法同cin.getline()。char
a[20]; cin.get(a,20);
详见:http://www.cnblogs.com/wanghao111/archive/2009/09/05/1560822.html
17.
身份证号码合法性判断
问题描述:
我国公民的身份证号码特点如下:
1、 长度为18位;
2、 第1~17位只能为数字;
3、 第18位可以是数字或者小写英文字母x。
4、 身份证号码的第7~14位表示持有人生日的年、月、日信息。
例如:511002198808080111或51100219880808011x。
请实现身份证号码合法性判断的函数。除满足以上要求外,需要对持有人生日的年、月、日信息进行校验。年份大于等于1900年,小于等于2100年。需要考虑闰年、大小月的情况。所谓闰年,能被4整除且不能被100整除 或 能被400整除的年份,闰年的2月份为29天,非闰年的2月份为28天。其他情况的合法性校验,考生不用考虑。
函数返回值:
1) 如果身份证号合法,返回0;
2) 如果身份证号长度不合法,返回1;
3) 如果身份证号第1~17位含有非数字的字符,返回2;
4) 如果身份证号第18位既不是数字也不是英文小写字母x,返回3;
5) 如果身份证号的年信息非法,返回4;
6) 如果身份证号的月信息非法,返回5;
7) 如果身份证号的日信息非法,返回6(请注意闰年的情况);
【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。
要求实现函数:
int verifyIDCard(char* input)
【输入】 char* input,表示输入的身份证号码字符串
【输出】 无
【返回】 判断的结果,类型为int
示例
1) 输入:”511002111222”,函数返回值:1;
2) 输入:”511002abc123456789”,函数返回值:2;
3) 输入:”51100219880808123a”,函数返回值:3;
4) 输入:”511002188808081234”,函数返回值:4;
5) 输入:”511002198813081234”,函数返回值:5;
6) 输入:”511002198808321234”,函数返回值:6;
7) 输入:”511002198902291234”,函数返回值:7;
8) 输入:”511002198808081234”,函数返回值:0;
#include<iostream> #include<cmath> using namespace std; int verifyIDCard(char *input) { int year[4],y=0,month[2],m=0,day[2],d=0; int n=strlen(input); if(n!=18) return 1; for(int i=0;i<n-1;i++) { if(input[i]<'0'||input[i]>'9') return 2; } if((input[n-1]>'9'||input[n-1]<'0')) if(input[n-1]!='x') return 3; for(int i=6;i<10;i++) year[i-6]=input[i]; for(int i=0;i<4;i++) y+=(year[i]-'0')*pow(10.0,3-i); if(y>2010||y<1900) {cout<<y<<endl; return 4; } for(int i=10;i<12;i++) month[i-10]=input[i]; for(int i=0;i<2;i++) m+=(month[i]-'0')*pow(10.0,1-i); if(m>12||m<1) return 5; if(m==1||m==3||m==5||m==7||m==8||m==10||m==12) { for(int i=12;i<14;i++) day[i-12]=input[i]; for(int i=0;i<2;i++) d+=(day[i]-'0')*pow(10.0,1-i); if(d>31||d<1) return 6; } if(m==4||m==6||m==9||m==11) { for(int i=12;i<14;i++) day[i-12]=input[i]; for(int i=0;i<2;i++) d+=(day[i]-'0')*pow(10.0,1-i); if(d>30||d<1) return 6; } if(m==2) { if(y%4==0&&y%100!=0&&y%400!=0) { for(int i=12;i<14;i++) day[i-12]=input[i]; for(int i=0;i<2;i++) 4000 d+=(day[i]-'0')*pow(10.0,1-i); if(d>29||d<1) return 7; } else { for(int i=12;i<14;i++) day[i-12]=input[i]; for(int i=0;i<2;i++) d+=(day[i]-'0')*pow(10.0,1-i); if(d>28||d<1) return 7; } } return 0; } void main() { char *input=new char[100]; cin.get(input,100); int num=verifyIDCard(input); cout<<num<<endl; }
18.
识别字符串中的整数并转换为数字形式(40分)
问题描述:
识别输入字符串中所有的整数,统计整数个数并将这些字符串形式的整数转换为数字形式整数。
要求实现函数:
void take_num(const char *strIn, int *n, unsigned int *outArray)
【输入】 strIn: 输入的字符串
【输出】 n: 统计识别出来的整数个数
outArray:识别出来的整数值,其中outArray[0]是输入字符串中从左到右第一个整数,
outArray[1]是第二个整数,以此类推。数组地址已经分配,可以直接使用
【返回】无
注:
I、 不考虑字符串中出现的正负号(+, -),即所有转换结果为非负整数(包括0和正整数)
II、 不考虑转换后整数超出范围情况,即测试用例中可能出现的最大整数不会超过unsigned int可处理的范围
III、 需要考虑 '0' 开始的数字字符串情况,比如 "00035" ,应转换为整数35;
"000" 应转换为整数0;"00.0035" 应转换为整数0和35(忽略小数点:mmm.nnn当成两个数mmm和nnn来识别)
IV、 输入字符串不会超过100 Bytes,请不用考虑超长字符串的情况。
示例
输入:strIn = "ab00cd+123fght456-25 3.005fgh"
输出:n = 6
outArray = {0, 123, 456, 25, 3, 5}
#include <iostream> #include <cmath> using namespace std; void take_num(const char *strIn,int *n,unsigned int *outArray) { int num=strlen(strIn); char *temp=new char[100]; int m=0; for(int i=0;i<num;i++) { if(strIn[i]<='9'&&strIn[i]>='0') { int j=0,r=0; while(1)//-------------------提取出相连的数字块存储到temp[] { temp[j++]=strIn[i++]; if(strIn[i]>'9'||strIn[i]<'0') break; } for(int k=0;k<j;k++) { r+=(temp[k]-'0')*pow(10.0,j-k-1); } outArray[m++]=r; } } for(int i=0;i<m;i++) cout<<outArray[i]<<' '; } void main() { char *strIn=new char[100]; cin.get(strIn,100); int n=0; unsigned int *outArray=new unsigned int[100]; take_num(strIn,&n,outArray); }注:思想:从从第一个字符开始遍历整个字符串,当遇到字符型数字将其提取出来并检测后面相连的是否也是数字,如果是将其和前者放在一组,直到检测出非数字,再从此位置(数字块的末尾)继续遍历字符串。
#include<iostream> #include<cmath> using namespace std; void take_num(const char* strIn,int *n,unsigned int* outArray) { int m=strlen(strIn),l=0; for(int i=0;i<m;i++) { if(strIn[i]>='0'&&strIn[i]<='9') { int temp[10],k=0; while(strIn[i]>='0'&&strIn[i]<='9') { temp[k++]=strIn[i]-'0'; i++; } int sum=0; for(int j=0;j<k;j++) sum+=temp[j]*pow(10.0,k-j-1); outArray[l++]=sum; } } *n=l; } void main() { char strIn[100]; cin.getline(strIn,100); unsigned int outArray[100]; int *n=new int; take_num(strIn,n,outArray); cout<<*n<<endl; for(int i=0;i<*n;i++) cout<<outArray[i]<<' '; delete n; }
19.
.通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
比如字符串“abacacde”过滤结果为“abcde”。
示例
输入:“deefd” 输出:“def”
输入:“afafafaf” 输出:“af”
输入:“pppppppp” 输出:“p”
#include <iostream> using namespace std; void main() { char *str=new char[100]; char *result=new char[100]; cin>>str; int n=strlen(str); result[0]=str[0]; int m=1; for(int i=1;i<n;i++) { bool k=0; for(int j=0;j<m;j++) { if(result[j]==str[i]) k=1; } if(!k) result[m++]=str[i];//k=0表示新字符同result[]中的字符都不相同 } for(int i=0;i<m;i++) cout<<result[i]<<' '; }注:把k设为BOOL型默认false,如果内循环有相同的数,k置1,最后k为false时输出这个字符。k也可指定为比较不相等的次数。
也可用string &find(); string &push_back(char);来实现。
#include<iostream> using namespace std; void filter(char* in,char* out) { int n=strlen(in); int array[200]={0}; int m=0; for(int i=0;i<n;i++) { if(array[in[i]]==0) { out[m++]=in[i]; array[in[i]]=1; } } out[m]='\0'; } void main() { char in[100],out[100]; cin.getline(in,100); filter(in,out); cout<<out<<endl; }
20.
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
a. 仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc".
b. 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"
示例
输入:“cccddecc” 输出:“3c2de2c”
输入:“adef” 输出:“adef”
输入:“pppppppp” 输出:“8p”
#include<iostream>
using namespace std;
void main()
{
char *input=new char[100];
char *output=new char[100];
cin>>input;
int m=strlen(input);
int k=0;
for(int i=0;i<m;)
{
char temp=input[i];
int num=1;
while(1)
{
if(temp==input[++i])
num++;
else
break;
}
if(num==1)
output[k++]=input[i-1];
else
{
output[k++]=num+'0';
output[k++]=input[i-1];
}
}
output[k++]='\0';
cout<<output<<endl;
delete []input;
delete []output;
}
注:其思想主要是对“块”的处理,连续相同的字符串为一块18题连续的数字为一块。采用内循环while来切割块。
相关文章推荐
- 【1】C++实现内核链表功能
- 设计模式--责任链模式C++实现
- C语言之指针 到现在还是很模糊 ->
- C++ Primer 5th - 1.5 类
- C++实现开机启动
- c++Primer5,总览与IO库和泛型算法
- c++ 函数返回引用
- leetcode Add Digits 之C语言实现
- leetcode Add Digits 之C++实现
- 设计模式--命令模式C++实现
- leetcode之Nim Game C语言实现
- leetcode之Nim Game C++实现
- leetcode 之Maximum Depth of Binary Tree 用 C语言实现
- 认识Visual C++各个版本
- 结构体大小问题
- c++ 强制类型转换 static_cast dynamic_cast reinterpret_cast和const_
- [面试] C++ STL(一)—— 向一个vector中添加N个元素,平均的添加的性能是?
- C语言中将数字转换为字符串的方法
- 进程间的相互通讯 C++
- c++ 中__declspec 的用法