注册 登录
编程论坛 C++教室

[求助]进来关注一下这个小游戏程序,找出问题~

oggplay 发布于 2007-07-01 10:36, 1614 次点击

功能实现:任意给定5个数字,其中必定存在3个数字已经有序(或者升序,或者降序),找出这5个数字中最长的升序或降序序列。
例如:1,7,5,3,9。则{1,7,9},{1,5,9},{1,3,9}都是最长的升序序列;
而{7,5,3}是最长的降序序列。
再如:1,3,2,5,7。最长的升序序列为{1,3,5,7}和{1,2,5,7}。

自动生成各种可能的序列,对于5个数字所有可能的序列为:
{0,1,2,3}、{0,1,2,4}、{0,1,3,4}、{0,2,3,4}、{1,2,3,4}
{0,1,2}、{0,1,3}、{0,2,3}、{1,2,3}
{0,1,4}、{0,2,4}、{1,2,4}
{1,3,4}
{2,3,4}、{0,3,4}
考察各种可能的序列是否升序或是降序,若是则打印;




《《有什么错误纠正一下,调试其正确,能不能把BOOL函数用语句什么的替代了啊 ,我们没学过这个函数。
using namespace std; 能不能删掉啊?大家多帮帮忙——把它搞正确了,感激 不尽》》



#include <iostream>
using namespace std;

//判断序列是不是升序排列
bool is_up_ordered(int a, int b, int c, int d = -1, int e = -1){
if (e == -1)
return (a<b && b<c && c<d && d<e);
else if (d == -1)
return (a<b && b<c && c<d);
else
return (a<b && b<c);
}

//判断序列是不是降序排列
bool is_down_ordered(int a, int b, int c, int d = -1, int e = -1){
if (e == -1)
return (a>b && b>c && c>d && d>e);
else if (d == -1)
return (a>b && b>c && c>d);
else
return (a>b && b>c);
}

