Structure and User-Define Type struct tag {members;…;} variable; typedef old_type new_type;

Presentation on theme: "Structure and User-Define Type struct tag {members;…;} variable; typedef old_type new_type;"— Presentation transcript:

Structure and User-Define Type struct tag {members;…;} variable; typedef old_type new_type;

Structures 結構變數 Syntax: struct type_id { type1 variable1; type2 variable2; …} varible1,..; struct type_id variable1, variable2;

Memory layout 計憶體的配置 int a; double b; struct {int n; double x;} ss; 4 bytes8 bytes &a &b 4 bytes8 bytes &ss.n &ss.x &ss

Structure members (example) 結構變數之成員example struct item_record { unsigned int number; float price; } pen, book; pen.number = 10; pen.price = 13.5; book.number = 5; book.price = 590.5; total = pen.price * pen.number + book.price * book.number; struct item_record notebook; notebook.price = 60,4; notebook.number = 20; total = total + notebook.price * notebook.number;

User-Type Define (example)example 自定新的變數型態 Syntax: ( 語法 ) typedef old_type_name new_type_name; typedef unsigned int Uint; typedef struct struct_type new_type_name;

ExampleExample 2. 將相關變數集合為一變數結構 typedef struct { char name[80]; unsigned long int id; float t1, t2, t3, avg;} Student; Student sss; // Student 為一新的變數型態 sss.name // name of student. 姓名 sss.id // id number. 學號 sss.t1 // score of first test. 成績 …. sss.avg // average over t1, t2, and t3 平均

While Loop 用 while 控制迴圈 (1) while (condition) { …; …..; …..; } (2) do { …; …; …; …; } while (condition); char a; printf(“Press q to quit”;) fflush(stdin); do { a = getc(stdin); } while (a != ‘q’); sum = 0; n = 0; while (n <= 10) { sum = sum + n; n++; }

File input: getc(file_pointer) 從檔案中讀取一個字元 Symbol represents the file pointer of Keyboard: stdin : standard input device, defined within stdio.h getc(stdin) : read a single character from keyboard.

Practice 2. 增加 expval(x) 的可用範圍 A double variable can represent a value < ~ exp(709) exp(800) = #INF 超出 double 的範圍 Problem : How to increase the applicable range of our previous program?

Numerical Scheme 選擇 a = ln(10) = 2.302585092994045684 選擇 n 使 y=(x – na), 0 <= y < ln(10)

Flow Chart of the Scheme Call myexp(x) myexp(x) nq = (int)floor(x / LN10) y = x – nq *LN10 Input x Output result expval(y) Set n = 30 Do Taylor series In reverse order return expval(y), nq return sum main mytype myexp() double expval()

Pratice 5. Another root searching Using Netwon’s method find the root of Write the function and its derivative within a same subroutine, And return these values in a two-double structure.

details struct two_double { double x; double y;}; typedef struct two_double twodim; twodim funct(double x) { twodim fdf; ……. fdf.x = ??; fdf.y = ??; return fdf; } int main() { twodim ff; …. do { … ff = funct(x); delta = ff.x / ff.y; } …… }

Related usages or functions #include double floor(double a) ; // return the largest integer that smaller than a. typedef struct {double x; int n} MyType; For example : floor(2.34) = 2.00, floor(-3.48) = -4.00 MyType myexp(x) { MyType ttt; ……; …..; ttt.n = nq; ttt.x = expval(y); return ttt; }

Project 3. 計算二次方程的根 設計一程式 1. 寫一函數讀取系數 a, b, c. 回傳主程式. 2. 將系數傳到令一函數計算兩複數根. 3. 將兩複數根傳回主程式 4. 再傳到另一副程式列印結果.

functions 1. 讀取系數, 並回傳到主程式 Quadratic inputcoef(void); 2. 給與系數計算兩根 TwoComplex findroots(Quadratic coef); 3. 列印 void printroots(TwoComplex root);

Techniques -- input Quadratic inputcoef(void) { double a, b, c; Quadratic coef; …. 讀入 a, b, c… coef.a = a; coef.b = b; coef.c = c; return coef; }

Output viod printroots (TwoComplex twor) { printf(“root1 = (%.10lf, %.10lf)\n”, twor.r1.x, twor.r2.y); ……… return; }

#include typedef struct {double a, b, c;} Quadratic; typedef struct {double x, y;} Complex; typedef struct {Complex r1, r2;} TwoComplex; Quadratic inputcoef(void); TwoComplex findroots(Quadratic); void printroots(TwoComplex); int main() { Quadratic coefs; TwoComplex roots; coefs = inputcoef(); roots = findroots(coefs); printroots(roots); system("pause"); return 0; } Main and prepocessors 輸入系數 解根 列印

findroot(Quadratic cf) 判別式 crit = b*b – 4*a*c crit >= 0.0 ? crit = sqrt(crit) root1.x = (-b+crit) / (2a) root2.x = (-b-crit) / (2a) root1.y = root2.y = 0.0; crit = sqrt(-crit) root1.x = root2.x = (-b) / (2a) root1.y = crit / (2a) root2.y = (-crit) / (2a); root.r1 = root1; root.r2 = root2; return root; yes no Complex root1, root2; TwoComplex root; a  cf.a b  cf.b c  cf.c

Download ppt "Structure and User-Define Type struct tag {members;…;} variable; typedef old_type new_type;"

Similar presentations