这程序是自考题,知道结果,但推断过程不知道。

img


这程序知道结果,但推测过程不知道,写解题过程,这是个程序阅读题。

推断过程大致如下列注释:@newhand上路多多指教

#include <stdio.h>
int main()
{
    int a[] = {-8,9,8,-7};//声明一个数组a[] ,里面有四个值,-8的数组索引是09的数组索引是18的数组索引是2;-7的数组索引是3;a[3]=-7;a[2]=8;a[1]=9;a[0]=-8;
    int k1, k2, k3;            //声明3个变量;
    k1 = 0;                    //定义k1是数组的最小索引0;
    k2 = 3;                    //定义k2是数组的最大索引3;
    do {                      //死循环,如果k2大于k1就一直进行死循环;否则就跳出循环;
        if (a[k2] > 0)    //如果a[k2]大于0,a[k2]为正数,就执行--k2;如果k2等于3,那么就是a[3]=-7,所以第一次这里不动,k2还是3
            --k2;            //如果a[k2]大于0,a[k2]为正数,就执行k2减1,此时k2等于2,所以下次就执行a[2]的值;下次再进来就是21,变为k2=1;
        if (a[k1] < 0)    //如果a[k1]小于0,a[k1]为负数,比如a[0]=-8;所以此时if为真,就执行++k1;  k1就变为了1;
            ++k1;        //如果a[k1]小于0,就执行++k1;  k1此时就从0变为了1;第二次又执行这个行代码就从1变为2;
        if (k2 > k1)    //判断最小索引和最大索引是否相遇,没有就继续执行这个if中的代码;
        {                    //下面三行代码目的是交换a[k2]和a[k1]值的位置,k3作为临时变量,保存a[k1]的值,使负数排在正数的前面;
            k3 = a[k1];
            a[k1] = a[k2];
            a[k2] = k3;
        }
    } while (k2 > k1);    //死循环跳出条件:k2>k1。判断最小索引和最大索引是否相遇,相遇之前就继续循环;否则跳出循环,执行下面的代码;
    for (k1 = 0; k1 < 4; ++k1)        //循环输出四次,从03的;输出数组a[]
        printf("%d\t", a[k1]);       //循环输出四次,从03的;索引第一次就是输出a[0]的值,第二次就是a[1]的值,第三次就是a[2]的值,,第四次就是a[3]的值,
    printf("\n");
    return 0;
}
第一次执行死循环:k1=0,k2=3;
                           因为a[3]=-7,不大于0,所以不执行--k2;
                           因为a[0]=-8,小于0,所以执行++k1;
                           接着执行到if(k2>k1);   k1=1,k2=3,所以a[1]和a[3],的值交换,此时数组是a[] = {-8,-7,8,9}
第二次执行死循环:k1=1,k2=3;
                           因为a[3]=9,大于0,所以执行--k2k2变为2
                           因为a[1]=-7,小于0,所以执行++k1k1变为2
                           接着执行到if(k2>k1);  k1=2,k2=2,因为k2不大于k1,所以a[2]和a[2],的值不交换,此时数组是a[] = {-8,-7,8,9}
此时 k1=2,k2=2k2=k1,所以跳出死循环,通过for循环打印数组a[]的值为:a[] = {-8,-7,8,9}

img

你是想知道最后的结果是啥吗

推断过程大致如下列注释:

#include <stdio.h>
int main()
{
    int a[] = { -8,9,8,-73 };
    int k1, k2, k3;
    k1 = 0;
    k2 = 3;
    do {
        if (a[k2] > 0)    //令a[k2]<0
            --k2;
        if (a[k1] < 0)    //令a[k1]>0
            ++k1;
        if (k2 > k1)    //如果k2>k1,即在数组中,如果a[k2]在a[k1]之前,交换两者的位置,使负数排在正数的前面
        {
            k3 = a[k1];
            a[k1] = a[k2];
            a[k2] = k3;
        }
    } while (k2 > k1);    //循环条件:k2>k1,即存在负数在正数后面的情况。否则不进入循环
    for (k1 = 0; k1 < 4; ++k1)        //输出排序后的数组
        printf("%d\t", a[k1]);
    printf("\n");
    return 0;
}



区分正负数,并从小到大排列,使用冒泡排序方法

代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。