回 帖 发 新 帖 刷新版面

主题:数组中的一个小问题

main()
{
int i,j,p,q,s,n,a[11]={127,3,6,28,54,68,87,105,162,18};
for(i=0;i<10;i++)
{ p=i;q=a[i];
for(j=i+1;j<10;j++)
if(q<a[j]) {p=j;q=a[j];}
[size=3][color=FF0000]if(p!=i)
{
s=a[i];
a[i]=a[p];
a[p]=s;
}
printf("%d ",a[i]);
}[/color][/size]
printf("\ninput number:\n");
scanf("%d",&n);
for(i=0;i<10;i++)
if(n>a[i])
{for(s=9;s>=i;s--) a[s+1]=a[s];
break;}
a[i]=n;
for(i=0;i<=10;i++)
printf("%d ",a[i]);
printf("\n");
}

这是段在已排好序的数组里插入一位数后数组仍然有序的程序。
哪位帮解释下这段代码的作用(红色部分),稍微详细点- - 谢谢

回复列表 (共4个回复)

沙发

交换两个数的值

板凳

如果P不等于i 交换两个数的数值

3 楼

其实它的作用就是来交换两个值的顺序,用一个S来存储,作为中间变量,用它来保留一个交换的值,为了防止输入丢失,如果你要是想要交换a和b的值的话,a=b显然不能实现啊,你自己可以看一下,如果a=b那么a的值就会丢失,那要是你用个s作为中间变量,s=a;a=b;b=s;这样就行了

4 楼

#include<stdio.h>
main()
{
    int i,j;                //排序时使用的变量控制 
    int p,q;                //p用来记 数组标号,q用来记 数组的数字 
    int s;                    //用来做交换  1)用来做为交换数组的值的交换 2)用来让小于n 
                            //                                          的数组中的数值
                            //                                            向后移动                                                
    int n;                    //用来  读取scanf 
    int a[11]={127,3,6,28,54,68,87,105,162,18};//定义数组的时候a[11]代表数组有11个元素
                                                //实际用数组时 数组从0开始 
    for(i=0;i<10;i++)
        { 
            p=i;q=a[i];
            for(j=i+1;j<10;j++)
            if(q<a[j]) 
                {
                    p=j;q=a[j];
                }
            if(p!=i)  //这里就是可以替换 p==i 如果j>i替换j与i的值  (这里是从大到小) 
            {
                s=a[i];
                a[i]=a[p];
                a[p]=s;
            }
            printf("%d ",a[i]);//注意 此处是在循环里面 
        }
    printf("\ninput number:\n");
    scanf("%d",&n);
    for(i=0;i<10;i++)
        {
            if(n>a[i]) //目的是判断n与i的直 让大于n的a[i]不移动 小于n的a[i]向后移动 
            {
                for(s=9;s>=i;s--) 
                    a[s+1]=a[s];//因为让所有小于n的a[i]向后移动 所以s+1=s
                                              
                break;            //注意 此处是第一个小于n的数组值 开始向后移动
                                //如果不加break 循环将一直走下去 即i不断自加直到9
                                //使得i=10 跳出for 直接进行a[10]=n 
            }
        }
    a[i]=n;       //因为上面的程序i已经得到值 所以让 n赋值到 a[i]的位置 
    for(i=0;i<=10;i++)     //控制输出 
    {
        printf("%d ",a[i]); 
    }
    printf("\n");
}



所有的注释我都写了 看看你能看明白不

我来回复

您尚未登录,请登录后再回复。点此登录或注册