c program design data types

Post on 05-Jan-2016

71 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

C Program Design Data Types. 主講人:虞台文. Content. Memory Concept Number Systems Basic Data Types int char float Double Data-Type Modifiers Type Conversions. C Program Design Data Types. Memory Concept. CPU. ALU. Input Device. Output Device. Input. Output. Control. Memory. - PowerPoint PPT Presentation

TRANSCRIPT

C Program DesignData Types

主講人:虞台文

Content Memory Concept Number Systems Basic Data Types

– int– char– float– Double

Data-Type Modifiers Type Conversions

C Program DesignData Types

Memory Concept

Computer Architecture

ALUALU

ControlControl

CPU

InputInput OutputOutput

MemoryMemory

InputDevice

OutputDevice

MemoryMemory

Data in Memory: Bit, Byte, Word, …

Bit:– 2 possible values

Byte: 8-bit data– 256 (28) possible values

Word: 16-bit data

– 65536 (216) possible values

0/10/1

0/10/1 0/10/1 0/10/1 0/10/1 0/10/1 0/10/1 0/10/1 0/10/1

0/10/1 0/10/1 0/10/1 0/10/1 0/10/1 0/10/1 0/10/1 0/10/1 0/10/1 0/10/1 0/10/1 0/10/1 0/10/1 0/10/1 0/10/1 0/10/1

C Program DesignData Types

Number Systems

Memory Space

00000000

00000001

00000002

00000003

00000004

00000005

00000006

00000007

00000008

FFFFFFFB

FFFFFFFC

FFFFFFFD

FFFFFFFE

FFFFFFFF

address

OS

mail

Word

HelloWorld

System Area

User Area

Number Systems

Binary (0-1)– bn1bn2…b2b1b0

Octal (0-7)– on1on2…o2o1o0

Decimal (0-9)– dn1dn2…d2d1d0

Hexadecimal (0-9,A-F)– hn1hn2…h2h1h0

1

0

2n

kk

k

value b

1

0

8n

kk

k

value o

1

0

10n

kk

k

value d

1

0

16n

kk

k

value h

Examples:3 2 1 0

2 101011 1 2 0 2 1 2 1 2 11

3 2 1 08 103213 3 8 2 8 1 8 3 8 1675

2 1 010 10813 8 10 1 10 3 10 813

2 1 016 102 12 16 2 16 10 16 3114C A

Number System Conversion

Binary (0-1)– bn1bn2…b2b1b0

Octal (0-7)– on1on2…o2o1o0

Decimal (0-9)– dn1dn2…d2d1d0

Hexadecimal (0-9,A-F)– hn1hn2…h2h1h0

1

0

2n

kk

k

value b

1

0

8n

kk

k

value o

1

0

10n

kk

k

value d

1

0

16n

kk

k

value h

Examples:3 2 1 0

2 101011 1 2 0 2 1 2 1 2 11

3 2 1 08 103213 3 8 2 8 1 8 3 8 1675

2 1 010 10813 8 10 1 10 3 10 813

2 1 016 102 12 16 2 16 10 16 3114C A

Number System Conversion

Decimal Binary Octal Hexadecimal

000000010010001101000101

0111

1001

0110

1000

101010111100110111101111

012345

7

9

6

8

101112131415

012345

7

11

6

10

121314151617

012345

7

9

6

8

ABCDEF

Number Coding in C

#include <stdio.h>