int main(){
int a[5];
int mark = 0;
//从终端输入5个数字
cin >> a[0] >> a[1] >> a[2] >> a[3] >> a[4];

//下面是找出升序序列
cout << "升序排序:" << "\n";

if (is_up_ordered(a[0], a[1], a[2], a[3], a[4])){
cout << a[0] << a[1] << a[2] << a[3] << a[4] << "\n";
}
else {
for (int i = 0; i < 5; ++i)
for (int j = i+1; j < 5; ++j)
for (int k = j+1;k < 5;++k)
for (int l = k+1;l < 5;++l){
if (is_up_ordered(a[i],a[j],a[k],a[l])){
cout << a[i] << a[j] << a[k] << a[l] << "\n";
mark = 1;
}
}
}
if (mark != 1){
for (int i = 0;i < 5;++i)
for (int j = i+1;j < 5;++j)
for (int k = j+1;k < 5;++k){
if (is_up_ordered(a[i],a[j],a[k]))
cout << a[i] << a[j] << a[k] << "\n";
}
}

mark = 0;
//下面是找出降序序列
cout << "降序排序:" << "\n";

if (is_down_ordered(a[0], a[1], a[2], a[3], a[4]){
cout << a[0] << a[1] << a[2] << a[3] << a[4] << "\n";
}
else {
for (int i = 0; i < 5; ++i)
for (int j = i+1; j < 5; ++j)
for (int k = j+1;k < 5;++k)
for (int l = k+1;l < 5;++l){
if (is_down_ordered(a[i],a[j],a[k],a[l])){
cout << a[i] << a[j] << a[k] << a[l] << "\n";
mark = 1;
}
}
}
if (mark != 1){
for (int i = 0;i < 5;++i)
for (int j = i+1;j < 5;++j)
for (int k = j+1;k < 5;++k){
if (is_down_ordered(a[i],a[j],a[k]))
cout << a[i] << a[j] << a[k] << "\n";
}
}
system("pause");
}

[此贴子已经被作者于2007-7-1 14:33:36编辑过]

14 回复
#2
oggplay2007-07-01 12:20
回复:(oggplay)XDJM看一下这个小游戏程序,有什么错...

小弟我条件有限,只是也 有限,而且现在没有VC++6.0的软件
高手们帮忙看下吧

#3
oggplay2007-07-01 14:34
版主来指点一下啊~
#4
aipb20072007-07-01 14:51
你的问题是什么?
你编译下看有什么错误。
#5
aipb20072007-07-01 15:01
https://bbs.bc-cn.net/viewthread.php?tid=150319

你把简单问题复杂化了,参考下上面这个帖子。
#6
oggplay2007-07-01 15:24
回复:(aipb2007)http://bbs.bc-cn.net/dispbbs.asp...

问题 是总 有 一处错误/找不到

版主 的 写的那个第二段 是实现的 升序 ?还是降序?还是什么
能不 能说明白点,我在线等

#7
aipb20072007-07-01 15:46
我写那个是有序!

你可以把那个函数改为两个,升和降,然后判断的位置都不变。

你的代码我看了下,思路基本上对,但是有错误,太复杂。
你完全可以把3个和4个的情况放到一起考虑,就像我那里那样。
#8
oggplay2007-07-01 16:30
回复:(aipb2007)我写那个是有序!你可以把那个函数...
晕了,版主帮我写出来吧,我听你的 不是 很懂,3.4合一?
特别是 降序, 我非常搞不定 。你把 整个你的方法的 写出来,我来 研究一下
特别 是 降序,我向 看看你写的套路
谢了,我在线等~
#9
aipb20072007-07-01 17:04
[CODE]#include <iostream>
using namespace std;
bool is_ordered(int a,int b,int c,int d = 0){
if (d)
return (a>b && b>c && c>d) || (a<b && b<c && c<d);
else
return (a>b && b>c) || (a<b && b<c);
}

bool is_increase(int a,int b,int c,int d = 0){
if (d)
return a<b && b<c && c<d;
else
return a<b && b<c;
}

bool is_decrease(int a,int b,int c,int d = 0){
if (d)
return a>b && b>c && c>d;
else
return a>b && b>c;
}

int main(){
int a[] = {1,4,3,2,5};

for (int i = 0;i < 5;++i)
for (int j = i+1;j < 5;++j)
for (int k = j+1;k < 5;++k){
if (is_increase(a[i],a[j],a[k]))
cout << "升序" << a[i] << a[j] << a[k] << "\n";
if (is_decrease(a[i],a[j],a[k]))
cout << "降序" << a[i] << a[j] << a[k] << "\n";
for (int l = k+1;l < 5;++l){
if (is_increase(a[i],a[j],a[k],a[l]))
cout << "升序" << a[i] << a[j] << a[k] << a[l] << "\n";
if (is_decrease(a[i],a[j],a[k],a[l]))
cout << "降序" << a[i] << a[j] << a[k] << a[l] << "\n";
}
}
system("pause");
}[/CODE]

自己理解下,不要光copy!
GOOD LUCK
#10
oggplay2007-07-01 17:13
回复:(aipb2007)[CODE]#include u...
谢谢斑竹了,你 这个比我那个简单 太 多啊,呵呵,不可思议啊
那个bool函数可以用普通语句替代吗,我们设计要求里不 能 用BOOL
#11
aipb20072007-07-01 17:32
还有这种要求?
你就不用函数,把上面要用函数的地方全部换成函数的实现代码。


#12
oggplay2007-07-01 18:07

如果把BOOL换成VOID应该 怎么 实现

#13
zhufeng7142007-07-04 21:01

根据你说的功能 我写的程序如下!
// maxinorder.cpp : Defines the entry point for the console application.
//
#include <iostream>
#define COUNT 5

void inDECorder(int* pData,bool jiang);
int main()
{
int data[COUNT];
cout<<"input data------------------------------------------------------"<<std::endl;
for(int i=0;i<COUNT;i++)
{
cout<<"input data "<<i + 1<<" "<<std::endl;
cin>>data[i];
}
inDECorder(data,true);
cout<<"所有的降序排列如上所示"<<endl;
//下面将反转data数组 并将反转结果保留在rdata中
int rdata[COUNT];
for(int i=0;i<COUNT;i++)
{
rdata[i] = data[COUNT-i-1];
}
//对反转后的数据来求降序就得到原数据的升序
inDECorder(rdata,false);
cout<<"所有的升序如上所示"<<endl;
return 0;
}
void inDECorder(int* pData,bool jiang)
//参数解释pData原数据指针,jiang标志是否用该函数得到降序的输出结果
{
//cout<<pData[2]<<endl; //test code
int counter = 0;
int temp[3] = {0,0,0};
for(int i = 0;i < COUNT - 2;i++)
{
temp[0] = pData[i];
for(int j = i+1; j < COUNT - 1;j++)
{
if(pData[i] > pData[j]) //如果找到第二个数据就存储到临时数组中
{
temp[1] = pData[j];
for(int k = i+1; k < COUNT;k++)
{
if(pData[j] > pData[k])
{
temp[2] = pData[k];
counter++;
if(jiang) //根据标志变量来得到输出的顺序是否逆向
{
cout<<temp[0]<<"\t"
<<temp[1]<<"\t"
<<temp[2]<<endl;
}
else
{
cout<<temp[2]<<"\t"<<temp[1]<<"\t"<<temp[0]<<endl;
}//if
}//if inner
}//for 3
temp[1] = 0;//记得清零哦
}//if outer
}//for 2
}//for 1
cout<<"总数"<<"\t"<<counter<<endl;
}
时间就是生命是我的追求

#14
zhufeng7142007-07-04 21:06
斑竹给出的程序好象函数的调用次数比较多,如果循环比较深,的话,函数调用次数过多会造成内存堆栈区的占用过大,但是循环过深也好象影响效率我也是个新手,刚刚学西C++ 将近一年,以前学习JAVA的,希望今后多关照.
#15
zhufeng7142007-07-04 21:09
我的程序的缺点:输出在函数的内部,只是能够满足这道题的要求:得到序列,但是不能够很好的把得到的序列返回,如果要返回序列就需要动态分配数组来存储.我的目标是最小的代价,最快的效率!
1