- •Основы алгоритмизации и программирования, язык Си
- •Введение
- •Блок-схема алгоритма Общие требования к блок-схеме алгоритма
- •Линейные и разветвляющиеся процессы
- •Циклические процессы
- •Итерационные процессы
- •Комментарии
- •Типы данных
- •Данные целого типа
- •Данные вещественного типа
- •Модификатор const
- •Переменные перечисляемого типа
- •Константы
- •Операции и выражения
- •Операция присваивания
- •Арифметические операции
- •Операции поразрядной арифметики
- •Логические операции
- •Операции отношения
- •Инкрементные и декрементные операции
- •Операция sizeof
- •Порядок выполнения операций
- •Приоритет операций
- •Преобразование типов
- •Операция приведения
- •Операция запятая
- •Ввод и вывод информации
- •Директивы препроцессора Директива #include
- •Директива #define
- •Понятие пустого и составного операторов
- •Условные операторы
- •Операторы организации цикла
- •Оператор цикла for
- •Оператор цикла while
- •Оператор цикла do … while
- •Вложенные циклы
- •Операторы перехода (break, continue, return, goto)
- •Примеры программ
- •Массивы Одномерные массивы
- •Примеры программ
- •Многомерные массивы (матрицы)
- •Примеры программ
- •Указатели Понятие указателя
- •Описание указателей
- •Операции с указателями
- •Связь между указателями и массивами
- •Массивы указателей
- •Многоуровневые указатели
- •Примеры программ
- •Символьные строки
- •Ввод/вывод строк.
- •Функции работы со строками.
- •Примеры программ
- •Функции
- •Прототип функции.
- •Определение функции.
- •Параметры функции
- •Параметры по умолчанию
- •Передача массива в функцию
- •Inline функции
- •Класс памяти
- •Автоматические переменные
- •Статические переменные
- •Регистровые переменные
- •Блочная структура
- •Примеры программ
- •Указатели на функции
- •Примеры программ
- •Рекурсия
- •Примеры программ
- •Аргументы в командной строке
- •Функции с переменным числом параметров
- •Примеры программ
- •Сортировка
- •Пузырьковая сортировка.
- •Шейкер сортировка
- •Сортировка вставкой
- •Сортировка выбором
- •Метод Шелла
- •Метод Хора
- •Структуры
- •Доступ к элементам структуры
- •Инициализация структур
- •Указатели на структуры.
- •Структуры и функции
- •Примеры программ
- •Поля бит
- •Объединения
- •Переменные с изменяемой структурой
- •Примеры программ
- •Организация списков и их обработка
- •Операции со списками при связном хранении
- •Построение обратной польской записи
- •Односвязный линейный список, очередь
- •Двусвязный линейный список
- •Циклический список, кольцо
- •Двусвязный циклический список
- •Примеры программ
- •Деревья
- •Потоки и файлы
- •Файлы Основные сведения о файловой системе
- •Организация посимвольного ввода и вывода
- •Определение конца файла feof()
- •Организация ввода и вывода строк
- •Удаление файлов
- •Дозапись потока
- •Позиционирование в файле
- •Текстовые и двоичные файлы
- •Функции fread() и fwrite()
- •Примеры программ
- •Хеширование
- •Схемы хеширования
- •Метод открытой адресации с линейным опробыванием
- •Метод цепочек
- •Машинное представление графов
- •Примеры программ
- •Литература
Примеры программ
Пример . Среди абитуриентов, сдавших вступительные экзамены в институт, определить количество абитуриентов, проживающих в городе Минске и сдавших экзамены со средним баллом не ниже 8, распечатать их фамилии в алфавитном порядке.
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#define n 3
int main()
{ struct str
{ char *gr; // город
char fm[15]; //фамилия
int oc[3];
} s[n];
int i,j,k=0;
char c;
clrscr();
printf("\nВведите информацию в массив структур");
for(i=0;i<n;i++) // цикл ввода структур в массив
{ printf("\n введите город :");
fflush(stdin);
s[i].gr=(char *)malloc(10); //отводим память для ввода города
gets(s[i].gr); //ввод города
if (!*s[i].gr) break; // выход по пустой строке
printf("\n введите фамилию :");
gets(s[i].fm); //ввод фамилии
printf("\n введите оценки (ф м л) :");
scanf("%d%d%d",s[i].oc,s[i].oc+1,s[i].oc+2);
}
i--; // последняя стр-ра s[i] - пустая или i==n
for(c='А';c<='Я';c++)
for(j=0;j<=i;j++)
if(!strcmp(s[j].gr,"Минск") && s[j].fm[0]==c)
if((s[j].oc[0]+s[j].oc[1]+s[j].oc[2])/3>=8)
{ printf("\n%s",s[j].fm);
k++; // подсчет числа абитуриентов удовл. условию задачи
}
printf("\n Итого абитуриентов = %d",k);
return 0;
}
Пример . вложенных структур
#include <stdio.h>
#define DL 30 // max число символов в строке char
struct name
{ char fm[DL]; // фамилия
char im; // имя
char ot; // отчество
};
struct inform
{ name nm; // переменная типа на структура name
char prof[DL]; // профессия
int god; // год рождения
float okl; // оклад
};
int main()
{ static inform mas[4]=
{ "Иванов",'И','И',"конструктор",1989,15000.50,
"Петров",'П','П',"оператор",1987,12350.50};
inform *him; // указатель на структуру inform
printf("адрес mas[0]: %u mas[1]: %u \n",&mas[0],&mas[1]);
him=mas; // him содержит адрес mas[0]
printf("адрес mas[0]: %u mas[1]: %u \n",him,him+1);
printf("him->okl = %.2f (*him).okl = %.2f \n",him->okl,(*him).okl);
him++; // him содержит адрес следующей стр-ры mas[1]
(++him)->okl++; // him->okl==12351.5
printf("him->okl = %.2f (*him).okl = %.2f \n",him->okl,(*him).okl);
him--;
printf("him->nm.fm = %.20s (*him).nm.fm = %.20s \n",
(him)->nm.fm,(*--him).nm.fm);
// в этом случае выполняется переход к mas[0]-----------┘
// затем вывод -------------------------------┘
return 0;
}
Пример . Нахождение площади прямоугольной фигуры по двум точкам с координатами (x1,y1) и (x2,y2).
#include <stdio.h>
#include <conio.h>
struct rect analiz(struct rect); // здесь наличие слова struct обязательно
void swap(int n,struct rect *);
struct point
{ int x; // структура point описывает координаты
int y; // (x и y) точки на плоскости
};
struct rect
{ point p1; // структура rect описывает координаты
point p2; // 2 угловых точек (прямоуг-ка, квадрата)
};
int main()
{ rect pt;
int s;
do
{ clrscr();
puts("введите координаты левого нижнего угла фигуры");
scanf("%d%d",&pt.p1.x,&pt.p1.y);
puts("введите координаты правого верхнего угла фигуры");
scanf("%d%d",&pt.p2.x,&pt.p2.y);
pt=analiz(pt); // анализ и коррекция координат угловых точек
} while(pt.p1.x>pt.p2.x && pt.p1.y>pt.p2.y);
s=(pt.p2.x-pt.p1.x)*(pt.p2.y-pt.p1.y); // вычисление площади фигуры
printf("площадь фигуры S= %d",s);
return 0;
getch();
}
rect analiz(rect ptt)
{ void (*f)(int,rect *)={swap}; // указатель на функцию swap
rect *ptr;
ptr=&ptt; // ptr содержит адрес стр-ры ptt
if (ptt.p1.x>ptt.p2.x) (*f)(1,ptr); // x1>x2 выполняем в (*f) x1<->x2
if (ptt.p1.y>ptt.p2.y) (*f)(2,ptr); // y1>y2 выполняем в (*f) y1<->y2
return ptt;
}
void swap(int n,rect *ptr) // замена одноименных координат 2 точек
{ int i; // из функции не требуется возврата т.к.
switch (n) // замена выполняется по адресу стр-ры ptt
{ case 1 : i=ptr->p1.x; ptr->p1.x=ptr->p2.x; ptr->p2.x=i; break;
case 2 : i=ptr->p1.y; ptr->p1.y=ptr->p2.y; ptr->p2.y=i; break;
}
}