请解释一下下面程序每一句都是什么意思,要详细点儿的,过程要清晰,谢谢,看懂后必采纳。

#include <stdio.h>
int main()
{
int i=5;
void palin(int n);
printf("请输入5个字符:");
palin(i);
printf("\n");
}
void palin(n)
int n;
{
char next;
if(n<=1) {
next=getchar();
printf("相反顺序输出结果:");
putchar(next);
} else {
next=getchar();
palin(n-1);
putchar(next);
}
}

首先你的代码有两处错误

#include <stdio.h>

int main()                    //这里的int指返回类型为:int,即整数类型,但是你在这个函数最                                         //后没有返回任何数据,所以错误

                                    //修改方式有两种①:吧int改为void,即无返回类型

                                    //②:在 printf("\n");后面加一句 return 0;

{

    int i=5;

    void palin(int n);

    printf("请输入5个字符:");

    palin(i);

    printf("\n");

}

void palin(n)        //这里palin()括号内的变量n需要定义一个类型,但是你吧它写在了下面

int n;

{

    char next;

    if(n<=1) {

        next=getchar();

        printf("相反顺序输出结果:");

        putchar(next);

    } else {

        next=getchar();

        palin(n-1);

        putchar(next);

    }

}

-------------------------------------------分割线-----------------------------------------

下面是正确的代码及注释

#include <stdio.h>        //编译预处理

int main()                        //main函数声明

{

    int i=5;                        //定义一个变量i,并赋初值5

    void palin(int n);        //声明palin函数,无返回值,定义整型参数n

    printf("请输入5个字符:");    //输出语句,输出一句话:请输入5个字符:

    palin(i);                                //调用palin函数

    printf("\n");                        //输出语句,\n代表换行,dos窗口程序走到这里光标会换行

return  0;                                //返回0,

}

void palin(int n){                    //函数实现,{ }里的代码是函数体


    char next;                            //定义一个char类型变量

    if(n<=1) {                            //分支判断语句,如果n<=1就执行 { }里的代码,否则就                                                        //执行 else { }里的代码

        next=getchar();               //吧从控制台输入的字符赋值给next字符变量

        printf("相反顺序输出结果:");    //输出一句话,没什么好讲的,同上

        putchar(next);                //吧next的值输出

    } else {

        next=getchar();                //吧从控制台输入的字符赋值给next字符变量

        palin(n-1);                        //调用palin函数,注意这里是palin函数调用palin函数,                                                      //即:调用自身,在数学上这叫递归,有兴趣可以百度一下

        putchar(next);                   //吧next的值输出

    }

}

最后解释一下palin函数:

刚开始n=5, 走else,next=getchar();    然后palin(4);还走else,next=getchar();直到n=1,走if,next=getchar(),所以next=getchar()调用了5次,吧输入在dos命令行的字符放入缓冲区,执行printf("相反顺序输出结果:"); 再然后 putchar(next); 输出字符,此时的字符是n=1时的字符,即:你输入的最后一个字符;再然后程序会回到n=2时else里剩下的putchar(next); 输出字符,此时的字符是n=2时的字符,即:你输入的倒数第二个字符;以此类推,输出5个字符。这样就完成了顺序输入,倒序输出的算法

温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-12-17

int main(void){

    int i=5;//声明变量i并初始化为5

    void palin(int n);//声明函数,否则编译找不到自定义函数palin

    printf("请输入5个字符:");//提示输入5个字符

    palin(i);//用5调用函数palin

    printf("\n");//回车是版面需要

    return 0;//加上这一行,少了不行

}

void palin(int n){//自定义一个递归函数palin,这里原来的写法是1990年代的格式,

                             //现在过不了编译了,它和这个写等价

    char next;//声明一个变量

    if(n<=1){//当n<=1时执行以下至}前的代码

        next=getchar();//从键盘接收一个字符赋给next

        printf("相反顺序输出结果:");//提示

        putchar(next);//输出刚才接收的字符

    }//函数从这里的}前返回至下面的palin(n-1);后

    else{//当n为5、4、3、2时执行以下至}前的语句

        next=getchar();//从键盘接收一个字符

        palin(n-1);//将n-1再调用palin直到n==2

        putchar(next);//n==1时从上面else前的}前返回到这一句前面反复执行这一句直到n==5

    }

}

递归调用不太好表述,也不太好理解,得好好琢磨……

追问

比如我输入的12345,是23451,34521,45321,54321,这样的一个过程吗?递归调用在下面的函数明细里面过程实在看不懂啊,能详细阐述一下原理过程吗谢谢T0T

追答

不是的。你输入12345回车,但getchar只接收一个字符。第一次调用由于n==5,所以执行else下面的语句next=getchar();接收'1'赋给next,但并不输出到屏幕上而是继续用n-1==4调用,如前一次一样把'2'赋给next(注意,上一次的next仍是'1',两次调用不在一个环境下)……这样一直到n==1时执行next=getchar();把5赋给next并接着输出5后函数返回;返回到哪里?在哪里调用的就返回到那条语句后面,由于这调用是在else后面的putchar(next);前调用的,所以就返回到putchar(next);这条语句前而执行这条语句——这时的环境是n==2的环境,也就是next==4的那个环境,所以输出的next是4;输出后函数又返回到了这条语句这里,但这个环境是n==3亦即next==3的环境……一直这样到n==5、next==1输出后返回到了主函数。

第2个回答  2016-12-17
#include <stdio.h> ‘调用通用头文件,必要的不可缺少
int main() ’程序的主函数,也是不要的不可缺少
{
int i=5; ‘声明一个数值型变量 i ,并赋值为5
void palin(int n); ’声明一个自定义函数,不过位置不对,应该放在主函数的上面
printf("请输入5个字符:"); ‘向屏幕输出文字信息,内容是:请输入5个字符
palin(i);调用自定义函数,并将数值变量作为参数传递给该函数
printf("\n");向屏幕输出一个换行符号,让屏幕换一行
}
void palin(n)自定义的函数明细部分
int n;声明一个数值型变量 n,不过位置不对,应该在下一行内,就是左括号的下边
{
char next;声明一个字符型变量 ,变量名为next
if(n<=1) {判断语句,用来判断数值变量n是否小于等于1
next=getchar();调用系统函数getchar,并将返回值保存在 next里面
printf("相反顺序输出结果:");向屏幕输出文字信息,内容是:相反顺序输出结果
putchar(next);调用系统函数,向屏幕输出变量next中的数值
} else {判断语句的子语句,意思是否则
next=getchar();调用系统函数getchar,并将返回值保存在 next里面
palin(n-1);调用系统函数,将n的值减一
putchar(next); 调用系统函数,向屏幕输出变量next中的数值
}
}

顺便说一下,此程序的编写太过于垃圾了,调用了那么多系统函数,导致程序的可读性和可移植性大大降低,实际编写中不会这样写追问

if(n<=1)这句在递归函数里是什么意思呢?我知道他是要先读后四位字符并输出,然后读第一位字符并输出,一步一步完成整个调序的,也就是第一步先变成(比如12345)23451是这个意思吗?那么下面函数明细部分的逻辑实在是看不懂啊,或者请您写一个类似的递归调用的函数明细行吗?谢谢

相似回答