2008年6月28日 星期六

Linked list

請使用動態記憶體配置與Linked list,撰寫一程式,可以讓使用者逐一輸入各學生的姓名與成績(int),並依成績高低由高到低排好節點串接的順序。並可印出所有學生的成績,以及查詢某一位學生的成績。

(optional): 試試讓該Linked list反轉,該如何做?

========================================================
拙著,請指教......
// 使用動態記憶體配置與linked list 撰寫程是讓使用者逐一輸入學生姓名,
// 成績,並依成績高低由高至低排好結點串接的順序,並可印出學生成績,
// 以及查詢某位學生成績
#include
#include


typedef struct TagStudent
{
char name[30];
int grade;
struct TagStudent *next;
}Student;

void InsertStudent(char newname[30],int newgrade);
int StudentCount();
void StudentPrint();
void StudentSearch(char search[]);

Student Head,*ptr=&Head,*current,*previous;


int main(int argc, char *argv[])
{
char ch,Newname[10],SearchName[10];
int Newgrade;

puts("學生成績查詢及輸入系統(停止輸入請按q或Q)\n");
while(1) //當按下不是 Ctrl+q 時
{
printf("請輸入學生姓名:");
scanf("%s",Newname);
if(!stricmp(Newname,"q")) break;
printf("請輸入成績:");
scanf("%d",&Newgrade);
InsertStudent(Newname,Newgrade);
}
puts("輸入結束!!");
printf("共有%d個學生\n",StudentCount());
StudentPrint();
printf("\n請輸入欲查詢學生姓名:");
scanf("%s",SearchName);
StudentSearch(SearchName);
system("PAUSE");
return 0;
}

void StudentSearch(char search[])
{
Student *p=ptr->next;
while(p!=NULL)
{
if(!strcmp(search,p->name))
printf("%s 成績:%d\n",p->name,p->grade);
p=p->next;
}
}
void StudentPrint()
{
Student *p = ptr->next;
while(p!=NULL)
{
printf("姓名:%s \t 分數:%d\n",p->name, p->grade);
p = p->next;
}
}

int StudentCount()
{
int count=0;
Student *p = ptr->next;
while(p!=NULL)
{
count++;
p = p->next;
}
return count;

}
void InsertStudent(char newname[],int newgrade)
{
Student *NewNode;
NewNode=(Student*)malloc(sizeof(Student));
if(NewNode == NULL)
puts("malloc Fail!!");

strcpy(NewNode->name ,newname);
NewNode->grade = newgrade;
NewNode->next=NULL;

if(StudentCount()==0)
{
NewNode->next = ptr->next;
ptr->next = NewNode;
}else
{
previous = ptr;
current = ptr->next;

while(current->grade > NewNode->grade)
{
previous = current;
if (current->next != NULL)
current=current->next;
else
goto END;
}
NewNode->next = current;
END:
previous->next = NewNode;
}

}

2008年7月 課表

年月:2008年7月 課表

<< 依班級:SI502 >>

製成時間:2008/7/1上午 01:40:04

星期
週別
星期一 星期二 星期三 星期四 星期五 星期六 星期日
第
1
週
上
午
6/30
 
 
 
7/1
陳衍華
    TCP/IP
    310
7/2
黃馨瑧
    DS
    310
7/3
蔡宜璋
    嵌入式處理器架構
    310
7/4
李志賢
    OS
    310
7/5
鄧淇文
    驅動程式
    310
7/6
鄧淇文
    驅動程式
    310
下
午
 
 
 
李志賢
    OS
    310
李志賢
黃馨瑧 專題
孫文駿 106
蔡宜璋
    嵌入式處理器架構
    310
黃馨瑧
 程式設計(C/C++)
    310
鄧淇文
    驅動程式
    310
鄧淇文
    驅動程式
    310
夜
間
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
第
2
週
上
午
7/7
 
 
 
7/8
李俊傑
    Socket程式
    310
7/9
黃馨瑧
 程式設計(C/C++)
    310
7/10
黃馨瑧
 程式設計(C/C++)
    310
7/11
李俊傑
    Socket程式
    310
7/12
蔡宜璋
    嵌入式處理器架構
    310
7/13
鄧淇文
    驅動程式
    310
下
午
 
 
 
李志賢
    OS
    310
 
 
 
李志賢
    OS
    310
黃馨瑧
 程式設計(C/C++)
    310
蔡宜璋
    嵌入式處理器架構
    310
鄧淇文
    驅動程式
    310
