史萊姆論壇

返回   史萊姆論壇 > 專業主討論區 > 程式語言討論區
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


發文 回覆
 
主題工具 顯示模式
舊 2016-10-29, 04:14 PM   #1
alanniok 帥哥
註冊會員
榮譽勳章

勳章總數
UID - 369540
在線等級: 級別:3 | 在線時長:31小時 | 升級還需:1小時級別:3 | 在線時長:31小時 | 升級還需:1小時級別:3 | 在線時長:31小時 | 升級還需:1小時
註冊日期: 2015-06-21
文章: 59
精華: 0
現金: 91 金幣
資產: 91 金幣
Unhappy 疑問 - 關於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了,到底是怎麼了啊??
alanniok 目前離線  
送花文章: 75, 收花文章: 17 篇, 收花: 22 次
回覆時引用此帖
舊 2016-10-29, 04:24 PM   #2 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9661小時 | 升級還需:136小時級別:96 | 在線時長:9661小時 | 升級還需:136小時級別:96 | 在線時長:9661小時 | 升級還需:136小時級別:96 | 在線時長:9661小時 | 升級還需:136小時級別:96 | 在線時長:9661小時 | 升級還需:136小時級別:96 | 在線時長:9661小時 | 升級還需:136小時
註冊日期: 2002-12-07
文章: 13247
精華: 0
現金: 26237 金幣
資產: 3024047 金幣
預設

你的 maze 型態是 int
但卻用 '1' 標示
用引號框起來表示 型態是char 字元
字元 1 的 ascii碼的 int值 就是 49
字元 2 = 50
字元 0 = 48

