2018年11月4日 星期日

[C語言 練習 3]串鍊連結 創建-刪除-插入-檢視

如果程式沒有練習,有些小細節很容易錯過...
就像一開始我的串列連結  完全沒注意到要在 外面設定一個head

結構link
data儲存 資料
*next 指標next指向 下個結構
struct link{
 int data;
 struct link *next;
};
void Creat_node(struct link *,int);  //創建結點 
void Insert_node(struct link *,int,int); // 插入結點 
void Delete_node(struct link *,int); //刪除結點 
void Look_list(struct link *); //列表列出各個結點 

創建



______________________________________

插入

這邊的
位置  指 第1個,第2個,第3個(依 某種順序而排列 的位置)
位址 指的是 那一塊結構的位址(如同門牌)




____________________________________________

刪除

____________________________________________
檢視.
檢視其實就是在指標只到下一個的時後順便把data印出來直到遇到NULL而已
所以就不放程式碼了(下方有 .c程式碼連結)
____________________________________________
稍微放下主程式的概念,有些程式碼沒放全,放全篇幅會拉太大

這邊的 head沒有指標,所以它的成員不能用->  ,
但是如果head的下一位 是用指標指的 那叫到它的成員就可以用
如: *(head.next).data or (head.next)->data 

int main(){
 int act=0,value,rank,i;
 struct link head;
 char temp[10];
 //head 初值設定 
 head.data=0;
 head.next=NULL;
 while (act!=4){
  act=0;
  //system("cls");
  printf("chose action type \ncreat_node[0],\ninsert_node[1],\ndelet_node[2],\nlook_node[3],\nleave[4]\n");
  scanf("%s",&temp);
  for(i=0;temp[i]!='\0';i++)   //預防有人很奇怪的給你輸入w或其他非數字 ,
   act=act*10+temp[i]-'0';  //下方rank 和 value都能用這種方法,只是我懶得用  
  if(act>=0&&act<5){
   if(act==0)
    //Creat_node(&head,value);
   else if(act==1)
    //Insert_node(&head,rank,value);
   else if(act==2)
    //Delete_node(&head,rank); 
   else if(act==3)
    //Look_list(&head);
   }
  }
 }
 system("pause");
 return 0;
}


____________________________________________
[C語言 練習 3]串鍊連結 程式碼
1.link test :練習 串列連結的建立 與 結構指標格式的使用
2.link test all in one  :練習 串列連結的建立.插入.刪除.顯示
https://drive.google.com/drive/folders/1O2pdvfT9T0vl4vogYf_EZcYNEmb1JR55?usp=sharing

2018年11月2日 星期五

[C 語言 遞迴練習.思考] 河內塔 (Towers of Hanoi)

上圖來源:師範大學 某網站
上圖來源:https://ctfork12.ice.ntnu.edu.tw/conception.html
n為河內塔總數,在書上看到河內塔的簡介要寫程式來表現時,只覺得頭腦不夠用...需要整個寫出來才能思考...和發現規律(我自己是找不太出來規律...看別人講解和自己話圖才:哇!天阿!,雖然書中也有步驟,可是還是看不太懂別人怎麼歸納出來的想法跟程序的轉換...(雖然我畫了n=4的河內塔,可是還是想不出來解法...只能按照正常情況一一寫出的移動步驟並裡解程式它的寫法 ...與感嘆別人的腦子

n=1 
1.n1.A->C

n=2 
|    1.n1.A->B     (把1~1(1~n-1))的盤子從A搬到B)
2.n2.A->C        (把第n(2)的盤子 從A搬到 C)
|    3.n1 B->C     (把1~1(1~n-1))的盤子從B搬到C)

n=3
|    1.n1.A->C     2.n2.A->B     3.n1.C->B (把1~2(1~n-1))的盤子從A搬到B)
     上方可以拆解為 n=2時的情況,只是B與C互換
4.n3.A->C                                             (把第n=3的盤子 從A搬到 C)
|    5.n1.B->A     6.n2.B->C     7.n1.A->C (把1~2(1~n-1))的盤子從B搬到C)
      上方可以拆解為n=2,A與B互換

