User-define type: struct

advertisement
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;
4 bytes
&a
8 bytes
&b
 struct {int n; double x;} ss;
&ss
4 bytes
&ss.n
8 bytes
&ss.x
Structure members (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)
自定新的變數型態
Syntax: (語法)
typedef old_type_name new_type_name;
typedef unsigned int Uint;
typedef struct struct_type new_type_name;
Example 2. 將相關變數集合為一變數結構
typedef struct { char name[80];
unsigned long int id;
float t1, t2, t3, avg;}
Student;
Student sss; // Student 為一新的變數型態
sss.name
sss.id
sss.t1
….
sss.avg
// name of student. 姓名
// id number. 學號
// score of first test. 成績
// average over t1, t2, and t3 平均
While Loop 用 while 控制迴圈
(1) while (condition)
{ …; …..; …..; }
(2) do { …; …;
…; …; } while (condition);
sum = 0;
n = 0;
while (n <= 10)
{ sum = sum + n;
n++;
}
char a;
printf(“Press q to quit”;)
fflush(stdin);
do { a = getc(stdin);
} while (a != ‘q’);
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.
直角座標 與 球座標 轉換
ex4
typedef struct { double x, y, z;} Cartesian;
typedef struct { double r, t, p;} Spherical;
Cartesian v1;
Spherical v2;
v2.r = sqrt(v1.x*v1.x + v1.y*v1.y+v1.z*v1.z);
v2.t = acos(v1.z / v2.r);
v2.p = atan(v1.y / v1.x);
Practice 2. 增加 expval(x) 的可用範圍
A double variable can represent a value
< 1.7 10308
~ 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)
exp( x)  exp( x  na)  (exp a)
 exp( y) 10
n
n
Flow Chart of the Scheme
main
Input x
mytype myexp()
myexp(x)
double expval()
expval(y)
nq =
(int)floor(x / LN10)
Set n = 30
y=
x – nq *LN10
Do Taylor series
In reverse order
return
expval(y), nq
return
sum
Call myexp(x)
Output result
Pratice 5. Another root searching
Using Netwon’s method find the root of
exp(  x 2 )  x 3
Write the function and its derivative within a same subroutine,
And return these values in a two-double structure.
f ( x)  exp(  x 2 )  x 3
f ( x)  2 x exp(  x 2 )  3x 2
details
struct two_double { double x; double y;};
typedef struct two_double twodim;
twodim funct(double x)
{ twodim fdf;
…….
fdf.x = ??;
int main()
fdf.y = ??;
{ twodim ff;
return fdf;
}
….
do { …
ff = funct(x);
delta = ff.x / ff.y;
}
……
}
Related usages or functions
 #include <math.h>
double floor(double a) ;
// return the largest integer that smaller than a.
For example : floor(2.34) = 2.00,
floor(-3.48) = -4.00
 typedef struct {double x; int n} MyType;
MyType myexp(x)
{ MyType ttt;
……; …..;
ttt.n = nq;
ttt.x = expval(y);
return ttt; }
Project 3. 計算二次方程的根
設計一程式
1. 寫一函數讀取系數 a, b, c. 回傳主程式.
2. 將系數傳到令一函數計算兩複數根.
3. 將兩複數根傳回主程式
4. 再傳到另一副程式列印結果.
自定新變數格式
1. Quardratic
typedef struct {double a, b, c;} Quardratic;
2. Complex
typedef struct {double x;
double y;} Complex;
3. TwoComplex
typedef struct { Complex r1;
Complex r2; } TwoComplex;
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;
}
Main and prepocessors
輸入系數
解根
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
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;
}
Complex root1, root2;
TwoComplex root;
a  cf.a
b  cf.b
c  cf.c
findroot(Quadratic cf)
判別式 crit = b*b – 4*a*c
no
crit >= 0.0 ?
yes
crit = sqrt(crit)
crit = sqrt(-crit)
root1.x = (-b+crit) / (2a)
root2.x = (-b-crit) / (2a)
root1.y = root2.y = 0.0;
root1.x = root2.x = (-b) / (2a)
root1.y = crit / (2a)
root2.y = (-crit) / (2a);
root.r1 = root1;
root.r2 = root2;
return root;
Download