計算機程式語言實習課

Download Report

Transcript 計算機程式語言實習課

計算機程式語言實習課
認識助教
曾彥翔( Isfun )
台北市立大安國小 畢業
台北市立金華國中 畢業
台北市立和平高中 畢業
淡江大學 資訊管理系 畢業
實驗室 E689
E-mail :[email protected]
C++ online :http://helldeathscythe.myweb.hinet.net/
興趣:羽球、電玩、漫畫
專長:軟體工程、人工智慧
認識課程
 實習課占總成績多少?




作業
點名
分組報告
上機考
5%
5%
5%
10%
 實習課點不點名?
 計算機程式語言是什麼?
 資工系一定要會寫程式嗎?
認識課程
C++
經驗
問題 bug error
身精百戰的程式設計師...
手無吋鐵的初學者
毫無技巧的莽夫!?
Java
技能
C++ :Microsoft Visual C++ 、Dev C++
認識課程
手無吋鐵的初學者
助教
教授
技能
問題 bug error
作業 考試
經驗
C++ online :http://helldeathscythe.myweb.hinet.net/
認識你的競爭對手
 資工系 全台灣幾乎每所大學都有資工系
 程式設計
 工學院  理學院  資訊學門
 電機系
 機械系
 航太系
 數學系
 物理系




資訊工程系
資訊管理系
資訊傳播系
資訊圖書系
分組報告
 分組
 題目如下






enum語法
beep語法
poke語法
peek語法
sprintf語法
puts與printf語法
教授名言
 為什麼別人能這麼快就把程式寫完,我卻





一直原地踏步?
台上十分鐘,台下十年功
別看別人瞬間就把題目秒殺,他坐在電腦
前的時間絕對超乎你想像!
寫程式不會debug,就像游泳不會換氣
英文能力能夠彌補某方面的專業能力不足
助教不一定都是對的,相信自己的經驗
正式上課
C語言
 Programming or codes
 指揮電腦執行人類所需的演算法
 一系列指令的集合
 機器語言、組合語言、高階語言
 C++是一種高階程式語言
B
C(Ritchiie,Bell Lab)
C++(Stroustrup,Bell Lab)
C語言 編譯程式
C/C++ language
Source Code
Hello.cpp
Compiler
Dev C++,VC++
Binary Code
Hello.exe
C語言 編譯程式
Microsoft Visual C++ 6.0
Bloodshed Dev-C++
http://www.bloodshed.net/devcpp.html
C編譯環境
#include <stdio.h>
int main()
{
…
return 0;
}
C編譯環境
 程式內容中有許多符號
 「#」之後的東西是要給compiler看的
 「{ }」是要把一段程式碼包起來用的
 「;」是指程式結尾,如同文法中的。
 「//」表示註解 給設計師看的
 「/*」和「*/」表示註解 給設計師看的
 「\n」特殊字元
printf 語法
 起手式 printf 輸出在螢幕上
 Hello World
#include <stdio.h>
int main()
{
printf(“hello world”);
return 0;
}
解決程式結束畫面停留問題
system 語法
執行dos指令
system( const char* );
用途
 呼叫其他程式
 執行dos指令
 ...
system(“pause”);
稍後詳談…
換行
 即按下Entre的意思
printf(“hello world\n”);
 「\n」特殊字元,表示換行(new line)
 「\a」特殊字元,讓系統發出”嗶”響鈴
 puts();的效果!?
scanf 語法
 顯示數字
#include <stdio.h>
int main()
{
printf(“the number is %d”,11+13);
system(“pause”);
return 0;
}
scanf 語法
 顯示數字
printf(“the number is %d\n”,11+13);
 “%d”是顯示格式的指令,意味「以十進位
表示後面的參數」 ,即顯示11+13的值
 “%d”中的d是取自十進位「decimal」
scanf 語法
 螢幕輸出  鍵盤輸出
 將鍵盤輸入的”資料”讀入電腦
 變數x接收資料
11
X
scanf 語法
 變數
 如同數學中的 x,y,z
 但是使用變數時,必須先宣告(ps.)
變數型態
宣告
int
變數名稱
x ;
X
scanf 語法
 輸入數字
#include <stdio.h>
int main()
{
int num;
scanf(“%d”,&num);
printf(“the number is %d\n”,num);
system(“pause”);
return 0;
}
運算
 加法器
#include <stdio.h>
int main()
{
int num1,num2;
printf(“num1=”);
scanf(“%d”,&num1);
printf(“num2=”);
scanf(“%d”,&num2);
printf(“%d+%d=%d\n”,num1,num2,num1+num2);
system(“pause”);
return 0;
}
程式流程的選擇
 if…then…else
 switch
 goto
程式流程的迴圈
 do…while
 while
 fot