main(){ int octNum = 011; // an octal number is prefixed by 0 int hexNum = 0x11; // a hexadecimal number is prefixed by 0x int decNum = 11; // a decimal number is w/o any prefix

// display decimal numbers // for numbers represented in different number systems printf("011=%d, 0x11=%d, 11=%d\n", octNum, hexNum, decNum);

// desplay a number using different number sytems printf("100=0x%x, 100=0%o, 100=%d\n", 100, 100, 100);}

#include <stdio.h>

main(){ int octNum = 011; // an octal number is prefixed by 0 int hexNum = 0x11; // a hexadecimal number is prefixed by 0x int decNum = 11; // a decimal number is w/o any prefix

// display decimal numbers // for numbers represented in different number systems printf("011=%d, 0x11=%d, 11=%d\n", octNum, hexNum, decNum);

// desplay a number using different number sytems printf("100=0x%x, 100=0%o, 100=%d\n", 100, 100, 100);}

Data Coding

0 1 1 1 0 0 1 1

11510

7 = 01112 3 = 00112

= 011100112

= 011100112

= 011100112

int totalMoney = 115;int motorState = 115;int girl_boy = 115;

int totalMoney = 115;int motorState = 115;int girl_boy = 115;

練習1. 輸入一介於 0-255 之十進位數字用於表示八台馬達之狀態 ( 如

前投影片所示 ) ,利用你目前所學過之 C 敘述撰寫一程式,輸出各台馬達之狀態。例:

練習2. 輸入一介於 0-255 之十進位數字用於表示男女孩數 ( 如前投影

片所示 ) ,利用你目前所學過之 C 敘述撰寫一程式,輸出男孩與女孩數。例:

C Program DesignData Types

Basic Date Types

Basic Data Types

chara single byte, capable of holding one character in the local character set

intan integer, typically reflecting the natural size of integers on the host machine

float single-precision floating point

double double-precision floating point

The type of an object determines the set of values it can have and what operations can be performed on it.

The sizeof Operator

#include <stdio.h>

main(){ printf("The size of char is: %d\n", sizeof(char)); printf("The size of int is: %d\n", sizeof(int)); printf("The size of float is: %d\n", sizeof(float)); printf("The size of double is: %d\n\n", sizeof(double));

printf("The size of short is: %d\n", sizeof(short)); printf("The size of long is: %d\n", sizeof(long)); printf("The size of long double is: %d\n", sizeof(long double)); printf("The size of void* is: %d\n\n", sizeof(void *));}

#include <stdio.h>

main(){ printf("The size of char is: %d\n", sizeof(char)); printf("The size of int is: %d\n", sizeof(int)); printf("The size of float is: %d\n", sizeof(float)); printf("The size of double is: %d\n\n", sizeof(double));

printf("The size of short is: %d\n", sizeof(short)); printf("The size of long is: %d\n", sizeof(long)); printf("The size of long double is: %d\n", sizeof(long double)); printf("The size of void* is: %d\n\n", sizeof(void *));}

int Signed Integer

The size of int is dependent on machine It is usually the most efficient data type of a machi

ne, e.g., in a 32-bit machine, its size is 32 bits, i.e., 4 bytes.

The range of int is defined in <limits.h>

#define INT_MIN (-2147483647 - 1) /* minimum (signed) int value */#define INT_MAX 2147483647 /* maximum (signed) int value */

#define INT_MIN (-2147483647 - 1) /* minimum (signed) int value */#define INT_MAX 2147483647 /* maximum (signed) int value */

int Signed Integer

INT_MIN (-2147483647 - 1)INT_MAX 2147483647

#include <stdio.h>#include <limits.h>

main(){ int val1, val2, val3, val4;

printf("int range: %d <--> %d\n", INT_MIN, INT_MAX);

val1 = INT_MIN + 1; val2 = INT_MAX - 1; // within range val3 = INT_MIN - 1; val4 = INT_MAX + 1; // overflow

// ok --- within range printf("INT_MIN + 1 = %d, INT_MAX - 1 = %d\n", val1, val2); // overflow printf("INT_MIN - 1 = %d, INT_MAX + 1 = %d\n", val3, val4);}

#include <stdio.h>#include <limits.h>

main(){ int val1, val2, val3, val4;

printf("int range: %d <--> %d\n", INT_MIN, INT_MAX);

val1 = INT_MIN + 1; val2 = INT_MAX - 1; // within range val3 = INT_MIN - 1; val4 = INT_MAX + 1; // overflow

// ok --- within range printf("INT_MIN + 1 = %d, INT_MAX - 1 = %d\n", val1, val2); // overflow printf("INT_MIN - 1 = %d, INT_MAX + 1 = %d\n", val3, val4);}

Integer Constants

Integer constant can be expressed in the following ways:1234 (decimal)

0xff (Hexidecimal)

0100 (Octal)

'a' (ASCII character)

'\xhh' (Hex character)

'\000' (Oct character)

ASCII

用於表示一個 Byte 足夠表示之整數

Overflow 由程式設計師負責

Integer ConstantsASCII

#include <stdio.h>

main(){ int val1, val2, val3, val4;

val1 = 'd'; val2 = '\x64'; val3 = '\144'; val4 = 'a' + 3;

// Display in decimal printf("'d'=%d, '\\x64'=%d, '\\144'=%d, 'a' + 3 = %d\n", val1, val2, val3, val4);

// Display in character printf("'d'->%c, '\\x64'->%c, '\\144'->%c , 'a' + 3->%c\n" val1, val2, val3, val4);}

#include <stdio.h>

main(){ int val1, val2, val3, val4;

val1 = 'd'; val2 = '\x64'; val3 = '\144'; val4 = 'a' + 3;

// Display in decimal printf("'d'=%d, '\\x64'=%d, '\\144'=%d, 'a' + 3 = %d\n", val1, val2, val3, val4);

// Display in character printf("'d'->%c, '\\x64'->%c, '\\144'->%c , 'a' + 3->%c\n" val1, val2, val3, val4);}

練習1. 預測以下程式中哪些敘述編譯時會產生錯誤 (error)

或警訊 (warning) , 說明其原因,編譯並驗證之。#include <stdio.h>#include <limits.h>

main(){ int v1, v2, v3, v4, v5, v6, v7, v8, v9, v10;

v1 = INT_MAX + 1; v2 = INT_MIN - 1; v3= 9999999999999; v4 = -9999999999999; v5 = 0x100; v6 = '\x100'; v7 = 0377; v8 = '\377'; v9 = 0477; v10 = '\477';}

#include <stdio.h>#include <limits.h>

main(){ int v1, v2, v3, v4, v5, v6, v7, v8, v9, v10;

v1 = INT_MAX + 1; v2 = INT_MIN - 1; v3= 9999999999999; v4 = -9999999999999; v5 = 0x100; v6 = '\x100'; v7 = 0377; v8 = '\377'; v9 = 0477; v10 = '\477';}

char Signed Character

The size of char is 8 bits (1 byte) Although it is named character, it is in fact an integ

er whose value can be represented by one byte, i.e., between 128 and +127. <limits.h>

#define SCHAR_MIN (-128) /* minimum signed char value */#define SCHAR_MAX 127 /* maximum signed char value */

// . . . .#define CHAR_MIN SCHAR_MIN#define CHAR_MAX SCHAR_MAX

#define SCHAR_MIN (-128) /* minimum signed char value */#define SCHAR_MAX 127 /* maximum signed char value */

// . . . .#define CHAR_MIN SCHAR_MIN#define CHAR_MAX SCHAR_MAX

CHAR_MIN (-128)INT_MAX 127

char Signed Character

The size of char is 8 bits (1 byte)

Although it is named character, it is in fact an

integer whose value can be represented by

one byte, i.e., between 128 and +127.

It is most frequently used to represent ASCII

characters (7-bit)

CHAR_MIN (-128)INT_MAX 127

ASCII

Character Constants

Character constant can be expressed in the following ways:1234 (decimal)

0xff (Hexidecimal)

0100 (Octal)

'a' (ASCII character)

'\xhh' (Hex character)

'\000' (Oct character)

ASCII

用於表示一個 Byte 足夠表示之整數

Overflow 由程式設計師負責

Character Constants

 \a alert (bell) character  \\ backslash \b backspace  \? question mark \f formfeed  \' single quote \n newline  \"  double quote \r carriage return  \000 octal number \t horizontal tab  \xhh hexadecimal number  \v vertical tab

Some Escape Sequences

範例: Character Constants#include <stdio.h>

main(){ char c1, c2, c3, c4;

c1 = 'd'; c2 = '\x64'; c3 = '\144'; c4 = 'a' + 3;

// Display in decimal printf("'d'=%d, '\\x64'=%d, '\\144'=%d, 'a' + 3 = %d\n", c1, c2, c3, c4);

// Display in character printf("'d'->%c, '\\x64'->%c, '\\144'->%c , 'a' + 3->%c\n" c1, c2, c3, c4);}

#include <stdio.h>

main(){ char c1, c2, c3, c4;

c1 = 'd'; c2 = '\x64'; c3 = '\144'; c4 = 'a' + 3;

// Display in decimal printf("'d'=%d, '\\x64'=%d, '\\144'=%d, 'a' + 3 = %d\n", c1, c2, c3, c4);

// Display in character printf("'d'->%c, '\\x64'->%c, '\\144'->%c , 'a' + 3->%c\n" c1, c2, c3, c4);}

範例: Escape Sequences

#include <stdio.h>

main(){ printf("\x6d\x6f\x64\x65\x6d\n");}

#include <stdio.h>

main(){ printf("\x6d\x6f\x64\x65\x6d\n");}

ASCII

char vs. int

char與 int可以說只有大小 (容量 )不同,可以用來存放相同性質之資料。

一般, sizeof(int) > sizeof(char) 。– 故,若容量足夠,使用 char較省記憶體。例如:表示年齡 (age)

與各科成績 (math_score) 之變數,用 char已足夠。– 然,省記憶體不意謂運算速度較快。

char與 int變數間可以進行運算– char變數將先轉為 int型態後,再行運算,運算後型態為 int

– char與 int資料型態之變數值可交互指派 (可能 overflow) C 中字串 (string) 係 char形成之陣列。

範例: char vs. int

#include <stdio.h>

main(){ char c='d'; // c=100 int val=200;

printf("c = %d, val= %d\n", c, val); val = c + val; // val = 300? printf("val = c + val = %d (Expected %d)\n", val, 300); c = c + val; // c = 400? printf("c = c + val = %d (Expected %d)\n", c, 400); val = c * 2; // val = 800? printf("val = c * 2 = %d (Expected %d)\n", val, 800); c = val; // c = 800? printf("c = val = %d (Expected %d)\n", c, 800);}

#include <stdio.h>

main(){ char c='d'; // c=100 int val=200;

printf("c = %d, val= %d\n", c, val); val = c + val; // val = 300? printf("val = c + val = %d (Expected %d)\n", val, 300); c = c + val; // c = 400? printf("c = c + val = %d (Expected %d)\n", c, 400); val = c * 2; // val = 800? printf("val = c * 2 = %d (Expected %d)\n", val, 800); c = val; // c = 800? printf("c = val = %d (Expected %d)\n", c, 800);}

以下程式可以通過編譯,但結果卻與預期不同

範例: char vs. int

#include <stdio.h>

main(){ char c='d'; // c=100 int val=200;

printf("c = %d, val= %d\n", c, val); val = c + val; // val = 300? printf("val = c + val = %d (Expected %d)\n", val, 300); c = c + val; // c = 400? printf("c = c + val = %d (Expected %d)\n", c, 400); val = c * 2; // val = 800? printf("val = c * 2 = %d (Expected %d)\n", val, 800); c = val; // c = 800? printf("c = val = %d (Expected %d)\n", c, 800);}

#include <stdio.h>

main(){ char c='d'; // c=100 int val=200;

printf("c = %d, val= %d\n", c, val); val = c + val; // val = 300? printf("val = c + val = %d (Expected %d)\n", val, 300); c = c + val; // c = 400? printf("c = c + val = %d (Expected %d)\n", c, 400); val = c * 2; // val = 800? printf("val = c * 2 = %d (Expected %d)\n", val, 800); c = val; // c = 800? printf("c = val = %d (Expected %d)\n", c, 800);}

以下程式可以通過編譯,但結果卻與預期不同

練習

#include <stdio.h>

main(){ char c='d'; // c=100 int val=200;

printf("c = %d, val= %d\n", c, val); val = c + val; // val = 300? printf("val = c + val = %d (Expected %d)\n", val, 300); c = c + val; // c = 400? printf("c = c + val = %d (Expected %d)\n", c, 400); val = c * 2; // val = 800? printf("val = c * 2 = %d (Expected %d)\n", val, 800); c = val; // c = 800? printf("c = val = %d (Expected %d)\n", c, 800);}

#include <stdio.h>

main(){ char c='d'; // c=100 int val=200;

printf("c = %d, val= %d\n", c, val); val = c + val; // val = 300? printf("val = c + val = %d (Expected %d)\n", val, 300); c = c + val; // c = 400? printf("c = c + val = %d (Expected %d)\n", c, 400); val = c * 2; // val = 800? printf("val = c * 2 = %d (Expected %d)\n", val, 800); c = val; // c = 800? printf("c = val = %d (Expected %d)\n", c, 800);}

1. 試找出產生是項執行結果之原因

常用之字元輸出入函式 int getchar ( void );

– Returns the next character from the standard input (stdin).– Remark: line-based read

int putchar ( int character );– Writes character to the current position in the standard outp

ut (stdout) and advances the internal file position indicator to the next position.

/* uppercase typewriter */#include <stdio.h>

main(){ char c;

do { c = getchar(); if(c >= 'a' && c <= 'z') c = c - 'a' + 'A'; putchar(c); } while (c != EOF);}

/* uppercase typewriter */#include <stdio.h>

main(){ char c;

do { c = getchar(); if(c >= 'a' && c <= 'z') c = c - 'a' + 'A'; putchar(c); } while (c != EOF);}

範例:字元輸出入函式

/* uppercase typewriter */#include <stdio.h>

main(){ char c;

do { c = getchar(); if(c >= 'a' && c <= 'z') c = c - 'a' + 'A'; putchar(c); } while (c != EOF);}

/* uppercase typewriter */#include <stdio.h>

main(){ char c;

do { c = getchar(); if(c >= 'a' && c <= 'z') c = c - 'a' + 'A'; putchar(c); } while (c != EOF);}

範例:字元輸出入函式

陣列 (Arrays)

Array is a data structure that stores contiguous data elements of the same type.

Examples:int score[50];char address[50];double distance[50];

score

address

distance

200

byte

s50

byte

s400

byte

s

陣列 (Arrays)Examples:int score[50];char address[50];double distance[50];

score

address

distance

...

score[0]

score[1]

score[49]

陣列 (Arrays)

score

address

distance

address[0]address[1]address[2]

address[49]

...

Examples:int score[50];char address[50];double distance[50];

陣列 (Arrays)

score

address

distance ...

distance[0]

distance[49]

Examples:int score[50];char address[50];double distance[50];

陣列使用注意事項 陣列之索引 (index) 由 0開始

– 一陣列若含 n元素,其索引由 0至 n-1

C Compiler 對陣列索引不做 out of range 檢查– 易產生程式錯誤,甚或系統失敗– 寫程式時程式設計師應保證陣列索引不超出範圍

範例: 輸入若干位學生成績將之儲存於一整數陣列中,並求算平均成績。

#include <stdio.h>

#define MAX_STUDENTS 50

int scores[MAX_STUDENTS]; // define as global

main(){ int i, count=0, score, sum, avg; // local variables

do{ // Enter scores until a negative score is obtained printf("Enter score for student No. %d:", count + 1); scanf("%d", &score); if(score >= 0) scores[count++] = score; } while(score >= 0 && count < MAX_STUDENTS);

for(i = 0, sum = 0; i < count; sum += scores[i++]);// sum all scores avg = count > 0 ? sum / count : 0; // calc average

printf("The average score of %d students is %d\n", count, avg);}

#include <stdio.h>

#define MAX_STUDENTS 50

int scores[MAX_STUDENTS]; // define as global

main(){ int i, count=0, score, sum, avg; // local variables

do{ // Enter scores until a negative score is obtained printf("Enter score for student No. %d:", count + 1); scanf("%d", &score); if(score >= 0) scores[count++] = score; } while(score >= 0 && count < MAX_STUDENTS);

for(i = 0, sum = 0; i < count; sum += scores[i++]);// sum all scores avg = count > 0 ? sum / count : 0; // calc average

printf("The average score of %d students is %d\n", count, avg);}

練習: 1. 修改此範例,使之於輸入所有成績完畢後,亦能將每位學生給予 ABCDF 等之評等,及其它數據,請自由發揮,輸出力求清晰。

#include <stdio.h>

#define MAX_STUDENTS 50

int scores[MAX_STUDENTS]; // define as global

main(){ int i, count=0, score, sum, avg; // local variables

do{ // Enter scores until a negative score is obtained printf("Enter score for student No. %d:", count + 1); scanf("%d", &score); if(score >= 0) scores[count++] = score; } while(score >= 0 && count < MAX_STUDENTS);

for(i = 0, sum = 0; i < count; sum += scores[i++]);// sum all scores avg = count > 0 ? sum / count : 0; // calc average

printf("The average score of %d students is %d\n", count, avg);}

#include <stdio.h>

#define MAX_STUDENTS 50

int scores[MAX_STUDENTS]; // define as global

main(){ int i, count=0, score, sum, avg; // local variables

do{ // Enter scores until a negative score is obtained printf("Enter score for student No. %d:", count + 1); scanf("%d", &score); if(score >= 0) scores[count++] = score; } while(score >= 0 && count < MAX_STUDENTS);

for(i = 0, sum = 0; i < count; sum += scores[i++]);// sum all scores avg = count > 0 ? sum / count : 0; // calc average

printf("The average score of %d students is %d\n", count, avg);}

範例:陣列之定義#include <stdio.h>

main(){ int array1[]={0, 10, 20, 30, 40}; // initialize its elements only int array2[10]={0, 10, 20, 30, 40}; // specify size and initialize some leading elements int array3[10]; // specify size only int i;

printf("Size of array1 is: %d\n", sizeof(array1)); printf("Size of array2 is: %d\n", sizeof(array2)); printf("Size of array3 is: %d\n\n", sizeof(array3));

printf("#element in array1 is: %d\n", sizeof(array1)/sizeof(int)); printf("#element in array2 is: %d\n", sizeof(array2)/sizeof(int)); printf("#element in array3 is: %d\n", sizeof(array3)/sizeof(int));

for(i=0; i < 10; i++) printf("array1[%d]=%8d,\tarray2[%d]=%8d,\tarray3[%d]=%8d\n", i, array1[i], i, array2[i], i, array3[i]);}

#include <stdio.h>

main(){ int array1[]={0, 10, 20, 30, 40}; // initialize its elements only int array2[10]={0, 10, 20, 30, 40}; // specify size and initialize some leading elements int array3[10]; // specify size only int i;

printf("Size of array1 is: %d\n", sizeof(array1)); printf("Size of array2 is: %d\n", sizeof(array2)); printf("Size of array3 is: %d\n\n", sizeof(array3));

printf("#element in array1 is: %d\n", sizeof(array1)/sizeof(int)); printf("#element in array2 is: %d\n", sizeof(array2)/sizeof(int)); printf("#element in array3 is: %d\n", sizeof(array3)/sizeof(int));

for(i=0; i < 10; i++) printf("array1[%d]=%8d,\tarray2[%d]=%8d,\tarray3[%d]=%8d\n", i, array1[i], i, array2[i], i, array3[i]);}

#include <stdio.h>

main(){ int array1[]={0, 10, 20, 30, 40}; // initialize its elements only int array2[10]={0, 10, 20, 30, 40}; // specify size and initialize some leading elements int array3[10]; // specify size only int i;

printf("Size of array1 is: %d\n", sizeof(array1)); printf("Size of array2 is: %d\n", sizeof(array2)); printf("Size of array3 is: %d\n\n", sizeof(array3));

printf("#element in array1 is: %d\n", sizeof(array1)/sizeof(int)); printf("#element in array2 is: %d\n", sizeof(array2)/sizeof(int)); printf("#element in array3 is: %d\n", sizeof(array3)/sizeof(int));

for(i=0; i < 10; i++) printf("array1[%d]=%8d,\tarray2[%d]=%8d,\tarray3[%d]=%8d\n", i, array1[i], i, array2[i], i, array3[i]);}

#include <stdio.h>

main(){ int array1[]={0, 10, 20, 30, 40}; // initialize its elements only int array2[10]={0, 10, 20, 30, 40}; // specify size and initialize some leading elements int array3[10]; // specify size only int i;

printf("Size of array1 is: %d\n", sizeof(array1)); printf("Size of array2 is: %d\n", sizeof(array2)); printf("Size of array3 is: %d\n\n", sizeof(array3));

printf("#element in array1 is: %d\n", sizeof(array1)/sizeof(int)); printf("#element in array2 is: %d\n", sizeof(array2)/sizeof(int)); printf("#element in array3 is: %d\n", sizeof(array3)/sizeof(int));

for(i=0; i < 10; i++) printf("array1[%d]=%8d,\tarray2[%d]=%8d,\tarray3[%d]=%8d\n", i, array1[i], i, array2[i], i, array3[i]);}

範例:陣列之定義

Debugging Mode 執行結果

#include <stdio.h>

main(){ int array1[]={0, 10, 20, 30, 40}; // initialize its elements only int array2[10]={0, 10, 20, 30, 40}; // specify size and initialize some leading elements int array3[10]; // specify size only int i;

printf("Size of array1 is: %d\n", sizeof(array1)); printf("Size of array2 is: %d\n", sizeof(array2)); printf("Size of array3 is: %d\n\n", sizeof(array3));

printf("#element in array1 is: %d\n", sizeof(array1)/sizeof(int)); printf("#element in array2 is: %d\n", sizeof(array2)/sizeof(int)); printf("#element in array3 is: %d\n", sizeof(array3)/sizeof(int));

for(i=0; i < 10; i++) printf("array1[%d]=%8d,\tarray2[%d]=%8d,\tarray3[%d]=%8d\n", i, array1[i], i, array2[i], i, array3[i]);}

#include <stdio.h>

main(){ int array1[]={0, 10, 20, 30, 40}; // initialize its elements only int array2[10]={0, 10, 20, 30, 40}; // specify size and initialize some leading elements int array3[10]; // specify size only int i;

printf("Size of array1 is: %d\n", sizeof(array1)); printf("Size of array2 is: %d\n", sizeof(array2)); printf("Size of array3 is: %d\n\n", sizeof(array3));

printf("#element in array1 is: %d\n", sizeof(array1)/sizeof(int)); printf("#element in array2 is: %d\n", sizeof(array2)/sizeof(int)); printf("#element in array3 is: %d\n", sizeof(array3)/sizeof(int));

for(i=0; i < 10; i++) printf("array1[%d]=%8d,\tarray2[%d]=%8d,\tarray3[%d]=%8d\n", i, array1[i], i, array2[i], i, array3[i]);}

範例:陣列之定義

Release Mode 執行結果

對未定義初值之陣列元素值勿做臆測對未定義初值之陣列元素值勿做臆測

字串 (String)

C 語言沒有定義字串資料型態 C 語言之字串係以零 (NUL) 作為結尾之字元陣列 (char array) 表示

例 :

char str[]="hello\n";

h (68)

e (65)

l (6C)

l (6C)

o (6F)

\n (0A)

\0 (00)

str str[0]

str[1]

str[2]

str[3]

str[4]

str[5]

str[6]

sizeof(str) = 7

範例:#include <stdio.h>

#define MAX_LINE 256

char line[MAX_LINE]; // buffer to hold a null terminated string

main(){ int i=0; char c;

do{ // read a line in safe mode c = getchar(); line[i++] = c; } while(c != '\n' && i < (MAX_LINE - 1)); // out of range check by programmer

line[i] = '\0'; // string is null terminated

// convert a line to ucase i = 0; while((c = line[i]) != '\0'){ line[i] = c >= 'a' && c <= 'z' ? c - 'a' + 'A' : c; i++; }

printf("\n%s\n", line); // output ucase line}

#include <stdio.h>

#define MAX_LINE 256

char line[MAX_LINE]; // buffer to hold a null terminated string

main(){ int i=0; char c;

do{ // read a line in safe mode c = getchar(); line[i++] = c; } while(c != '\n' && i < (MAX_LINE - 1)); // out of range check by programmer

line[i] = '\0'; // string is null terminated

// convert a line to ucase i = 0; while((c = line[i]) != '\0'){ line[i] = c >= 'a' && c <= 'z' ? c - 'a' + 'A' : c; i++; }

printf("\n%s\n", line); // output ucase line}

輸入一行文字將之儲存於一字串陣列中,並將之轉換成大寫後輸出。

範例:#include <stdio.h>

#define MAX_LINE 256

char line[MAX_LINE]; // buffer to hold a null terminated string

main(){ int i=0; char c;

do{ // read a line in safe mode c = getchar(); line[i++] = c; } while(c != '\n' && i < (MAX_LINE - 1)); // out of range check by programmer

line[i] = '\0'; // string is null terminated

// convert a line to ucase i = 0; while((c = line[i]) != '\0'){ line[i] = c >= 'a' && c <= 'z' ? c - 'a' + 'A' : c; i++; }

printf("\n%s\n", line); // output ucase line}

#include <stdio.h>

#define MAX_LINE 256

char line[MAX_LINE]; // buffer to hold a null terminated string

main(){ int i=0; char c;

do{ // read a line in safe mode c = getchar(); line[i++] = c; } while(c != '\n' && i < (MAX_LINE - 1)); // out of range check by programmer

line[i] = '\0'; // string is null terminated

// convert a line to ucase i = 0; while((c = line[i]) != '\0'){ line[i] = c >= 'a' && c <= 'z' ? c - 'a' + 'A' : c; i++; }

printf("\n%s\n", line); // output ucase line}

輸入一行文字將之儲存於一字串陣列中,並將之轉換成大寫後輸出。

範例:#include <stdio.h>

#define MAX_LINE 256

char line[MAX_LINE]; // buffer to hold a null terminated string

main(){ int i=0; char c;

do{ // read a line in safe mode c = getchar(); line[i++] = c; } while(c != '\n' && i < (MAX_LINE - 1)); // out of range check by programmer

line[i] = '\0'; // string is null terminated

// convert a line to ucase i = 0; while((c = line[i]) != '\0'){ line[i] = c >= 'a' && c <= 'z' ? c - 'a' + 'A' : c; i++; }

printf("\n%s\n", line); // output ucase line}

#include <stdio.h>

#define MAX_LINE 256

char line[MAX_LINE]; // buffer to hold a null terminated string

main(){ int i=0; char c;

do{ // read a line in safe mode c = getchar(); line[i++] = c; } while(c != '\n' && i < (MAX_LINE - 1)); // out of range check by programmer

line[i] = '\0'; // string is null terminated

// convert a line to ucase i = 0; while((c = line[i]) != '\0'){ line[i] = c >= 'a' && c <= 'z' ? c - 'a' + 'A' : c; i++; }

printf("\n%s\n", line); // output ucase line}

輸入一行文字將之儲存於一字串陣列中,並將之轉換成大寫後輸出。

簡化版

do{ // read a line in safe mode line[i++] = c = getchar();} while(c != '\n' && i < (MAX_LINE - 1)); // out of range check by programmer

while(c = line[i]) line[i++] = c >= 'a' && c <= 'z' ? c - 'a' + 'A' : c;

練習:1. 製作一 C 程式,從標準輸入裝置成功的讀取一十進

制整數字串 ( 可能含正負號 ) , 並將之儲存於一字元陣列中。

2. 將上題儲存於陣列中之字串轉換成整數,並呼叫 printf將之印出,以驗證你的轉換是否正確。

Float and Double

IEEE 754

Header Files

<limits.h>

and

<float.h>

Floating Point Constants

Floating point constants contain a decimal point or exponent. By default they are double.

123.4 (double)

1e-2 (double)

124.4f (float)

1e-2f (float)

範例:#include <stdio.h>#include <math.h>

main(){ double a, b;

printf("Enter two legs a and b of a right triangle:"); scanf("%lf%lf",&a,&b);

printf("The hypotenuse c of the triangle is %10.5lf\n", sqrt(a * a + b * b ));}

#include <stdio.h>#include <math.h>

main(){ double a, b;

printf("Enter two legs a and b of a right triangle:"); scanf("%lf%lf",&a,&b);

printf("The hypotenuse c of the triangle is %10.5lf\n", sqrt(a * a + b * b ));}

畢氏定理 (Pythagorean theorem )

a2 + b2 = c2

範例:#include <stdio.h>#include <math.h>

main(){ double a, b;

printf("Enter two legs a and b of a right triangle:"); scanf("%lf%lf",&a,&b);

printf("The hypotenuse c of the triangle is %10.5lf\n", sqrt(a * a + b * b ));}

#include <stdio.h>#include <math.h>

main(){ double a, b;

printf("Enter two legs a and b of a right triangle:"); scanf("%lf%lf",&a,&b);

printf("The hypotenuse c of the triangle is %10.5lf\n", sqrt(a * a + b * b ));}

畢氏定理 (Pythagorean theorem )

a2 + b2 = c2

練習:1. 參考 http://zh.wikibooks.org/wiki/%E4%B8%89%E8%A7%92%E5%87%BD%E6

%95%B8製作一 C 程式,列印出 sin, cos, tan 表格。

2. 求二元一次方程式 (ax2 + bx + c = 0) 之解,需考慮有兩組實解、有兩組虛解及僅單一解之情況。

C Program DesignData Types

Data-Type Modifiers

Basic Data Types

chara single byte, capable of holding one character in the local character set

intan integer, typically reflecting the natural size of integers on the host machine

float single-precision floating point

double double-precision floating point

Modifiers

short long signed unsigned

Data Types in Real World

typebytes

bits range

char 1 8 128 127

unsigned char 1 8 0 255

short int 2 16 32,768 32,767

unsigned short int 2 16 0 65,535

int 4 32 -2,147,483,648 +2,147,483,647

unsigned int 4 32 0 4,294,967,295

long int 4 32 -2,147,483,648 +2,147,483,647

unsigned long int 4 32 0 4,294,967,295

float 4 32 single-precision floating point

double 8 64 double-precision floating point

long double 8 64 extended-precision floating point

Data Types in Real World

typebytes

bits range

char 1 8 128 127

unsigned char 1 8 0 255

short int 2 16 32,768 32,767

unsigned short int 2 16 0 65,535

int 4 32 -2,147,483,648 +2,147,483,647

unsigned int 4 32 0 4,294,967,295

long int 4 32 -2,147,483,648 +2,147,483,647

unsigned long int 4 32 0 4,294,967,295

float 4 32 single-precision floating point

double 8 64 double-precision floating point

long double 8 64 extended-precision floating point

type bytes

bits range

char 1 8 128 127

unsigned char 1 8 0 255

short int 2 16 32,768 32,767

unsigned short int 2 16 0 65,535

int 4 32 -2,147,483,648 +2,147,483,647

unsigned int 4 32 0 4,294,967,295

long int 4 32 -2,147,483,648 +2,147,483,647

unsigned long int 4 32 0 4,294,967,295

float 4 32 single-precision floating point

double 8 64 double-precision floating point

long double 8 64 extended-precision floating point

On Integer Data Types

範例 : Sizes of C Data Types

#include <stdio.h>/* view the sizes of C basic data types */int main(){ printf("sizeof(char) == %d\n", sizeof(char)); printf("sizeof(short) == %d\n", sizeof(short)); printf("sizeof(int) == %d\n", sizeof(int)); printf("sizeof(long) == %d\n", sizeof(long)); printf("sizeof(float) == %d\n", sizeof(float)); printf("sizeof(double) == %d\n", sizeof(double)); printf("sizeof(long double) == %d\n", sizeof(long double)); return 0; }

#include <stdio.h>/* view the sizes of C basic data types */int main(){ printf("sizeof(char) == %d\n", sizeof(char)); printf("sizeof(short) == %d\n", sizeof(short)); printf("sizeof(int) == %d\n", sizeof(int)); printf("sizeof(long) == %d\n", sizeof(long)); printf("sizeof(float) == %d\n", sizeof(float)); printf("sizeof(double) == %d\n", sizeof(double)); printf("sizeof(long double) == %d\n", sizeof(long double)); return 0; }

C Program DesignData Types

Type

Conversions

Type Hierarchies type byte

sbits range

char 1 8 128 127

unsigned char 1 8 0 255

short int 2 16 32,768 32,767

unsigned short int 2 16 0 65,535

int 4 32 -2,147,483,648 +2,147,483,647

unsigned int 4 32 0 4,294,967,295

long int 4 32 -2,147,483,648 +2,147,483,647

unsigned long int 4 32 0 4,294,967,295

float 4 32 single-precision floating point

double 8 64 double-precision floating point

long double 8 64 extended-precision floating pointwider

narrow

Type Conversions

Implicit type conversion– also known as coercion– automatically done by the compiler when

type mismatch on operands– narrower type wider type

Explicit type conversion– also known as casting– done by programmer

Implicit Type Conversion

General rules for binary operators (+-*/%etc)– If either operand is long double the other is converted

to long double. – Otherwise, if either operand is double the other is conve

rted to double – Otherwise, if either operand is float the other is convert

ed to float – Otherwise, convert char and short to int – Then, if an operand is long convert the other to long.

範例 :Implicit Type Conversion

int a; unsigned long b; float f, g; double d;

g = a + f; // a transforms to float

d = a + b; // a and b transform to unsigned long, adding // is produced in unsigned long domain and then // the result type unsigned long is transformed // to double

int a; unsigned long b; float f, g; double d;

g = a + f; // a transforms to float

d = a + b; // a and b transform to unsigned long, adding // is produced in unsigned long domain and then // the result type unsigned long is transformed // to double

練習 :Implicit Type Conversion

1. 預測右方程式將產生之輸出為何?編譯執行後驗證你的預測是否正確?

2. 說明 C 編譯器在編譯右方程式時,將對各 assignment 做哪些 implicit type conversions ?

Explicit Type Conversion: Casting

(type name) expression

範例 :Type Casting

(type name) expression

範例 :Type Casting

(type name) expression

範例 :Type Casting

(type name) expression

範例 :Type Casting

(type name) expression

範例 :Type Casting

(type name) expression

More on Type Casting

(type name) expression

The cast operator has the same high precedence as other unary operators.

top related