| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1057 人关注过本帖, 1 人收藏
标题:这段用标记法的程序谁来讲解一下啊,看不懂啊
只看楼主 加入收藏
snailqiu
Rank: 2
等 级:论坛游民
帖 子:59
专家分:45
注 册:2007-9-26
结帖率:100%
收藏(1)
已结贴  问题点数:15 回复次数:12 
这段用标记法的程序谁来讲解一下啊,看不懂啊
输入一个数组,输入结束时打印出排序,如输入的数组为98 82 2 73 80    则输出为
 98     1
 82     2
 2      5
 73    4
 80    3
以下是正解:
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
#define MIN 0
int main(void)
{
    int score[MAX+1]={0};
    int juni[MAX+2]={0};
    int count=0,i;
    do
        {
       printf("输入分数,-1结束:");
       scanf("%d", &score[count++]);
    }
        while(score[count-1]!=-1);
    count--;
    for(i=0;i<count;i++)
        juni[score[i]]++;
    juni[MAX+1]=1;
    for(i=MAX;i>=MIN;i--)
        juni[i]=juni[i]+juni[i+1];
    printf("得分\t排行\n");
    for(i=0;i<count;i++)
        printf("%d\t%d\n",score[i],juni[score[i]+1]);
    return 0;
}


搜索更多相关主题的帖子: include count 
2013-07-16 15:22
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:10 
程序代码:
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
#define MIN 0
int main(void)
{
    int score[MAX+1]={0};//定义一个数组长度为101的score数组,并初始化所有数组元素为0;
    int juni[MAX+2]={0};//同上,不过长度为102
    int count=0,i;
    /*比如说输入5个分数,使用count之后,自增1,从0开始,
    一直输入数据分别赋值给score[0],score[1],score[2],score[3],score[4](输入了5个分数之后count=5),
    直到输入-1为结束标志,由于while条件score[count-1]!=-1的影响,会多输
    入一个-1给数组,前面说了使用完count之后自增1,那么在输入-1给数组score之后,count会自增1,那么自然count的值变为6*/
    printf("输入分数,-1结束:");
    do                            

        {
       scanf("%d", &score[count++]);
    }
        while(score[count-1]!=-1);
        printf("count=%d",count);
    count--;          //在进入下面的for循环之前,count先自减1,如果不减1,那么count=6,在下面的比较中会把-1也放进去比较的
    for(i=0;i<count;i++)
        juni[score[i]]++;
    juni[MAX+1]=1;
    for(i=MAX;i>=MIN;i--)
        juni[i]=juni[i]+juni[i+1];
    printf("得分\t排行\n");
    for(i=0;i<count;i++)
        printf("%d\t%d\n",score[i],juni[score[i]+1]);
    return 0;
} 

思考赐予新生,时间在于定义
2013-07-16 16:54
snailqiu
Rank: 2
等 级:论坛游民
帖 子:59
专家分:45
注 册:2007-9-26
收藏
得分:0 
刚好你注释的那些我都看得懂,
for(i=0;i<count;i++)
         juni[score[i]]++;
     juni[MAX+1]=1;
     for(i=MAX;i>=MIN;i--)
         juni[i]=juni[i]+juni[i+1];
就是这几句不懂。
比如我输入了5项(不包括-1)score[0]=5,score[1]=2,score[2]=1,score[3]=3,score[4]=0,这时count=5
然后for(i=0;i<count;i++)
         juni[score[i]]++;
之后,juni[5]=1;juni[2]=1;juni[1]=1;juni[3]=1;juni[0]=1;为什么又让juni[101]=1,
然后 for(i=MAX;i>=MIN;i--)
         juni[i]=juni[i]+juni[i+1]; 是什么意思?我好像试了几个数都对不上啊
2013-07-16 17:11
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
你说的那段代码很有意思,但是解释起来比较麻烦,我先将它修改一下数组名称,今晚再给你解释

思考赐予新生,时间在于定义
2013-07-16 17:37
awisebird_
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:82
专家分:185
注 册:2013-7-6
收藏
得分:0 
把上面的输入数组带入到程序里面就明白了
2013-07-16 19:08
snailqiu
Rank: 2
等 级:论坛游民
帖 子:59
专家分:45
注 册:2007-9-26
收藏
得分:0 
回复 4楼 love云彩
我用了个笨方法,把程序改了一下:
#include<stdio.h>
 #include<stdlib.h>
 #define MAX 100
 #define MIN 0
 int main(void)
 {
     int score[MAX+1]={0};
     int juni[MAX+2]={0};
     int count=0,i;
     do
         {
        printf("输入分数,-1结束:");
        scanf("%d", &score[count++]);
     }
         while(score[count-1]!=-1);
     count--;
     for(i=0;i<count;i++)
         juni[score[i]]++;
     juni[MAX+1]=1;
     for(i=MAX;i>=MIN;i--)
         juni[i]=juni[i]+juni[i+1];
         
     for(i=0;i<=100;i++)
        printf("score[%d]=:%d\tjuni[%d]=:%d\n",i,score[i],i,juni[i]);   
        
     printf("    得分\t      排行\n");
     for(i=0;i<count;i++)
         printf("score[%d]=:%d\tjuni[%d]=:%d\n",i,score[i],i,juni[score[i]+1]);     
   
     return 0;
 }
把结果输出,然后一项一项对照,终于看懂了。
我真的很佩服想出来的人,我觉得最后输出的 得分 和 排行 中score[]和juni[]的那几项中并没有很明显的规律,解题者是怎么想到它们之间的对应关系就是一个score[i]对应一个juni[score[i]+1])呢?我头都想破了都没有想出来。这是有什么固定的方法吗?
2013-07-16 22:42
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
就你刚开始贴出的那些代码,其实是有一个规律的,我也花了半个小时才弄懂,但我现在还没找到方法解释给你,这个规律真的很值得学习,不过不推荐,因为太难总结

