- •Содержание
- •Лекция 1. Общее знакомство
- •Происхождение языка Си
- •Достоинства языка Си
- •Будущее языка Си
- •Использование языка Си
- •Использование текстового редактора для подготовки программ
- •Исходные и выполняемые файлы
- •Пример простой программы на языке Си
- •Пояснения к программе
- •Первый просмотр
- •Второй просмотр
- •Структура простой программы
- •Дополнительный пример
- •Лекция 2. Данные, символьные строки, директива #define
- •Основные типы данных
- •Описание различных типов, переменные и константы
- •Символьные строки
- •Препроцессор языка Си
- •Лекция 3. Операции
- •Основные операции
- •Операция вычитания: -
- •Операция изменения знака: -
- •Операция умножения: *
- •Операция деления: /
- •Дополнительные операции
- •Операция деления по модулю: %
- •Операция уменьшения: --
- •Перечень операций языка Си
- •Операции, уровень приоритета которых равен 1
- •Операция уменьшения: --
- •Операция вычитания: -
- •Операции, уровень приоритета которых равен 5
- •Операции, уровень приоритета которых равен 6
- •Операции, уровень приоритета которых равен 7
- •Операция, уровень приоритета которой равен 8
- •Операция, уровень приоритета которой равен 12
- •Операция логическое или: ||
- •Операция, уровень приоритета которой равен 13
- •Операция условный оператор: ?
- •Операция, уровень приоритета которой равен 14
- •Операция присваивания
- •Операция, уровень приоритета которой равен 15
- •Операция запятая: ,
- •Лекция 4. Операторы
- •Выражения
- •Простейшие выражения
- •Операторы
- •Составные операторы
- •Оператор цикла while
- •Изучение и использование функций printf( ) и scanf( )
- •Применение функции scanf( )
- •Лекция 5. Преобразование типов
- •Эквивалентность типов
- •Преобразование типов
- •Разбор программы
- •Операция приведения
- •Неявное преобразование типа
- •Арифметические преобразования
- •Явные преобразования типов
- •Синтаксис типов
- •Лекция 6. Функции и переключение ввода-вывода
- •Ввод и вывод одного символа
- •Чтение одной строки
- •Чтение файла
- •Переключение и работа с файлами
- •Переключение ввода
- •Комбинированное переключение
- •Операционные системы, отличные от oc unix
- •Лекция 7. Выбор вариантов
- •Выбор вариантов
- •Оператор if
- •Расширение оператора if
- •Операции отношения
- •Что такое истина
- •Осложнение с понятием истина
- •Логические операции
- •Операция условия: ?:
- •Множественный выбор
- •Лекция 8. Циклы и другие управляющие средства. Структурное программирование
- •Структурное программирование
- •Цикл с предусловием
- •Цикл со счетчиком
- •Цикл с постусловием
- •Другие управляющие операторы
- •Оператор break
- •Оператор continue
- •Оператор goto
- •Лекция 9. Функции
- •Создание и использование функций
- •Аргументы функции
- •Возвращение значений
- •Локальные переменные
- •Нахождение адресов
- •Указатели, первое знакомство
- •Операция косвенной адресации *
- •Описание указателей
- •Подведем итоги по указателям
- •Функции с переменным количеством аргументов
- •Лекция 10. Классы памяти и разработка программ
- •Классы памяти и область действия
- •Автоматические переменные
- •Внешние переменные
- •Статические переменные
- •Внешние статические переменные
- •Регистровые переменные
- •Лекция 11. Препроцессор языка Си
- •Общие сведения
- •Символические константы: #define
- •Замена идентификаторов
- •Использование аргументов с #define
- •Макроопределение или функция?
- •Включение файла: #include
- •Условная компиляция
- •Вспомогательные директивы Номер строки и имя файла
- •Реакция на ошибки
- •Пустая директива
- •Встроенные макроимена
- •Лекция 12. Массивы и указатели
- •Указатели и массивы
- •Массивы
- •Указатели
- •Динамические объекты
- •Создание динамических объектов
- •Доступ к динамическим объектам
- •Время жизни динамического объекта
- •Связь между указателями и массивами
- •Строки - дополнительные сведения о тесной связи между указателями и массивами
- •Инициализация массивов и классы памяти
- •Функции, массивы и указатели
- •Операции с указателями
- •Лекция 13. Символьные строки и функции над ними
- •Строковые константы
- •Массивы символьных строк и их инициализация
- •Массив и указатель: различия
- •Указатели и строки
- •Ввод-вывод строк
- •Обработка строк
- •Лекция 14. Структуры
- •Определение структурных переменных
- •Доступ к компонентам структуры
- •Поля битов в структурах
- •Объединения
- •Перечисления
- •Переменные структуры
- •Указатели и структуры
- •Массив структур
- •Переименование типов
- •Лекция 15. Библиотека языка Си и файлы ввода-вывода
- •Стандартные библиотечные функции
- •Доступ в библиотеку языка Си
- •Открытие файла: fopen( )
- •Закрытие файла: fclose( )
- •Текстовые файлы с буферизацией
- •Ввод-вывод текстового файла: getc( ), putc( )
- •Ввод-вывод файла: fprintf( ), fscanf( ), fgets( ), fputs( )
- •Функции fprintf( ) и fscanf( )
- •Функция fgets( )
- •Функция fputs( )
- •Функция fseek( )
- •Распределение памяти Функция malloc( )
- •Функция calloc( )
- •Лекция 16. Функции в примерах
- •Функция получения случайных чисел
- •Поиск узлов из простых чисел
- •Матрица инцидентности
- •Структуры данных
- •Очереди
- •Связанные списки
- •Все операции со стеком
- •Подведем итог
- •Дополнения
- •Литература
Применение функции scanf( )
Поскольку мы будем пользоваться функцией scanf( ) эпизодически, мы рассмотрим здесь только основные особенности ее применения. Для функции scanf( ) указывается управляющая строка и следующий за ней список аргументов. Основное различие функций printf( ) и scanf( ) заключается в особенностях данного списка. Функция printf( ) использует имена переменных, константы и выражения, а функция scanf( ) - только указатели на переменные. Мы ничего не должны знать о таких указателях. Необходимо помнить только два правила:
Если нам нужно ввести некоторое значение и присвоить его переменной одного из основных типов, то перед именем переменной требуется писать символ &.
Если мы хотим ввести значение строковой переменной, использовать символ & не нужно.
Пример:
int main()
{
int age;
float assets;
char fio[50];
printf("Введите ваш возраст, оклад, фамилию. \n");
scanf("%d %f", &age, &assets);
scanf("%s", fio); /* & отсутствует при указании
массива символов */
printf("%d $%.0f %s\n",age, assets, fio);
}
Функция scanf( ) использует некоторые специальные знаки, пробелы, символы табуляции и "новая строка", для разбиения входного потока символов на отдельные поля. Она согласует последовательность спецификаций преобразования с последовательностью полей, опуская упомянутые специальные знаки между ними. Исключением является спецификация %c, обеспечивающая чтение каждого следующего символа даже в том случае, если это пустой символ.
Функция scanf( ) использует тот же набор символов спецификации преобразования, что и функция printf( ). Основные отличия функции scanf( ) следующие:
Отсутствует спецификация %g.
Спецификации %f и %e эквивалентны. Обе спецификации допускают наличие или отсутствие знака строки цифр с десятичной точкой или без нее и поля показателя степени.
Для чтения целых чисел типа short применяется спецификация %h.
Функция scanf( ) не является одной из наиболее часто используемых функций языка Си. Мы обсуждаем ее из-за универсальности.
Особенности работы с языком Си. Задание фиксированной ширины полей оказывается полезным при печати данных столбиком.
Например:
printf("%d %d %5d\n",val1,val2, val3);
Результат выглядит так:
11 222 3333
4 5 23
22222 3332 11111
Эти же данные можно представить в улучшенном виде, если задать достаточно большую фиксированную ширину поля:
printf("%9d %9d %9d\n", val1,val2, val3);
Результат будет выглядеть так:
11 222 3333
4 5 23
22222 3332 11111
Если печатаемое число включено в некоторую фразу, то часто при его выводе оказывается удобным задать ширину поля равной или меньше требуемой. Это дает возможность включить число в фразу без добавления лишних пробелов.
А теперь рассмотрим два примера работы с циклом while:
/*квадраты чисел*/
int main( ) /*получение квадратов*/
{
int n=1;
while(n < 11) {
printf("%10d %10d\n", n, n*n);
n=n+1;
}
}
Эта программа выводит на печать первые 10 чисел и их квадраты.
Второй пример.
Согласно легенде, один правитель обещал наградить ученого, оказавшего ему большую услугу. Ученый, когда его спросили, что бы он хотел получить в награду, указал на шахматную доску и сказал: "Положите одно пшеничное зерно на первую клетку, два - на вторую, четыре на третью, восемь на следующую и т.д." Правитель был поражен, услышав такую скромную просьбу. Программа, приведенная ниже, показывает, в какое положение попал правитель!
/* пшеница*/
#include <stdio.h>
#define NUMBER 64 /* число клеток на шахматной доске*/
#define CROP 7E14 /* весь урожай пшеницы,
выраженный в числе зерен*/
int main( )
{
double current, total;
int count =1;
printf("КЛЕТКА ЧИСЛО СУММА ЗЕРЕН ДОЛЯ\n");
total = current = 1.0;/*начинаем с одного зерна*/
printf("%4d %15.2e %13.2e %12.2e\n",count,
current, total, total/CROP);
while(count < NUMBER) {
count = count + 1;
current = 2.0*current;
/*удвоенное число зерен на следующей клетке */
total = total +current; /* коррекция суммы*/
printf ("%4d %15.2e %13.2e %12.2e\n",count,
current, total, total/CROP);
}
}
Это пример составного оператора. От открывающей фигурной скобки оператора while до закрывающей фигурной скобки.
Составной оператор используется в следующих случаях:
Чтобы сгруппировать несколько логических связанных операторов в один оператор.
В качестве тела функции.
Для ограничения видимости определений частью программы, т.е. для локализации действия описаний.
Составной оператор имеет следующую форму:
{
определения и описания
операторы
}
Определения переменных внутри составного оператора имеют больший приоритет, чем определения переменных с тем же именем для области действия составного оператора. Эти переменные видимы, т.е. доступны, только внутри составного оператора. Глобальные переменные являются видимыми внутри составного оператора только при условии, что их определения не изменены локальными определениями.
! |
Применяйте отступы от поля в строках, чтобы сделать структуру программы наглядной! |
Подведем итог.
Выражение состоит из операций и операндов.
Оператор служит командой компилятору. Операторы бывают простыми и составными. Простые операторы оканчиваются символом "точка с запятой". Примеры:
Оператор описания: |
int name; |
Оператор присваивания: |
current=12; |
Оператор вызова функции: |
printf("Текст\n"); |
Управляющий оператор: |
while (n < 111) n=n+5; |
Пустой оператор: |
; |
Составные операторы, или блоки, состоят из одного или более операторов, заключенных в фигурные скобки, которые в свою очередь сами могут быть составными.
Примеры:
/* Задача № 1.
Вычислить величину дохода по вкладу. Процентная
ставка (в процентах годовых), время хранения
(в днях) и сумма задаются во время работы программы.*/
#include <stdio.h>
float р,t,s,d;
int main()
{
puts("Введите сумму s");
scanf("%f",&s);
puts("Введите процентную ставку р");
/* вывод строки */
scanf("%f",&p);
puts("Введите время хранения в днях t");
scanf("%f",&t);
d=p*s*t/36500;
printf("\n Величина дохода d=%f",d);
}
/* Задача № 2
По заданной стороне куба А определить его объем, площадь
грани и площадь поверхности.*/
#include <stdio.h>
float a,v,s,si;
int main()
{
puts("\n Введите сторону а");
scanf("%f",&a);
v=a*a*a;
s=a*a;
si=s*6;
printf("\n объем v=%f",v);
printf("\n площадь грани s=%f",s);
printf("\n площадь поверхности si=%f",si);
}
/* Задача № 3
Определить реальное расстояние между населенными
пунктами. Указан масштаб карты и расстояние между
двумя точками, изображающими населенные пункты.*/
#include <stdio.h>
float m,s,si;
int main()
{
puts("Введите масштаб карты m");
scanf("%f",&m);
puts("Введите расстояние на карте si");
scanf("%f", &si);
s=si*m;
printf("\n реальное расстояние s=%f",s);
}