- •Занятие 1.Выбор среды программирования. Первая программа!
- •Резюме урока:
- •Задание для практической работы .
- •Занятие 2.Стандартные типы данных. Переменные. Основы ввода и вывода данных.
- •Стандартные функции ввода/вывода данных языка Си.
- •Резюме урока:
- •Задание для практической работы.
- •Переменные и типы данных.
- •Проверь себя:
- •Проверь себя:
- •Как сохранить что-то в перменной?
- •Как объявить переменную?
- •Домашнее Задание
- •Занятие 3. Ввод и вывод данных. Справочники функций.
- •Символьный ввод и вывод данных.
- •Функция putchar.
- •Функции форматного ввода и вывода данных printf и scanf.
- •Спецификаторы формата:
- •Модификаторы формата
- •Управляющие последовательности
- •Резюме урока:
- •Задание для практической работы:
- •Занятие 4. Арифметические выражения и стандартные математические функции. Приоритет операций. Инкремент. Декремент.
- •Оператор присваивания. Арифметические выражения.
- •Операторы инкремента и декримента.
- •Сокращенный вид записи арифметических выражений.
- •Стандартная бибиотека математических функций math.H.
- •Приоритет операций.
- •Резюме урока:
- •Задание для практической работы
- •Занятие 5.Управляющая конструкция if-else. Логические операторы и выражения.
- •Операторы соотношений и логические выражения.
- •Управляющая конструкция if - else.
- •Логические операторы. Сложные условия.
- •Приоритет логических операций.
- •Задание для практической работы:
- •Занятие 6. Оператор множественного выбора switch.
- •Инструкция switch.
- •Резюме урока:
- •Задание для практической работы:
- •Занятие 7.Циклические конструкции. Цикл со счетчиком for.
- •Циклическая конструкция for. (Цикл for)
- •Первое выражение - инициализация счетчика.
- •Второе выражение - условие.
- •Третье выражение - изменение счетчика.
- •Занятие 8.Оформление кода программы на Си.Уроки программирования для чайников.Язык Си.
- •Имена и способы описания переменных.
- •Оформление логических блоков и запись лесенкой.
- •Оформление арифметических выражений и сложных условий.
- •Использование комментариев.
- •Резюме урока:
- •Занятие 9.Циклические конструкции. Циклы while и do-while.
- •Цикл while.
- •Цикл do-while.
- •Зацикливание.
- •Задание для практической работы.
- •Занятие 10. Функции определяемые пользователем.
- •Как задать функцию.
- •Заголовок функции.
- •Тело функции.
- •Резюме урока:
- •Задание для практической работы.
- •Занятие 11. Одномерные массивы.
- •Резюме урока:
- •Задание для практической работы:
- •Занятие 12. Простейшие алгоритмы для работы с одномерными массивами.
- •Поиск минимального элемента в массиве.
- •Сортировка массива.
- •Задание для практической работы.
- •Занятие 13. Азы работы с файлами и потоками. Случайные числа.
- •Занятие 14. Строки и символьные массивы в языке Си.
- •Объявление и инициализация строк.
- •Ввод и вывод строк.
- •Функция gets().
- •Функция fgets().
- •Функции puts(), fputs().
- •Задания для самостоятельной практической работы.
- •Урок 15. Некоторые стандартные функции работы со строками.
- •Функция strlen().
- •Функции сравнения строк.
- •Функции изменения регистра строки.
- •Функции объединения строк.
- •Занятие 16. Указатели.
- •Перевод числа из шестнадцатеричной системы счисления в десятичную.
- •Перевод числа из десятичной в шестнадцатеричную систему счисления.
- •Переменные и их адреса.
- •Указатели.
- •Объявление указателя.
- •Присвоение указателю адреса.
- •Получение значения переменной.
- •Урок 17. Создание динамического массива. Указатели и практическое применение.
- •Занятие 18. Передача одномерных массивов в функцию. Возвращение массива из функции.
- •Первый случай. Передача в функцию статического массива.
- •Второй случай. Передача в функцию динамического массива.
- •Задание для практической работы:
- •Занятие 18. Передача одномерных массивов в функцию. Возвращение массива из функции.
- •Первый случай. Передача в функцию статического массива.
- •Второй случай. Передача в функцию динамического массива.
- •Занятие 19. Двумерные массивы.
- •Что такое двумерный массив?
- •Как работать с двумерным массивом?
- •Как работать с отдельным элементом массива.
- •Задание для практической работы:
- •Зачем нужны двумерные массивы?
- •Практическое задание.
- •Занятие №20. Некоторые особенности цикла for. Оператор последовательного вычисления.
- •I присвоить 0;
- •Занятие 21. Заголовочные файлы.
- •Как создать заголовочный файл.
- •Как поделиться своей программой с друзьями.
- •Практическое задание.
- •Дополнительные материалы к уроку.
- •Занятие 22. Препроцессор. Директивы препроцессора.
- •Чем занимается препроцессор?
- •Как работает препроцессор?
- •Как посмотреть код программы, после обработки препроцессором.
- •Урок 23. Структуры в языке Си.
- •Int book_date[100]; // дата издания
- •Int book_pages[100]; // количество страниц
- •Что такое структура.
- •Int date; // дата издания
- •Int pages; // количество страниц
- •Как объявить структурную переменную (структуру).
- •Как инициализировать структуру.
- •Как обращаться к полям структуры.
- •Практическое задание:
- •Автор||Название||Год издания||Прочитано||Количество страниц||Стоимость
Урок 17. Создание динамического массива. Указатели и практическое применение.
Добрый день друзья. Сегодня у нас особый урок. Во-первых, он будет более практичный и небольшой по объему, во-вторых, он посвящен ответам на вопросы, которые мне задали в нашей группе вконтакте, и в-третьих, он будет уже использовать некоторые возможности С++. Это осознанный шаг, и я думаю, во многом, он облегчит жизнь и вам и мне. Приступим.
Начну с последнего вопроса. Как создать динамический массив. Допустим, мы пишем программу, которая вычисляет среднее значение введенных чисел. Но мы же не знаем, сколько чисел собирается ввести пользователь. Естественно мы могли бы организовать цикл и просто сохранять все веденные числа в одну переменную, а потом лишь поделить на количество введенных элементов. Но что делать, если мы хотим все эти введенные числа использовать в дальнейшем. Или хотим посчитать среднее лишь по некоторым из этих чисел. Тут-то нам на помощь и придут динамические массивы. Т.е. массивы, длину которых задает не в коде программы. На самом деле это достаточно просто.
Примерно, это выглядело бы так:
Листинг 17.1
#include <stdio.h>
int main(){
int N;
printf("Vvedite kolichestvo dannih\N");
scanf("%d",&N);
int arr[N];
…
return 0;
}
Но если мы сделаем так, то наша программа не скомпилируется даже. Получим ошибку, что при объявлении массива, нужно константное выражение. Естественно, мы могли бы создать массив на 100 элементов и не париться об этом, но мы пойдем другим путём, более оптимальным.
Как я уже писал в прошлом уроке, память можно представить себе в виде последовательных ячеек с адресами. Так вот, наша программа, может работать с этой памятью почти напрямую. Т.е. мы можем выделить себе в свободной памяти некоторый кусочек и в нем работать.
Это называется выделение памяти «в куче». Для того, чтобы выделить себе некоторую область в памяти, необходимо использовать командуnew(). Смотрите, как это работает.
Листинг 17.2
#include <stdio.h>
int main(){
int *num = new (int);
*num=4;
printf("%d \n",*num);
return 0;
}
Результат работы это программы, представлен на следующем рисунке.
|
Рис.1 Выделение памяти под переменную типа int. |
Команда new() выделяет необходимое количество памяти, под тип объекта, который указан в скобках. Ну т.е. в нашем случае, мы попросили выделить для нас память под одну переменную типа int. Данная команда возвращает указатель на выделенный фрагмент памяти. Поэтому мы в принципе и сохраняем её в соответствующую переменную.
С одним числом разобрались, но мы же хотели целый массив таких чисел. Да без проблем, просто укажем, что это должен быть массив из нужного нам количества переменных.
Листинг 17.3
#include <stdio.h>
int main(){
int N;
printf("Vvedite kolichestvo dannih\n");
scanf("%d",&N);
int *arr = new (int [N]);
return 0;
}
Вот в таком виде наша программа уже скомпилируется и будет делать именно то, что нам нужно. Пользователь введет 20 и она создаст массив из 20 элементов типа int. Введет пять - будет массив из пяти элементов. Удобно, не правда ли? Не надо расходовать лишнюю память, создавая массив из 100 элементов из которых только пять первых будут использоваться.
А самое классно знаете что? То, что работать с этим массивом можно прямо точно так же как если бы мы создали его самостоятельно. Ну т.е. нам не потребуется добавлять звездочки и т.д. Вот, например, в следующей программе мы присваиваем вновь созданному динамическому массиву из двух элементов некоторые значения.
Листинг 17.4
#include <stdio.h>
int main(){
int N;
printf("Vvedite kolichestvo dannih\n");
scanf("%d",&N);
int *arr = new (int [N]);
arr[0]=1;
scanf("%d", &arr[1]);
printf("%d %d\n", arr[0],arr[1]);
return 0;
}
|
Рис. 2. Иллюстрация работы программы использующей динамический массив |
Как видите, все как и прежде. Это действительно удобно. Теперь немножко отвлечемся. Команда new() это команда языка С++, в чистом Си её нет. Там есть некоторый её аналог команда malloc. Но она менее удобная, чем new. Поэтому пользуйтесь.
Я думаю, всех учили убирать за собой, когда навели беспорядок. В этом плане память, как мама. Не любит, когда не убрано. Поэтому есть и еще одна команда, которая позволяет убрать за собой. Ну т.е. освободить память, которую мы заняли. Она называется delete(). Логично, да?
Передаете ей в качестве аргумента, то что вы выделили и она самостоятельно наведет уборку. Это нужно делать всегда, когда вы выделяли память. Конечно, если вы не сделаете так, ничего особенно страшного не случится. Но представьте ситуацию, что каждая программа, которую вы запускаете, сохраняет в оперативной памяти вашего компьютера какие-то данные и потом не удаляет их. Не порядок, не так ли? Или пришел к вам гость, сходил в туалет и не смыл за собой. Ну вот и вы не сорите за собой. Я вот, кстати намусорил сейчас в вашем компьютере немного, если вы уже запускали программы из примеров. =))
Покажу на примере первой программы, как это делается.
Листинг 17.5
#include <stdio.h>
int main(){
int *num = new (int);
*num=4;
printf("%d \n",*num);
delete num;
return 0;
}
Если высвобождаете память, в которой хранился массив, то необходимо указать это.
Листинг 17.6
delete []arr;
С первым вопросом разобрались и на этом закончим сегодняшний мини-урок.
