c语言编程求找错误!

时间:2020.11.03 发布人:执着gg

c语言编程求找错误!

已解决问题

谷歌执着gg用户在2020.11.03提交了关于“许魏洲c语言编程求找错误!”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2024-11-06T11:13:57。希望大家能够帮助她。

详细问题描述及疑问:期待您的答案,真心佩服你,谢谢 !

希望以下的回答,能够帮助你。

第1个回答

用户名:adnfan5  

按照你的问题:(6种砝码组合,列出所有不同的组合结果)

从编程角度看你的代码轮调,不单纯是错误修改,还有编程思路改进:

一、有5个砝码重量和5个砝码数量,那问答么重量应定义成数组(写程序要考虑需求的修改,比如其它重量组合),而数量也定义成数组(单独写成abcdef可以,但是数量多了不方便阅读维护程序,而且数组可钱呢训始今以循环遍历)。

二、逻辑上,可将组合结果放在一个数组中,每次组合将结果和数组对比,存在就跳过,不存在就保存到数组,最后这个液卫结果数组就是题目要的境虽听及顺亮米济所n种质量。

三、扩展讲,这里重量和数量都是砝码对象的属性,所以实际开传立任伯望季发,这种情况把砝码定义成结构体更好,数量和重量都是其属性。(考虑你学习范围,这里暂用数组解决)

四、结果数组可以定乎守找鱼显纪义一个非常大的数宜序组(但是输入的数字太大可能会超出范围),也可以用动态数组。
下面是代码(我演示代码所航价因应有个数都输入1,这样每种刚好有0和1两种选择,这样刚好就是6位二进制数(对应10进制就是63),和截图一致。打印输出是给你看的,可以注释掉):


#include<stdio.h>

#defineN6//砝码种类的数量,定义常量约望,方便修改

#defineM1000//组合的最大数量

intmain粮跳成田胜底养()

{

intsums[M]={0},len=0,flag,土劳企获期据音吃sTemp;//结果数组,按你写法用大数组,但注意不要输入太大数量,否则使用动态数组

inti,wets[N]={1,2,5,10,15,20},**ms[N]={0};

inta[N],cnt=0,n=0;

for(i=0,printf("请分别输入%d种砝码数量(1,2,5,10,15,20g):\n",N);i<N;scanf("%d",&**ms[i++]));

f老鲜朝满创知因抓米or(a[0]=0;a[0]<=六良致始密属船社**ms[0];县笑除背口a[0]++)/愿烈充促划什/按照你的写法,嵌套循环穷举师缺所有组合

for(a[1]=0;a[1]<=**ms[1];a[1]++风容绍书显心现夜城)//这样写,如需扩展,比如100种砝码,要复制99遍,还要改下标(实际代码太长,所以最好还是用递归函数单独实现,这里不深究)

for(a[2]=0;a[2]<=**ms[2];a[2]++)

for(a[3]=0;a[3]<=云卷引会负甲评至史哥**ms[3];a[3]++)

for(a[4]=0;a[4]<=**ms[4];a[4]++)

for(a[5]=0;a[5]<=**ms[5];a[5]++)

{

cnt++;

printf("个数的组合%d:%d,%d,%d,%d,%d,%d",n++,a[0],a[1],a[2],a[3],a[4],a[5]);//测试用,打印给你看,可注释掉

for(i=0,sTemp=0;i<N;sTemp+=a[i]*wets[i],i++);

printf("(总重量%d)\n",sTemp);//测试用,打印给你看,可注释掉

for(i=0,flag=0;i<len;i++)//与结果数组对比

if(sums[i]==sTemp)

{

flag=1;//发现有重复记录,标识置1

bre**;

}

if(flag)cnt--;//用重复,当前组合结果放弃,不记录

else

{

sums[len]=sTemp;//不重复,记录当前组合结果

len++;

}

}

printf("其中**有%d种不同组合\n",cnt);

for(i=0,printf("总重量分别为:");i<cnt;printf("%d",sums[i]),i++);//测试用,打印给你看,可注释掉

return0;

}