n=4  從A經B到C
{    1~n-1從A藉由C到B  從A經C到B
|    {    (1~n-2)從A藉由B搬到C,要讓n-1(3)可以放到B    從A經B到C
|    |     {    (1~n-3)從A搬到B,要讓n-2(2)可以放到C    從A經C到B
|    |     |    1.n1.A->B     n1 從A到B
|    |     }
|    |    2.n2.A->C          n2 從A到C
|    |    {    (1~n-3)從B搬到C,要讓n-1(3)可以放到B    從B經A到C
|    |    |     3.n1.B->C     n1 從B到C
|    }
|    4.n3.A->B              n3   從A到B
|    {    (1~n-2)從C搬到B,要讓n(4)可以放到C    從C經A到B
|    |    {    (1~n-3)從C搬到A,要讓n(3)可以放到B    從C經B到A
|    |    |    5.n1.C->A     n1 從C到A
|    |    }
|    |    6.n2.C->B          n2  從C到B
|    |    {    (1~n-3)從A搬到B,要讓n(4)可以放到C    從A經C到B
|    |    |    7.n1.A->B     n1  從A到B
|    |    }
|    }
}
8.n4.A->C                   n4  從A到C
下方就不再多用 { }表示...不然太長  下方是把1~n-1從B經A到C的過程,可以看縮排來得知在哪層
|    |    |    9.n1.B->C     n1
|    |    10.n2.B->A        n2
|    |    |    11.n1.C->A   n1
|    12.n3.B->C            n3
|    |    |    14.n1.A->B  n1
|    |    15.n2.A->C       n2
|    |    |    16.n1.B->C  n1

總共是可以分為三個步驟
1.把(1~n-1)的盤子從A搬到B  (從A藉由C到B)
2.把第n的盤子 從A搬到 C      (從A到C)
3.(1~n-1)的盤子從B搬到C      (從B藉由A到C)
void Honi(int n,char from,char by,char to)
{
    if(n>0){
        Honi(n-1,from,to,by);
        printf("no %d move from %c to %c",n,from,to);
        Honi(n-1,by,from,to);
    }
}


2018年10月30日 星期二

[C語言 練習 2-1]串鍊連結 動態儲存 堆疊練習 迷宮

之前的迷宮是用副程式的遞迴寫出來的,想改成跌代的方式,努力了一陣子

但還只想得出  資料結構 (不過還是遞迴..) 串列連結 來改寫,也順便練習一下怎麼利用串列聯結來寫程式,我是打算用堆疊push pop來幫助
堆疊就像是放一個東西在桶內,先放進去在最下面,最後一個放的在最上面.
拿出來時放在最上面(最後放的)先拿出來,最先放的則在最底部.最後才拿出來.

2018年10月27日 星期六

[C語言 練習 2]使用Dev C++建立 迷宮

        在上一次吃金幣的練習中,對自己的障礙物(其實想做出迷宮)感到不滿意,雖然有從書上看到遞迴,不過本身也想不到甚麼遞迴的方法.
有一天 找迷宮時看到 此網頁 https://openhome.cc/Gossip/OpenSCAD/RandomMaze.html
        雖然他是用OpenSCAD 而且是用 3D列印印出東西的,不過對我來說有個可以借鑑的東西就覺得很開心了,一開始是玩全看不懂的(不知道那個語言的用法並且對建立迷宮不太清楚怎麼做),所以實際上我幾乎是一路照抄他的寫法,最後卡在拆地圖的地方很久,花了很久的時間(好像快懂又不太懂,持續頓悟中),我才想通整個方法.(不過目前我還只寫得出遞迴版,非遞迴還需要需要思考蠻長一陣子)
P.S. 我才在好奇為毛我的檔名叫.cpp,原來是C++的檔案,所以其實我下方一些東西有沒注意到的錯誤...

C語言中 (我cpp檔案犯的一些錯誤,下方程式為C++支援寫法,不過差別沒太大 .下方連結有放C的程式碼,網頁部分就懶得改了)
我的C語言犯的錯誤...
1.沒有 布林值(bool) 1 0 (也沒有true false)
2.三元運算子 敘述?(是的話,這邊):(不是的話,在這邊)
好像是我等於放太多  , 我的?後面為兩個東西定值,沒把它們用() 包起來
maze[jx][iy]=state[index(jx,iy)].up_right_wall=2
3.index 索引副程式  有被命名過了 需要改名

2018年10月15日 星期一

擦拭玻璃心得

看到玻璃變很乾淨時,挺有成就感的  

目前適合的 擦玻璃方法 2018/10/13 的方法 

2018年10月11日 星期四

[C語言 練習 1]使用Dev C++設計 一款 貪食蛇吃金幣小遊戲

前言:
       這個是想來溫習一下好久以前學的C語言(不過file、 指標、結構 這些比較後面的章節都不太熟悉,以前學的其他東西自以為還行但實際上在寫時忘掉了很多,藉由寫個小程式來練習,程式方面的設計也只是做一步想一步)。P.S.本人極度缺乏各種基層知識...可能有不少地方會說錯。

     原本是打算用1111陣列來當圍牆,空白陣列當作可移動空間。來做一個貪食蛇小遊戲,不過後來發現我不懂該怎麼控制程式的刷新printf時間 (人物走路速度),所以我就改變成以按鍵操控動作,按一下動一下的吃金幣小遊戲,不然看不清人物在哪...看不清畫面的原因據說是system("cls")洗頻洗得不夠快。p.s.我是用system("cls")來洗掉屏幕的。
____________________________________________________________________________

[C語言 練習 3]串鍊連結 創建-刪除-插入-檢視

如果程式沒有練習,有些小細節很容易錯過... 就像一開始我的串列連結  完全沒注意到要在 外面設定一個head 結構link data儲存 資料 *next 指標next指向 下個結構 struct link{ int data; struct link *nex...