夜
間
 
 
 
 
 
 
孫文駿
    Linux程式設計
    310
 
 
 
 
 
 
 
 
 
 
 
 
第
3
週
上
午
7/14
 
 
 
7/15
 
 
 
7/16
孫文駿
    Linux程式設計
    310
7/17
李俊傑
    Socket程式
    310
7/18
 
    專題觀摩
    310
7/19
蔡宜璋
    嵌入式作業系統
    310
7/20
鄧淇文
    驅動程式
    310
下
午
 
 
 
李俊傑
    Socket程式
    310
黃馨瑧
 程式設計(C/C++)
    310
黃馨瑧
    DS
    310
李志賢
    OS
    310
蔡宜璋
    嵌入式作業系統
    310
鄧淇文
    驅動程式
    310
夜
間
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
第
4
週
上
午
7/21
 
 
 
7/22
 
 
 
7/23
李俊傑
    Socket程式
    310
7/24
李俊傑
    Socket程式
    310
7/25
李志賢
    OS
    310
7/26
蔡宜璋
    嵌入式作業系統
    310
7/27
鄧淇文
    驅動程式
    310
下
午
 
 
 
黃馨瑧
 程式設計(C/C++)
    310
李志賢
    OS
    310
李志賢
黃馨瑧 專題
孫文駿 310
黃馨瑧
    DS
    310
蔡宜璋
    嵌入式作業系統
    310
鄧淇文
    驅動程式
    310
夜
間
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
第
5
週
上
午
7/28
 
 
 
7/29
 
 
 
7/30
李俊傑
    Socket程式
    310
7/31
黃馨瑧
    DS
    310
8/1
李俊傑
    Socket程式
    310
8/2
陳裕生
 嵌入式Linux系統
    310
8/3
鄧淇文
    嵌入式作業系統
    310
下
午
 
 
 
 
 
 
李志賢
    OS
    310
李志賢
黃馨瑧 專題
孫文駿 106
李志賢
    OS
    310
陳裕生
 嵌入式Linux系統
    310
鄧淇文
    嵌入式作業系統
    310
夜
間
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

2008年6月13日 星期五

03.堆疊與佇列( Stack and Queue )

上課內容精要!!

3.1 堆疊和佇列基本觀念

堆疊(Stack)

加入(push)與刪除(pop)於同一端。後進先出(LIFO)

例子:堆積木、蓋房子

佇列(Queue)

加入與刪除於不同端(front & rear)。先進先出(FIFO)

例子:排隊買票、坐公車

3.2 堆疊的加入與刪除

3.2.1 堆疊加入函數(top的初始值為-1)

3.2.2 堆疊刪除函數

3.3 佇列的加入與刪除

3.3.1 佇列加入函數(front、rear的初始值分別為0、-1)

3.3.2 佇列刪除函數

[ 問題 ] 佇列前端還有空位,但要加入元素卻發現此佇列已滿

[ 解決方式 ] 環狀佇列

3.3.3 環狀佇列加入函數(front、rear的初始值均為MAX-1)

3.3.4 環狀佇列刪除函數

3.4 堆疊與佇列的應用

堆疊的應用 :副程式的呼叫 (subroutine calls)

中序表示式 → 後序表示式

佇列的應用 : 作業系統的工作安排(job scheduling)

中序表示式 :「運算子」(operator)置於「運算元」(operand)的中間

Ex: A*B / C

後序表示式 :「運算子」置於「運算元」的後面

Ex:AB * C /

3.5 如何計算後序表示式

利用<運算元堆疊法>

3.6 老掉牙的應用問題

數獨遊戲 (個人經常給學生玩的數獨網站) http://oddest.nc.hcc.edu.tw/sumain.htm

Algorithm Gossip: 八個皇后

老鼠走迷官(一)

河內塔

(以上三個連結取自 良葛格學習筆記 - 困在技術撰稿人身體裡的小說家)

2008年5月28日 星期三

Linux Programming (2) Wrapper

上課的內容:如何在上班時偷看股票~~~

1.先去找你要的網頁資料,並透過lynx 去抓股票:2475 下來存到aaa.txt

[root@SI502U30 Class]# lynx -dump http://tw.stock.yahoo.com/q/q?s=2475 > aaa.txt

2.人工搜尋你要的資料。例如我想要的股票資料為 [19] 和 [20] 那兩行中間(請自行打開aaa.txt文件檔)

