- •Основы программирования на языке Си.
- •Достоинства языка Си.
- •Будущее языка Си.
- •Использование языка Си.
- •Использование текстового редактора для подготовки программ.
- •Исходные и выполняемые файлы
- •Пример простой программы на языке Си
- •Структура простой программы
- •2. Лекция: Данные, символьные строки, директива #define.
- •Основные типы данных
- •Описание различных типов, переменные и константы
- •Символьные строки
- •Препроцессор языка Си
- •3. Лекция: Операции.
- •Основные операции
- •Дополнительные операции
- •Перечень операций языка Си
- •Операции, уровень приоритета которых равен 1
- •Операции, уровень приоритета которых равен 2
- •Операции, уровень приоритета которых равен 3
- •Операции, уровень приоритета которых равен 4
- •Операции, уровень приоритета которых равен 5
- •Операции, уровень приоритета которых равно 6
- •Операции, уровень приоритета которых равен 7
- •Операция, уровень приоритета которой равен 8
- •Операция, уровень приоритета которой равен 9
- •Операция, уровень приоритета которой равен 10
- •Операция, уровень приоритета которой равен 11
- •Операция, уровень приоритета которой равен 12
- •Операция, уровень приоритета которой равен 13
- •Операция, уровень приоритета которой равен 14
- •Операция, уровень приоритета которой равен 15
- •Примеры простых задач
- •4. Лекция: Операторы.
- •Выражения
- •Простейшие выражения
- •Операторы
- •Составные операторы
- •Оператор цикла while
- •10 Км. В последующие дни он проезжал со скоростью,
- •Изучение и использование функций printf( ) и scanf( )
- •Применение функции scanf( )
- •Подведем итог.
- •5. Лекция: преобразование типов.
- •Эквивалентность типов
- •Преобразование типов
- •Разбор программы
- •Операция приведения
- •Неявное преобразование типа
- •Арифметические преобразования
- •Явные преобразования типов
- •Синтаксис типов
- •6. Лекция: функции и переключение ввода-вывода
- •Ввод и вывод одного символа
- •Чтение одной строки
- •Чтение файла
- •Переключение и работа с файлами
- •7. Лекция: Выбор вариантов.
- •Выбор вариантов
- •Оператор if
- •Расширение оператора if
- •Операции отношения
- •Логические операции
- •Операция условия: ?:
- •Множественный выбор
- •8. Лекция: Циклы и другие управляющие средства. Структурное программирование.
- •Структурное программирование
- •Цикл с предусловием
- •Цикл со счетчиком
- •Цикл с постусловием
- •Другие управляющие операторы
- •9. Лекция: Функции.
- •Создание и использование функций
- •Аргументы функции
- •Возвращение значений
- •Локальные переменные
- •Нахождение адресов
- •Указатели, первое знакомство
- •Функции с переменным количеством аргументов
- •10. Лекция: Классы памяти и разработка программ.
- •Классы памяти и область действия
- •Автоматические переменные
- •Внешние переменные
- •Статические переменные
- •Внешние статические переменные
- •Регистровые переменные
- •11. Лекция: Препроцессор языка Си.
- •Общие сведения
- •Символические константы: #define
- •Использование аргументов с #define
- •Макроопределение или функция?
- •Включение файла: #include
- •Условная компиляция
- •12. Лекция: Массивы и указатели.
- •Указатели и массивы
- •Массивы
- •Указатели
- •Динамические объекты
- •Создание динамических объектов
- •Доступ к динамическим объектам
- •Связь между указателями и массивами
- •Инициализация массивов и классы памяти
- •Функции, массивы и указатели
- •Операции с указателями
- •13. Лекция: Символьные строки и функции над ними.
- •Строковые константы
- •Массивы символьных строк и их инициализация
- •Массив и указатель: различия
- •Указатели и строки
- •Ввод-вывод строк
- •Обработка строк
- •14. Лекция: Структуры.
- •Определение структурных переменных
- •Доступ к компонентам структуры
- •Поля битов в структурах
- •Объединения
- •Перечисления
- •Переменные структуры
- •Указатели и структуры
- •Массив структур
- •Переименование типов
- •15. Лекция: Библиотека языка Си и файлы ввода-вывода.
- •Стандартные библиотечные функции
- •Связь с файлами
- •Текстовые файлы с буферизацией
- •Распределение памяти
- •16. Лекция: Функции в примерах.
- •Функция получения случайных чисел
- •Поиск узлов из простых чисел
- •Матрица инцидентности
- •Структуры данных
- •Все операции со стеком
Указатели и структуры
Рассмотрим метку структуры student, описание которой было дано выше как
struct student {
char name[25];
int id, age;
char sex;
}
Указатель new_student определен как
struct student *new_student;
Предположим, что память выделена таким образом, чтобы new_student указывал на объект student. Тогда на компоненты этого объекта можно ссылаться следующим образом:
(*new_student).name
(*new_student).id
(*new_student).age
(*new_student).sex
Поскольку указатели часто используются для указания на структуры, в языке Си специально для ссылок на компоненты таких структур введен оператор выбора стрелка вправо ->. Например, ссылки на вышеприведенные компоненты структуры можно записать с использованием оператора стрелки вправо -> как:
new_student->name
new_student->id
new_student->age
new_student->sex
Массив структур
Процесс описания массива структур совершенно аналогичен описанию любого другого типа массива:
struct book libry[MAXBKS];
Этот оператор объявляет libry массивом, состоящим из MAXBKS-элементов. Каждый элемент массива представляет собой структуру типа book. Таким образом, libry[0] является book-структурой, libry[1] - второй book-структурой и т.д.
Определение элементов массива структур. При определении элементов массива структур мы применяем те же самые правила, которые используются для отдельных структур: сопровождаем имя структуры операцией получения элемента и имени элемента:
libry[0].value value - первый элемент массива
libry[4].title title - пятый элемент массива
Переименование типов
Формат
typedef старый_тип новый_тип
Примеры:
typedef long large;
/* определяется тип large, эквивалентный типу long */
typedef char *string;
/* тип string, эквивалентен типу char* */
Переименование типов используется для введения осмысленных или сокращенных имен типов, что повышает понятность программ, и для улучшения переносимости программ (имена одного типа данных могут различаться на разных ЭВМ).
Пример:
/* Реализован алгоритм, который позволяет определить
строки матриц, состоящие из одинаковых целых,
расположенных в различных столбцах. Используются
двумерные массивы и структуры. Сначала выполняется
сортировка строк по возрастанию. Отсортированные
строки сравниваются и выводятся на экран номера
одинаковых строк */
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <conio.h>
#define n 4 /*количество строк */
#define m 4 /*количество столбцов*/
typedef struct mas{int i,i1;} mas;
int m1[n][m]; /*исходный массив*/
struct mas{int i,i1;};
mas a[n*2];
/*массив типа mas, где будут лежать одинаковые
строки, a[1].i и a[1].i1 - одинаковые строки*/
void main()
{
clrscr();
int i,j;
randomize();
for(i=0;i<n;i++)
for(j=0;j<m;j++)
m1[i][j]=random(2);
/*случайным образом в массив заносим целые*/
for(i=0;i<n;i++) {
printf("\n %d) ",i);
for(int j=0;j<m;j++)
printf(" %d",m1[i][j]);
}
int min, p;
/* индекс минимального элемента после s-го элемента
i-ой строки сортировка строк массива по возрастанию */
for(i=0;i<n;i++) { /* i-сортировка i-ой строки */
for(int s=0;s<m-1;s++) {
min=m1[i][s+1];
for(int j=s;j<m;j++)
if(m1[i][j]<=min) {
min=m1[i][j];p=j;
}
/* запоминаем минимальный элемент в ряду после
s-го элемента */
if(m1[i][s]>=min) {
m1[i][p]=m1[i][s];m1[i][s]=min;
}
/* меняем местами s-й и p-й элемент,если
s-й > p-го(минимального) */
}
}
printf("\n");
for(i=0;i<n;i++) {
printf("\n %d) ",i);
for(int j=0;j<m;j++)
printf(" %d",m1[i][j]);
/* выводим отсортированный массив */
}
int s,k=0;
/*сколько элементов в i-й строке совпадают с элементами i1 строки*/
/*сколько строк совпали*/
int i1;
for(i=0;i<n-1;i++) /* верхняя строка i */
for(i1=i+1;i1<n;i1++) { /* нижняя строка i1 */
s=0;
for(int j=0;j<m;j++)
/* сравнение идет по j-му столбцу */
if(m1[i][j]==m1[i1][j]) s++;
/* если соответствующие элементы в i-й и i1-й строки совпадают то кол-во совпавших увеличивается на 1 */
if(s==m) {a[k].i=i;a[k].i1=i1;k++;}
/* если все элементы i-й и i1-й строки совпали, то они одинаковые */
}
printf("\n Совпадающие строки :");
for(i=0;i<k;i++)
printf("\n %d и %d",a[i].i,a[i].i1);
/* распечатываем a[i].i-ю и a[i].i1-ю совпадающую
строку */
getch();
}