C語言復習
C語言的Hello world程式
/* hello.c
the Hello world program
*/
#include <stdio.h>
int main()
{
printf("Hello world!\n");
return 0;
}
說明
include
stdio.h包括許多標準的輸出入及檔案處理函數的宣告(declaration)。因為範例要引用printf()函數,所以加上這一行。表示程式程式包含stdio.h這個檔案。 - 基本的C程式是由main()函數所開始執行。因此程式要有一個main()函數。
- C語言的函數的定義(definition)是由左右大括號包起來的一些程式。
- printf()是一個在螢幕(在Windows中是一個DOS視窗)上輸出文字的函數。由雙引號包起來的是一個字串。在這裡,表示由priintf()輸出 "Hello world!\n" 這個字串。“\n”表示換行的意思。
C程式的組成
寫程式基本上就是由輸入資料經過運算然後得到輸出。這樣的過程可以簡化成五個部份:一、宣告變數。二、進行運算。三、控制流程。四、判斷資料的值。五、輸入及輸出。舉例說:阿姆斯壯數字(Armstrong Numbers)是三位數的數字。數字的每一個位元的3次方的值加起來等於其本身的數值。如153=13+53+33,所以153是一個阿姆斯壯數字。那有哪些三位數是阿姆斯壯數字呢?可以寫成一個C程式如下:
/* AmNum.c
Print all of Armstrong Numbers
*/
#include <stdio.h>
void main()
{
int i,j,k, num1, num2;
for (i=0; i<10; i++)
for (j=0; j<10; j++)
for (k=0; k<10; k++)
{
num1=i*100+j*10+k;
num2=i*i*i+j*j*j+k*k*k;
if (num1==num2)
printf("%d ", num1);
}
}
說明
- C的程式任何地方中可以加上由 “/” 及 “/” 所圈起來的文字,稱為註解(Comment)。“/” 及 “/” 所圈起來的區塊註解 (block comment), “//”開頭的行註解 (line comment)。只要是程式中遇到 “//”之後的那一行剩下的文字都會被視為註解。
- int i,j,k, num1, num2; 表示宣告了5個整數變數,其名稱為i,j,k, num1, num2。 int是C語言的關鍵字,表示寫在其後面的變數為整數型別。
- for (i=0; i<10; i++) 表示一個迴圈(loop)的表示式,用來控制程式的進行的次數。for-loop 是由左右括號包起來的一個表示式,裡頭有二個分號將表示式分成三個部份。第一個部份是啟始狀態;第二個部份是執行條件;第三個部份是每一次狀態改變的方式。在這裡for (i=0; i<10; i++)表示i這個變數從0開始,每次的值加一(i++),如果i的值小於1(i<10)不成立則結束此一迴圈。所以其後面的敘述會執行10次。在範例中有三層的迴圈,其執行是k變數所在的迴圈執行10次時,j變數的所在的迴圈執行1次;同樣地,j變數所在的迴圈執行10次時,i變數的所在的迴圈執行1次。
- 迴圈(loop)中的敘述如果只有一行,則只要直接將此一敘述寫在for-loop的後面。如果有很多行的敘述。則用左右括符把它們包起來。每一個敘述和數學的等式很像,不同的是每一個敘述的最後面要加上分號 “;”。
- if (num1==num2)表示一個條件式(condition)。表示如果括符中的條件成立的時候,進行下面的敘述。二個等號 “==” 表示相等關係。如果num1和num2的值相等則num1==num2這個表示式的值是1;否則這個表示式的值為0。如果這二個數值相同的話,下一行的printf()函數就把它印出來。
C程式的main() function
/* gcd.c
calculate the greatest common divisor of two numbers
*/
#include <stdio.h>
#include <stdlib.h>
void main(int argc, char *argv[])
{
int num1, num2, a, b, c;
if (argc<3)
{
printf("There must be 2 numbers at least.\n");
return;
}
num1=atoi(argv[1]);
num2=atoi(argv[2]);
if (num1<0) num1=-num1;
if (num2<0) num2=-num2;
if (num1>num2)
{
a=num1;
b=num2;
}
else
{
a=num2;
b=num1;
}
c=a%b;
while (c!=0)
{
a=b;
b=c;
c=a%b;
}
printf("The GCD of %d and %d is %d", num1, num2, b);
}
說明
- C的程式處理輸入參數,則可以寫成以下的形式:main( int argc, char *argv[])。
- 例如: 執行 pkzip –d file.zip。 則系統會傳給pkzip的參數字串為 “pkzip”, “–d”, “file.zip”;而argc=3。
- 寫或小寫的字在C程式語言中視為不同的字。所以 main()函數不可以寫成 MAIN()或 Main()。
- atoi()是另一個標準函數。其作用是將一個字串轉成一個數字。atoi()是由
標頭檔所宣告的,所以,在程式的開頭加上 #include - if (num1==num2)表示一個條件式(condition)。表示如果括符中的條件成立的時候,進行下面的敘述。二個等號 “==” 表示相等關係。如果num1和num2的值相等則num1==num2這個表示式的值是1;否則這個表示式的值為0。如果這二個數值相同的話,下一行的printf()函數就把它印出來。
C程式的函數function定義及宣告
/* pc.c
ParityCheck of a byte
*/
#include <stdio.h>
int ParityCheck(char x);
void main(){
char ch1=53;
char ch2=124;
printf("the byte %x parity= %d \n", ch1, ParityCheck(ch1)); printf("the byte %x parity= %d \n", ch2, ParityCheck(ch2));
}
int ParityCheck(char x){
int i, bitcheck,parity=0;
for (i=0, bitcheck=1; i<8; i++, bitcheck<<=1)
if (x&bitcheck)
parity++;
return parity%2;
}
說明
- 函數的設計及使用包括三件事。一、是函數原型(prototype)的宣告、函數的呼叫(call)以及函數的定義(definition)。函數原型(prototype)的宣告必須在函數的呼叫(call),其目的在於讓編譯器知道有這個函數存在,以及其輸入及輸出參數為何種型別。
- int ParityCheck(char x);表示ParityCheck這個函數輸入一個字元,輸出一個整數值。
表示式及指定式
運算子的種類 | 優先順序 |
---|---|
( ) | 8 |
-- ++ ! & | 7 |
* / % | 6 |
+ - | 5 |
> < >= <= | 4 |
== != | 3 |
&& | 2 |
|| | 1 |
#
從命令列輸入值
double d1, d2;
int a1, a2;
d1 = Double.parseDouble(args[0]);
d2 = Double.parseDouble(args[1]);
a1 = Integer.parseInt(args[0]);
a2 = Integer.parseInt(args[1]);
從檔案輸入
try
{
//In
FileReader reader = new FileReader("math.txt");
BufferedReader sr = new BufferedReader(reader);
String line = sr.readLine();
while (line != null && line.length() > 0)
{
int score = Integer.parseInt(line);
line = sr.readLine();
}
sr.close();
}
catch(FileNotFoundException fe)
{
System.out.printf(fe.getMessage());
}
catch(IOException ie)
{
System.out.printf(ie.getMessage());
}
從檔案輸出
try
{
//Out
FileWriter writer = new FileWriter(result.txt);
PrintWriter pw = new PrintWriter(writer);
System.out.printf("%2d => %5.2f\n", score, modified);
pw.printf("%5.2f", modified);pw.println();
pw.close();
}
catch(FileNotFoundException fe)
{
System.out.printf(fe.getMessage());
}
catch(IOException ie)
{
System.out.printf(ie.getMessage());
}
產生亂數
Random rnd = new Random();
int[] ball = new int[49];//int ball[49];
for (int k = 0; k < 49; k++)
{
ball[k] = rnd.nextInt();;
}
把字串切開
String[] numStr = line.split(" ");
從檔案輸入