- •Санкт-Петербургский
- •Структура программы на языке Си
- •Структура простейшей одномодульной программы
- •Комментарии в программе на языке Си
- •Начальные сведения о препроцессоре
- •Определение функции main().
- •Пример простейшей программы
- •Алфавит, синтаксис и семантика
- •Алфавит языка Си
- •Понятие о типе
- •Система типов языка Си Система типов языка Си
- •Понятие об объекте
- •Лексемы
- •Зарезервированные слова
- •Идентификаторы
- •Литералы
- •Целочисленные литералы
- •Литерал вещественного типа
- •Символьные литералы
- •Строковый литерал
- •Переменные
- •Символические константы в языке Си
- •Операторы, выражения и инструкции. Общие сведения.
- •Классификация операторов
- •Приоритет и ассоциативность операторов.
- •Побочные эффекты и вычисления выражений
- •Порядок вычисления выражений
- •Арифметические операторы и выражения
- •Унарные операторы
- •Бинарные операторы
- •Преобразования типа при выполнении бинарных операторов
- •Автоматическое преобразование типов
- •Явное преобразование типа
- •Математические функции
- •Оператор присваивания и инструкция присваивания
- •Простой оператор присваивания
- •.Множественное присваивание
- •Составной оператор присваивания
- •Преобразование типа при присваивании
- •Начальные сведения об указателях. Выходные параметры функции
- •Принятие решений и логические величины. Операторы отношения и сравнения на равенство
- •Логические операторы
- •Поразрядные операторы
- •Условные выражения (оператор ?:)
- •Оператор запятая
- •Оператор sizeof
- •Составная инструкция
- •Инструкция ifelse
- •Полная и сокращенная формы инструкции if
- •Вложенные инструкции if
- •Инструкция switch
- •Синтаксис инструкции switch
- •1.25.2. Использование инструкции switch
- •Функциональные компоненты цикла
- •Арифметические и итерационные циклы
- •Задачи, приводящие к арифметическим циклам
- •Задачи, приводящие к итерационным циклам
- •Циклические управляющие инструкции
- •Цикл, управляемый инструкцией for
- •Цикл, управляемый инструкцией while
- •Цикл, управляемый инструкцией do … while
- •Цикл с выходом
- •Вложенные циклы
- •Понятие о варианте и инварианте цикла
- •Объявления и определения (расширенное рассмотрение)
- •Спецификаторы объявления
- •Спецификаторы класса памяти.
- •Квалификаторы типа
- •Спецификаторы типа
- •Использование спецификаторов
- •Описатели
- •Использование зарезервированного слова typedefдля объявления синонимов типов
- •Функции
- •Понятие об абстракции и инкапсуляции
- •Функция языка Си и процедурная абстракция
- •Понятие о функции
- •Назначение функций
- •Определение функции
- •Функции, возвращающие и невозвращающие значение
- •Вызов функции. Передача параметров по значению
- •Внешние переменные и процедурная абстракция
- •Понятие о прототипе. Компиляция
- •Старый стиль определения функции
- •Массивы в стиле языка с89
- •Определение и объявление массивов
- •Определение и объявление одномерных массивов. Иницициализация одномерных массивов при их определении. Доступ к элементам массива.
- •Определение и инициализация двумерных массивов
- •Операции с массивами
- •Размещение массивов в оперативной памяти
- •Указатели
- •Операторы разыменования и взятия адреса
- •Области применения указателей
- •Нулевой указатель
- •Определение указателя
- •Недействительный указатель
- •Операции с указателями
- •Дополнительные сведения о разыменовании указателей
- •Присваивание указателей
- •Операция взятия адреса для указателя. Указатели на указатели
- •Указатели и операция индексирования
- •Арифметические операции с указателями
- •Сравнение указателей
- •Указатели и динамическая память
- •Функция malloc
- •Функция calloc
- •Функция realloc
- •Функция free
- •Указатели – параметры функций. Имитация передачи по ссылке
- •Указатели на функцию
- •Инициализация указателя на функцию
- •Операции с указателями на функцию
- •Табулирование произвольной функции одного переменного
- •Использование стандартной функции qsort
- •Указатели и массивы
- •Строковый литерал
- •Символические строковые константы
- •Строковые переменные
- •Инициализация строковых переменных
- •Операции со строковыми переменными
- •Ввод строк
- •Функция scanf()
- •Опасная функция gets()
- •Использование функции fgets()
- •Вывод строк
- •Функция printf()
- •Функция puts()
- •Функция fputs()
- •Библиотечные функции для обработки строк
- •Функция strlen()
- •Функции strcpy()иstrncpy()
- •Функции strcat() иstrncat()
- •Функция strcmp()
- •Массивы строк
- •Структуры
- •Объявление структур
- •Обращение к полям структуры
- •Инициализация структур
- •Операции над структурами
- •Массивы структур
- •Объявление массива структур
- •Идентификация элементов массива структур
- •Работа с внешними устройствами
- •Понятие потока
- •Текстовый поток
- •Двоичный поток
- •Указатель файла
- •Функция fopen()
- •Функция fclose()
- •Построковый ввод – вывод
- •Блоковый ввод – вывод
- •Примеры решенных задач
- •Прямой доступ к файлу
- •Функция fseek()
Определение и инициализация двумерных массивов
Общий формат определения одномерного массива в стиле стандарта С89 имеет следующий:
<α> <>[<γ1>][<γ2>] = <μ>;
Здесь α- тип элементов, хранящихся в массиве; - имя массива, [..] – оператор индексирования; γ1 – константное выражение, определяющее количество строк в двумерном массиве, а γ2 - константное выражение, определяющее количество столбцов в двумерном массиве. Конструкция «= <μ>» используется для инициализации массива; μ – список инициализаторов.
Приведем пример определения двумерного массива.
#define MROW 2 #define MCOL 3 int main(void) { double m[MROW][MCOL] = { {1, 3, 5}, {2, 4, 6} }; }
В этом примере содержится определение двумерного массива m, в котором может храниться не более 2 строк и не более трех столбцов. Элементы массива инициализированы во время его определения. Первая строка массива содержит числа 1, 3 и 5, а вторая строка - 2, 4 и 6. Элементы массива имеют типdouble.
Операции с массивами
Все операции с элементами массива выполняются поэлементно. Приведем два примера.
Пример 1. Копирование одномерных массивов.
Постановка задачи. Даны два массива одинаковых размеровx1 иx2. Скопировать частьnэлементов массиваx1 в массивx2.
Решение. Организуем арифметический цикл, рассчитанный наnповторений. Поэлементно будем копировать элементы массиваx1 в массивx2. Программный код, представленный ниже, решает рассматриваемую задачу.
#defineMSIZE20 #include<stdio.h>intmain(void)
{ int x1[MSIZE] = {1, 3, 5}; int x2[MSIZE]; int n; printf(“n=”); scanf(“%d”, &n); for(int i = 0; i < n; i++) x2[i] = x1[i]; //.. }
В рассматриваемом коде «n» элементов массиваx1 копируется в массивx2. Если ввести значение «n», равноеMSIZE, то весь массивx1 , будет скопировани в массивx2. Заметим, что инстукцияx1 =x2; в связи с тем,x1 – константный указатель.
Пример 2. Обработка двумерных массивов.
Постановка задачи. В двумерном массиве, хранятся данные типаdouble. Массив состоит изnrстрок иncстолбцов. Требуется вычислить две суммыsumma_rowиsumma_col. Здесьsumma_row- сумма элементов в каждой строке, аsumma_col– сумма элементов для каждого столбца.
Решение
При обращении к элементам двумерного массива следует использовать два индекса, причем каждый из индексов должен записываться в своих индексных скобках. Отметим, левый индекс определяет номер строки, в которй находится элемент массива, а правый – номер столбца. Например, если m– матрицы, тоm[1][2] – элемент этой матрицы, находящийся в строки с индексом 1 и столбце с индексом 2.
Каждая из сумм summa_rowиsumma_colдолжна вычисляться отдельно с использованием вложенных циклов. Дело в том, что при вычислении суммыsumma_rowматрица должна просматриваться по строкам, а при вычисленииsumma_colматрица должна просматриваться по стобцам.
Алгоритм просмотра по строкам реализуется с помощью вложенных циклов. Причем:
внешний цикл должен фиксировать индекс строки,
внутренний цикл - изменять индекс столбца.
В алгоритме просмотра по столбцам наоборот:
внешний цикл должен фиксировать индекс столбца,
внутренний цикл – изменять индекс строки.
#defineMROW5 #defineMCOL10intmain(void) {doublesumma_row[MROW];intnr;printf(“nr= ”);scanf(“%d”, &nr);intnc;printf(“nc= ”);scanf(“%d”, &nc);doublem[MROW][MCOL]; // Ввод матрицы по строкамfor(intr= 0;r<nr;r++) {for(c= 0;c<nc;c++) {printf(“m[%d][%d]”,c,r);scanf(“%lf”, &m[r][c]); } } // Вычисление суммы для каждой строкиdoublesumma_row[MROW];// массив для хранения суммы по // строкамfor(intr= 0;r<nr;r++) {doubles= 0;for(c= 0;c<nc;c++) {s+=m[r][c]; }summa_row[r] =s; } // Вычисление суммы для каждого столбцаdoublesumma_col[MROW];// массив для хранения суммы по // столбцамfor(intc= 0;c<nc;c++) {doubles= 0;for(r= 0;r<nr;r++) {s+=m[r][c]; }summa_col[c] =s; } // вывод результатов вычислений }return0;