How to write a C program Yu-Chen, Shu
Transcription
How to write a C program Yu-Chen, Shu
How to write a C program Yu-Chen, Shu Reference • B. W. Kernighan, D. M. Ritchie, The C Programming Language, 2nd ed. Prentice-Hall, 1988. • Website: http://libai.math.ncu.edu.tw/bcc16/C/C/ • This document: http://scicomp.math.ntu.edu.tw/~scc/asiaa/lecture_c.ppt Human VS Machine • Because computer only knows zero and one. If we want the computer help us doing something, we should talk to him in his way. What? I don’t speak Chinese 給我 關機!! C: intermediary language Compiler shutdown(now) 00101001010010010……… I am Mr. Chinese. I know Machine Language and C language. You can tell me in C. 給我 關機!! Our aim today • • • • Write some simple baby C programs. Compile them with gnu C compiler. Execute it. And see the result. How to translate algorithm to C program. A first example: hello.c #include <stdio.h> /* My first C program */ main() { printf(“Hello, world\n”); } • Use any text editor (notepad, winedt, vi, pico) to write/save this file. I suggest not to use “Microsoft WORD” Header (.h file) #include <stdio.h> /* My first C program */ main() { printf(“Hello, world\n”); } • At the first few lines in C program, we should include the header file. • The use of header file is like a dictionary. For example, the function “printf” is defined in stdio.h • When we write a C program, for those functions we want to use, we should include their header files. function and argument #include <stdio.h> /* My first C program */ main() { printf(“Hello, world\n”); } • main and printf are functions. • main function is what we want to do during the program. • printf is a function which print the argument: “Hello, world\n” to screen. Compiler PROMPT:> gcc hello.c PROMPT:> a.exe Hello world PROMPT:> • “Compile” means to translate the human language “C” into machine language(0 and 1). • At the command line: gcc hello.c • There are many compilers, such as intel c compiler(icc), gnu c compiler(gcc), turbo c compiler, … Executable file • If you use “gcc”, the default executable file is “a.out”(in unix system) or “a.exe”(in windows system). • At the command line, type a.out you will see the result. Conclusion • • • • • • Edit a file, xxx.c Include the header files we need. Write our ideas in main function. Compile it with compiler. Run the result :D Yes. It’s the framework of “How to write a C-program”. To Be Continued… How to write our idea • • • • Define variables. Look for algorithm. Write statement. Write some function we need. Our idea • We want to print out 50 geometric sequences. The first one is 1 and the common ratio is 0.5 . • Algorithm: an+1 = an x 0.5 . • How to translate it to C? Our thought • I need print out something.( include stdio.h ) • I need a variable for geometric sequence. • I need a index number which let me know the order of sequence. • I must tell C about the algorithm. Define variables #include <stdio.h> main() { int i; double a; a = 1; for(i=1;i<=50;++i) { printf("%.15f\n", a); a = a * 0.5; } } • In C program, there are many types of variables: – int : 4 bytes integer. Represent the integer from -231 to 231. – double : 8 bytes. A number which has floating decimal point. We shall talk about it at next class. • In this program, “i” is a integer variable and “a” is a double variable. Vector/Matrix • If we want to define a lot of “double” variables: v0, v1, v2, …, v9. We may write: double v[10]; • If we want a int variables: v00, v01, v02, v10, v11, v12. We may write: int v[2][3]; • Remember that the sub index of C is start from 0. (Fortran has a simple declaration.) User define variable • If you want a “account” variable include character variable name, and a double variable money, you should define as following in the first few line of the C program. typedef struct { char name[15]; double money; } account; • And then you can declare the account variable in C program: account shu; • Then access the name and money variables by printf(“%s”, shu.name); shu.money = 1e15; Statement #include <stdio.h> main() { int i; double a; a = 1; for(i=1;i<=50;++i) { printf("%.15f\n", a); a = a * 0.5; } } • A complete statement is ended with semicolon (;). – Example 1: int i; (It tells C that I want a integer naming “i”) – Example 2: a = 1; (It tells C that I want the variable “a” to be 1.) – Example 3: a=a*0.5; (It tells C that I want the value of “a” replaced by “a * 0.5”.) Assignment operator = • = , assign the value from right to left. – a = 1; means assign 1 to the variable a. – a = a*0.5; means assign a*0.5 to the variable a. • There are many assignment expression such as += *= -= – For example: the following two statements are identical. a = a*0.5; a *= 0.5; for structure #include <stdio.h> main() { int i; double a; a = 1; for(i=1;i<=50;++i) { printf("%.15f\n", a); a = a * 0.5; } } • If we want to do something for a fixed times. We should put it in “for structure” between a left brace and right brace. Here is a new word: “++i” The statement is equal to i = i + 1 You may write: “i++” Althought there are a little difference between “++i”, “i++”, and “i = i + 1”. I stop here because we don’t want to introduce increase-operator today. for structure • for (initial statement; loop criterion; steps statement) { The thing we want to do; } • The structure will start with initial statement, check the loop criterion, and do the steps statement after the thing we want to do. • For example the following for structure will print 1 to 50 to the screen. for(i=1; i <= 50; ++i) { printf(“%d\n”,i); } Equivalent statement 1 #include <stdio.h> main() { int i; double a; a = 1; for(i=1;i<=50;++i) { printf("%.15f\n", a); a = a * 0.5; } } They are the same. #include <stdio.h> main() { int i; double a; a = 1; i = 1; while(i<=50) { printf("%.15f\n", a); a = a * 0.5; i = i + 1; } } while structure while (loop criterion) { The thing we want to do; } • This structure only check the loop criterion. Equivalent statement 2 #include <stdio.h> main() { int i; double a; a = 1; for(i=1;i<=50;++i) { printf("%.15f\n", a); a = a * 0.5; } } They are the same. #include <stdio.h> main() { int i; double a; The loop criterion a = 1; “1” means the loop i = 1; while(1) will not stop. { printf("%.15f\n", a); a = a * 0.5; i = i + 1; if(i > 50) { break; } } } Here is a new word: “break”. It tells the loop structure will stop here. if structure if (criterion) { Something you want to do; } else { Another thing you want to do; } • “if structure” will check the criterion and then work only once on the blue block if the criterion is true, otherwise it will work on the green block only once. Compare operator • • • • • • Equal : == Greater : >, less : < Greater or equal: >=, less or equal : <= Not equal : != and : && or : || Some remarks • How to define our variables – We often define variables by their purpose, meanings, or symbols. For example, we often define a “double” variable rho for density. • Indentation – Make the program more readable. Reserved word • Reserved words are those words defined by C and they have specific meanings. For example: – int, char, float : define variables – for, while : loop structure – if, else : judgement • Reserved words can not be a variables or function name. Define a new function • If the function is not defined in C and we will use it very often in our work. For example, we need a function sinc(x) to return the value of sin(x)/x function example #include <math.h> double sinc(double x) { if(fabs(x)<1e-10) { return 1.0; } else { return sin(x)/x; } } • • • Because we need sine function, we must include <math.h> There are some new words in this code: – “fabs” means the absolute value of x. – “1e-10” means the scientific notation 1x10-10 . – “return” means that this function will return to the location calling this function by the value behind it. The programer should consider all cases. So when |x| is too small, we should return the value 1.0. function structure Type of function double sinc(double x) { if(fabs(x)<1e-10) { return 1.0; } else { return sin(x)/x; } } The input of the function. function name we will use in C program. Input/Output • • • • • scanf: read values from screen. printf: print values to screen. fopen: open a file. fscanf: read values from file. fprintf: print values to file. printf/scanf format • “%d” : means a integer. • “%f”, “%lf” : means a float decimal. • printf(“a = %f\n”, a); will print the value of a to screen. • scanf (“%f\n”, &a); will get the input from screen. The storage in memory • When we declare a “double” variable x, C locate a memory for x and put the memory information in &x. If we want to change the value of x, we need to provide the memory information of x. Here is the memory location of x Memory Block Memory Block &x x Here is the value of x The pointer double x; double *m; x = 1; m = &x; printf(“%f\n”,m[0]); It will print the value of x. • A powerful variable type in C; • “double *m;” means that m is a memory information. • Then m[k] is the value at the memony location m + k. Conclusion • We learn – Loop structure : for, while – Judgment structure: if – How to write a new function Newton method • Aim: solve the root of f(x) = 0 • Require: A function f, initial guess x0. • Algorithm: while |f(xn)| > 0 xn+1 = xn – f(xn)/f’(xn) Return the value xn. If f(xn)=0 Newton method #include <stdio.h> #include <math.h> double newton_method(double); double f(double); double df(double); int main() { double x; printf(“Initial x:”); scanf(“%lf”,&x); x = newton_method(x); printf(“The root is:%f\n”,x); } Here we declare the functions we want to use. We provide the memory information of x double newton_method(double x) { while(fabs(f(x)) > 1e-10) { x = x – f(x)/df(x); printf(“x : %f\n”, x); } return x; } double f(double x) { return x*x – x – 2; } double df(double x) { return 2*x-1; } Conservation laws int main() { define variables; initial(all variables we should define their value at first); while(t < final_time) { dt = find_dt(all variables related to time steps); update(the variables we should update); t = t + dt; } printf(“Yes. We did it!\n”); } We will talk about the algorithm next Monday.