论坛风格切换
  • 723阅读
  • 4回复

[求助][悬赏5天]C++小程序的 [复制链接]

上一主题 下一主题
离线枸鸺槿
 
发帖
157
重量
2001
香味
1015
好感度
200
200
只看楼主 倒序阅读 使用道具 0F 发表于: 2010-12-06
本帖最后由 枸鸺槿 于 2010年12月6日 11:10 编辑

因为周五要交一个c++作业,咱还没做啊……
具体要求有很多,其实总结起来就下面这句话

1.
程序(或项目)不要求太大,可以是一个小算法、一个较实用的类或一个小的应用程序等,同学们要自己动手锻炼。



那个,因为上课没听,所以会悲剧的啦~~
然后程序的话我希望是注释什么的多点的OTL
好吧,先说到这里了……
P.S.啊,补充点啊,举例比如计算器啊什么的都行……
离线nemoma

发帖
182
重量
21
香味
705
好感度
200
200
只看该作者 1F 发表于: 2010-12-06
既然你说是计算器,那么就计算器吧。
另:我也是从网上找的。
附件: C++计算器的设计.doc (443 K) 下载次数:3
离线夏影
发帖
1945
重量
2065
香味
4608
好感度
200
195
只看该作者 2F 发表于: 2010-12-06
本帖最后由 夏影 于 2010年12月6日 12:46 编辑

正好在研究猜数字,于是我也顺便扔一下上来吧……
虽然代码风格有点乱,不过整体思路还是比较简单的。应该仔细读一读就能看懂……
这代码在学校讨论区里面讨论了一下,应该有更优化的策略,不过出于程序的简洁性考虑,还是算了。

为了“程序(或项目)不要求太大,可以是一个小算法、一个较实用的类或一个小的应用程序等,同学们要自己动手锻炼。”的要求……



编译环境codeblocks 10.05通过……

