标题:泥塑课问题,求帮助,问题详见正贴
只看楼主
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
结帖率:100%
已结贴  问题点数:20 回复次数:6 
泥塑课问题,求帮助,问题详见正贴
泥塑课问题:
小米是一个幼儿园老师,每学期的泥塑课上,她都会给每个学生发不超过250立方厘米的等量橡皮泥,教大家做泥塑。在上课过程中,她发现每个班都恰好有一个小朋友会去抢另一个小朋友的橡皮泥,于是她决定,在正式开始做泥塑前,让大家把手里的橡皮泥都捏成一个立方体,并且测量手里捏好的橡皮泥的长、宽和高。这样,她就可以知道谁被谁抢了橡皮泥了。

小米老师在不同的学期可能会带一个班或者同时带多个班,因此输入数据可能有一组或者多组。每组输入数据的第一行为一个整数n,表示了这个班的小朋友数,之后n行每行包括了由空格分隔的三个整数和一个字符串,那个字符串表示了小朋友的名字,前面三个整数则是这个学生手里橡皮泥块的长、宽、高数据。按照幼儿园的规定,每个班最多有9个小朋友,最少也要有2个小朋友,每个小朋友在学籍系统中的名称不超过8个字符长。当出现一个班级的小朋友数为-1时,表示没有更多的班级了。

输出行数与小米老师带的班级数相同,形式为“X took clay from Y.”,具体请参考样例输出。

样例输入

3
10 10 2 Jill
5 3 10 Will
5 5 10 Bill
4
2 4 10 Cam
4 3 7 Sam
8 11 1 Graham
6 2 7 Pam
-1
样例输出

Bill took clay from Will.
Graham took clay from Cam.

我写了个程序,问题在于如果先输入n=4(即4个同学)则程序判断是正确,再判断n=3三个同学也是正确,再次判断n=4的时候结果就不正确了。
不知道问题出在哪里了,帮忙看下各位,谢谢了。 问题太长,代码和结果截图放2楼
搜索更多相关主题的帖子: 幼儿园 小朋友 立方体 橡皮泥 测量 
2016-05-30 15:43
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
得分:0 
方法是把每个同学的橡皮泥的体积存入一个数组clay_v[9],然后定义两个函数分别求该数组的最大值和最小值,并记录此时的元素下标,最后对应该下输出对应的橡皮泥所有者的姓名;
程序代码:
#include<stdio.h>
struct stu_clay
{
    int length;
    int width;
    int high;
    char name[10];
};
int clay_v[9],i_max=0,i_min=0;
//找最大体积橡皮泥对应的元素下标i_max
int clay_max_v(int clay_v[9],int n)
{
    int    i;
    int    max_v=clay_v[0]; 
    for(i=1;i<n;i++)     
    {
        if(clay_v[i]>max_v)
        {
            max_v=clay_v[i];
            i_max=i;                    
        }
    }    
    return i_max;    
}
//找最小体积橡皮泥对应的元素下标i_min
int clay_min_v(int clay_v[9],int n)
{
    int    j;
    int    min_v=clay_v[0]; 
    for(j=1;j<n;j++)     
    {
        if(clay_v[j]<min_v)
        {
            min_v=clay_v[j];
            i_min=j;
        }                    
    }    
    return i_min;    
}
int main()
{
    struct stu_clay stu[9];
    int i,n=0;
    while(1)
    {
        scanf("%d",&n);
        if(n==-1) break;
        for(i=0;i<n;i++)
        {                    
            scanf("%d%d%d%s",&stu[i].length,&stu[i].width,&stu[i].high,&stu[i].name);
            clay_v[i]=stu[i].length*stu[i].width*stu[i].high;            
        }
        clay_max_v(clay_v,n);
        clay_min_v(clay_v,n); 
        printf("%s took clay from  %s.\n",stu[i_max].name,stu[i_min].name);
     }
    return 0;
}

4   //截图这个位置少截了个4,手动补下吧,将就看下吧

补充:判断过程如下:1:n=4 正确 2:n=3 正确  3:n=4 错误 4:n=3 正确 5:n=4 错误
也就是说判断n=3没有问题,n=4的时候只有第一次是正确的,且必须是最先就判断n=4.不然n=4的时候就判断错误了。