給阿發老師敎~ XD
巨集
 除了int以外,數值還有很多種表示方式
 共用的常數,如 圓周率 ASCII code
 方便設計師更容易撰寫程式
 只要程式碼遇到巨集所定義的字通通自動替換
#define 巨集名稱 常數
#define 巨集名稱 字串
#define 巨集名稱 函數
巨集
#include <stdio.h>
#define begin {
#define end
}
int main()
begin
int num1,num2;
printf(“num1=”);
scanf(“%d”,&num1);
printf(“num2=”);
scanf(“%d”,&num2);
printf(“%d+%d=%d\n”,num1,num2.num1+num2);
system(“pause”);
return 0;
end
計算三角函數
#include <stdio.h>
#include <cmath>
int main()
{
int num;
scanf(“%d”,&num);
printf(“sin(%d)=%d\n”,num,sin(num*3.14/180) );
system(“pause”);
return 0;
}
計算三角函數
#include <stdio.h>
#include <cmath>
int main()
{
int num;
scanf(“%d”,&num);
printf(“sin(%d)=%d\n”,num,sin(num*3.14/180) );
printf(“sin(%d)=%d\n”,num,cos(num*3.14/180) );
printf(“sin(%d)=%d\n”,num,tan(num*3.14/180) );
system(“pause”);
return 0;
}
計算三角函數
#include <stdio.h>
#include <cmath>
#define pi 3.14
int main()
{
int num;
scanf(“%d”,&num);
printf(“sin(%d)=%d\n”,num,sin(num*pi/180) );
printf(“sin(%d)=%d\n”,num,cos(num*pi/180) );
printf(“sin(%d)=%d\n”,num,tan(num*pi/180) );
system(“pause”);
return 0;
}
計算三角函數
#include <stdio.h>
#include <cmath>
#define pi 3.1415926535897932384626433832795
int main()
{
int num;
scanf(“%d”,&num);
printf(“sin(%d)=%d\n”,num,sin(num*pi/180) );
printf(“sin(%d)=%d\n”,num,cos(num*pi/180) );
printf(“sin(%d)=%d\n”,num,tan(num*pi/180) );
system(“pause”);
return 0;
}
巨集函數
 同理,巨集函數就是定義常用的函數