思考赐予新生,时间在于定义
2013-07-16 22:50
q13678986740
Rank: 4
等 级:业余侠客
帖 子:114
专家分:245
注 册:2012-7-7
收藏
得分:5 
juni这个数组是保存标记的数组,分数存在就标记1,若存在多次及累计下去,不存在就标记0。juni[MAX+1]=1; 这句将juni最后一个元素标记为1,即juni[101]=1。
    for(i=MAX;i>=MIN;i--)
        juni[i]=juni[i]+juni[i+1]; 这句解释比较麻烦。假设有分数99,那么i=100时,juni[100]=juni[100]+juni[101]=1,因为juni[101]之前赋值为1。当i=99时juni[99]=juni[99]+juni[100]=2但他输出的是juni[99+1]=1。有分数98则juni[98]=3,但他输出是juni[99]=2。依次下去将分数对应数组的下标的标志值累加从而使名次随分数减小而增大。
2013-07-16 23:06
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
                          我花了10多分钟来分析,却花了1个多小时写论文给你解释,如果你还看不懂,我真的要吐血了。
1、输入5个数(100太多,举个小一点的例子来解释):10 20 30 40 50 -1
while循环体结束后,此时a[0]=10,a[1]=20,a[2]=30,a[3]=40,a[4]=50,a[5]=-1,count=6;
2、执行count--,此时count=5,执行第一个for语句(i=0;i<count;i++),执行循环体里面这条b[a[i]]++语句,在这个for循环中,要注意的是:在函数开头就初始化b[102]={0},即所有的元素的值均为0,所以当结束for循环之后,b[10]=1,b[20]=1,b[30]=1,b[40]=1,b[50]=1,除了这5个元素之外,其他元素的值在没有执行第二个for循环体里面的赋值语句之前都还是0的。
3、执行b[MAX+1]=1;for(i=MAX;i>=MIN;i--){b[i]=b[i]+b[i+1];}
b[MAX+1]=1的作用就是是b[101]=1,然后使1往前面的元素传送,发生值传递。
b[100]=b[100]+b[101]=0+1=1;
b[99]=b[99]+b[100]=0+1=1;
b[98]=b[98]+b[99]=0+1=1;
……//期间1一直不变,即b[51]—b[99]的元素的值均为1;
b[50]=b[50]+b[51]=1+1=2;
b[49]=b[49]+b[50]=0+2=2;
……//期间2一直不变,即b[41]—b[49]的所有元素的值均为2;
b[40]=b[40]+b[41]=1+2=3;
b[39]=b[39]+b[40]=0+3=3;
……//期间3一直不变,即b[31]—b[39]的所有元素的值均为3;
b[30]=b[30]+b[31]=1+3=4;
b[29]=b[29]+b[30]=0+4=4;
……//期间4一直不变,即b[21]—b[29]的所有元素的值均为4;
b[20]=b[20]+b[21]=1+4=5;
b[19]=b[19]+b[20]=0+5=5;
……//期间5一直不变,即b[11]—b[19]所有元素的值均为5;
b[10]=b[10]+b[11]=1+5=6;
总结以上for循环的最后结果:b[10]=6,b[11]~b[19]=5,b[20]=5,b[21]~b[29]=4,b[30]=4,b[31]~b[39]=3,b[40]=3,b[41]~b[49]=2,b[50]=2,b[51]~b[101]=1
4、输出printf("得分\t排行\n")这条语句
5、执行第三个for循环,在这里我只想说说输出b[a[i]+1]
i=0,每次自增1,i<5;i=0,i=1,i=2,i=3,i=4,分别代进去,得到b[a[0]+1],b[a[1]+1],b[a[2]+1],b[a[3]+1],b[a[4]+1],即是b[10+1],b[20+1],b[30+1],b[40+1],b[50+1],每个元素都+1是为了输出正确的排名(因为b[10]=6,b[11]=5,b[20]=5,b[21]=4,b[30]=4,b[31]=3,b[40]=3,b[41]=2,b[50]=2,b[51]=1),如果不+1的话,则会输入b[10],……b[50]几个元素,这样的排名为6,5,4,3,2,没有第1名,所以要+1,使得其输出b[11],b[21],b[31],b[41],b[51],这样的排名就正确了,b[MAX+2]这个数组其实就是拿来计算排名的

思考赐予新生,时间在于定义
2013-07-17 03:59
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
回复 6楼 snailqiu
忘了上代码给你,其实就是差不多的,就是改了一下数组的名称
程序代码:
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
#define MIN 0
int main(void)
{
    int a[MAX+1]={0};
    int b[MAX+2]={0};
    int count=0,i;
    printf("输入分数,-1结束:");
    do
        {
       scanf("%d", &a[count++]);
    }
        while(a[count-1]!=-1);
    count--;
    for(i=0;i<count;i++)
        b[a[i]]++;
    b[MAX+1]=1;
    for(i=MAX;i>=MIN;i--)
        b[i]=b[i]+b[i+1];
    printf("得分\t排行\n");
    for(i=0;i<count;i++)
        printf("%d\t%d\n",a[i],b[a[i]+1]);
    return 0;
}


思考赐予新生,时间在于定义
2013-07-17 04:01
快速回复:这段用标记法的程序谁来讲解一下啊,看不懂啊
数据加载中...
 
   



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

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