220 likes | 345 Views
Imperative & System Programming IN.3011 – Systemnahe Programmierung IN.3011 – Programmation proche du système. Bachelor students : Major in computer science (3rd semester) Minor in computer science Optionnal course JMCS Gateway students :
E N D
Imperative & SystemProgramming IN.3011 – SystemnaheProgrammierungIN.3011 – Programmationprochedusystème • Bachelor students : • Major in computer science (3rd semester) • Minor in computer science • Optionnal course • JMCS Gateway students : • Complementary course for the Joint Master in Computer Science Prof. Béat Hirsbrunner Ammar Halabi, PhD student (exercises) Dani Rotzetter, Master student (exercises) Prerequisite: Basic knowledge of a programming language, e.g. Java University of Fribourg, Department of Informatics Autumn Semester 2012, www.unifr.ch/diuf/pai/ip
Hello World • #include <stdio.h> • main() • { • printf("hello, world\n"); • } % gcc -o hello hello.c // Compile hello.c % ./hello // Run hello % gcc hello.c // Compile hello.c % ./a.out // Run a.out Imperative and System Programming, B. Hirsbrunner, Lecture 1 – 19 September 2012Course organization: ~30’; Unix Tutorial: ~60’; C Tutorial: ~20’; KR – Chap 1: ~70’ (KR p6)
Variables and Arithmetic Expressions (1) • #include <stdio.h> • /* Print Fahrenheit-Celsius table for fahr = 0, 20, ..., 300 */ • main() • { • int fahr, celsius; • int lower, upper, step; • lower = 0; /* lower limit of temperature table */ • upper = 300; /* upper limit */ • step = 20; /* step size */ • fahr = lower; • while (fahr <= upper) { • celsius = 5 * (fahr - 32) / 9; • printf("%d\t%d\n", fahr, celsius); • fahr = fahr + step; • } • } (KR p9)
Variables and Arithmetic Expressions (2) • #include <stdio.h> • /* Print Fahrenheit-Celsius table for fahr = 0, 20, ..., 300 */ • /* Floating-point version */ • main() • { • float fahr, celsius; • int lower, upper, step; • lower = 0; /* lower limit of temperature table */ • upper = 300; /* upper limit */ • step = 20; /* step size */ • fahr = lower; • while (fahr <= upper) { • celsius = (5.0/9.0) * (fahr - 32.0); • printf("%3.0f %6.1f\n", fahr, celsius); • fahr = fahr + step; • } • } (KR p12)
The For Statement • #include <stdio.h> • /* print Fahrenheit-Celsius table */ • main() • { • int fahr; • for (fahr = 0; fahr <= 300; fahr = fahr + 20) • printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32)); • } (KR p13)
Symbolic Constants • #include <stdio.h> • #define LOWER 0 /* lower limit of table */ • #define UPPER 300 /* upper limit */ • #define STEP 20 /* step size */ • /* print Fahrenheit-Celsius table */ • main() • { • int fahr; • for (fahr = LOWER; fahr <= UPPER; fahr = fahr + STEP) • printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32)); • } (KR p15)
File Copying (1) • #include <stdio.h> • /* copy input to output; 1st version */ • main() • { • int c; • c = getchar(); • while (c != EOF) { • putchar(c); • c = getchar(); • } • } (KR p16)
File Copying (2) • #include <stdio.h> • /* copy input to output; 2nd version */ • main() • { • int c; • while ((c = getchar()) != EOF) • putchar(c); • } (KR p17)
Character Counting (v1) • #include <stdio.h> • /* count characters in input; 1st version */ • main() • { • long nc; • nc = 0; • while (getchar() != EOF) • ++nc; • printf("%ld\n", nc); • } (KR p18)
Character Counting (v2) • #include <stdio.h> • /* count characters in input; 2nd version */ • main() • { • double nc; • for (nc = 0; getchar() != EOF; ++nc) • ; • printf("%.0f\n", nc); • } (KR p18)
Line Counting • #include <stdio.h> • /* count lines in input */ • main() • { • long c, nl; • nl = 0; • while ((c = getchar()) != EOF) • if (c == '\n') • ++nl; • printf("%d\n", nl); • } (KR p19)
Word Counting #include <stdio.h> #define IN 1 /* inside a word */ #define OUT 0 /* outside a word */ State machine /* count lines, words, and characters in input */ main() { int c, nl, nw, nc, state; state = OUT; nl = nw = nc = 0; c not in S c in S c not in S out in init c in S while ((c = getchar()) != EOF) { ++nc; if (c == '\n') ++nl; c == EOF c == EOF exit exit if (c == ' ' || c == '\n' || c == '\t') state = OUT; else if (state == OUT) { state = IN; ++nw; } S = {‘‘, ‘\n’, ‘\t’} ++nw : for every state transition "out" to "in" } printf("%d %d %d\n", nl, nw, nc); } (KR p20)
Arrays(1 / declaration + initialization) ndigit ndigit[2] index 0 1 2 3 4 5 6 7 8 9 • #include <stdio.h> • /* count digits, white space, others */ • main() • { • int c, i, nwhite, nother; • int ndigit[10]; • nwhite = nother = 0; • for (i = 0; i < 10; ++i) • ndigit[i] = 0; (KR p22)
Arrays(2 / algo + output) • while ((c = getchar()) != EOF) • if (c >= '0' && c <= '9') • ++ndigit[c - '0']; • else if (c == ' ' || c == '\n' || c == '\t') • ++nwhite; • else • ++nother; • printf("digit ="); • for (i = 0; i < 10; ++i) • printf(" %d", ndigit[i]); • printf(", white space = %d, other = %d\n",nwhite,nother); • } // c - '0': See ASCII table ! (KR p22)
Functions(1 / main program) • #include <stdio.h> • int power(int m, int n); // power: m,n m**n • /* test power function */ • main() • { • int i; • for (i = 0; i < 10; ++i) • printf("%d %d %d\n", i, power(2, i), power(-3, i)); • return 0; • } (KR p24)
Functions(2 / power function) power (base, n) = basen = base * base * … * base (n times) • /* power: raise base to • n-th power; n >= 0 */ • int power(int base, int n) • { • int i, p; • p = 1; • for (i = 1; i <= n; ++i) • p = p * base; • return p; • } Function call Diagram (KR p24)
Arguments – Call by Value power (base, n) = basen = base * base * … * base (n times) • /* power: raise base to • n-th power; n >= 0; • version 2 */ • int power(int base, int n) • { • int p; • for (p = 1; n > 0; --n) • p = p * base; • return p; • } Function call Diagram (KR p27)
Character Arrays(1 / main) • #include <stdio.h> • #define MAXLINE 1000 /* maximum input line size */ • int getline(char line[], int maxline); • void copy(char to[], char from[]); • /* print longest input line */ • main() • { • int len; /* current line length */ • int max; /* maximum length seen so far */ • char line[MAXLINE]; /* current input line */ • char longest[MAXLINE]; /* longest line saved here */ • max = 0; • while ((len = getline(line, MAXLINE)) > 0) • if (len > max) { • max = len; • copy(longest, line); • } • if (max > 0) /* there was a line */ • printf("%s", longest); • return 0; • } (KR p29)
Character Arrays(2 / getline + copy) • /* getline: read a line into s, return length */ • int getline(char s[], int lim) • { • int c, i; • for (i = 0; i < lim-1 && (c = getchar())!= EOF && c!='\n'; ++i) • s[i] = c; • if (c == '\n') { • s[i] = c; • ++i; • } • s[i] = '\0'; • return i; • } • /* copy: copy 'from' into 'to'; assume 'to' is big enough */ • void copy(char to[], char from[]) • { • int i; • i = 0; • while ((to[i] = from[i]) != '\0') • ++i; • } (KR p29)
C String • In C, a string is stored as an array of characters: • containing the characters of the string and • terminated with a ‘\0’ to mark the end • char s[7] = “Hello”; Typical navigation for (i=0; s[i]!=‘\0’; ++i) { // Do some actions } (KR p30)
Scope of the variables int i=2; // global variable int f(int x) { int j=3; // local variable return i*j*x; } main() { int j=4, r1, r2; // local variables r1 = f(j); r2 = f(5*j); } • A variable v1 declared inside any function, inclusive main(), is only known in that function, i.e. no other function can have direct access to it. • A variable v2 declared outside any function is known and accessible everywhere. • v1 is called a local or private variable, and v2 a global or public variable. Function Call Diagram (KR p31)
#includename #definenamereplacementtext main() { } Summary while (expression) statement for (expr1;expr2;expr3) statement if (expr1) statement1 else if (expr2) statement2 … else statement_n Return-typefunction-name(parameter declarations, if any) { declarations statements } Definition. A statement is an expression followed by a semicolon or a sequence of 'expression;' surrounded by { }