所以請把
int maze[15][15]={{'0', '2', '1', '1'
改成
int maze[15][15]={{0, 2, 1, 1
mini 目前離線  
送花文章: 1999, 收花文章: 7956 篇, 收花: 26748 次
回覆時引用此帖
有 2 位會員向 mini 送花:
alanniok (2016-10-29),getter (2016-10-30)
感謝您發表一篇好文章
舊 2016-10-29, 04:25 PM   #3 (permalink)
註冊會員
榮譽勳章

勳章總數
UID - 369540
在線等級: 級別:3 | 在線時長:31小時 | 升級還需:1小時級別:3 | 在線時長:31小時 | 升級還需:1小時級別:3 | 在線時長:31小時 | 升級還需:1小時
註冊日期: 2015-06-21
文章: 59
精華: 0
現金: 91 金幣
資產: 91 金幣
預設

了解了!!謝謝,太就沒寫程式沒想到連這個都忘了....

謝謝拉~~
alanniok 目前離線  
送花文章: 75, 收花文章: 17 篇, 收花: 22 次
回覆時引用此帖
舊 2016-10-29, 11:37 PM   #4 (permalink)
註冊會員
榮譽勳章

勳章總數
UID - 369540
在線等級: 級別:3 | 在線時長:31小時 | 升級還需:1小時級別:3 | 在線時長:31小時 | 升級還需:1小時級別:3 | 在線時長:31小時 | 升級還需:1小時
註冊日期: 2015-06-21
文章: 59
精華: 0
現金: 91 金幣
資產: 91 金幣
預設

不知道有沒有人願意幫我看一下,這是我剛剛參考網路上的Stack作法加工成的走迷宮程式,
不過不知道為何一開始的列印迷宮就不會動了...
-----------------------------------------------------
PHP 語法:
include <stdio.h
#include <stdlib.h> 
#define MAX 225 

int creates(int[]);         // 建立堆疊 
int isEmpty(int);           // 堆疊已空 
int stacktop(int[], int);   // 傳回頂端元素 
int add(int[], intint);   // 插入元素 
int delete(int[], int);     // 刪除元素 
void list(int[], int);      // 顯示所有內容 

int main(void) { 
    
int maze[15][15]={
             {
021111202012102}
            ,{
200212101202100}
            ,{
120102102102012}
            ,{
002120102100112}
            ,{
121012001210102}
            ,{
000102012120010}
            ,{
102101202102121}
            ,{
212001210210012}
            ,{
020121201201201}
            ,{
210210210102102}
            ,{
120001201201200}
            ,{
102011101020120}
            ,{
021021021002012}
            ,{
120120210202010}
            ,{
012010020121210}};
    
int solution[15][15];

    
int xstack[MAX];
    
int ystack[MAX]; 
    
int xtopytop;  
    
int xy;
    
xtop creates(xstack);
    
ytop creates(ystack);

    
printf("這是迷宮:\n");//印出迷宮&複制迷宮副本
    
for(int p 015p++){
        for(
int q 015q++){
            
printf("%d "maze[p][q]);
            
solution[p][q] = maze[p][q];
        }
    }    
    
printf("aaa");
    while(
1) { 
        
stacktop(xstackxtop);
        
stacktop(ystackytop);
        
        if(
maze[x][y] == 0){
            if((
solution[x][y+1] == 0)||(solution[x][y+1] == 2)){//下
                
xtop add(xstackxtopx);
                
ytop add(ystackytopy+1);
                
solution[x][y+1] = 3;
            }
            else if((
solution[x+1][y+1] == 0)||(solution[x+1][y+1] == 2)){//右下
                
xtop add(xstackxtopx+1);
                
ytop add(ystackytopy+1);
                
solution[x+1][y+1] = 3;
            }
            else if((
solution[x+1][y] == 0) ||(solution[x+1][y] == 2)){//右
                
xtop add(xstackxtopx+1);
                
ytop add(ystackytopy);
                
solution[x+1][y] = 3;
            }
            else if((
solution[x+1][y-1] == 0)||(solution[x+1][y-1] == 2)){//右上
                
xtop add(xstackxtopx+1);
                
ytop add(ystackytopy-1);
                
solution[x+1][y-1] = 3;
            }
            else if((
solution[x][y-1] == 0) ||(solution[x+1][y] == 2)){//上
                
xtop add(xstackxtopx);
                
ytop add(ystackytopy-1);
                
solution[x+1][y] = 3;
            }
            else if((
solution[x-1][y-1] == 0) ||(solution[x+1][y] == 2)){//左上
                
xtop add(xstackxtopx-1);
                
ytop add(ystackytopy-1);
                
solution[x+1][y] = 3;
            }
            else if((
solution[x-1][y] == 0) ||(solution[x+1][y] == 2)){//左
                
xtop add(xstackxtopx-1);
                
ytop add(ystackytopy);
                
solution[x+1][y] = 3;
            }
            else if((
solution[x-1][y+1] == 0) ||(solution[x+1][y] == 2)){//左下
                        
xtop add(xstackxtopx-1);
                        
ytop add(ystackytopy+1);
                        
solution[x+1][y] = 3;
            }
            else{                            
//退
                
solution[x][y] = 1;
                
xtop delete(xstackxtop);
                
ytop delete(ystackytop);
            }
        }

        else if(
maze[x][y] == 2){
            if((
solution[x][y+1] == 0)||(solution[x][y+1] == 2)){//下
                
xtop add(xstackxtopx);
                
ytop add(ystackytopy+1);
                
solution[x][y+1] = 3;
            }
            else if((
solution[x+1][y] == 0) ||(solution[x+1][y] == 2)){//右
                
xtop add(xstackxtopx+1);
                
ytop add(ystackytopy);
                
solution[x+1][y] = 3;
            }
            else if((
solution[x][y-1] == 0) ||(solution[x+1][y] == 2)){//上
                
xtop add(xstackxtopx);
                
ytop add(ystackytopy-1);
                
solution[x+1][y] = 3;
            }
            else if((
solution[x-1][y] == 0) ||(solution[x+1][y] == 2)){//左
                
xtop add(xstackxtopx-1);
                
ytop add(ystackytopy);
                
solution[x+1][y] = 3;
            }
            else{                        
//退
                
solution[x][y] = 1;
                
xtop delete(xstackxtop);
                
ytop delete(ystackytop);
            }
        }
        if((
stacktop(xstackxtop) == 15) && (stacktop(ystackytop) == 15))//終點到達
            
break;
    }

    
printf("路徑為:\n");//列出結果
    
for(int p 015p++){
        for(
int q 015q++){
            if(
solution[p][q] == 3)
                
printf("3");
            else
                
printf("*");
        }
        
printf("\n");
    }

    
printf("\n"); 

    return 
0


// 以下為堆疊操作的實作 
int creates(int stack[]) { 
    
int i

    for(
0MAXi++) 
        
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 topint item) { 
    
int t top

    if(
>= 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--; 
    } 

----------------------------------------------------
可以編譯成功,但執行時成功印出迷宮然後游標就停了...連後面的aaa都沒印出來,似乎是卡在for迴圈裡,有人可以幫忙debug下嗎??

此帖於 2016-10-31 01:13 PM 被 mini 編輯.
alanniok 目前離線  
送花文章: 75, 收花文章: 17 篇, 收花: 22 次
回覆時引用此帖
舊 2016-10-31, 01:10 PM   #5 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9661小時 | 升級還需:136小時級別:96 | 在線時長:9661小時 | 升級還需:136小時級別:96 | 在線時長:9661小時 | 升級還需:136小時級別:96 | 在線時長:9661小時 | 升級還需:136小時級別:96 | 在線時長:9661小時 | 升級還需:136小時級別:96 | 在線時長:9661小時 | 升級還需:136小時
註冊日期: 2002-12-07
文章: 13247
精華: 0
現金: 26237 金幣
資產: 3024047 金幣
預設

用哪套開發軟體編譯執行的 ?
像 int delete(int[], int);
就使用了 保留字 delete
這在編譯時應該會有錯~

載了一套 Dev-C++
將所有 delete 改成 sdelete
編譯後發現跑出 aaa就沒再反應了
所以
在while(1) { 後嘗試加個 printf("b");
發現一直印b 沒完沒了
所以大概是一直沒有符合 break; 的條件
因此試問
會不會是你迷宮地圖沒有出口?
還是哪裡的 if 條件有問題

P.S. 還有個顯示問題需多加個 printf("\n");
如下
PHP 語法:
 for(int p 015p++){ 
        for(
int q 015q++){ 
            
printf("%d "maze[p][q]); 
            
solution[p][q] = maze[p][q]; 
        } 
        
printf("\n");
    } 
.否則迷宮就不會是方塊狀
.條件寫的很雜你需要用除錯模式好好的步進跑跑才能找到問題 (這裡就無法提供協助)

建議先建個最簡單的 4x4 迷宮地圖跑跑看,會比較好邏輯除錯

此帖於 2016-10-31 08:05 PM 被 mini 編輯.
mini 目前離線  
送花文章: 1999, 收花文章: 7956 篇, 收花: 26748 次
回覆時引用此帖
向 mini 送花的會員:
alanniok (2016-11-02)
感謝您發表一篇好文章
舊 2016-11-02, 10:06 PM   #6 (permalink)
註冊會員
榮譽勳章

勳章總數
UID - 369540
在線等級: 級別:3 | 在線時長:31小時 | 升級還需:1小時級別:3 | 在線時長:31小時 | 升級還需:1小時級別:3 | 在線時長:31小時 | 升級還需:1小時
註冊日期: 2015-06-21
文章: 59
精華: 0
現金: 91 金幣
資產: 91 金幣
預設

謝謝,問題算是解決了,之前是在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檔以外就沒有別的了...
alanniok 目前離線  
送花文章: 75, 收花文章: 17 篇, 收花: 22 次
回覆時引用此帖
向 alanniok 送花的會員:
mini (2016-11-02)
感謝您發表一篇好文章
發文 回覆



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 08:19 AM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1