Лекция 4 Области видимости и структуры в языке С
Внешние переменные и область видимости #include #define MAXLINE 1000 /* максимальный размер вводимой строки */ int max; /* длина максимальной из просмотренных строк */ char line[MAXLINE]; /* текущая строка */ char longest[MAXLINE]; /* самая длинная строка */ int getline(void); void copy(void); /* печать самой длинной строки; специализированная версия */ int main () { int len; extern int max; extern char longest[]; max = 0; while ((len = getline()) > 0) if (len > max) { max = len; copy(); } if (max > 0) /* была хотя бы одна строка */ printf("%s", longest); return 0; }
Символьные массивы /* copy: специализированная версия */ void copy(void) { int i; extern char line[], longest[]; i = 0; while ((longest[i] = line[i]) != '\0') ++i; }
Преобразование типов Если в выражении появляются операнды различных типов, то они преобразуются к некоторому общему типу. int a = 30000; float b; b = (float) a * 12; (переменная a целого типа явно преобразована к типу float; если этого не сделать, то результат будет потерян, т.к. a * 12 > 32767).
itoa /* itoa: преобразует число n в строку символов s */ void itoa(int n, char s[]) { int i, sign; if ((sign = n) < 0) /* записываем знак */ n = -n; /* делаем число положительным */ i = 0; do { /* генерируем цифры в обратном порядке */ s[i++] = n % 10 + '0'; /* извлекаем цифру */ } while ((n /= 10) > 0); /* удаляем ее */ if (sign < 0) s[i++] = '-'; s[i] = '\0'; reverse(s); }
Функции, возвращающие нецелые значения #include /* atof: преобразование строки s в число типа double */ double atof(char s[]) { double val, power; int i, sign; for(i = 0; isspace(s[i]); i++) /* пропуск пробелов */ sign = (s[i] =='-') ? -1 : 1; if (s[i] == '+' || s[i] == '-') i++; for(val = 0.0; isdigit(s[i]); i++) val = 10.0 * val + (s[i] - '0'); if (s[i] == '.') i++; for (power = 1.0; isdigit(s[i]); i++) { val = 10.0 * val + (s[i] - '0'); power *= 10; } return sign * val / power; }
Поиск подстроки /* strindex: вычисляет место t в s или выдает -1, если t нет в s */ int strindex (char s[], char t[]) { int i, j, k; for (i = 0; s[i] != '\0'; i++) { for (j = i, k = 0; t[k] != '\0' && s[j] == t[k]; j++, k++) ; if (k > 0 && t[k] == '\0') return i; } return -1; }
Рекурсивный вызов #include /* printd: печатает n как целое десятичное число */ void printd(int n) { if (n < 0) { putchar('-'); n = -n; } if (n / 10) printd(n / 10); putchar(n % 10 + '0'); }
Структуры struct point { int x; int у; };
Структуры /* объявление переменной типа структуры*/ struct {…} х, у, z; //x,y,z имена переменных // если структура была задана ранее struct point pt; // присваивание в структуре struct point maxpt = { 320, 200 }; /* обращение к структуре(вывод значений на экран)*/ printf("%d,%d", pt.x, pt.y);
Вложенные структуры struct rect { struct point pt1; struct point pt2; };
Вложенные структуры Структура rect содержит две структуры point. Если мы объявим screen как struct rect screen; то screen.pt1. x обращается к координате х точки pt1 из screen.
Структуры в функциях /* makepoint: формирует точку по компонентам(аргументам) х и y */ struct point makepoint(int x, int y) { struct point temp; temp.x = x; temp.у = у; return temp; }
Структуры в функциях struct rect screen; struct point middle; struct point makepoint(int, int); screen.pt1 = makepoint(0, 0); screen.pt2 = makepoint(XMAX, YMAX); middle = makepoint((screen.pt1. x + screen. pt2.x)/2, (screen.pt1. y + screen.pt2.y)/2);
Структуры в функциях /* addpoint: сложение двух точек */ struct point addpoint(struct point p1, struct point p2) { p1. x += p2.x; p1. y += p2.y; return p1; }
Структуры /* ptinrect: возвращает 1, если р в r, и 0 в противном случае */ int ptinrect(struct point p, struct rect r) { return p.x >= r.ptl.x && p.x < r.pt2. x && p.y >= r.ptl.y && p.y < r.pt2.y; }