#include<iostream>
#include<cstdlib>
#include<time.h>
using namespace std;
int f(int c[],bool d[],int e[])//正确答案c,猜测答案e,返回一个2位数,10位值为A的数量,个位值为B的数量。参考猜数字规则……
{
int r=0;
for(int i=0; i<4; ++i)
{
r+=d[e];//如果这个数字存在,个位自增。
r+=(c==e)*9;//如果位数相符,10位自增。
}
return r;
}
int main()
{
srand((unsigned)time(NULL));
int c[4]= {},e[4],g[4],i,t,z,q(0);
bool d[10]= {},d2[10]= {},h[10][10][10][10]= {};//d与d2记录某个数字是否已经出现过,h存储已经被排除的数。
for(i=0; i<4; ++i)
{
do t=rand()%10;
while(d[t]);//不重复的数字…
c=t;
d[t]=true;//标记已经出现的数字
}//产生一个随机不重复的四位数
cout<<c[0]<<c[1]<<c[2]<<c[3]<<endl;//输出这个随机数
system(\"pause\");//等待
for(e[0]=0; e[0]<10; ++e[0])
for(e[1]=0; e[1]<10; ++e[1])
for(e[2]=0; e[2]<10; ++e[2])
for(e[3]=0; e[3]<10; ++e[3])//穷举四位数…
{
if (h[e[0]][e[1]][e[2]][e[3]]||e[0]==e[1]||e[0]==e[2]||e[0]==e[3]||e[1]==e[2]||e[1]==e[3]||e[2]==e[3])
continue;//如果这个数字已经被排除或者有两个数位上的数字相同的话跳过。
z=f(c,d,e);//猜数,Z的值为A与B的数量。
for (g[0]=0; g[0]<10; ++g[0])
for(g[1]=0; g[1]<10; ++g[1])
for(g[2]=0; g[2]<10; ++g[2])
for(g[3]=0; g[3]<10; ++g[3])//穷举,对剩下的所有数进行筛选。不符合规定的淘汰掉
{
if (h[g[0]][g[1]][g[2]][g[3]]||g[0]==g[1]||g[0]==g[2]||g[0]==g[3]||g[1]==g[2]||g[1]==g[3]||g[2]==g[3])
continue;//同上,如果这个数字已经被排除或者有两个数位上的数字相同的话跳过。
for(i=0; i<10; ++i)
d2=false;//初始化d2数组,其实可以用memset,我犯懒了。
for(i=0; i<4; ++i)
d2[g]=true;//标记
if (f(g,d2,e)!=z)//如果不符合猜测结果
h[g[0]][g[1]][g[2]][g[3]]=true;//灭了它。
}
cout<<e[0]<<e[1]<<e[2]<<e[3]<<' '<<z<<' '<<++q<<endl;//输出 猜测的数字,猜测的结果(一个2位数,10位值为A的数量,个位值为B的数量。参考猜数字规则……),猜测的次数。
}
return 0;
}


程序执行结果样例:
7158
请按任意键继续. . .
0123 10 1
0456 10 2
0789 2 3
7158 40 4
Process returned 0 (0x0) execution time : 0.265 s
Press any key to continue.

第一行是原始数字,后面是猜数字的过程,三个数依次是猜的数字,返回值(10位为A个位为B)和猜的次数。于是按照筛法,7158这个数只要猜到四次就能猜出来了…


下面这个就纯属蛋疼了……看看就好。

这个是修改后的,在外面加上一个生成0123-9876的原始数字的循环,对每一个数字进行都猜一遍,看看对于所有的数,最多需要多少步才能出解……#include<iostream>
#include<cstdlib>
#include<time.h>
#include<memory.h>
using namespace std;
int f(int c[],bool d[],int e[])
{
int r=0;
for(int i=0; i<4; ++i)
{
r+=d[e];
r+=(c==e)*9;
}
return r;
}
int main()
{
srand((unsigned)time(NULL));
int c[4]= {},e[4],g[4],i,z,m(0),q;
bool d[10]= {},d2[10]= {},h[10][10][10][10]= {};
for(c[0]=0; c[0]<10; ++c[0])for(c[1]=0; c[1]<10; ++c[1])for(c[2]=0; c[2]<10; ++c[2])for(c[3]=0; c[3]<10; ++c[3])
{
if (c[0]==c[1]||c[0]==c[2]||c[0]==c[3]||c[1]==c[2]||c[1]==c[3]||c[2]==c[3])continue;
for(i=0; i<10; ++i)d=false;
for(i=0; i<4; ++i)d[c]=true;
memset(h,0,sizeof( h ));
q=0;
for(e[0]=0; e[0]<10; ++e[0])for(e[1]=0; e[1]<10; ++e[1])for(e[2]=0; e[2]<10; ++e[2])for(e[3]=0; e[3]<10; ++e[3])
{
if (h[e[0]][e[1]][e[2]][e[3]]||e[0]==e[1]||e[0]==e[2]||e[0]==e[3]||e[1]==e[2]||e[1]==e[3]||e[2]==e[3])continue;
z=f(c,d,e);
for(g[0]=0; g[0]<10; ++g[0])for(g[1]=0; g[1]<10; ++g[1])for(g[2]=0; g[2]<10; ++g[2])for(g[3]=0; g[3]<10; ++g[3])
{
if (h[g[0]][g[1]][g[2]][g[3]]||g[0]==g[1]||g[0]==g[2]||g[0]==g[3]||g[1]==g[2]||g[1]==g[3]||g[2]==g[3])continue;
for(i=0; i<10; ++i)d2=false;
for(i=0; i<4; ++i)d2[g]=true;
if (f(g,d2,e)!=z)
{
h[g[0]][g[1]][g[2]][g[3]]=true;
}
}
q++;
}
cout<<c[0]<<c[1]<<c[2]<<c[3]<<' '<<q<<endl;
m=max(m,q);
}
cout<<m;
return 0;
}

程序执行结果如下:
0123 1
0124 2
0125 3
0126 4
0127 5
0128 6
0129 7
0132 2
0134 2
0135 3
......(中间省略)
9861 6
9862 7
9863 8
9864 5
9865 6
9867 5
9870 7
9871 7
9872 6
9873 5
9874 6
9875 6
9876 6
9
前面每一行依次是生成的原始数字和需要猜测的次数,最后一行输出的9是所有数据中最多需要猜测的次数。

于是蛋疼结论得出,对于任意4位数字,都可以9次内出解……
1条评分
scord  +1 只看懂頭尾兩句... 2010-12-06
离线枸鸺槿
发帖
157
重量
2001
香味
1015
好感度
200
200
只看该作者 3F 发表于: 2010-12-07
补充一下
刚刚弄到了要求……
一、程序(或项目)背景
1. 详细描述程序(或项目)所完成的所有功能;
2. 讲述程序(或项目)的背景与意义。
二、相关技术
1. 列出使用的《C++语言》哪些方面的知识;
2. 列出开发程序(或项目)使用的关键技术(比如多态技术、模版技术、STL技术、链表技术、网络编程技术、数据库编程技术等),并对这些技术进行简单介绍;
3. 列出开发项目使用的C++类库或MFC类库中相关的类。
三、程序(或项目)设计
1. 分析程序(或项目)的开发思路;
2. 画出程序流程图或项目的架构图,并加以适当说明;
3. 给出程序中所采用的数据结构以及拟采用的算法思路;(可选)
4. 画出程序(或项目)中的关键类图,并加以适当说明。(可选)
四、程序(或项目)实现
1. 给出程序(或项目)的关键代码(注:代码量不要超过两页),并加以说明;
2. 列出实现中遇到的问题和解决方案。
五、结果展示
给出程序的测试数据与结果或项目的运行界面,并加以说明;
六、心得体会
给出本次程序(或项目)开发的心得体会,总结自己所学到的知识。
七、参考文献
记录开发过程中主动查阅的纸质和电子文档等资料。

注意事项:
1. 该作业为期末成绩的主要依据,并需要进行存档,同学们要认真对待;
2. 严禁抄袭,对于雷同的作业,一律按零分算;
3. 程序(或项目)不要求太大,可以是一个小算法、一个较实用的类或一个小的应用程序等,同学们要自己动手锻炼。
离线枸鸺槿
发帖
157
重量
2001
香味
1015
好感度
200
200
只看该作者 4F 发表于: 2010-12-11
5天时间终结了……
然后今天呕心沥血终于做了一个计算器的程序……

首先NX的程序用的是MFC……
但是很遗憾的是,我用的是Dev-c,
这本VC++6.0用不了(不过貌似VS2008也能用)
不过用了别人的机子试了下MFC,发现完全不会,藕才不是天才(什么5天学会MFC的都是浮云)
所以NX的方案PASS了……

然后夏影的这个貌似以前竞赛的时候玩过这题目……不过用的肯定不是穷举了……(嘛,其实现在都忘光光了,刚看到代码的时候还差点不懂什么意思……OTL)
嗯,虽然这次没用上,给了我很好的参考价值……下次会试试用这个的。

然后最后我还是写了一个最基础的计算器程序……
只能加减(当然高精度算法是必须的),主要把时间磨在了各种蛋疼判断上了……
然后最后写的纠结……
我正在考虑要不要放上来……
给我的经验就是——千万要把流程图什么的画仔细了OTL
虽然最后都没有采纳你们的建议,但是还是给了我启发的,所以我想把这222平分给你们了(就不用一个人2了orz)……
具体操作,GM帮下吧……
快速回复
限100 字节
克里喵子:注意回帖时随时存档,随时使用草稿功能才是上策!
 
上一个 下一个