QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1750|回复: 16

C程序源码请教

[复制链接]
发表于 2004-9-12 13:40:22 | 显示全部楼层 |阅读模式
有这样一个题目,有红黄蓝白黑5个小球,一次分别取三个不一样的小球,问有多小种取法。
下面是用C语言设计的程序。[code:1]
main()
   {enum color {red,yellow,blue,white,black};
    enum color i,j,k,pri;
    int n,loop;
    n=0;
    for (i=red;i<=black;i++)
    for (j=red;i<=black;j++)
       if (i!=j)
        {for (k=red;k<=black;k++)
         if ((k!=i)&&(k!=j))
           {n=n+1;
            printf ("%-4d",n);
            for (loop=1;loop<=3;loop++)
            {switch(loop)
                {case 1:pri=i; break;
                 case 2:pri=j; break;
                 case 3:pri=k; break;
                 default: break;
                  }
            switch(pri)
               {case red: printf("%-10s","red");break;
                case yellow: printf("%-10s","yellow");break;
                case blue: printf("%-10s","blue");break;
                case white: printf("%-10s","white");break;
                case black: printf("%-10s","black");break;
                default: break;
                 }
           }
          printf ("\n");
}
}

  printf ("\ntotal:%5d\n",n);
}
[/code:1]
编译后运行正常不过却无法正常将结果显示在屏幕上面。运行后是这样的。
有哪位可以告诉我为什么会出现这样的错误吗。并不一定要改正过来。但是我想知道原因。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2004-9-12 14:20:16 | 显示全部楼层
讲讲你的思想。再把代码排版
回复

使用道具 举报

发表于 2004-9-12 14:26:10 | 显示全部楼层
看你的第二个for语句
回复

使用道具 举报

 楼主| 发表于 2004-9-12 21:39:21 | 显示全部楼层
我的思路是这样子的.因为要找三个球嘛.所以呢我就设三个for 语句用来控制三个球的选择.
而在前已经定义了一个枚举类里面有五个元素.所以for 语句从中取值.我在第一个  for 语句把枚举常量的值给了i,也就是第一个球,我在第二个语句中把枚举常量的第一个值也给了j也就是第二个球.在第三个语句中我也把常量的第一个值给了k ,所以判断如果k的值如果不等于j和i.也就是三个球都不等.就输出这三个球.n用来控制有几个这样的组合,分别用swithch语句控制三个球的打印.第一个语句.用来将不同值的三个球选定.第二个switch语句用来输出控制.
最后打印出总数.
我看了一个第二个for 语句.我不知道.如果把i,j,k的初值都定为0会不会还是这个样子.
回复

使用道具 举报

 楼主| 发表于 2004-9-12 21:42:07 | 显示全部楼层
这个程序是在谭浩强的c语言教程里面的枚举类型里面的一个例子.今天刚刚看到这里,所以就写了这段.运行了,但是没有结果.
我在前一个月前还在说要安装好gaim,xmms但是现在我就已经快把c 语言看完了.下一步我就要学习mysql各位大哥一定要帮忙啊.到时候.
回复

使用道具 举报

 楼主| 发表于 2004-9-12 21:44:54 | 显示全部楼层
改为0了还是一个样.
回复

使用道具 举报

发表于 2004-9-12 22:25:55 | 显示全部楼层

排版后的

[code:1]main()
{
    enum color { red, yellow, blue, white, black };
    enum color i, j, k, pri;
    int n, loop;
    n = 0;
    for (i = red; i <= black; i++)
        for (j = red; i <= black; j++)
            if (i != j) {
                for (k = red; k <= black; k++)
                    if ((k != i) && (k != j)) {
                        n = n + 1;
                        printf("%-4d", n);
                        for (loop = 1; loop <= 3; loop++) {
                            switch (loop) {
                            case 1:
                                pri = i;
                                break;
                            case 2:
                                pri = j;
                                break;
                            case 3:
                                pri = k;
                                break;
                            default:
                                break;
                            }
                            switch (pri) {
                            case red:
                                printf("%-10s", "red");
                                break;
                            case yellow:
                                printf("%-10s", "yellow");
                                break;
                            case blue:
                                printf("%-10s", "blue");
                                break;
                            case white:
                                printf("%-10s", "white");
                                break;
                            case black:
                                printf("%-10s", "black");
                                break;
                            default:
                                break;
                            }
                        }
                        printf("\n");
                    }
            }

    printf("\ntotal:%5d\n", n);
}
[/code:1]
回复

使用道具 举报

发表于 2004-9-12 22:28:36 | 显示全部楼层
第二个for 的 i和j
回复

使用道具 举报

