
- •1. Основные операции языка Си.
- •3. Язык Си: указатели и массивы. Определения, примеры.
- •4. Язык Си: объявления функций, передача аргументов. Примеры.
- •5. Язык Си: строки и указатели. Определения, примеры.
- •8. Язык Си: структуры. Пример.
- •9 . Язык Си: битовые поля и объединения. Примеры.
- •10. Язык Си: оператор определения типа. Примеры.
- •11.Язык Си: препроцессор. Директивы препроцессора, примеры
- •12.Язык Си: программный стек. Пример работы стека.
- •13. Линейные списки. Операции с линейными списками.
- •14 Hash-таблицы
- •15 Двоичные деревья
- •17. Язык Си: ссылочные типы. Пример.
- •18. Язык Си: защита указателей и объектов, неявное изменение объектов.
- •19. Язык Си: организация ввода/вывода. Пример: слияние файлов. Организация ввода/вывода
- •Открытие файла
- •Закрытие файла
- •Ввод из файла
- •Вывод в файл
- •Особые ситуации
- •Пример: слияние файлов
- •20. Язык Си: произвольный доступ к файлам. Пример.
- •22. Язык Си: примеры реализаций функций ввода/вывода (getc,putc).
- •23. Язык Си: примеры реализаций функций ввода/вывода (fgets, fputs).
- •24. Язык Си: работа с файловой системой. Пример.
- •25. Основные понятия ооп: абстракция, инкапсуляция, наследование, полиморфизм.
- •27. Объекты классов: статические,автоматические, динамические. Примеры.
- •28. Управление доступом к элементам классов. Пример.
- •29. Шаблоны функций и шаблоны классов. Примеры.
- •30. Наследование. Пример.
- •31. Множественное наследование. Пример.
- •П оскольку классы-потомки наследуют все данные и методы классов-предков, в итоге имеем следующую картину:
- •32. Виртуальные функции. Раннее и позднее связывание.
- •33. Абстрактные классы. Их назначение, пример.
- •34. Полиморфный контейнер (пример).
- •36. Конструкторы, их виды, примеры. Вызов конструкторов при наследовании.
- •37. Деструкторы. Их назначение, примеры.
- •39. Перегруженные операции. Примеры.
- •40. Обработка нештатных ситуаций. Объекты-исключения. Примеры.
- •Вопрос 1: какова дальнейшая судьба этих ресурсов, будут ли они освобождены?
- •Вопрос 2: как распознавать подобные ситуации и корректно их обрабатывать?
- •41. Модели жизненного цикла программного обеспечения. Модели жизненного цикла по
- •Спиральная модель жизненного цикла по.
- •42. Проектирование программного обеспечения и uml.
- •Uml (основные понятия)
- •Канонические диаграммы языка uml 2.X
- •43. Диаграммы прецедентов. Нотация, семантика, примеры.
- •Основные обозначения на диаграммах прецедентов:
- •44. Сценарии выполнения прецедентов (пример).
- •45. Диаграммы классов. Нотация, семантика, отношения.
- •46. Атрибуты на диаграммах классов. Нотация и семантика. Примеры.
- •47. Операции на диаграммах классов. Нотация и семантика. Примеры.
- •48. Отношения ассоциации на диаграммах классов.
- •Отношения ассоциации
- •Предприятие
- •Сотрудник
- •Отношения обобщения
- •Отношения композиции
- •53. Язык c#: сборки, манифесты, домены, компоненты.
- •55. Java как язык ооп для машинно-независимых приложений.
- •56. Обзор Java-технологий NetBeans ide.
- •57. Компонентные технологии разработки программного обеспечения.
- •59.Обёртки в языках c# и Java.
- •60. Архитектурный паттерн mvc. Область применения, схема взаимодействия.
22. Язык Си: примеры реализаций функций ввода/вывода (getc,putc).
Реализация getc, getchar, putc, putchar в форме макросов:
#dedine getc ( stream ) \
( --(stream) ->_cnt >= 0 ) ? 0xff & *(stream) ->_ptr++ : _filbuf ( stream )
#define getchar () getc ( stdin )
#define putc ( c, stream ) \
( --(stream) -> _cnt >= 0) ? 0xff & *(stream) ->_ptr++ = (char) c : _flsbuf ( (с), (stream) )
#define putchar ( с ) putc ( ( с ), stdout )
Более подробно эти макросы можно посмотреть в заголовочном файле <stdio.h>.
Если код генерируется для dll или как реентерабельный, тогда применяется реализация getc и putc через вызов функций, и потоки блокируются на время выполнения операций ввода/вывода.
23. Язык Си: примеры реализаций функций ввода/вывода (fgets, fputs).
Реализации функций fgets и fputs:
|байт-1| |байт-2| |байт-3| ...... |’\n’| |.....|
char* fgets ( char *s, int n, FILE *stream ) {
register int c;
register char *cs = s //обзаведемся быстрым указателем
while ( --n > 0 && ( c = getc ( stream ) ) != EOF ) //читаем из потока
if ( ( *cs++ = c ) == ’\n’ ) break; //пишем в буфер
*--cs = ‘\0’; //оформляем признак конца строки
return ( c == EOF && cs == s ) ? NULL : s; //всё прочитано успешно?
}
int fputs ( char *s, FILE *stream ) {
register int c;
while ( c = *s++ ) //берем символы из строки
if ( putc ( c, stream )==EOF ) return EOF; //выводим их в поток
putc ( ‘\n’, stream ); //оформляем признак перевода строки
return 0;
}
24. Язык Си: работа с файловой системой. Пример.
Работа с файловой системой
Прототипы функций описаны в заголовочных файлах <io.h> и <direct.h>.
Получить имя текущей папки (директории) можно так:
char* _getcwd ( char *buf, int maxlen );
Полный путь для текущей рабочей директории будет записан в buf. Если вместо buf был указан NULL, функция самостоятельно получит буфер длиной maxlen символов.
Возвращает указатель на буфер с именем текущей рабочей директории или NULL, если произошла ошибка в/в.
изменить текущую папку (директорию):
int _chdir ( char *pathname);
Возвращает 0 в случае успеха или -1 при возникновении ошибки в/в.
создать папку (директорию):
int _mkdir ( char *pathname);
Возвращает 0 в случае успеха или -1 при возникновении ошибки в/в.
удалить папку (директорию):
int _rmdir ( char *pathname);
Возвращает 0 в случае успеха или -1 при возникновении ошибки в/в.
Для выборки файлов из текущей рабочей папки (директории)
применяется следующая структура (уточнять её для конкретных IDE):
struct_finddata_t{
unsignded; // атрибуты выбираемых файлов
long time_create; // дата и время создания файла
long time_access; // дата и время последнего доступа к файлу
long time_write; // дата и время последней записи в файл
unsigned long size; // длина файла в байтах
char name[260]; // полный путь к файлу, включая его имя
};
Значения поля attrib могут быть комбинацией следующих констант:
_А_Normal // обычный файл
_А_RDONLY // файл, доступный только для чтения
_А_HIDDEN // скрытый файл
_А_SYSTEM // системный файл
_А_SUBDIR // подпапка (поддиректория)
_А_АRCH // архивный файл
выборка первого файла из текущей рабочей папки:
long_findfirst ( char *filespec,struct_finddata_t *fileinfo );
В аргументе filespec (спецификация имени файла) задается шаблон имени
выбираемого файла, в шаблоне имени могут использоваться метасимволы '*' и '?'.
Возвращает ненулевой дескриптор поиска (handle) в случае успеха (т.е. был найден
файл, который удовлетворяет атрибутам attrib, заданным в _finddata_t ) или -1 при
возникновении ошибки в/в.
выборка следующего (очередного) файла из текущей рабочей папки:
int_findnext ( long handle, struct_finddata_t *fileinfo );
В аргументе handle задается ненулевой дескриптор поиска, который ранее был получен
как результат работы функции _findfirst,
Возвращает 0 в случае успеха (т.е. был найден очередной файл, который удовлетворяет
атрибутам attrib, заданным в _finddata_t ) или -1 при возникновении ошибки в/в.
Пример вывода списка файлов текущей папки (шаблон "*.*"):
#include <io.h>
#include <stdio.h>
void main(void) {
struct _finddata_32_t finddata; // структура для выборки файлов
long handle; int flag= 0;
finddata.attrib=_A_NORMAL; // выбираем только обычные файлы
handle= _findfirst("*.*",&finddata); // поищем первый файл
if (handle) // если файлы есть, выведем
while (!flag) { // их имена и размеры
printf("%s %lu\n",finddata.name ,finddata.size );
flag = _findnext(handle, &finddata ); // ищем следующий файл
}
else printf("%s\n","Файлов не найдено" ); // нужных файлов не найдено
}
Перед практическим использованием данного примера уточните имена структур и
функций (finddata,findfirst,findnext) для конкретного релиза Visual Studio.