Introduction to Computer and Program Design Lesson 2 Functions, scanf and EOF James C.C. Cheng Department of Computer Science National Chiao Tung University
The return of scanf The number of fields successfully converted and assigned int a =1, b =2, c =3; int n = scanf("%d %d %d", &a, &b, &c); printf("%d\n", n ); printf("%d, %d, %d", a, b, c); In the case of an input failure before any data could be successfully read, EOF is returned. 2
Multiple input int x = 0; while( scanf("%d", &x)!= EOF ){ EOF: end of file usually EOF is defined as (-1) It is a signal to tell the system that no more data can be read from a input source. In Windows, press Ctrl+Z and Enter In UNIX, Linux and Mac OS X, press Ctrl+D 3
Abnormal Input int x = 0; while( scanf("%d", &x)!= EOF ){ Please input a non-numeric line, ex: %T@#$@KI A non-stop loop occurred! Why? How to fix the problem? 4
Standard I/O Buffer Buffer: A memory block used to temporarily hold data while it is being moved from one place to another. There three I/O memory buffers in the computer FILE* stdin : For the standard input device (generally, a keyboard). FILE* stdout : For the standard output device (generally, the screen). FILE* stderr : For output error and warning messages to the standard output device FILE* is a pointer to point a stream I/O buffer 0x 26E81E00 FILE* stdin address data 26E81E00 04 A5 00 10 26E81E04 0B 00 56 4F 26E81E08 06 FF 00 00 26E81E0C B4 00 C7 FF 5
The Reading Mechanism of scanf -- 1 In the format string of scanf: Format specifiers (%): A sequence formed by an initial percentage sign (%) indicates a format specifier, which is used to specify the type and format of the data to be retrieved from stdin and stored in the locations pointed by the additional arguments. The basic usage of format specifier: %[*][l]type where type can be c, d, e, E, f, g, G, o, s, x, X EX: %d Read but ignored %*type int x = 0; while( scanf("%*d%d", &x)!= EOF ){ printf("%d\n", x); //? 6
The basic data types There are 13 basic data types in C Name Size (byte) Range char 1-128 to 127 unsigned char 1 0 to 255 short 2-32768 to 32767 unsigned short 2 0 to 65535 int 4-2 31 to 2 31-1 unsigned int 4 0 to 2 32-1 long 4-2 31 to 2 31-1 unsigned long 4 0 to 2 32-1 int64, long long 8-2 63 to 2 63 1 unsigned int64 8 0 to 2 64-1 float 4 ±(1.175494351e -38 to 3.402823466e 38 ) double 8 ±(2.2250738585072014e -308 to 1.7976931348623158e 308 ) long double 12 in DevC++, 8 in MSC The same as double In C++, bool represents boolean value, true or false. The size of bool depends on compiler, 1 byte in most case. 7
The type of format specifier type Qualifying Input Type of argument c Single character: Reads the next character. If a width different from 1 is specified, the function reads width characters and stores them in the successive locations of the array passed as argument. No null character is appended at the end. char * d Decimal integer: Number optionally preceded with a + or int * - sign. Floating point: Decimal number containing a decimal e,e,f,g,g point, optionally preceded by a + or - sign and optionally float * folowed by the e or E character and a decimal number. Two examples of valid entries are -732.103 and 7.12e4 o Octal integer. int * s String of characters. This will read subsequent characters until a whitespace is found (whitespace char * characters are considered to be blank, newline and tab). u Unsigned decimal integer. unsigned int * x,x Hexadecimal integer. int * 8
The Reading Mechanism of scanf -- 2 It starts after one string line inputted. a string which the last key is \n In the format string of scanf: White-space characters, WC: blank (' '); tab ('\t'); or newline ('\n'). 一連串的 WC 可視為一個 WC 一個在 format string 的 WC 代表它可吸收零個以上的 WC 輸入 輸入數值型態的資料時, 前面可以鍵入零個以上的 WC. The non-wcs in format, except the % scanf 會從 stdin 依輸入順序讀取字元, 然後依序與 format string 的非 WC 字元比較. 若比較相同, 輸入字元 discarded, 繼續下一字元. 若比較不相同,scanf 失敗並結束,stdin 剩下的資料包含現在比較失敗的字元都會留在 stdin 9
Standard Input in C How to clear the stdin? getchar() read a character from stdin Usage: #include <stdio.h> int getchar( void ); Returns the input character Ex: int c = getchar(); Using getchar() to clear stdin int x=0; scanf("%d", &x); printf("%d\n", x); { int c; while((c=getchar())!='\n'&&c!=eof); // clear stdin printf("press enter to exit"); getchar(); // Waiting an Enter key 10
EOF in Windows Ctrl + z (^Z) in Windows: ^Z 要搭配 \n 才有意義按下 ^Z 之後可一連串按下任意鍵再按下 \n 皆等同按下 ^Z\n, 如 ^Z!@#!@$!$!@\n 等同 ^Z\n 甚至 ^Z 後面接一堆空格再加 \n 也等同 ^Z\n 他要能被當成 EOF, 之前除了一連串的 \n 或 ^Z, 不可按其它任何鍵 否則按下 \n 後是代表 Substitute 這個字元,ASCII code 是 26 當要成為 EOF 前,^Z 不產生任何 ASCII code 下列程式碼, ^Z\n 需按下兩次才能結束程式, 為什麼? int x=0, y=0; a white space while( scanf(" %d%d", &x, &y)!= EOF ){ printf("%d, %d\n", x, y); 11
EOF in Windows DO NOT let the last character of the format string be a WC int x=0; a white space while( scanf("%d ", &x)!= EOF ){ printf("%d\n", x); 12
Exercises 請根據指示輸入資料, 並解釋為何會出現畫面上的結果? int x=0, y=0; while( scanf("%d,%d", &x, &y)!= EOF ){ printf("%d, %d\n", x, y); int x=0, y=0; while( scanf("%d, %d", &x, &y)!= EOF ){ printf("%d, %d\n", x, y); 請輸入下列資料 : 1,2 3,4 5, 6 7, 8 9 10 int x=0, y=0; while( scanf("%d,%d", &x, &y)!= EOF ){ printf("%d, %d\n", x, y); 13
Function declaration Syntax: return type + function name + (parameters); where the parameters are: 1. nothing or void 2. typename1, typename2, typenamen 3. the names of parameters are not necessary Function name must be unique, except C++. Ex: int F1(void); int F2(); void F3(void); void F3(int); // In C++, OK, but error in C int F4(int, int, char); or int F4(int x, int y, char c); 14
Function declaration In C++, the function declaration must be placed before calling int main( void ){ int MyF(int); // declaration int x = 0; printf("%d\n", MyF(x)); return 0; int MyF(int n){ return n+1 ; // Function definition 15
Function definition Function definition Syntax: return type + function name + (parameters){ where the name of the parameters not be ignored. int MyF(int n){ return n+1 ; Function definition can not be placed in any block (except C++). 16
Function definition Declaration, definition and invocation. Which of following are correct? In C, all of them are correct implicit declaration and the function is assumed to return int In C++, the third is failed int MyF (int a); int MyF(int a){ return a+1; int main( void ){ int x = MyF (1); printf("1+1 = %d\n", x); return 0; int MyF (int a){ return a+1; int main( void ){ int x = MyF (1); printf("1+1 = %d\n", x); return 0; int MyF (int a); int MyF (int a); int main( void ){ int x = MyF (1); printf("1+1 = %d\n", x); return 0; int MyF (int a){ return a+1; int MyF (int a){ return a+1; int MyF (int a); int main( void ){ int x = MyF (1); printf("1+1 = %d\n", x); return 0; int main( void ){ int x = MyF (1); printf("1+1 = %d\n", x); return 0; int MyF (int a); int MyF (int a){ return a+1; int MyF (int a){ return a+1; int main( void ){ int x = MyF (1); printf("1+1 = %d\n", x); return 0; 17
Function definition Default argument Only C++ provides default argument for functions A default argument is a value given in the declaration that the compiler automatically inserts if you don t provide a value in the function call. A default argument cannot be placed before non-default argument The declaration of a default argument either in global function declaration or in function definition. Local function declaration can has its own default argument list. void F1(int a, int b =10, int c = 2){ void F2(int a, int b =10, int c){ // Compiler error void F3(int a, int b =10, int c=5); // Global function declaration void F3(int a, int b =10, int c=5){ // Compiler error int main(){ F1(1, 2, 3); // a = 1; b= 2; c =3 F1(1); // a = 1; b= 10; c =2 void F1(int a, int b =20, int c = 30); // Local function declaration F1(1); // a = 1; b= 20; c =30 F1(1,,3); // Compiler error 18
練習題 1. 設計一個 function, 名稱為 CheckN int CheckN(int n); 若 n > 0 且任兩個連續的 digit 相加皆相同, 則 return 任兩個連續的 digit 之和, 反 之 return 0 10<=n<20 則 return 兩個 digit 之和,n<10 則 return0 注意, 不可用 字串處理方式 2. 設計一個 function, 名稱為 TileN int TileN(int RoomW, int RoomH, int TileW, int TileH); RoomW 及 RoomH: 分別代表房間的寬及長 ( 公分 ) TileW 及 TileH : 分別代表地磚的寬及長 ( 公分 ) 假設地磚不可分割, 所有地磚排列方式需一至, 則 TileN 會 return 該房間可貼的 最多地磚數量 3. 設計一個 function, 名稱為 IsPrime int IsPrime(int n); If n = ab, a <= b. Assuming that a >. n. 根據右列的理論來判斷 n 是否為質數 Then, n = ab >= aa > n causes contrary. Therefore, a <= n 若 n 為質數,return 1, 反之 return 0 19
練習題 4. 設計一個 function, 名稱為 ProductDigit unsigned long ProductDigit(unsigned long n); 給一個正整數 n, 請找一個最小的正整數 k( 即回傳值 ), 使得 k 所有 digit 的乘積會等於 n 若 k 不存在則回傳 -1 注意 overflow 問題! ex: n = 10 則 k = 25; n = 126 則 k = 279 ; n = 26 則 k = -1 5. 設計一個 function, 名稱為 PrimeSum void PrimeSum(int n); 給一個正整數 n, 若 n 可以被許多不重複的質數加總, 則列出這些質數之加總過程, 由大至小 答案可能不只一種, 列出其中一種即可 若不存在這樣的組合, 則只能顯示 X ex: n = 26 則顯示 13+11+5; n = 16 則顯示 13+3 或者 11+5 n = 6 則顯示 X 20