- •Занятие 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; // количество страниц
- •Как объявить структурную переменную (структуру).
- •Как инициализировать структуру.
- •Как обращаться к полям структуры.
- •Практическое задание:
- •Автор||Название||Год издания||Прочитано||Количество страниц||Стоимость
Ввод и вывод строк.
Теперь рассмотрим, как можно ввести строку символов с клавиатуры.
Возникает естественное желание воспользоваться стандартной функцией scanf(). Попробуем.
Листинг 14.6
#include <stdio.h>
int main(){
char str[17];
scanf("%s", str);
printf("%s\n",str);
return(0);
}
Выполним эту программу. Введем, уже привычное нам, Hello world.
Результат работы программы на следующем рисунке.
|
Рис.5 Ввод строки с использованием функции scanf(). |
Как видите, в строку сохранилось лишь первое слово. Все дело в реализации функции scanf. Она считает пробел разделителем. Получается, таким способом мы можем считать лишь строку, которая не содержит пробелов, т.е. мы можем считать одно слово.
Кстати, вы обратили внимание, что я не поставил перед именем массива знак &, чтобы получить его адрес? Это не ошибка. Просто имя массива, без указания номера элемента в квадратных скобках, ссылается на адрес первого элемента массива. Т.е. нам тут не нужно получать адрес, он и так у нас есть. Это касается не только символьных массивов, а любых. Но пока это не особо важно. С этим мы столкнемся, когда будем изучать указатели.
Вернемся к нашим баранам, как говорится. Мы хотели считать строку. Раз scanf() надежд возложенных на неё не оправдала, должна быть какая-то другая функция. И она, конечно же, есть.
Функция gets().
Мы снова не будем углубляться в развернутый синтаксис, кому интересно, тот может подробно посмотреть в любом справочнике.
Функция gets принимает в качестве своего аргумента массив символов, в который она и записывает считываемую из стандартного потока ввода строку. Концом ввода строки является символ перенос строки ‘\n’, т.е. когда мы нажмем Enter на клавиатуре. Этот символ последним считывается и при записи в массив заменяется символом конца строки ’\0’.
Следующая программа читает введенную строку и выводит её на экран.
Листинг 14.7
#include <stdio.h>
int main(){
char str[17];
gets(str);
printf("%s\n",str);
return(0);
}
Результат работы программы, на следующем рисунке.
|
Рис. 6. Ввод строки с использованием функции gets() |
Как видите, мы избавились от нашей проблемы. Но есть более важная проблема. Когда мы предоставляем пользователю вводить строку, мы не знаем, сколько он символов введет. Может так случиться, что мы объявили массив на 10 элементов, а пользователь ввел 30. Тогда возникнет ошибка – переполнение буфера. Поэтому использовать эту функцию использовать нужно очень осторожно, либо не использовать вообще. А что же тогда использовать?
Функция fgets().
Сразу рассмотрим пример её использования.
Листинг 14.8
#include <stdio.h>
int main(){
char str[10];
fgets(str,10,stdin);
printf("%s\n",str);
return(0);
}
Функция принимает три аргумента.
Массив символов, в который необходимо записать вводимую строку.
Количество символов, которые может считать функция с учетом символа конца строки. В нашем случае это 10, т.е. рабочих из них девять, и один зарезервирован для конца строки.
Откуда читать данные. В нашем случае указан стандартный поток ввода.
Попробуем в нашей программе Листинг 14.8 ввести нашу строку Helloworld. В ней 12 символов.
Результат выполнения.
|
Рис.7. Ввод с помощью функции fgets(). |
Как видите, даже если мы введем больше, то функция считает только определенное ей количество символов. Не больше.
Есть еще одно отличие. Функция gets() глотала наш перенос строки, превращая его в символ конца строки. А вот функция fgets() его не «проглатывает». Введем, какую-нибудь строку меньше 10 символов. И посмотрим что будет.
|
Рис.8. Иллюстрация особенностей ввода функции fgets(). |
Как видите, получилось два переноса строки. Один из самой строки, другой из-за формат строки вывода.
С вводом разобрались. Теперь поколдуем над выводом. Кроме стандартного printf() есть еще несколько функций. По аналогии с функциями ввода.