[18]2475M
[19][X
14:30 9.55 9.55 9.56 0.24 29,595 9.79 9.80 9.82 9.55
[20]N@[21]sD
@[22]wX
xU (_) R (_) _____ i [BUTTON] [23]s

3.所以利用grep和cut去搜尋[19] 和 [20] 在檔案的那一行?
如例子上所列為 aaa.txt的 20行 和 22行

cut -d: -f1 表示 以 ":" 作分隔 ,並取 f1 (第一欄)
所以得到的 19\] 位於檔案的20行 ; 20\] 位於檔案的22行 ;

[root@SI502U30 Class]# grep -n 19\] aaa.txt |cut -d: -f1
20
[root@SI502U30 Class]# grep -n 20\] aaa.txt |cut -d: -f1
22

4.利用head 和 tail 將資料擷取出來 所以得到的資料
head -21 表示將檔案的第一行到第21行保留,第22行以下刪除
tail -1 表示將檔案的最底下數來第1行以下保留,倒數第2行以上刪除

[root@SI502U30 Class]# head -21 aaa.txt > temp.txt
[root@SI502U30 Class]# tail -1 temp.txt > temp2.txt
[root@SI502U30 Class]# cat temp2.txt
14:30 9.55 9.55 9.56 0.24 29,595 9.79 9.80 9.82 9.55

5.在利用cut把剩下精簡的資料作分欄
# cut -d" " -f9 temp2.txt 以空格當分隔 所以9.55為第九個分隔 14:30 為第6個分隔

[root@SI502U30 Class]# cat temp2.txt
14:30 9.55 9.55 9.56 0.24 29,595 9.79 9.80 9.82 9.55
[root@SI502U30 Class]# cut -d" " -f9 temp2.txt
9.55

6. 將上述所學的指令串成一個shell script (stock.sh)

如此就可以將每日的股票資料和你所想要觀察的資料當漏下來寄給自己。
如果公司有擋網頁的話就可以在上班的時候利用電子郵件看股票。


#(stock.sh)

i=2601
lynx -dump http://tw.stock.yahoo.com/s/s/kimo_day${i}.html >${i}.txt

begin_line=`grep -n 19\] ${i}.txt|cut -d: -f1`
echo "begin_line= $begin_line"

end_line=`grep -n 21\] ${i}.txt|cut -d: -f1`
echo "end_line= $end_line"

cut_line=$(( (end_line + begin_line)/2 ))
echo "cut_line= $cut_line"

head -${cut_line} ${i}.txt > tmp.txt
tail -1 tmp.txt > tmp2.txt

echo
echo time:`cut -d' ' -f4 tmp2.txt`
echo price:`cut -d' ' -f5 tmp2.txt`

exit
rm tmp.txt
rm tmp2.txt
rm ${i}.txt

2008年5月27日 星期二

