Въведение - 2

Chapter 1 - A Tutorial Introduction
1.3 The for statement
1.4 Symbolic Constants
1.5 Character Input and Output
1.5.1 File Copying
1.5.2 Character Counting
1.5.3 Line Counting
1.5.4 Word Counting
1.6 Arrays
1.7 Functions
1.8 Arguments - Call by Value
1.9 Character Arrays
1.10 External Variables and Scope

Оператор for
Температура по Целзии и Фаренхайт: C = (5/9) * (F - 32)
 0   -17.8
 20   -6.7
 40    4.4
 
#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));
}


Знакови константи
Знак = символ = character = char
Магически числа - знакови константи

#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));

}

Знаков вход и изход
Знак = символ = character = char
Текстов поток - редица от знаци, специален знак за нов ред.

c = getchar();
putchar(c);

ASCII Table

(American Standard Code for Information Interchange)

0-31 are control codes, for example "/n" (newline) has ASCII code 10.

  32:   33:!  34:"  35:#  36:$  37:%  38:&  39:'  40:(  41:)
  42:*  43:+  44:,  45:-  46:.  47:/  48:0  49:1  50:2  51:3
  52:4  53:5  54:6  55:7  56:8  57:9  58::  59:;  60:<  61:=
  62:>  63:?  64:@  65:A  66:B  67:C  68:D  69:E  70:F  71:G
  72:H  73:I  74:J  75:K  76:L  77:M  78:N  79:O  80:P  81:Q
  82:R  83:S  84:T  85:U  86:V  87:W  88:X  89:Y  90:Z  91:[
  92:\  93:]  94:^  95:_  96:`  97:a  98:b  99:c 100:d 101:e
 102:f 103:g 104:h 105:i 106:j 107:k 108:l 109:m 110:n 111:o
 112:p 113:q 114:r 115:s 116:t 117:u 118:v 119:w 120:x 121:y
 122:z 123:{ 124:| 125:} 126:~ 127:  128:Ђ 129:Ѓ 130:‚ 131:ѓ
 132:„ 133:… 134:† 135:‡ 136:€ 137:‰ 138:Љ 139:‹ 140:Њ 141:Ќ
 142:Ћ 143:Џ 144:ђ 145:‘ 146:’ 147:“ 148:” 149:• 150:– 151:—
 152:� 153:™ 154:љ 155:› 156:њ 157:ќ 158:ћ 159:џ 160:  161:Ў
 162:ў 163:Ј 164:¤ 165:Ґ 166:¦ 167:§ 168:Ё 169:© 170:Є 171:«
 172:¬ 173:­  174:® 175:Ї 176:° 177:± 178:І 179:і 180:ґ 181:µ
 182:¶ 183:· 184:ё 185:№ 186:є 187:» 188:ј 189:Ѕ 190:ѕ 191:ї
 192:А 193:Б 194:В 195:Г 196:Д 197:Е 198:Ж 199:З 200:И 201:Й
 202:К 203:Л 204:М 205:Н 206:О 207:П 208:Р 209:С 210:Т 211:У
 212:Ф 213:Х 214:Ц 215:Ч 216:Ш 217:Щ 218:Ъ 219:Ы 220:Ь 221:Э
 222:Ю 223:Я 224:а 225:б 226:в 227:г 228:д 229:е 230:ж 231:з
 232:и 233:й 234:к 235:л 236:м 237:н 238:о 239:п 240:р 241:с
 242:т 243:у 244:ф 245:х 246:ц 247:ч 248:ш 249:щ 250:ъ 251:ы

 252:ь 253:э 254:ю 255:

Първите 32 символа (от 0 до 31) са управляващи символи и нямат стандартен графичен образ.
Символите от 127 до 255 са различни в различните езици.
Мястото на българската азбука е различно в зависимост от типа на кодирането - в таблицата е даден стандарта Windows-1251.
  
Копиране на файл


#include <stdio.h>

/* copy input to output; 1st version */
main()
{
    int c;
    c = getchar();
    while (c != EOF) {
        putchar(c);

        c = getchar();

    }
}


Втора версия на програмата:

#include <stdio.h>

/* copy input to output; 2nd version */
main()
{
    int c;
    while ((c = getchar()) != EOF)
        putchar(c);
}

   Преброяване на знаци

#include <stdio.h>

/* count characters in input; 1st version */
main()
{
    long nc;
    nc = 0;
    while (getchar() != EOF)
        ++nc;
    printf("%ld\n", nc);

}

#include <stdio.h>

/* count characters in input; 2nd version */
main()

{
    double nc;
    for (nc = 0; gechar() != EOF; ++nc)
        ;

    printf("%.0f\n", nc);
}


   Преброяване на редове

#include <stdio.h>

/* count lines in input */
main()

{
    int c, nl;
    nl = 0;
    while ((c = getchar()) != EOF)
           if (c == '\n')
               ++nl;
    printf("%d\n", nl);
}

Знакова константа (литерал) и низова константа.

   Преброяване на думи

#include <stdio.h>

#define IN 1 /* inside a word */
#define OUT 0 /* outside a word */

/* count lines, words, and characters in input */
main()

{
    int c, nl, nw, nc, state;
    state = OUT;
    nl = nw = nc = 0;
    while ((c = getchar()) != EOF) {
        ++nc;
        if (c == '\n')
            ++nl;
        if (c == ' ' || c == '\n' || c = '\t')
            state = OUT;
        else if (state == OUT) {
            state = IN;
            ++nw;
        }

    }
    printf("%d %d %d\n", nl, nw, nc);
}


Масиви
Преброяване на цифрите, разделителите (white space) и другите знаци

#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;
    while ((c = getchar()) != EOF)
        if (c >= '0' && c <= '9')

            ++ndigit[c-'0'];
        else if (c == ' ' || c == '\n' || c == '\t')
            ++nwhite;
        else
            ++nother;

    printf("digits =");
    for (i = 0; i < 10; ++i)
        printf(" %d", ndigit[i]);
    printf(", white space = %d, other = %d\n",
        nwhite, nother);
}


Функции

#include <stdio.h>

int power(int m, int 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;
}

/* 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;

}


Аргументи - извикване по стойност

/* 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;
}


Масиви от знаци
Програмата чете редове и отпечатва най-дългия от тях.

#include <stdio.h>
#define MAXLINE 1000 /* maximum input line length */

int getline(char line[], int maxline);
void copy(char to[], char from[]);

/* print the 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;
}

/* 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;
}


Външни променливи и област на видимост

#include <stdio.h>
#define MAXLINE 1000 /* maximum input line size */

int max;                 /* maximum length seen so far */
char line[MAXLINE];      /* current input line */
char longest[MAXLINE];   /* longest line saved here */

int getline(void);
void copy(void);

/* print longest input line; specialized version */
main()
{
    int len;
    extern int max;
    extern char longest[];
    max = 0;

    while ((len = getline()) > 0)
        if (len > max) {
            max = len;
            copy();
        }
    if (max > 0) /* there was a line */
        printf("%s", longest);
    return 0;
}

/* getline: specialized version */
int getline(void)
{
    int c, i;
    extern char line[];

    for (i = 0; i < MAXLINE - 1
        && (c=getchar)) != EOF && c != '\n'; ++i)
            line[i] = c;
    if (c == '\n') {
        line[i] = c;
        ++i;
    }
    line[i] = '\0';
    return i;
}

/* copy: specialized version */
void copy(void)
{
    int i;
    extern char line[], longest[];
    i = 0;
    while ((longest[i] = line[i]) != '\0')
        ++i;
}


Локални -- глобални променливи
Автоматични -- външни променливи