- •Основы алгоритмизации и программирования, язык Си
- •Введение
- •Блок-схема алгоритма Общие требования к блок-схеме алгоритма
- •Линейные и разветвляющиеся процессы
- •Циклические процессы
- •Итерационные процессы
- •Комментарии
- •Типы данных
- •Данные целого типа
- •Данные вещественного типа
- •Модификатор const
- •Переменные перечисляемого типа
- •Константы
- •Описание переменных
- •Локальные переменные
- •Операции и выражения
- •Операция присваивания
- •Арифметические операции
- •Операции поразрядной арифметики
- •Логические операции
- •Операции отношения
- •Инкрементные и декрементные операции
- •Операция sizeof
- •Порядок выполнения операций
- •Приоритет операций
- •Преобразование типов
- •Операция приведения
- •Операция запятая
- •Ввод и вывод информации
- •Директивы препроцессора Директива #include
- •Директива #define
- •Понятие пустого и составного операторов
- •Условные операторы
- •Операторы организации цикла
- •Оператор цикла for
- •Оператор цикла while
- •Оператор цикла do … while
- •Вложенные циклы
- •Операторы перехода (break, continue, return, goto)
- •Примеры программ
- •Массивы Одномерные массивы
- •Примеры программ
- •Многомерные массивы (матрицы)
- •Примеры программ
- •Указатели Понятие указателя
- •Описание указателей
- •Операции с указателями
- •Связь между указателями и массивами
- •Массивы указателей
- •Многоуровневые указатели
- •Примеры программ
- •Символьные строки
- •Ввод/вывод строк.
- •Функции работы со строками.
- •Примеры программ
- •Функции
- •Прототип функции.
- •Определение функции.
- •Параметры функции
- •Параметры по умолчанию
- •Передача массива в функцию
- •Inline функции
- •Класс памяти
- •Автоматические переменные
- •Статические переменные
- •Регистровые переменные
- •Блочная структура
- •Примеры программ
- •Указатели на функции
- •Примеры программ
- •Рекурсия
- •Примеры программ
- •Аргументы в командной строке
- •Функции с переменным числом параметров
- •Примеры программ
- •Сортировка
- •Пузырьковая сортировка.
- •Шейкер сортировка
- •Сортировка вставкой
- •Сортировка выбором
- •Метод Шелла
- •Метод Хора
- •Структуры
- •Доступ к элементам структуры
- •Инициализация структур
- •Указатели на структуры.
- •Структуры и функции
- •Примеры программ
- •Поля бит
- •Объединения
- •Переменные с изменяемой структурой
- •Примеры программ
- •Организация списков и их обработка
- •Операции со списками при связном хранении
- •Построение обратной польской записи
- •Односвязный линейный список, очередь
- •Двусвязный линейный список
- •Циклический список, кольцо
- •Двусвязный циклический список
- •Примеры программ
- •Деревья
- •Потоки и файлы
- •Файлы Основные сведения о файловой системе
- •Организация посимвольного ввода и вывода
- •Определение конца файла feof()
- •Организация ввода и вывода строк
- •Удаление файлов
- •Дозапись потока
- •Позиционирование в файле
- •Текстовые и двоичные файлы
- •Функции fread() и fwrite()
- •Примеры программ
- •Хеширование
- •Схемы хеширования
- •Метод открытой адресации с линейным опробыванием
- •Метод цепочек
- •Машинное представление графов
- •Примеры программ
- •Литература
Примеры программ
Пример . Реализация функций с произвольным числом параметров
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
void fun1(int,...); // прототип ф-ции имеющей 1 постоянный параметр
void fun2(int,...); // прототип ф-ции имеющей 1 постоянный параметр
void fun3(...); // прототип ф-ции не имеющей постоянных параметров
void main(void)
{ int a1,a2,a3;
float f1,f2;
clrscr();
puts("введите 3 значения типа int и 2 типа float");
scanf("%d%d%d",&a1,&a2,&a3);
scanf("%f%f",&f1,&f2);
fflush(stdin);
fun1(3,a1,a2,a3);
fun2(2,f1,f2);
fun1(2,'1','2');
fun3(a1,a3,a1,0);
getch(); // задержка
}
void fun1(int k,...)
{ int s=0;
void *p;
p=&k; // p указатель на элемент стека k
((int *)p)++; // указатель на следующий элемент стека
while(k--) s+=*((int *)p)++; // считывание k чисел int из стека
printf("\n 1 сумма элементов = %d",s);
}
void fun2(int k,...)
{ float s=0;
void *p;
p=(...); // указатель на первый элемент перем. списка парам.
while(k--) s+=*((double *)p)++; // считывание k чисел float из стека
printf("\n 2 сумма элементов = %5.2f",s);
}
void fun3(...)
{ int s=0,k;
void *p;
p=(...); // указатель на первый элемент перем. списка парам.
while(k=*((int *)p)++) s+=k;
printf("\n 3 сумма элементов = %d",s);
}
Пример . Реализация функции с произвольным числом параметров одного типа. Доступ к данным (параметрам) реализован с помощью безтиповых указателей (void *p). При чтении данных из стека данные приводятся к требуемому типу.
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
int * fun(...); // прототип ф-ции не имеющей постоянных параметров
void main(void)
{ int *ms; // для возврата из fun адресов полученных сумм
clrscr();
ms=fun(1,7,2,7,8,6,8,4,0);
for(;*ms;) // вывод пока *ms!=0
printf("%6d",*ms++);
getch(); // задержка
}
// функция выделения k MAX элементов из списка параметров
// найденные элементы возвратить в main
int * fun(...)
{ int i,j,k,n=0,*ii,**jj;
void *p;
printf("\n сколько MAX переменных надо выделить из списка = ");
scanf("%d",&k); // ввести ограничение на k (не более чем параметров)
ii=(int *)calloc(k+1,sizeof(int)); // k max значений из списка (k+1 эл-т
// всегда ==0 - признак конца для main)
jj=(int **)calloc(k,sizeof(int *)); // адреса k max значений в стеке
while(n<=k-1) // пока не найдено k max элементов
{ p=(...); // элипсис, p устанавливается на начало списка
// параметров переменной длинны
do
{ i=0;
while(i<n && jj[i]) // поиск первого еще не занесенного
if (jj[i++]==(int *)p) // адрес уже есть
{ ((int *)p)++; // выбор следующего элемента из стека
break;
}
} while(jj[i]);
ii[n]=*(int *)p; // предварительное max значение для сравнения
jj[n]=((int *)p)++; // его адрес в стеке
while(j=*((int *)p)) // пока считанный j!= 0 (признак конца списка)
{ for(i=0;i<n && jj[i]!=(int *)p && jj[i++];); // поиск адреса эл-та в jj
if (j>ii[n] && jj[i]!=(int *)p) // эл-т max и его адрес не найден
{ ii[n]=*((int *)p); // новое max значение для сравнения
jj[n]=((int *)p); // его адрес в стеке
}
((int *)p)++; // указатель на следующий элемент стека
}
n++;
}
free(jj);
return ii;
}