史萊姆論壇

史萊姆論壇 (http://forum.slime.com.tw/)
-   程式語言討論區 (http://forum.slime.com.tw/f76.html)
-   -   關於C語言不知道我犯了什麼蠢嗎?? (http://forum.slime.com.tw/thread286111.html)

alanniok 2016-10-29 04:14 PM

關於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了,到底是怎麼了啊??

mini 2016-10-29 04:24 PM

你的 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

alanniok 2016-10-29 04:25 PM

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

謝謝拉~~

alanniok 2016-10-29 11:37 PM

不知道有沒有人願意幫我看一下,這是我剛剛參考網路上的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下嗎??

mini 2016-10-31 01:10 PM

用哪套開發軟體編譯執行的 ?
像 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 迷宮地圖跑跑看,會比較好邏輯除錯

alanniok 2016-11-02 10:06 PM

謝謝,問題算是解決了,之前是在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檔以外就沒有別的了...


所有時間均為台北時間。現在的時間是 04:44 PM

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

『服務條款』

* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *


SEO by vBSEO 3.6.1