寫了一個C程式.請幫我看看哪裡錯了!

#include<stdio.h>

void peter(int x,int a);

main()

{

int a;

for(a=4;a>=1;a--)

{peter(1,a);}

system("pause");

}

peter(int x,int a)

{if(x==4)

{ptintf("%d\n",a);}

else

{printf("%d",a);

for(a=4;a>=1;a--)

{peter(x+1,a);}

}

}

我是用來印出

4444

4443

4442

4441

4434

4433

4432

....

請幫我看一下哪裡有問題

他沒辦法跑

2 個解答

評分
  • 1 0 年前
    最佳解答

    你的程式有兩個地方錯了.

     

    第一是副程式沒加型態void peter(int x,int a)

     

    第二是拼錯printf(),你打成ptintf

     

    但是...就算改過來也只跑出第一行4444而已.

     

    原因是你用了遞迴( peter()裡面呼叫peter() ),但是遞迴的程式不是那樣寫的。

     

    簡簡單單用4層迴圈就可以了,這完完全全是迴圈的演算法呀!

     

    寫一個請你參考一下...

     

    #include "stdio.h"

    main()

    {

    int a,b,c,d;

    char k;

    for(a=4; a>=1; a--)

    {

    for(b=4; b>=1; b--)

    {

    for(c=4; c>=1; c--)

    {

    for(d=4; d>=1; d--)

    {printf("%d%d%d%d\n",a,b,c,d);}

    }

    }

    }

    printf("按任意鍵離開....");

    k=getchar();

    }

  • 1 0 年前

    你的程式邏輯大致正確,但在輸出結果時出了差錯。第一次逐一輸出各個字元,所以沒問題。但遞迴內的迴圈,僅輸出當時變化 位罝(含)以後的字元,該位置之左(前)的字元並未輸出。

    解決方法之一便是設一靜態變數,在字串完成之前只將字元存入該字串的相對位置內,直到 x==SIZE 時再將字串輸出,(我還雞婆的加了計數,以利查核是否正確。)如此做法,除了簡化輸出外,也同時解決了前述輸出不全的問題。

    至於在遞迴函式裡的靜態變數,在編繹時期便配置記憶體在資料節區裡(包含在 .EXE 內),執行時期不會再占用堆疊,其值與程式共存,不受遞迴影響,所以在本程式中可以達到保存字串和計數的目的。

    本程式具彈性應用,你可改變 #define SIZE 4 成其他的值,這是用巢狀迴圈所做不到的。但請勿大於 9,以免輸出的字元怪怪的。況且輸出的計數是 SIZE的 4次方,太大的話,.... 去喝杯咖啡吧!

    #include<stdio.h>

    #include<stdlib.h>

    #define SIZE 4 //可自行改變

    void peter(int x, int a);

    int main() {

    int a;

    for (a=SIZE; a>=1; a--)

    peter(1,a);

    system("pause");

    }

    void peter(int x, int a) {

    static char str[SIZE+1]={0};

    static int count=0;

    str[x-1] = a+'0';

    if (x == SIZE)

    printf("%d: %s\n", ++count, str);

    else {

    for (a=SIZE; a>=1; a--)

    peter(x+1, a);

    }

    }

    2008-05-04 12:16:40 補充:

    前述:計數是 SIZE的 4次方 ....

    更正為:計數是 SIZE的 SIZE次方 ....

還有問題?馬上發問,尋求解答。