发表于 2004-9-12 23:51:47 | 显示全部楼层
下面是正确的代码:
[code:1]
main()
{
    enum color { red, yellow, blue, white, black };
    enum color i, j, k, pri;
    int n, loop;
    n = 0;
    for (i = red; i <= black; i++)
        for (j = i + 1; j <= black; j++)
            if (i != j) {
                for (k = j + 1; k <= black; k++)
                    if ((k != i) && (k != j)) {
                        n = n + 1;
                        printf("%-4d", n);
                        for (loop = 1; loop <= 3; loop++) {
                            switch (loop) {
                            case 1:
                                pri = i;
                                break;
                            case 2:
                                pri = j;
                                break;
                            case 3:
                                pri = k;
                                break;
                            default:
                                break;
                            }
                            switch (pri) {
                            case red:
                                printf("%-10s", "red");
                                break;
                            case yellow:
                                printf("%-10s", "yellow");
                                break;
                            case blue:
                                printf("%-10s", "blue");
                                break;
                            case white:
                                printf("%-10s", "white");
                                break;
                            case black:
                                printf("%-10s", "black");
                                break;
                            default:
                                break;
                            }
                        }
                        printf("\n");
                        if (n > 50) exit(0);
                    }
            }
                                                                                                                          
    printf("\ntotal:%5d\n", n);
}
[/code:1]
其中,两个比较
if (i != j)
if ((k != i) && (k != j))
可以不要
执行的结果如下:

[code:1]
[hyh@bzimage ctmp]$ ./test5
1   red       yellow    blue
2   red       yellow    white
3   red       yellow    black
4   red       blue      white
5   red       blue      black
6   red       white     black
7   yellow    blue      white
8   yellow    blue      black
9   yellow    white     black
10  blue      white     black

total:   10
[/code:1]
回复

使用道具 举报

发表于 2004-9-12 23:55:39 | 显示全部楼层
if (n > 50) exit(0);
这行没用

我忘了组合的公式了,谁知道告诉我一下
回复

使用道具 举报

发表于 2004-9-13 08:31:18 | 显示全部楼层
m取n:c(n,m)=m!/n!(m-n)!
回复

使用道具 举报

发表于 2004-9-13 10:13:46 | 显示全部楼层
感谢啊
回复

使用道具 举报

 楼主| 发表于 2004-9-14 22:18:34 | 显示全部楼层
为什么要把第二个for中的 j=i+1,第三个for中的k=j+1呢.循环的时候他不自动跳过去吗.
我发现这个if(n>50)exit(0);实在太有用.程序居然成功的运行了.嘿嘿嘿.结果是在没有修改第一个for ,第二个for 的初值情况下成功的.这个if语句实在太有用了.
[dreamday@localhost myc]$ ./good.out
1   red       yellow    blue
2   red       yellow    white
3   red       yellow    black

total:    3
4   red       blue      yellow
5   red       blue      white
6   red       blue      black

total:    6
7   red       white     yellow
8   red       white     blue
9   red       white     black

total:    9
10  red       black     yellow
11  red       black     blue
12  red       black     white

total:   12
13  red       yellow
14  red       blue
15  red       white
16  red       black

total:   16
17  red       yellow
18  red       blue
19  red       white
20  red       black

total:   20
21  red       yellow
22  red       blue
23  red       white
24  red       black

total:   24
25  red       yellow
26  red       blue
27  red       white
28  red       black

total:   28
29  red       yellow
30  red       blue
31  red       white
32  red       black

total:   32
33  red       yellow
34  red       blue
35  red       white
36  red       black

total:   36
37  red       yellow
38  red       blue
39  red       white
40  red       black

total:   40
41  red       yellow
42  red       blue
43  red       white
44  red       black

total:   44
45  red       yellow
46  red       blue
47  red       white
48  red       black

total:   48
49  red       yellow
50  red       blue
51  red       white
回复

使用道具 举报

 楼主| 发表于 2004-9-14 22:35:09 | 显示全部楼层
这个是修改了第二个for ,第三个 for 的初值后运行的情况,一样成功.不过if(n>50)exit(0);不能够少如果少了程序会无止尽的运行下去,我也不知道为什么,for语句的运行不都是在循环内控制了吗.为什么会无尽止的运行下去呢.
这是按照此方法改后的程序,感许,师姐.师兄的帮助.不过我觉得只在程序里面加上师姐给出的if语句程序运行的要快一些.而且直观一些. 如果改了第二个for 第三个for ,程序好象少运行了两次结果.
唯一搞不懂的就是既然已尼用for 语句控制次数了..为什么还要加一个if语句控制呢.
回复

使用道具 举报

 楼主| 发表于 2004-9-14 22:40:08 | 显示全部楼层
以后还请大家多多指教啊,在此感谢了.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-7 13:34 , Processed in 0.045729 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表