Лекция 3 Массивы и Функции.
Массивы Массив – набор данных, связанных одним именем, расположенных последовательно в памяти. Каждому элементу массива присвоен номер – индекс. Доступ к элементам массива происходит по индексу. Индексация элементов начинается от нуля.
#include /* подсчет цифр, символов-разделителей и прочих символов */ int main() { int с, 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' && с <= '9' ) ++nDigit[c - '0' ]; else if (c == ' ' || с == '\n' || с == '\t') ++nWhite; else ++nOther; printf ("цифры ="); for (i=0; i < 10; ++i) printf(" %d", nDigit[i]); printf (", символы-разделители = %d, прочие = %d\n", nWhite, nOther); return 0; } Массивы
Сортировка методом пузырька #include #define N 1000 int main() { int n, i, j, tmp; int a[N]; // считываем количество чисел n scanf("%d", &n); // считываем n чисел for(i = 0 ; i < n; i++) { scanf("%d", &a[i]); } for(i = 0 ; i < n ; i++) { // сравниваем два соседних элемента. for(j = 0 ; j < n - i - 1 ; j++) { if(a[j] > a[j+1]) { // если они идут в неправильном порядке, то // меняем их местами. tmp = a[j]; a[j] = a[j+1] ; a[j+1] = tmp; } return 0; }
Функции #include /* объявление функции power */ int power(int m, int n); int main() { int i; for (i = 0; i < 10; ++i) printf("%d %d %d\n", i, power(2,i), power(-3, i)); return 0; }
Функции /* возводит base в n-ю степень; n >= 0 */ int power(int base, int n) { int i, p; p = 1; for (i = 1; i <= n; ++i) p = p * base; return p; }
Символьные массивы #include #define MAXLINE 1000 /* максимальный размер вводимой строки */ int getline(char line[], int maxline); void copy(char to[], char from[]); /* печать самой длинной строки */ int main() { int len; /* длина текущей строки */ int max; /* длина максимальной из просмотренных строк */ char line[MAXLINE]; /* текущая строка */ char longest[MAXLINE]; /* самая длинная строка */ max = 0; while ((len = getline(line, MAXLINE)) > 0) if (len > max) { max = len; copy(longest, line); } if (max > 0) /* была ли хоть одна строка? */ printf("%s", longest); return 0; }
Символьные массивы /* getline: читает строку в s, возвращает длину */ int getline(char s[], int lim) { int c, i; for (i = 0; i < lim-1 && (c = getchar()) != EOF && с != '\n'; ++i) s[i] = c; if (c == \n') { s[i] = c; ++i; } s[i] = '\0'; return i; }
Символьные массивы /* copy: копирует строку 'from' в 'to'; длина to считается достаточной */ void copy (char to[], char from[]) { int i ; i = 0; while ((to[i] = from[i]) != '\0') ++i; }
Символьные массивы Функция getline в конец создаваемого ею массива помещает символ '\0' (null-символ, кодируемый нулевым байтом), чтобы обозначить конец строки символов. То же соглашение относительно окончания нулем соблюдается и в случае строковой константы вроде "hello\n". В данном случае для него формируется массив из символов этой строки с '\0' в конце. h e l l o \n \0
Преобразование в целое /* atoi: преобразование s в целое */ int atoi(char s[]) { int i, n; n = 0; for (i = 0; s[i] >= '0' && s[i] <= '9'; ++i) n = 10 * n + (s[i] - '0'); return n; }
Преобразование строки /* lower: преобразование строки в нижний регистр; только для ASCII */ int lower(int с) { if (с >= 'А' && с <= 'Z' ) return с + 'а' - 'А'; else return с; }
strcat() /* strcat: помещает t в конец s; s достаточно велика */ void strcat (char s[], char t[]) { int i, j; i = j = 0; while (s[i] != '\0') /* находим конец s */ i++; while ((s[i++] = t[j++]) != '\0') /* копируем t */ ; }
Преобразование типов Если в виражении появляются операнды различных типов, то они преобразуются к некоторому общему типу. int a = 30000; float b; b = (float) a * 12; (переменная a целого типа явно преобразована к типу float; если этого не сделать, то результат будет потерян, т.к. a * 12 > 32767).
Оператор switch switch (виражение) { case констант-вираж: операторы default: операторы }
Оператор switch #include int main(){ int a=1; switch(a) { case 1: a++; case 2: a++; case 3: a++; } printf("a= %d\n, a); return 0; } /* *вывод программы: *a= 4 * */ #include int main(){ int a=1; switch(a) { case 1: a++; break; case 2: a++; break; case 3: a++; break; } printf("a= %d\n, a); return 0; } /* *вывод программы: *a= 2 * */
Подсчёт цифр, пробелов, других символов #include int main() /* подсчет цифр, пробелов, других символов */ { int с, i, nwhite, nother, ndigit[10]; nwhite = nother = 0; for (i = 0; i < 10; i++) ndigit[i] = 0; while ((с = getchar()) != EOF) { switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': ndigit[c-'0']++; break;
Подсчёт цифр, пробелов, других символов case ' ': case '\n': case '\t': nwhite++; break; default: nother++; break; } printf("digits = ") ; for (i = 0; i < 10; i++) printf(" %d", ndigit[i]); printf(", white space = %d, other = %d\n", nwhite, nother); return 0; }