#include <stdio.h>
#define product(a,b) a*b
int main()
{
printf("%d\n",product(3,7);
return 0;
}
巨集函數
#include <stdio.h>
#define add(a,b) a+b
int main()
{
printf("%d\n", add(1,2) );
printf("%d\n", add(3,4) );
system(“pause”);
return 0;
}
巨集函數
#include <stdio.h>
#define add(a,b) a+b
#define product(a,b) a*b
int main()
{
int a = add(1,2);
int b = add(3,4);
printf("%d\n", product(a,b) );
return 0;
}
巨集函數
 只要程式碼遇到巨集所定義的自通通自動替換
#include <stdio.h>
#define add(a,b) a+b
#define product(a,b) a*b
int main()
{
printf( "%d\n",product( add(1,2) , add(3,4) ) );
return 0;
}
巨集函數
#include <stdio.h>
#define pi
#define circum(r)
#define area(r)
3.14
2*pi*r
pi*r*r
int main()
{
int r;
scanf(“%d”,&r);
printf(“原周長=%d\n”,circum(r) );
printf(“面積=%d\n”, area(r) );
system(“pause”);
return 0;
}
巨集函數
#include <stdio.h>
#define say(name,message)
printf("%s說:%s\n",name,message)
int main()
{
char n[10],m[50];
printf("NAME:"); scanf("%s",&n);
printf("Message:");
scanf("%s",&m);
say(n,m);
return 0;
}
system 語法
system 用途
執行dos指令
system( const char* );
修改檔名 流水號
system(“ren pic0.jpg pic1.jpg”);
system(“ren pic1.jpg pic2.jpg”);
system(“ren pic2.jpg pic3.jpg”);
...
程式的風格與習慣
 空白與縮排
 (a)
int main() {
int a,b,c;
a=5; b=4; c=3;
}
 (b)
int main()
{
int a,b,c;
a=5; b=4; c=3;
}
 (c)
int main() { int a,b,c; a=5; b=4; c=3; }
程式的風格與習慣
 計算機語言歷史上著名的"Dangling Else“
if (n>0)
if (n>0)
If (n>0) if (a>b) z=a;{ else z=b;
{
if (a>b)
if (a>b)
{
{
z=a;
z=a;
}
}
else
}
{
else
z=b;
{
}
z=b;
}
}
程式的風格與習慣
 if 的有效範圍
C 的發明人曾經強調 else 會承接最接近的
if 保留字。在 C 語言上已經闡述其特性,
所以所有的 C 編譯器都會以相同的方法來
處理 Dangling Else。
 { } 的使用
 如果指令只有一個,可以省略{ }
 { } 內寫幾條指令都可以
程式的風格與習慣
int main()
{
int a=2,b=2;
if (a==1)
if (b==2)
cout << "a“ << endl ;
else
cout << "b“ << endl;
cout << "c“ << endl;
}
Number Types
1 byte = 8 bits
Type Name
Memory
Size
short
2 bytes
-32767 ~ 32767
int
4 bytes
long
4 bytes
float
4 bytes
-2147483647 ~
2147483647
-2147483647 ~
2147483647
10 -38 ~ 10 38
double
8 bytes
10 -308 ~ 10 308
long double
10 bytes
10 -4932 ~ 10 4932
Number Types
1 byte = 8 bits
Type Name
Memory
Size
unsigned short
2 bytes
0 ~ 65535
unsigned int
4 bytes
0 ~ 4294967295
unsigned long
4 bytes
0 ~ 4294967295
sign
0
1
1
binary code
1 1 1
1
…
記憶體溢位
int main()
{
int a;
cin >> a;
cout << a <<endl;
if (a > 3000000000)
cout << "too big" << endl;
else
cout << a << endl;
return 0;
}
字元
Type Name
char
符號
0
A
a
Memory
1 bytes
ASCII code
48
65
97
字元
int main()
{
int n;
char a,b;
cin >> a;
cin >> b;
n= abs(b-a) ;
cout << a << "與" << b << "相差" << n << "個字母\n";
system("pause");
return 0;
}
作業
 撰寫一簡易計算機可執行+, -, *, /運算
CAL> 5.5 + 3.3 
8.8
CAL> 5.5 - 3.3 
2.2
CAL> 3.5 * 3 
10.5
CAL> 6.4 / 2 
3.2
CAL> 3.3 / 0 
Divided by zero
CAL> 2.5 ^ 4 
unknown operator: ^
CAL> 0+0 
Bye! (結束執行)
進階版
 撰寫一簡易計算機可執行+, -, *, /的多元運算
 需用到while
CAL> 5.5 + 3.3 + 1.1
9.9
CAL> 5.5 - 3.3 - 1.1
1.1
CAL> 3.5 * 3 * 2
21
CAL> 6.4 / 2 +1.8
5
CAL> 3.3 / 0 +1
Divided by zero
CAL> 2.5 ^ 4 
unknown operator: ^
CAL> 0+0 
Bye! (結束執行)
程式的藝術
 程式的美





可讀性
自由性
安全性(容錯程度)
消耗記憶體
執行效率
程式的藝術
 goto破壞 程式的可讀性
它會使得程式像義大利麵一樣
意思是會讓程式跑來跑去 可讀性變差
用do while去寫終止條件或是用break去終止
初新者的裝死技能!?
程式的藝術
 自由性
 變數讓程式更美好
 修改容易 但是 複雜度提高
for (int i=0;i<10;i++)
int a=0,b=10;c=1;
{
for (i=a;i<b;i+=c)
…
{
…
}
}
程式的藝術
 安全性
 容錯程度、漏洞、bug
 使用者有意或無意的使系統發生錯誤
 使用者有意或無意繞過程式設計師的監控範圍
程式的藝術
 消耗記憶體、浪費記憶體
 變數的生命週期
 在{ }內宣告的變數會在{ }結束後會釋放記憶體
 指標與動態陣列則須手動釋放記憶體
程式的藝術
 程式的執行效率
 演算法
 好的演算法比好的程式設計師重要
程式的藝術
 程式的執行效率
 示範程式
輸入n 顯示從1加到n的總和
1+2+3+…+n = ?
int ans=0;
[exp]
n = 10
for (???;???;???)
ANS = 55
{
…
}
驗證三角形
 驗證三角形 三邊長 a b c
if(a>b&&b>c)
{
if(a-b<c)
{
cout<<"合法三角形"<<endl;
if(a*a==b*b+c*c)
{
cout<<"直角三角形"<<endl;
cout<<"面積:"<<b*c/2<<endl;
}
}
else
cout<<"非合法三角形”<<endl;
}
if(a>c&&c>b)
{
if(a-c<b)
{
cout<<"合法三角形"<<endl;
if(a*a==c*c+b*b)
{
cout<<"直角三角形"<<endl;
cout<<"面積:"<<c*b/2<<endl;
}
}
else
cout<<"非合法三角形"<<endl;
}
to be continued…
驗證三角形
if (a+b>c && a+c>b && b+c>a)
{
cout << "合法三角形\n";
if (a*a+b*b==c*c)
{
cout << "直角三角形\n";
cout << "面積=" << a*b/2;
}
else if (b*b+c*c==a*a)
{
…
}
else if (a*a+c*c==b*b)
{
…
}
else
cout << "非直角三角形\n“ << endl;
}
else
cout << "不合法三角形\n";