问题描述
(1)商贩卖pig
一个商贩养了一批猪,有一天赶着pig去村庄卖,每经过一个村庄就卖掉所有pig的一半又一只。这样他经过了 7 个村子后还剩 2 只pig,请计算并输出他一共养了多少只pig?输出经过每个村子卖出多少只pig?
(2)电话号码对应的字符组合
在电话或者手机上,一个数字比如 2 对应着字母 ABC,7 对应着PQRS。那么数字串 27 所对应的字符的可能组合就有 3*4=12 种(如AP,BR 等)。现在输入一个 3 到 11 位长的电话号码,请打印出这个电话号码所对应的字符的所有可能组合和组合数。
问题分析
注:此处只对两个函数进行分析,且函数标号与标题一致
-
Void useFun1()
输入:用户需要输入商贩到第几个村庄后(vnum)还剩下多少只pig(pnum);
输出:到第几个村庄时有多少只pig,卖掉了多少只pig,最后pig总数;
主要处理过程:利用递归函数int fun1(int vnum,int pnum)计算需要输出 的数据。 -
Void useFun2()
输入:用户只需要输入电话号码即可(标准输入为3-11)位;
输出:输入的号码对应九宫格拼音输入共有多少种组合方式,并输出这些组 合方式;
主要处理过程:利用递归函数
void fun2(int num[],int pos[],int c,int len)计算组合 方式数目并输出这些组合方式。
在主方法中调用相关函数满足用户需求即可
流程设计
源代码
#include <iostream>
#include <strings.h>
#include <windows.h>
using namespace std;
//存放每个数字对应的字母组合
static char ch[10][5] = {
{}, //0
{}, //1
{'A','B','C'}, //2
{'D','E','F'}, //3
{'G','H','I'}, //4
{'J','K','L'}, //5
{'M','N','O'}, //6
{'P','Q','R','S'}, //7
{'T','U','V'}, //8
{'W','X','Y','Z'} //9
};
//存放每个数字对应的字母的个数
static int total[] = {0,0,3,3,3,3,3,4,3,4};
//实现第一个问题的递归函数
int fun1(int vnum,int pnum);
//负责使用上述函数,保证和用户良好的交互
void useFun1();
//实现第二个问题的递归函数
void fun2(int num[],int pos[],int c,int len);
//实现第二个问题的循环函数,此函数与上个函数功能相同
void fun2x(int num[],int pos[],int c,int len);
//负责调用上述两个函数之一
void useFun2();
int main()
{
system("title ps&pnc");//设置控制台标题
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
COORD size_x;
size_x.X = 61;
size_x.Y = 200;
SetConsoleScreenBufferSize(hOut,size_x);//设置字缓冲区大小
SMALL_RECT rc;
rc.Left = 0;
rc.Top = 0;
rc.Right = 60;
rc.Bottom = 15;
SetConsoleWindowInfo(hOut, TRUE, &rc);//设置窗口大小
do{
system("cls");
char re;
cout << "\t(1) calculation the amount of pigs" << endl;
cout <<"\t(2) calculation the combination of phone number" << endl;
cout <<"\t(0) exit" << endl <<endl;
cout << "\tplease input digit to select function: ";
cin >> re;
if(re == '1')
useFun1();
else if(re == '2')
useFun2();
else if(re == '0')
break;
else{
cout << "please input right digit!" <<endl;
system("pause");
continue;
}
}while(true);
return 0;
}
int fun1(int vnum,int pnum,int& f){
if(vnum == 1){
cout << "no:" <<f << " have: " << (pnum+1)*2 <<" sale:" << 4 << endl;
return (pnum+1)*2;
}
int re = fun1(--vnum,pnum,f);
int sum = (re + 1) *2;
f --;
cout << "no:" << f << " have: " << sum << " sale:" << sum - re << endl;
return sum;
}
void useFun1(){
system("cls");
int temp,flag;
cout << "please input village's no and amount(apart in space):" << endl;
cin >> flag >> temp;
int sum = fun1(flag,temp,flag);
cout << "total: " << sum << endl;
system("pause");
}
void useFun2(){
system("cls");
char tel[12];
cout << "please input telephone number: " << endl;
cin >> tel;
int lenc = strlen(tel);
int numc[lenc];//保存输入的非(‘0’和‘1’)对应的数字
int posc[lenc];//保存各个数字当前应输出的字母的位置
int counts = 0;
//这里获取‘0’和‘1’这样的字符有多少个
for(int i =0;i< lenc;i++){
if(tel[i] == '0' || tel[i] == '1')
counts++;
}
//将不是‘0’或者‘1’的数字字符放入numc数组中
for(int i = 0,j = 0;i < lenc;i++){
if(tel[i] != '0' && tel[i] != '1'){
numc[j] = tel[i] - '0';
posc[j++] = 0;
}
}
lenc = lenc - counts;
int temp = 1;
//计算组合数目
for(int i =0;i < lenc;i++)
temp *= total[numc[i]];
cout << "total: " << temp << endl;
cout <<"possible combination:" <<endl;
fun2(numc,posc,0,lenc);
cout << endl;
system("pause");
}
void fun2(int num[],int pos[],int c,int len){
if(c == len){
for(int i =0;i< len;i++){
cout << ch[num[i]][pos[i]];
}
cout << endl;
return;
}
for(pos[c] = 0; pos[c] < total[num[c]];pos[c]++){
fun2(num,pos,c+1,len);
}
}
void fun2x(int num[],int pos[],int c,int len){
while(true){
for(int i=0; i<len; i++){
cout << ch[num[i]][pos[i]];
}
cout << endl;
int k=len-1;
while(k>=0){
if(pos[k]<total[num[k]]-1){
pos[k]++;
break;
}else{
pos[k]=0;
k--;
}
}
if(k<0)
break;
}
}
测试
Menu测试
Function1测试
Function2测试
Exit测试
读者可以自行设计测试样例
更多相关内容请参见