Linux Programming (1) Shell

  1. Shell is a piece of software that provides an interface for users.
  2. Executable File VS. Built-in Commands
  3. #echo $SHELL //顯示目前使用中的SHELL
  4. #chsh -s /bin/tcsh //改變SHELL
  5. A shell script will be writen by a text editor.
  6. Begin with " #!/bin/bash ".
  7. " # " 註解!! 只能寫在每一行的 head
  8. echo -n " my name is " // " -n "means that don't the newline
    whoami
  9. 執行 shell script 可以增加權限以後就不需加 sh 去執行
    #chmod +x hello.sh 或是 #chmod hello.sh 777
    #hello.sh (就可以直接執行)
  10. 若是不行,需要增加執行目錄=>編輯 .bash_pprofile 加入 PATH= . : $PATH
  11. Shell變數 (1) 預定變數(Predefined variables) local variable (2) 環境變數(Environment variables) Global variable , ex: PATH、HOME
  12. 設定變數,a=3,等號前後不能有空格。
  13. #longpath=/usr/home/ee/99/kph
    #cd $longpath (使用$符號取得設定的變數)
  14. set 可以查看所有已設定的變數
    #set grep longpath
  15. unset varName 移除設定的變數
  16. 變數輸出 echo 相當於printf() ; 變數輸入 read 相當於 scanf() ;
    #echo test (直接顯示"test")
    #echo $test (顯示 test變數內容)
    #read test (讀進來的取名test)
  17. 宣告環境變數:
    export變數名稱=內容 =>Global變數
    變數名稱=內容=>Local變數
    查看 set (宣告local) #set test=abc (宣告global) #export test=abc
    移除 unset (宣告local) #unset test (宣告global) #export -n test
  18. 引號:單引號:(" ' " ,所夾的所有內容保持不變)
    #echo 'pig cat $dog'
    #pig cat $dog (裡面所有符號皆無效)
  19. 引號:雙引號:(" " " ,所夾的內容保持不變)
    有三種例外(1)變數 $var ($ 跳脫字元) (2)反斜線 \ (3)反單引號:`
    (1)變數 $var ($ 跳脫字元)
    #color=blue
    #echo $color ==>#blue
    #echo '$color' ==>#$color
    #echo "$color" ==>#blue
    (2)反斜線 \ (其後的字元的特殊意義會被取消)
    #num=10
    #echo "#num" ===>#10
    #echo "\$num" ===>#$num
    #echo "\"$num\"" ===>#"10"
    (3)反單引號:` (不同於單引號 ' ,所夾內容會先執行)
    #echo "Your....is `pwd`"
    #Your....is /home/jhhsu
  20. ..
  21. .待續.......

2008年5月25日 星期日

嵌入式班:2008年6月 課表

星期
週別
星期一 星期二 星期三 星期四 星期五 星期六 星期日
第
1
週
上
午
5/26
 
 
 
5/27
孫文駿
    Linux程式設計
    310
5/28
郭惠民
    計算機組織
    310
5/29
孫文駿
    Linux程式設計
    310
5/30
郭惠民
    計算機組織
    310
5/31
莊博景
    8051微處理器
    310
6/1
 
 
 
下
午
孫文駿
    Linux程式設計
    310
黃馨瑧
    DS
    310
孫文駿
    Linux程式設計
    310
 
 
 
黃馨瑧
    DS
    310
莊博景
    8051微處理器
    310
 
 
 
夜
間
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
第
2
週
上
午
6/2
孫文駿
    Linux程式設計
    310
6/3
郭惠民
    計算機組織
    310
6/4
黃馨瑧
    DS
    310
6/5
郭惠民
    計算機組織
    310
6/6
 
 
 
6/7
 
 
 
6/8
 
 
 
下
午
黃馨瑧
    DS
    310
孫文駿
    Linux程式設計
    310
黃馨瑧
    專題
    310
孫文駿
    Linux程式設計
    310
 
 
 
 
 
 
 
 
 
夜
間
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
第
3
週
上
午
6/9
 
 
 
6/10
 
 
 
6/11
黃馨瑧
    DS
    310
6/12
孫文駿
    Linux程式設計
    310
6/13
李志賢
    嵌入式系統概論
    310
6/14
蔡宜璋
    嵌入式處理器架構
    310
6/15
 
 
 
下
午
 
 
 
李志賢
    嵌入式系統概論
    310
陳衍華
    TCP/IP
    310
黃馨瑧
    DS
    310
孫文駿
    Linux程式設計
    310
蔡宜璋
    嵌入式處理器架構
    310
 
 
 
夜
間
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
第
4
週
上
午
6/16
 
 
 
6/17
陳衍華
    TCP/IP
    310
6/18
蔡宜璋
    嵌入式處理器架構
    310
6/19
陳衍華
    TCP/IP
    310
6/20
陳衍華
    TCP/IP
    310
6/21
 
 
 
6/22
 
 
 
下
午
 
 
 
黃馨瑧
    DS
    310
蔡宜璋
    嵌入式處理器架構
    310
黃馨瑧
    DS
    310
黃馨瑧
 程式設計(C/C++)
    310
 
 
 
 
 
 
夜
間
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
第
5
週
上
午
6/23
 
 
 
6/24
陳衍華
    TCP/IP
    310
6/25
 
 
 
6/26
蔡宜璋
    嵌入式處理器架構
    310
6/27
 
 
 
6/28
莊博景
    8051微處理器
    310
6/29
鄧淇文
    驅動程式
    310
下
午
 
 
 
黃馨瑧
 程式設計(C/C++)
    310
黃馨瑧
 程式設計(C/C++)
    310
蔡宜璋
    嵌入式處理器架構
    310
黃馨瑧
 程式設計(C/C++)
    310
莊博景
    8051微處理器
    310
鄧淇文
    驅動程式
    310
夜
間
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
第
6
週
上
午
6/30
 
 
 
7/1
 
 
 
7/2
陳衍華
    TCP/IP
    310
7/3
蔡宜璋
    嵌入式處理器架構
    310
7/4
方華韋
    OS
    310
7/5
鄧淇文
    驅動程式
    310
7/6
 
 
 
下
午
 
 
 
方華韋
    OS
    310
李志賢
黃馨瑧 專題
孫文駿 106
蔡宜璋
    嵌入式處理器架構
    310
黃馨瑧
 程式設計(C/C++)
    310
鄧淇文
    驅動程式
    310
 
 
 
夜
間