[此贴子已经被作者于2016-5-30 16:02编辑过]

2016-05-30 15:44
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:20 
int clay_v[9],i_max=0,i_min=0;
看到红色的部分了吗?也就是第一次循环时它们是0,其后它们就不是零了,这就是滥用全局变量的下场

另外,最终的要,为什么要贴图,难道你希望每个人都照着你的那个图再敲一遍吗,直接拷贝文字不好吗?
4
2 4 10 Cam
4 3 7 Sam
8 11 1 Graham
6 2 7 Pam

3
10 10 2 Jill
5 2 10 Will
5 5 10 Bill

4
2 4 10 Cam
4 3 7 Sam
8 11 1 Graham
6 2 7 Pam

3
10 10 2 Jill
5 2 10 Will
5 5 10 Bill
这个论坛就应该直接去掉贴图功能,任何人只要贴图就后台直接封号删除。
2016-05-30 16:05
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
得分:0 
如果一直判断n=4,也是对的,就是判断n=4后接着n=3,再返回判断n=4就不对了
2016-05-30 16:07
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
得分:0 
回复 3楼 rjsp
首先谢谢你的帮助。
贴图我个人不认为有什么不妥?不知道你是什么原因这么反感放图。
就我个人而言我贴图是为了证明我确实是做了N组数据测试,也进行了相关的分析,也尝试修改了代码。如果自己能解决当然最好,也不会放论坛麻烦各位了。您觉得贴图不好,是不是有些测试数据不如直接复制来的快,如果是这样,帖子最上面的测试数据可以复制的啊。
另外一个我觉得您是不是有点反应过度了,您说的滥用全局变量,我不知道您是如何得到这个看法的。滥用的话我个人觉得是不是不管什么情况都把变量定义为全局变量,不管合适不合适就用全局变量,大量使用全局变量不管是否需要,通过看一个人很多的代码,积累一定的数量后,再得到其是否偏执于使用全局变量,这样说的话是否更符合滥用的范畴呢。
就我自己而言,我很少用到全局变量,首先不否认我还是个新手,很多问题不懂,也可能很多细节都没有考虑到,就C而言,我只是个人爱好,想学点东西,肯定比不了专业的编程人员,甚至比不了目前在校的大学生。如果有很多编程细节就比如说该用局部变量就用局部变量;
还有像之前为了吸收到scanf的回车对后续数据输入的影响,我开始还总是用fflush(stdin)这样的方法。当然也起到了一定的效果,但后来也是在这里,在论坛上看到有人说过这个方法不对,我也查了一些资料,确实这个方法可移植性不好,也就摒弃尽量不用了。
不过我觉得不管如何,在学习中肯定会有很多诸如此类的问题,但也就是这样或者那样的问题的存在,才让我们通过解决这些问题一步步学到一些东西,不是嘛?
再次谢谢。这个一会判断正常一会出错的BUG我说实话想了几个小时了,头都晕了,为此还单独把这部分代码拎出来单独测试了,也还是没有解决。谢谢。

[此贴子已经被作者于2016-5-30 16:23编辑过]

2016-05-30 16:19
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
得分:0 
补充下:其实我有想到过是某个或一些变量在第一次判断后没有恢复到初始状态。我也在主函数里增加最大值最小值下标的归零。不过没解决,也就没再进一步细致分析。
程序代码:
int main()
{
    struct stu_clay stu[9];
    int i,n=0;
    while(1)
    {
        scanf("%d",&n);
        if(n==-1) break;
        for(i=0;i<n;i++)
        {                    
            scanf("%d%d%d%s",&stu[i].length,&stu[i].width,&stu[i].high,&stu[i].name);
            clay_v[i]=stu[i].length*stu[i].width*stu[i].high;            
        }
        i_max=0;        //这里增加
        clay_max_v(clay_v,n);
        -_min=0;        //这里增加
        clay_min_v(clay_v,n); 
        printf("%s took clay from  %s.\n",stu[i_max].name,stu[i_min].name);
     }
    return 0;
}


[此贴子已经被作者于2016-5-30 16:50编辑过]

2016-05-30 16:27
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
得分:0 
确实是变量再第一次循环后没有归零的问题。已经解决了,再次感谢。
2016-05-30 16:36



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-465392-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.555840 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved