|
論壇說明 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2016-10-29, 04:14 PM | #1 |
註冊會員
|
疑問 - 關於C語言不知道我犯了什麼蠢嗎??
以下是我的程式碼, ------------------------------------------- #include <stdlib.h> #include <stdio.h> int main(){ int maze[15][15]={{'0', '2', '1', '1', '1', '1', '2', '0', '2', '0', '1', '2', '1', '0', '2'} ,{'2', '0', '0', '2', '1', '2', '1', '0', '1', '2', '0', '2', '1', '0', '0'} ,{'1', '2', '0', '1', '0', '2', '1', '0', '2', '1', '0', '2', '0', '1', '2'} ,{'0', '0', '2', '1', '2', '0', '1', '0', '2', '1', '0', '0', '1', '1', '2'} ,{'1', '2', '1', '0', '1', '2', '0', '0', '1', '2', '1', '0', '1', '0', '2'} ,{'0', '0', '0', '1', '0', '2', '0', '1', '2', '1', '2', '0', '0', '1', '0'} ,{'1', '0', '2', '1', '0', '1', '2', '0', '2', '1', '0', '2', '1', '2', '1'} ,{'2', '1', '2', '0', '0', '1', '2', '1', '0', '2', '1', '0', '0', '1', '2'} ,{'0', '2', '0', '1', '2', '1', '2', '0', '1', '2', '0', '1', '2', '0', '1'} ,{'2', '1', '0', '2', '1', '0', '2', '1', '0', '1', '0', '2', '1', '0', '2'} ,{'1', '2', '0', '0', '0', '1', '2', '0', '1', '2', '0', '1', '2', '0', '0'} ,{'1', '0', '2', '0', '1', '1', '1', '0', '1', '0', '2', '0', '1', '2', '0'} ,{'0', '2', '1', '0', '2', '1', '0', '2', '1', '0', '0', '2', '0', '1', '2'} ,{'1', '2', '0', '1', '2', '0', '2', '1', '0', '2', '0', '2', '0', '1', '0'} ,{'0', '1', '2', '0', '1', '0', '0', '2', '0', '1', '2', '1', '2', '1', '0'}}; for(int i=0; i<15; i++){ for(int j=0; j<15; j++){ printf('%d ',maze[i][j]); } printf('\n'); } return 0; } ------------------------------ 不知道為何我用terminal編譯完後(gcc -Wall maze.c -o maze), 執行(./maze)完的結果列出來的陣列裡面全部都是48, 49和50??? 大概看了一下,似乎0變成48, 1變成49,2變成50了,到底是怎麼了啊?? |
送花文章: 75,
|
2016-10-29, 11:37 PM | #4 (permalink) |
註冊會員
|
不知道有沒有人願意幫我看一下,這是我剛剛參考網路上的Stack作法加工成的走迷宮程式,
不過不知道為何一開始的列印迷宮就不會動了... ----------------------------------------------------- PHP 語法:
可以編譯成功,但執行時成功印出迷宮然後游標就停了...連後面的aaa都沒印出來,似乎是卡在for迴圈裡,有人可以幫忙debug下嗎?? 此帖於 2016-10-31 01:13 PM 被 mini 編輯. |
送花文章: 75,
|
2016-10-31, 01:10 PM | #5 (permalink) |
管理版主
|
用哪套開發軟體編譯執行的 ?
像 int delete(int[], int); 就使用了 保留字 delete 這在編譯時應該會有錯~ 載了一套 Dev-C++ 將所有 delete 改成 sdelete 編譯後發現跑出 aaa就沒再反應了 所以 在while(1) { 後嘗試加個 printf("b"); 發現一直印b 沒完沒了 所以大概是一直沒有符合 break; 的條件 因此試問 會不會是你迷宮地圖沒有出口? 還是哪裡的 if 條件有問題 P.S. 還有個顯示問題需多加個 printf("\n"); 如下 PHP 語法:
.條件寫的很雜你需要用除錯模式好好的步進跑跑才能找到問題 (這裡就無法提供協助) 建議先建個最簡單的 4x4 迷宮地圖跑跑看,會比較好邏輯除錯 此帖於 2016-10-31 08:05 PM 被 mini 編輯. |
送花文章: 2018,
|
向 mini 送花的會員:
|
alanniok (2016-11-02)
感謝您發表一篇好文章 |
2016-11-02, 10:06 PM | #6 (permalink) |
註冊會員
|
謝謝,問題算是解決了,之前是在macbookpro上用gcc指令編譯執行,然後就卡在aaa前。
後來回到宿舍用桌機的visual studio 編譯,改掉一些bug後就好了。 改的部分最重要的是最後的break判定改為14,14,其餘也修正了一些移動方線和坐標更新不一致的變數bug,就可以跑了。 ------------------------------------------------------ #include <stdio.h> #include <stdlib.h> #define MAX 225 int creates(int[]); // 建立堆疊 int isEmpty(int); // 堆疊已空 int stacktop(int[], int); // 傳回頂端元素 int add(int[], int, int); // 插入元素 int delete(int[], int); // 刪除元素 void list(int[], int); // 顯示所有內容 int main(int argc, char *argv[]) { int maze[15][15]={{0, 2, 1, 1, 1, 1, 2, 0, 2, 0, 1, 2, 1, 0, 2} ,{2, 0, 0, 2, 1, 2, 1, 0, 1, 2, 0, 2, 1, 0, 0} ,{1, 2, 0, 1, 0, 2, 1, 0, 2, 1, 0, 2, 0, 1, 2} ,{0, 0, 2, 1, 2, 0, 1, 0, 2, 1, 0, 0, 1, 1, 2} ,{1, 2, 1, 0, 1, 2, 0, 0, 1, 2, 1, 0, 1, 0, 2} ,{0, 0, 0, 1, 0, 2, 0, 1, 2, 1, 2, 0, 0, 1, 0} ,{1, 0, 2, 1, 0, 1, 2, 0, 2, 1, 0, 2, 1, 2, 1} ,{2, 1, 2, 0, 0, 1, 2, 1, 0, 2, 1, 0, 0, 1, 2} ,{0, 2, 0, 1, 2, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1} ,{2, 1, 0, 2, 1, 0, 2, 1, 0, 1, 0, 2, 1, 0, 2} ,{1, 2, 0, 0, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 0} ,{1, 0, 2, 0, 1, 1, 1, 0, 1, 0, 2, 0, 1, 2, 0} ,{0, 2, 1, 0, 2, 1, 0, 2, 1, 0, 0, 2, 0, 1, 2} ,{1, 2, 0, 1, 2, 0, 2, 1, 0, 2, 0, 2, 0, 1, 0} ,{0, 1, 2, 0, 1, 0, 0, 2, 0, 1, 2, 1, 2, 1, 0}}; int solution[15][15]; int xstack[MAX]; int ystack[MAX]; int xtop, ytop; int x = 0, y = 0; xtop = creates(xstack); ytop = creates(ystack); printf("這是迷宮:\n");//印出迷宮&複制迷宮副本 for(int p = 0; p < 15; p++){ for(int q = 0; q < 15; q++){ printf("%d ", maze[p][q]); solution[p][q] = maze[p][q]; } printf("\n"); } xtop = add(xstack, xtop, x); ytop = add(ystack, ytop, y); solution[0][0] = 3; while(1) { x = stacktop(xstack, xtop); y = stacktop(ystack, ytop); //system("pause"); //printf("\nx=: %d, y = %d. ", x, y); if(maze[x][y] == 0){ if((solution[x+1][y] == 0)||(solution[x + 1][y] == 2)){//下 xtop = add(xstack, xtop, x+1); ytop = add(ystack, ytop, y); solution[x+1][y] = 3; //printf("下\n"); } else if((solution[x+1][y+1] == 0)||(solution[x + 1][y + 1] == 2)){//右下 xtop = add(xstack, xtop, x+1); ytop = add(ystack, ytop, y+1); solution[x+1][y+1] = 3; //printf("右下\n"); } else if((solution[x][y+1] == 0) ||(solution[x][y + 1] == 2)){//右 xtop = add(xstack, xtop, x); ytop = add(ystack, ytop, y+1); solution[x][y+1] = 3; //printf("右\n"); } else if((solution[x-1][y+1] == 0)||(solution[x - 1][y + 1] == 2)){//右上 xtop = add(xstack, xtop, x-1); ytop = add(ystack, ytop, y+1); solution[x-1][y+1] = 3; //printf("右上\n"); } else if((solution[x-1][y] == 0) ||(solution[x - 1][y] == 2)){//上 xtop = add(xstack, xtop, x-1); ytop = add(ystack, ytop, y); solution[x-1][y] = 3; //printf("上\n"); } else if((solution[x-1][y-1] == 0) ||(solution[x - 1][y - 1] == 2)){//左上 xtop = add(xstack, xtop, x-1); ytop = add(ystack, ytop, y-1); solution[x-1][y-1] = 3; //printf("左上\n"); } else if((solution[x][y-1] == 0) ||(solution[x][y - 1] == 2)){//左 xtop = add(xstack, xtop, x); ytop = add(ystack, ytop, y-1); solution[x][y-1] = 3; //printf("左\n"); } else if((solution[x+1][y-1] == 0) ||(solution[x + 1][y - 1] == 2)){//左下 xtop = add(xstack, xtop, x+1); ytop = add(ystack, ytop, y-1); solution[x+1][y-1] = 3; } else{ //退 solution[x][y] = 1; xtop = delete(xstack, xtop); ytop = delete(ystack, ytop); //printf("退\n"); } } else if(maze[x][y] == 2){ if((solution[x+1][y] == 0)||(solution[x+1][y] == 2)){//下 xtop = add(xstack, xtop, x+1); ytop = add(ystack, ytop, y); solution[x+1][y] = 3; //printf("下\n"); } else if((solution[x][y+1] == 0) ||(solution[x][y+1] == 2)){//右 xtop = add(xstack, xtop, x); ytop = add(ystack, ytop, y+1); solution[x][y+1] = 3; //printf("右\n"); } else if((solution[x-1][y] == 0) ||(solution[x-1][y] == 2)){//上 xtop = add(xstack, xtop, x-1); ytop = add(ystack, ytop, y); solution[x-1][y] = 3; //printf("上\n"); } else if((solution[x][y-1] == 0) ||(solution[x][y-1] == 2)){//左 xtop = add(xstack, xtop, x); ytop = add(ystack, ytop, y-1); solution[x][y-1] = 3; //printf("左\n"); } else{ //退 //printf("go back. "); solution[x][y] = 1; xtop = delete(xstack, xtop); ytop = delete(ystack, ytop); //printf("退\n"); } } /*for (int p = 0; p < 15; p++) { for (int q = 0; q < 15; q++) { printf("%d ", solution[p][q]); } printf("\n"); }*/ if((stacktop(xstack, xtop) == 14) && (stacktop(ystack, ytop) == 14))//終點到達 break; } printf("路徑為:\n");//列出結果 for(int p = 0; p < 15; p++){ for(int q = 0; q < 15; q++){ if(solution[p][q] == 3) printf("3 "); else printf("* "); } printf("\n"); } printf("\n"); system("pause"); return 0; } // 以下為堆疊操作的實作 int creates(int stack[]) { int i; for(i = 0; i < MAX; i++) stack[i] = 0; return -1; } int isEmpty(int top) { return (top == -1); } int stacktop(int stack[], int top) { return stack[top]; } int add(int stack[], int top, int item) { int t = top; if(t >= MAX-1) { printf("\n堆疊已滿!"); return t; } stack[++t] = item; return t; } int delete(int stack[], int top) { int t = top; if(isEmpty(t)) { printf("\n堆疊已空!"); return t; } return --t; } void list(int stack[], int top) { int t = top; printf("\n堆疊內容:"); while(!isEmpty(t)) { printf("%d ", stack[t]); t--; } } --------------------------------------------------------- 至於delete是保留字的事,在windows時似乎不影響,但想來這可能是我把新code 放回mac依然會卡住的原因吧!! 最後順便問一下,在mac編譯完後會給我一個執行檔,但我用visual sstudio compile完後找不到生成的檔案ㄟ,不知道藏哪裡去了...有在"電腦"搜尋過,但是除了原本的.c檔以外就沒有別的了... |
送花文章: 75,
|
向 alanniok 送花的會員:
|
mini (2016-11-02)
感謝您發表一篇好文章 |