
- •Приложение г Лекция 1. Элементы Языка си Используемые символы
- •Константы
- •Идентификаторы
- •Ключевые слова
- •Использование комментариев в тексте программы
- •Лекция 2. Типы данных и их объявление
- •Категории типов данных
- •Целый тип данных
- •Данные вещественного типа
- •Указатели
- •Операции разадресации и адреса
- •Переменные перечислимого типа
- •Лекция 3. Выражения и присваивания Операнды и операции
- •Преобразования при вычислении выражений
- •Операции отрицания и дополнения
- •Операция sizeof
- •Мультипликативные операции
- •Аддитивные операции
- •Операции сдвига
- •Поразрядные операции
- •Логические операции
- •Операция последовательного вычисления
- •Условная (тернарная) операция
- •Операции увеличения и уменьшения
- •Простое присваивание
- •Составное присваивание
- •Приоритеты операций и порядок вычислений
- •Побочные эффекты
- •Преобразование типов
- •Лекция 3. Операторы
- •Оператор выражение
- •Пустой оператор
- •Составной оператор
- •Оператор if
- •Оператор switch
- •Оператор break
- •Оператор while
- •Оператор do while
- •Оператор for
- •Сумма чисел от 1 до 100
- •Микрожизнь
- •Оператор continue
- •Оператор return
- •Оператор goto
- •Лекция 4. Массивы
- •Поиск минимума, сортировка
- •Ввод-вывод, обнуление
- •Двумерный массив
- •Лекция 5. Структуры
- •Объединения (смеси)
- •Поля битов
- •Переменные с изменяемой структурой
- •Определение объектов и типов
- •Лекция 6. Инициализация данных
- •Определение и вызов функций
- •Ссылки как псевдонимы переменных
- •Ссылки в качестве параметров функции
- •Ссылка в качестве возвращаемого значения
- •Передача массивов
- •Прототип
- •Указатели на функцию
- •Рекурсия
- •Предварительная инициализация параметров функции
- •Функции с переменным числом параметров
- •Передача параметров функции main
- •Исходные файлы и объявление переменных
- •Объявления функций
- •Время жизни и область видимости программных объектов
- •Лекция 7. Инициализация глобальных и локальных переменных
- •Методы доступа к элементам массивов
- •Указатели на многомерные массивы
- •Операции с указателями
- •Массивы указателей
- •Лекция 8. Динамические объекты
- •1. Выделение памяти в соответствие с типом указателя
- •2. Выделение памяти под нетипизированный указатель
- •Лекция 9. Динамическое создание и уничтожение массивов
- •Директивы Препроцессора
- •Директива #include
- •Директива #define
- •Директива #undef
- •Лекция 10. Условные директивы препроцессора
- •Линейный односвязный список
- •Лекция 11. Объектно-ориентированный подход к программированию
- •Ссылки на Себя
- •Инициализация
- •Копирующий конструктор
- •Очистка
- •Законченный Класс
- •Доступ к членам
- •Статические Члены
- •Лекция 12. Наследование
- •Перегрузка Операций
- •Операции Преобразования
- •Стандартный ввод/вывод
- •Форматируемый вывод
- •Манипуляторы
- •Ввод-вывод двоичных данных
- •Ввод/вывод с диска
- •Ввод/вывод для типов данных, определенных пользователем
- •Шаблоны функций
- •Шаблоны классов
- •Лекция 14. Библиотека stl
- •Итераторы
- •Алгоритмы
- •Контейнеры
- •Функциональные объекты
- •Пример. Работа с контейнером vector
- •Пример 2. Алгоритмы и функциональные объекты
- •Лекция 15. Обработка исключительных ситуаций
- •Лекция 16. Rtti и приведение типов
- •Операция typeid
Поиск минимума, сортировка
#include <stdio.h>
int main(int argc, char* argv[])
{
const n=5;
int a[n]={3,5,2,8,1};
//Search Min as Value
int MinValue=a[0];
for (int i=1; i<n; i++)
if (a[i]<MinValue) MinValue=a[i];
printf("Min=%d\n", MinValue);
//Search Min as Index
char MinIndex=0;
for (int i=1; i<n; i++)
if (a[i]<a[MinIndex]) MinIndex=i;
printf("Min=%d\n", a[MinIndex]);
//Sorts
int tmp;
for (int i=0; i<n-1; i++)
for (int j=i+1; j<n; j++)
if (a[i]>a[j])
{
tmp=a[i]; a[i]=a[j]; a[j]=tmp;
}
for (int i=0; i<n; i++)
printf("%4d", a[i]);
getchar();
return 0;
}
Ввод-вывод, обнуление
#include <stdio.h>
#include <mem.h>
int main(int argc, char* argv[])
{
//One-dimensional array
int a[3];
//Input
for(int i=0;i<3;i++)
{
printf("Input a[%d] ", i);
scanf("%d", &a[i]);
}
//Output at line
for(int i=0;i<3;i++)
printf("%d ", a[i]);
printf("\n");
//Output at line
for(int i=0;i<3;i++)
printf("%d\n", a[i]);
//Two-dimensional array
int b[2][2];
//Input
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
{
printf("Input b[%d][%d] ", i, j);
scanf("%d", &b[i][j]);
}
//Output as matrix
for(int i=0;i<2;i++)
{
for(int j=0;j<2;j++)
printf("%4d", b[i][j]);
printf("\n");
}
//Zeroing
memset(b, 0, sizeof(b));
getchar();getchar();
return 0;
}
Двумерный массив
#include <stdio.h>
/* Олимпиада по информатике проводится в m туров.
Вывести победителей каждого тура и победителей в общем зачете.
Максимальное число баллов в туре - 50 */
int main(int argc, char* argv[])
{
const n=3; //число участников
const m=2; //число туров
unsigned char rez[n][m+1]; //последний столбец на сумму
unsigned char max[m+1]; //лучшие результаты
char name[n][20]; //фамилии
int i, j;
//Ввод данных
for (i=0; i<n; i++)
{
printf("Input a surname of %d-st participant ", i+1);
scanf("%s", name[i]);
for (j=0; j<m; j++)
{
printf("Input its result in %d-st round ", j+1);
scanf("%d", &rez[i][j]);
}
}
//Подсчет суммарного результата
for (i=0; i<n; i++)
{
rez[i][m]=0;
for (j=0; j<m; j++)
rez[i][m]+=rez[i][j];
}
//Поиск максимальных результатов
for (j=0; j<m+1; j++)
{
max[j]=rez[0][j];
for (i=1; i<n; i++)
if (rez[i][j]>max[j]) max[j]=rez[i][j];
}
//Вывод победителей в турах
int t;
for (j=0; j<m; j++)
{
printf("Winners in %d-st round with result %d\n", j+1, max[j]);
t=0;
for (i=0; i<n; i++)
if (rez[i][j]==max[j])
{
t++;
printf("%d. %-s\n", t, name[i]);
}
}
//Вывод победителя в общем зачете
printf("Winners in the general offset with result %d\n", max[m]);
t=0;
for (i=0; i<n; i++)
if (rez[i][m]==max[m])
{
t++;
printf("%d. %-s\n", t, name[i]);
}
getchar();getchar();
return 0;
}
Лекция 5. Структуры
Cтруктуры — это составной объект, в который входят элементы любых типов, за исключением функций. В отличие от массива, который является однородным объектом, структура может быть неоднородной. Тип структуры определяется записью вида:
struct { список определений }
В структуре обязательно должен быть указан хотя бы один компонент. Определение структур имеет следующий вид:
тип-данных идентификаторы;
где тип-данных указывает тип структуры для объектов, определяемых в описателях. В простейшей форме описатели представляют собой идентификаторы или массивы.
Пример:
struct { double x,y; } s1, s2, sm[9];
struct { int year;
char month, day; } date1, date2;
Переменные s1, s2 определяются как структуры, каждая из которых состоит из двух компонент х и у. Переменная sm определяется как массив из девяти структур. Каждая из двух переменных date1, date2 состоит из трех компонентов year, moth, day. >p>Существует и другой способ ассоциирования имени с типом структуры, он основан на использовании тега структуры. Тег структуры аналогичен тегу перечислимого типа. Тег структуры определяется следующим образом:
struct тег { список описаний; };
где тег является идентификатором.
В приведенном ниже примере идентификатор student описывается как тег структуры:
struct student { char name[25];
int id, age;
char prp; };
или
student { char name[25];
int id, age;
char prp; };
Тег структуры используется для последующего объявления структур данного вида в форме:
struct тег список-идентификаторов;
Пример:
struct studeut st1,st2;
Использование тегов структуры необходимо для описания рекурсивных структур. Ниже рассматривается использование рекурсивных тегов структуры.
struct node { int data;
struct node * next; } st1_node;
Тег структуры node действительно является рекурсивным, так как он используется в своем собственном описании, т.е. в формализации указателя next. Структуры не могут быть прямо рекурсивными, т.е. структура node не может содержать компоненту, являющуюся структурой node, но любая структура может иметь компоненту, являющуюся указателем на свой тип, как и сделано в приведенном примере.
Доступ к компонентам структуры осуществляется с помощью указания имени структуры и следующего через точку имени выделенного компонента, например:
st1.name="Иванов";
st2.id=st1.id;
st1_node.data=st1.age;
Пример: Распределение стипендии
#include <stdio.h>
int main(int argc, char* argv[])
{
const N=3; //Count students
struct stud
{
char name[15];
char group[10];
unsigned char CountEx; //Count examins
unsigned char ball[4];
float grant;
};
/*struct*/ stud s[N];
int i, j;
unsigned char ce;
printf("Enter quantity of examinations into sessions ");
scanf("%d", &ce);
for (i=0; i<N; i++)
{
printf("Enter a name of of %d-st student ", i+1);
scanf("%s", s[i].name);
printf("Enter its group ");
scanf("%s", s[i].group);
s[i].CountEx=ce;
for (j=0; j<ce; j++)
{
printf("Enter its ball for %d-st examination ", j+1);
scanf("%d", &s[i].ball[j]);
}
}
float BaseGrant;
printf("Enter base grant ");
scanf("%f", &BaseGrant);
for (i=0; i<N; i++)
{
int isThree=0, sum=0;
for (j=0; j<s[i].CountEx; j++)
{
if (s[i].ball[j]<4)
{
isThree=1;
break;
}
sum+=s[i].ball[j];
}
if (isThree) s[i].grant=0;
else if (sum/s[i].CountEx==5) s[i].grant=BaseGrant*1.25;
else s[i].grant=BaseGrant;
printf("%2d. %-16s%7.2f\n", i+1, s[i].name, s[i].grant);
}
getchar();getchar();
return 0;
}