小程序练手(c++)
2014-12-08 10:25
169 查看
给定一个数组input[] ,如果数组长度n为奇数,则将数组中最大的元素放到 output[] 数组最中间的位置,如果数组长度n为偶数,则将数组中最大的元素放到 output[] 数组中间两个位置偏右的那个位置上,然后再按从大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下的数。
例如:input[] = {3, 6, 1, 9, 7} output[] = {3, 7, 9, 6, 1};
input[] = {3, 6, 1, 9, 7, 8} output[] = {1, 6, 8, 9, 7, 3}
操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中,系统任务的优先级 < 50,用户任务的优先级 >= 50且 <= 255。优先级大于255的为非法任务,应予以剔除。现有一任务队列task[],长度为n,task中的元素值表示任务的优先级,数值越小,优先级越高。函数scheduler实现如下功能,将task[] 中的任务按照系统任务、用户任务依次存放到 system_task[] 数组和 user_task[] 数组中(数组中元素的值是任务在task[] 数组中的下标),并且优先级高的任务排在前面,数组元素为-1表示结束。
例如:task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99} system_task[] = {0, 3, 1, 7, -1} user_task[] = {4, 8, 2, 6, -1}
字符串替换:编写一个字符串替换函数,如strSrc为原字符串,strFind是待替换的字符串,strReplace为替换字符串。
举个直观的例子吧,如:“ABCDEFGHIJKLMNOPQRSTUVWXYZ”这个字符串,把其中的“RST”替换为“ggg”这个字符串,结果就变成了:
ABCDEFGHIJKLMNOPQgggUVWXYZ
***号码合法性判断
问题描述:
我国公民的***号码特点如下:
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;
问题描述:
识别输入字符串中所有的整数,统计整数个数并将这些字符串形式的整数转换为数字形式整数。
要求实现函数:
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}
通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。
补充说明:
1. 操作数为正整数,不需要考虑计算结果溢出的情况。
2. 若输入算式格式错误,输出结果为“0”。
示例
输入:“4 + 7” 输出:“11”
输入:“4 - 7” 输出:“-3”
输入:“9 ++ 7” 输出:“0” 注:格式错误
例如:input[] = {3, 6, 1, 9, 7} output[] = {3, 7, 9, 6, 1};
input[] = {3, 6, 1, 9, 7, 8} output[] = {1, 6, 8, 9, 7, 3}
#include <iostream> #include <algorithm> using namespace std; int input[100],output[100]; bool compare(int a,int b) { return a>b; //升序排列,如果改为return a>b,则为降序 } int main() { int i,a,b,j=1,n; cin>>n; for(int i=0;i<n;i++) { cin>>input[i]; } sort(input,input+n,compare); i=n/2; output[i]=input[0]; a=b=i; while(j<n) { output[--a]=input[j++]; output[++b]=input[j++]; } for(i=0;i<n;i++) cout<<output[i]<<" "; cout<<endl; return 0; }
操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中,系统任务的优先级 < 50,用户任务的优先级 >= 50且 <= 255。优先级大于255的为非法任务,应予以剔除。现有一任务队列task[],长度为n,task中的元素值表示任务的优先级,数值越小,优先级越高。函数scheduler实现如下功能,将task[] 中的任务按照系统任务、用户任务依次存放到 system_task[] 数组和 user_task[] 数组中(数组中元素的值是任务在task[] 数组中的下标),并且优先级高的任务排在前面,数组元素为-1表示结束。
例如:task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99} system_task[] = {0, 3, 1, 7, -1} user_task[] = {4, 8, 2, 6, -1}
#include <iostream> //此段代码有些问题,基本功能已实现 #include <algorithm> #include <map> using namespace std; map <int,int> W; int main() { int n,i,j=0,k=0; cin>>n; int *task= new int(n); int *system_task=new int(n); int *user_task=new int(n); for(i=0;i<n;i++) { cin>>task[i]; if(task[i]<50) { system_task[j++]=task[i]; W.insert(make_pair(task[i],i)); } if(task[i]>=50&&task[i]<=255) { user_task[k++]=task[i]; W.insert(make_pair(task[i],i)); } } sort(system_task,system_task+j); sort(user_task,user_task+k); for(i=0;i<j;i++) { map <int,int>::iterator it = W.find(system_task[i]); system_task[i]=it->second; cout<<system_task[i]<<" "; } cout<<"-1"<<endl; for(i=0;i<k;i++) { map <int,int>::iterator it = W.find(user_task[i]); user_task[i]=it->second; cout<<user_task[i]<<" "; } cout<<"-1"<<endl; delete []task; delete []system_task; delete []user_task; return 0; }
字符串替换:编写一个字符串替换函数,如strSrc为原字符串,strFind是待替换的字符串,strReplace为替换字符串。
举个直观的例子吧,如:“ABCDEFGHIJKLMNOPQRSTUVWXYZ”这个字符串,把其中的“RST”替换为“ggg”这个字符串,结果就变成了:
ABCDEFGHIJKLMNOPQgggUVWXYZ
#include <iostream> #include <string> using namespace std; string strSrc,strFind,strReplace; int main() { cin>>strSrc>>strFind>>strReplace; int i=strSrc.find(strFind); int length=strFind.length(); strSrc.replace(i,length,strReplace); cout<<strSrc<<endl; return 0; }
***号码合法性判断
问题描述:
我国公民的***号码特点如下:
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 <string> #include <ctype.h> using namespace std; int IsRuinian(int x) { if(x%4==0&&x%100!=0||x%400==0) return 1; return 0; } int verifyIDCard(string str) { if(str.length()<18) return 1; else { for(int i=0;i<str.length()-1;i++) if(!isdigit(str[i])) return 2; if(!isdigit(str[str.length()-1])&&str[str.length()-1]!='x') return 3; int sum = 0; for(int i=6;i<=9;i++) { sum=sum*10+str[i]-'0'; //此处之前忘记减去‘0’了 } if(sum>2100||sum<1900) return 4; int monthsum=0; for(int i=10;i<=11;i++) monthsum=monthsum*10+str[i]-'0'; if(monthsum>12||monthsum<1) return 5; int daysum=0; for(int i=12;i<=13;i++) daysum=daysum*10+str[i]-'0'; if(IsRuinian(sum)&&monthsum==2&&daysum>29 || !IsRuinian(sum)&&monthsum==2&&daysum>28 || daysum>31 ||daysum==0) return 6; } return 0; } int main() { string str; while(cin>>str) { cout<<verifyIDCard(str)<<endl; } return 0; }
问题描述:
识别输入字符串中所有的整数,统计整数个数并将这些字符串形式的整数转换为数字形式整数。
要求实现函数:
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 <string> #include <ctype.h> using namespace std; int k=0,n=0; void take_num(const string strIn,int *outArray) { int sum=0; for(int i=0;i<strIn.length();i++) { if(isdigit(strIn[i])) { sum=sum*10+strIn[i]-'0'; if(!isdigit(strIn[i+1])) { outArray[k++]=sum; n++; sum=0; } } } } int main() { string str; //cin>>str; getline(cin,str); //若要读入带空格的串,用getline(cin,str);替换cin>>str; int *outArray = new int[str.length()]; take_num(str,outArray); cout<<n<<endl; for(int i=0;i<k;i++) cout<<outArray[i]<<" "; cout<<endl; return 0; }
通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。
补充说明:
1. 操作数为正整数,不需要考虑计算结果溢出的情况。
2. 若输入算式格式错误,输出结果为“0”。
示例
输入:“4 + 7” 输出:“11”
输入:“4 - 7” 输出:“-3”
输入:“9 ++ 7” 输出:“0” 注:格式错误
#include<iostream> #include<string> #include<ctype.h> using namespace std; int a[3]; int calculate (string str) { int sum = 0,k=0; for(int i=0;i<str.length();i++) { if(isdigit(str[i])&&str[i]!=' ') sum=sum*10+str[i]-'0'; if(str[i]==' '||i==str.length()-1) { a[k++]=sum; sum=0; } if(str.find('+')!=str.rfind('+')||str.find('-')!=str.rfind('-')) return 0; } if(str.find('+')!=-1) return a[0]+a[2]; else if(str.find('-')!=-1) return a[0]-a[2]; } int main() { string str; while(getline(cin,str)) { cout<<calculate(str)<<endl; } return 0; }
相关文章推荐
- 算法导论第三版 练手程序C++(第二章)(2)
- 算法导论第三版 练手程序C++(第二章)(1)
- C++练手小程序 用vector使小写文本变为大写
- C++练手小程序 整数幂的计算
- 用PHP实现通过Web执行C/C++程序
- 如何将C/C++程序转译成Delphi(十)
- 如何将C/C++程序转译成Delphi(十四)
- 如何将C/C++程序转译成Delphi(十三)
- 如何将C/C++程序转译成Delphi(九)
- 如何将C/C++程序转译成Delphi
- 在你的C++程序里实现委托
- 解决RedHat Linux 8.0下的Kylix 3在C++ IDE模式中不能编译程序的办法(最简单的办法)
- More Effective C++ Item M34:如何在同一程序中混合使用C++和C
- >>VC++6.0 和 Dev-C++4989 编译的程序性能差
- 如何写好C/C++程序
- 在win32 api程序中:使用C++风格的字符串
- C++实战之程序书法
- 如何将C/C++程序转译成Delphi(八)
- 解决RedHat Linux 8.0下的Kylix 3在C++ IDE模式中不能编译程序的办法
- wxWindows 2--用C++编写跨平台程序--转