Стандартные математические функции
Для того, чтобы использовать эти функции в начале программы должно стоять:
#include <math. h>
abs (x) – возвращает абсолютное значение целого аргумента x.
acos (x) – арккосинус x.
asin (x) – арксинус x.
atan (x) – арктангенс x.
cos (x) – косинус x.
exp (x) – e.
fabs (x) – абсолютное значение вещественного аргумента x.
floor (x) – наибольшее целое, не превышающее значения х.
labs (x) – абсолютное значение целого аргумента long x.
log (x) – ln x.
log10 (x) – log 10 x.
pow (x, y) – х в степени у.
sin (x) – синус x – угол задается в радианах.
sqrt (x) – квадратный корень x.
tan (x) – тангенс x – угол задается в радианах.
Это только основные функции, которые могут понадобиться на первом этапе освоения языка.
Оператор присваивания
x = … – пусть x будет…
2. Программные конструкции
2.1. Ветвление (выбор)
2.1.1. Альтернатива (условный оператор)
Пример 2.1: Вычисление значений функции Y=1/X.
#include <stdio. h>
int main ()
{
float x;
printf ("Введите число\n");
scanf ("%f", &x);
if (x!= 0)
printf ("Y=1/X=%f\n", 1/x);
else
printf ("0 не входит в область определения функции Y=1/X\n");
getchar ();
return 0;
}
2.1.2. Неполный условный оператор
Пример 2.2: Если X <3, то вывести на печать значение X.
if (x <3)
printf ("%f", x);
> – больше
< – меньше
> = – не меньше
<= – не больше
= = – равно
!= – не равно
! – не
&& – и
|| – или
Примеры сложных (составных) условий:
if (a == 2 && b> 5)…
if (a == 2 || b> 5)…
if (! (a == 4))…
2.1.3. Оператор варианта (переключатель)
Переключатель в C существенно отличается от подобного в Pascal. Например, в нём нельзя в одном варианте выбора предлагать через запятую несколько констант. Зато у переключателя в C есть вариант по умолчанию. Поэтому, я привожу для разбора другой, но тоже простой и наглядный, пример.
Пример 2.3: При вводе номера дня недели программа сообщает название рабочего дня или сообщение "Выходной!"
#include <stdio. h>
int main ()
{
int n;
printf ("Введите номер дня недели\n");
scanf ("%d", &n);
switch (n)
{
case 1: printf ("Понедельник\n"); break;
case 2: printf ("Вторник\n"); break;
case 3: printf ("Среда\n"); break;
case 4: printf ("Четверг\n"); break;
case 5: printf ("Пятница\n"); break;
case 6: printf ("Выходной!\n"); break;
case 7: printf ("Выходной!\n"); break;
default: printf ("Вы заработались :-) \n");
}
getchar ();
return 0;
}
Как видите, данный оператор не может похвастаться хвалёной компактность записи, столь свойственной C. В Pascal подобная структура реализована куда элегантней. Вообще, современные среды программирования сводят на нет преимущество в экономии нажатий клавиш, поскольку все они обладают опцией автозавершения. Но данному монстру из C завоевать любовь программистов не поможет даже это.
SWITCH – переключатель, железнодорожная стрелка.
CASE – случай, обстоятельство.
BREAK – прервать.
DEFAULT – отсутствие, исключение, по умолчанию.
2.2. Повторение (операторы цикла)
2.2.1. Цикл типа "пока" (цикл с предусловием)
Пример 2.4: Программа находит наибольший общий делитель двух целых чисел.
#include <assert. h>
#include <stdio. h>
int main ()
{
int x, y;
printf ("Введите два целых числа через пробел\n");
int r = scanf ("%d%d", &x, &y);
assert (r == 2);
while (x!= y)
if (x> y)
x = x – y;
else
y = y – x;
printf ("НОД=%d\n", x);
getchar ();
return 0;
}
Для проверки соответствия ввода пользователя требованиям программы мы сохраняем (=) результат выполнения scanf – количество успешно измененных переменных – в целочисленной переменной с именем r (int r), после чего требуем равенства её значения двум
(assert (r == 2);
Для этого и нужна директива препроцессора
#include <assert. h>
2.2.2. Цикл, который выполняется не меньше одного раза
Обратите внимание, что в цикле используется условие продолжения, а не завершения повторения! Это не цикл "до", подобный REPEAT… UNTIL в Pascal, хотя назначение его то же – позволить телу цикла выполнится хотя бы один раз.
Пример 2.5: Решение предыдущей задачи.
#include <assert. h>
#include <stdio. h>
int main ()
{
int x, y;
printf ("Введите два целых числа через пробел\n");
int r = scanf ("%d%d", &x, &y);
assert (r == 2);
do
if (x> y)
x = x – y;
else
y = y – x;
while (x!= y);
printf ("НОД=%d\n", x);
getchar ();
return 0;
}
2.2.3. Цикл с параметром (со счётчиком)
Пример 2.6: Вычислить факториал числа (n!=1×2×3×…×n).
#include <stdio. h>
int main ()
{
int f=1, k, n;
printf ("Введите целое положительное число\n");
scanf ("%d", &n);
for (k=1; k <=n; k++)
f=f*k;
printf ("n!=%d\n", f);
getchar ();
return 0;
}
Для этого цикла в Си Рис. 6 из части о Паскале даже более нагляден, чем там! Особенно, если заменить в этом операторе k++ на k=k+1, что его работы не изменит. Разве, что только незаметно замедлит, поскольку унарные операции выполняются быстрее бинарных.
Цикл с параметром в Си больше похож на аналогичный оператор в древнем Бейсике – там тоже был шаг цикла и этим он был более гибким, чем соответствующий оператор Паскаля.
В Си возможен, например, такой оператор цикла с параметром:
for (i=100; i>=10; i=i-5) {…};
Здесь переменная i уменьшается от 100 до 10 с шагом 5 и, соответственно, тело цикла в фигурных скобках будет выполнено 19 раз.
3. Функции
В C есть только функции, а процедур нет.
Тело функции не может содержать в себе определения других функций.
Функцию можно вызвать из другой функции.
Оператор return возвращает выполнение программы в точку вызова функции.
При использовании return; функция не возвращает никакого значения.
При использовании такого вида – return выражение; результатом функции становится значение данного выражения. Тип этого выражения должен либо совпадать с типом функции, либо относиться к числу типов, допускающих автоматическое преобразование к типу функции.
Оператор return может не присутствовать в явном виде в теле функции. Тогда он подразумевается перед закрывающей тело функции фигурной скобкой. Эту подстановку производит сам компилятор.
Глобальные переменные описываются до функций, которые их будут "видеть".
Пример 2.7: Из главной функции вызывается функция вычисляющая факториал.
#include <stdio. h>
#include <stdlib. h>
int fakt (int n)
{
int f=1, k;
for (k=1; k <=n; k++)
f=f*k;
return f;
}
int main (void)
{
int n;
printf ("Введите целое положительное число\n");
scanf ("%d", &n);
int f = fakt (n);
printf ("n! = %d\n", f);
getchar ();
return 0;
}
4. Массивы и индексированные переменные
Пример описания одномерных массивов:
int x [15], y [30];
Пример описания двумерного массива:
float z [10] [20];
Нумерация элементов массива начинается с нуля.
Пример 2.9: Программа генерирует таблицу умножения и оформляет вывод результатов в матрицу 10 на 10 используя двумерный массив.
#include <stdio. h>
#include <stdlib. h>
int main (void)
{
int i, k;
int a [10] [10];
for (i=0; i <10; i++)
for (k=0; k <10; k++)
a [i] [k] = i * k;
for (i=0; i <10; i++)
{
for (k=0; k <10; k++)
printf ("%d%s%d%s%d\t", i,"*", k,"=", a [i] [k]);
printf ("\n");
}
getchar ();
return 0;
}
5. Заглянем в вычислительную математику
Метод половинного деления
Пример 2.10: Найти корень уравнения X – 3 = 0.
#include <assert. h>
#include <stdio. h>
#include <stdlib. h>
float fn (float x)
{
float y;
y = x*x – 3;
return y;
}
int main ()
{
float a, b, e, x, y, y1;
printf ("Введите границы интервала и погрешность через пробел\n");
int r = scanf ("%f%f%f", &a, &b, &e);
assert (r == 3);
x = a;
y = fn (x);
y1 = y;
while (b – a> = e)
{
x = (a + b) /2;
y = fn (x);
if (y * y1> = 0)
{
a = x;
y1 = y;
}
else
b = x;
}
printf ("X=%f\n", x);
getchar ();
return 0;
}
6. Что ещё интересного?
Язык C замышлялся его создателем Деннисом Ритчи, как язык структурного программирования, а предназначением его должно было стать системное программирование, то есть создание операционных систем и компиляторов для других языков программирования. Происходило это в период разработки платформонезависимой операционной системы UNIX на фирме Bell Laboratories, где Д. Ритчи работал. Идея была такая – написать операционную систему на языке высокого уровня, создать для каждой аппаратной платформы компилятор этого языка и спокойно откомпилировать операционную систему для этого "железа". Что с успехом и делалось без лишнего мучения с ассемблерами. Д. Ритчи, будучи высококлассным профессионалом, делал C как подручный инструмент для себя. Поэтому C не так "дуракоустойчив", как Pascal, созданный Николаусом Виртом для обучения студентов. Но C позволяет тоньше использовать возможности компьютера, что ранее могли только языки низкого уровня – ассемблеры. Поэтому C иногда называют языком "среднего уровня".
Скорость выполнения программ написанных на C близка к скорости программ на ассемблерах. А синтаксис этого языка послужил образцом при создании многих языков нового поколения.
Иногда удобны применяемые в C унарные операции, например запись i++ вместо i = i +1.
Причём возможна и запись ++i – но это выражение увеличивает переменную на единицу до её использования, а не после, как в случае i++.
Например: Если x имеет значение 5, то оператор x=i++; установит x равным 5, а оператор x=++i: равным 6. Тем не менее в обоих случаях i после выполнения любого из операторов становится равным 6. Аналогично работают унарные операции уменьшения на единицу i – – и – – i. При этом унарные операции работают быстрее, чем бинарные.
В C возможна, например, такая странная запись:
x=a+ (b=5) -1;
Здесь переменная b получит значение 5, такое же значение будет присвоено выражению в скобках, и всё выражение в целом стане равным a+4.
Но я не советую злоупотреблять этой занятной возможностью, так как это усложняет понимание текста программы другими людьми.
В C имеется препроцессор, который осуществляет макроподстановки, подстановки файлов, условные подстановки и перенумерацию строк в тексте программы перед её компиляцией.
Отличительным признаком директивы препроцессора служит символ #, помещённый перед ней.
Например, если вы напишете в начале программы:
# define pi 3.14159
# define e 2.71828
То препроцессор заменит в ней все имена pi и e на соответствующие числовые константы. Такие действия называются макроподстановками.
Подстановку файлов, например #include <stdio. h>, вы уже встречали в примерах программ.
Этот язык по прежнему пользуется уважением профессионалов и рассказывать о нём можно долго, но я, чтобы не раздувать объём книги, отсылаю вас к приведённому в её конце списку хорошей специальной литературы.
Напутствие
Ну, вот, я и рассказал вам всё, что хотел. Книжка получилась достаточно компактной, поскольку, как и в лекциях моим студентам, я следовал принципу – "Ещё проще!" Собственно, то, что вы держите сейчас в руках – это переработка тех самых лекций, в которых я снова нашёл, что можно ещё упростить и выкинул ряд моментов, требующих дополнительных объяснений и, следовательно, отвлекающих внимание от основных сведений. Надеюсь, что чтение этой работы и разбор примеров не заняли у вас много времени, но, в дальнейшем, вы ещё будете к ней возвращаться – пока не сформируете базовых навыков. А дальше – в добрый путь в волшебную страну программирования, где вы сами, со временем, станете магами, или шаманами. Существует много умных книг об этом – свои любимые я вам рекомендую в списке литературы. Есть ещё интернет с онлайн-справочниками и форумами, где энтузиасты и профессионалы делятся своими знаниями, а иногда и секретами. Так что без помощи вы не останетесь.
Буду очень рад получить ваши отзывы на свою работу – по адресу:
malaplaneta@yandex.ru
Если книжка вам понравится, то, может быть, возьмусь за следующую. И, скорее всего, она будет посвящена моему любимому интернет-программированию.
Упражнения
1. Написать программу пересчёта температуры из шкалы Цельсия в шкалу Фаренгейта:
t (F) =t (C) × 1,8 +32, где t (F) – температура по Фаренгейту, а t (C) – температура по Цельсию.
2. Написать программу пересчёта цены товара с учётом скидки, заданной в процентах.
3. Написать программу вычисления пройденного пути по известным значениям скорости и времени.
4. Написать программу для вычисления переменной S:
S= 1 +1/2 +1/3 +1/4 +…+1/n, при n=30.
5. Написать программу полного исследования совокупности корней биквадратного уравнения AX + BX + C = 0. Если корней нет, то должно быть выведено текстовое сообщение об этом, иначе должны быть выведены два или четыре корня.
6. Даны положительные X, Y, Z. Выяснить, существует ли треугольник с длинами сторон X, Y, Z? Ответ получить в текстовой форме: существует или не существует.
7. Дано положительное A. Найти наибольшее число вида 1/2 где n больше или равно 0, меньшее А.
8. Вывести таблицу значений функции Y = sin X. Таблица должна иметь две колонки, в i-ю строку таблицы заносятся значения Xi и Yi, где Xi = 0,1 × i, Yi = sin Xi (i = 0,1, 2, 3,…, 15).
9. Дан массив целых чисел. Написать программу поиска в массиве элемента с заданным значением. Если элемент имеется, то сообщить его индекс или индексы, если таковых найдётся несколько. Если элемента с заданным значением нет, то сообщить об этом.
10. Дан массив вещественных чисел. Написать программу поиска минимального элемента массива.
11. Дан двумерный массив вещественных чисел. Написать программу поиска максимального элемента массива.
12. Выяснить, имеются ли среди данных символов S1,…, Sn совпадающие.
Литература
Это книги по которым я сам учился программированию и которые использовал, готовя лекции для своих студентов в колледжах. Я храню их в своей личной библиотеке и всячески рекомендую вам поискать их в тех библиотеках, услугами которых вы, надеюсь, пользуетесь, или найти их отсканированными в сети. Хотя они и не самые новые, но, поверьте, они стоят того, чтобы ими воспользоваться и сейчас.
1. Вишняков Ю. С. и др. Простое и сложное в программировании/ Авт. предисл. Е. П. Велихов. – М.: Наука, 1988. – 176 с.: ил.
2. Горстко А. Б., Кочковая С. В. Азбука программирования (информатика для всех). – М.: Знание, 1988, – 144 с.
3. Абрамов С. А., Зима Е. В. Начала информатики. – М.: Наука, 1989. – 256 с.
4. Лапчик М. П. Вычисления Алгоритмизация Программирование: Пособие для учителя. – М.: Просвещение, 1988. – 208 с.: ил.
5. Очков В. Ф., Хмелюк В. А. От микрокалькулятора к персональному компьютеру/ Под ред. А. Б. Бойко. – М.: Изд-во МЭИ, 1990. – 224 с.: ил.
6. Крайзмер Л. И., Кулик Б. А. Персональный компьютер на вашем рабочем месте. – СПб.: Лениздат, 1991. – 286 с., ил.