Добавил:
Upload
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Информатика_1 / C / lecture1 / lecture1
.html<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><TITLE>Лекции по программированию</TITLE>
<META http-equiv=Content-Type content="text/html; charset=windows-1251">
<META content="MSHTML 6.00.2600.0" name=GENERATOR></HEAD>
<BODY class=BOOK text=#000000 vLink=#840084 aLink=#0000ff link=#0000ff
bgColor=#ffffff>
<P> <H1>Лекция 1. Введение. </H1>
<P><B>Table of Contents</B><PRE>
<A HREF="#MET1"> 1. Общая структура курса и рекомендуемая литература. </A>
<A HREF="#MET2"> 2. Общая структура программы на языке Си. </A>
<A HREF="#MET3"> 3. Задача. </A> </PRE>
<HR> <A NAME="MET1">
<P><B>Общая структура курса и рекомендуемая литература .
</B></P>
</A>
<P>
Лекции
посвящены наиболее популярному в настоящее время в среде профессиональных
программистов языку программирования Си. Изложение основных конструкций языка
сочетается с изучением наиболее популярных алгоритмов численного анализа,
применяемых в научно-технических расчетах. Подробно рассматриваются алгоритмы
поиска корней нелинейных уравнений, вычисления интегралов, интерполяция функций,
интегрирование обыкновенных дифференциальных уравнений , а также некоторые
алгоритмы для решения задач линейной алгебры. Большое внимание в лекциях уделено
принципу модульного программирования. Подробно рассказывается как создаются и
используются библиотеки прикладных программ. Каждый студент обязан к экзамену
представить собственную библиотеку прикладных программ для численного анализа и
демонстрационную программу. Это одно из основных условий успешной сдачи
экзамена. Все приводимые в лекциях примеры были скомпилированы с помощью
компилятора Visual C++ 6.0 . Этот компилятор является в настоящее время наиболее
оптимальным вариантом при разработке программ под Windows и именно этот
компилятотр рекомендуется автором для изучения курса. Все примеры написаны в
форме консольных приложений. Разработка графических приложений для Windows в
данном курсе не рассматривается. Кроме того я полностью исключил из курса
графическую библиотеку для DOS и все прочие DOSовские приемы программирования
типа прямого доступа к видеопамяти и т.д., как не соответствующие основным
тенденциям программирования в настоящее время.
<P>Рекомендуемая литература
<P>1. Шилдт Г. Полный справочник по С.
<P>2. Стивен Прата, Язык программирования С, Диасофт,
2002.
<P> 3. Шилдт Г. Справочник прграммиста С/C++.
<P> 4. Романовская Л.М. Программирование в среде Си для ПЭВМ ЕС.
<P> 5. Бочков , Субботин. Язык программирования С для персонального компьютера.
<DIV class=FORMALPARA>
<HR> <A NAME="MET2">
<P><B>Общая структура программы на языке С . </B></P></A></DIV>
<P>Любая программа на
языке С пишется с использованием букв латинского алфавита A-Z, a-z , цифр 0-9 и
специальных символов +, -, /,*, %, =,|, &,^,
.,,,:,;,(,),[,],<,>,!,\,#. Верхний и нижний регистры букв различаются при
написании программ. Комментарии в программах ограничиваются символами /* (начало
комментария) и */ (конец комментария). Комментарии полностью игнорируются
компилятором и пишутся программистами для лучшей читаемости программ. Пара
символов // - обозначает комментарий до конца строки.
<I>Каждая программа на языке С состоит из произвольного числа
директив препроцессора,прагм, объявлений, описаний и операторов. </I>
Вот пример программы , содержащей все указанные элементы:
<A HREF=l1.c> (файл l1.c) </A> <PRE class=PROGRAMLISTING>
#include <math.h> /* это дирктивы препроцессора */
#include <stdio.h>
double x; /* объявление глобальной переменной x */
/* типа double */
/* все глобальные переменные */
/* инициализируются по умолчанию нулями */
int main(void) { // начало описания функции main -
// главной функции всякого консольного
// приложения
double y=0.5e-1,z=0.0; //описывающее объявление локальных
// переменных y и z
//локальные переменные по умолчанию не
//обнуляются
// четыре строки с операторами
x=6.1; // оператор присвоения
z=sin(y+z); // оператор вызова функции и присвоения
printf("x=%3.1f z=%f \n",x,z); // оператор вызова функции
return 0; // оператор возврата
} //конец описания функции main
После выполнения этой программы вы увидите на экране одну строчку:
x=6.1 z=0.049979
Краткое описание строк программы:
</PRE><PRE class=PROGRAMLISTING>Первые две строки - директивы препрцессора.
Препроцессор -специальная программа , производящая
определенные действия над текстом программы перед ее
компиляцией. Любая директива начинается с новой строки
с символа #. Директива include указывает на необходимость
включения текста из какого-либо файла в текст вашей программы.
Первая строка программы l1.c указывает на включение в вашу
программу содержимого файла math.h. Угловые скобки <> означают,
что файл ищется по системным путям. Приведем в качестве примера
небольшой фрагмент содержимого файла math.h:
int __cdecl abs(int);
double __cdecl acos(double);
double __cdecl asin(double);
double __cdecl atan(double);
double __cdecl atan2(double, double);
double __cdecl cos(double);
double __cdecl cosh(double);
double __cdecl exp(double);
double __cdecl fabs(double);
double __cdecl fmod(double, double);
long __cdecl labs(long);
double __cdecl log(double);
double __cdecl log10(double);
double __cdecl pow(double, double);
double __cdecl sin(double);
double __cdecl sinh(double);
double __cdecl tan(double);
double __cdecl tanh(double);
double __cdecl sqrt(double);
Это объявления заголовков стандартных математических функций,
включенных в библиотеки, поставляемые с компилятором.
Например, строка
double __cdecl sin(double);
означает, что в состав стандартной библиотеки включена функция
с именем sin , получающая один вещественный аргумент типа double
и возврвщающая вещественное значение тоже типа double.
Конечно-же это функция для вычисления синуса вещественного числа.
Для того чтобы использовать стандартные математические функции в
своих программах вам необходимо включить заголовки этих функций в
свою программу. Это и делает директива препроцессора
#include <math.h>.
<I>Всякое объявление в программе, будь то объявление переменных
или заголовков функций , заканчивается точкой с запятой. </I>
Расширение .h в именах заголовочных файлов происходит от
английского header- заголовок. В стандартную поставку компилятора
входит много файлов с расширением .h. Например файл stdio.h
содержит заголовки функций предназначенных для ввода -вывода. Я
включил содержимое этого файла с свою программу для того, чтобы
включить в нее заголовок функции printf - функции ,предназначенной
для вывода информации на экран монитора. Если заглянуть в
содержимое файла stdio.h то там можно увидеть строку
int __cdecl printf(const char *,...); ,
содержащую объявление заголовка функции printf (на то что printf
функция указывают круглые скобки после ее имени- в языке Си такой
синтаксис однозначно указывает на функцию),которая получает произвольное
число аргументов( на это указывают три точки в списке аргументов),
но первый аргумент всегда строка ( строка в Си всегда имеет тип
const char * - подробнее это будет обсуждаться позже).
Итак, для того ,чтобы вывести что-либо на экран монитора нужно
вызвать функцию printf, как это например сделано в тексте примера.
Первый аргумент функции printf в нашем примере - это строка
"x=%3.1f z=%f \n" ( в языке Си любой набор символов заключенный
в двойные кавычки является строкой). Эта строка называется строкой
формата вывода. Функция printf начинает свою работу всегда с
анализа строки формата и выводит на экран все символы
встречающиеся в строке формата за исключением символа % и
следующих за ним определенных символов и символов ESC
последовательностей- начинающихся с символа \. Подробнее это
будет обсуждаться в лекции , посвященной вводу выводу в языке Си.
В нашем конкретном случае на экран будут выведены символы
x= , затем по формату f (формат для вывода вещественных чисел) в
трех позициях с одним десятичным знаком после точки (символы
%3.1f строке формата) будет выведено число x (6.1 на экране), затем
шесть пробелов, затем z= и далее по формату f значение переменной z
(0.049979 на экране).
Для переменной z не указано число позиций на экране и число знаков
после десятичной точки для вывода ( спецификация %f в строке
формата) , поэтому функция printf вывела z стандартным размером.
Последний символ в строке формата \n - управляющий символ ESC
поледовательности с названием - новая строка,
для функции printf этот символ в строке формата означает перевод
курсора на новую строку.
Последний оператор программы -
return 0;
определяет значение возвращаемое командному процессору при
завершении работы функции main. Замечу, что функция main описана
в моем примере , как возвращающая целое значение ( строка
int main() { ) в тексте программы, поэтому оператор return
в данном случае обязателен. В соответствии со стандартом
ANSI функция main всегда должна возвращать значение типа int
(целый тип данных в Си).
В качестве второго примера приведу программу выводящую на
экран несколько строк - таблицу значений функции у=sin(x^2)
для значений x от 0.1 до 1.9 с шагом 0.2. Для вызова функции printf
заданное число раз применяется оператор цикла for.
<A HREF=l1_2.c> (файл l1_2.c) </A>
#include<math.h>
#include<stdio.h>
double x;
int main(void){
for(x=0.1;x<=2;x=x+0.2)
printf("x=%e sin(x^2)=%e\n",x,sin(x*x));
return 0;
}
В этой программе оператор цикла for выполняет оператор вызова
функции printf 10 раз для значений x=0.1,0.3,...1.9 и каждый раз на
экран выводится строка , содержащая значение переменной x
и значение функции sin(x^2). Вот как выглядит на экране результат
работы программы:
x=1.000000e-001 sin(x^2)=9.999833e-003
x=3.000000e-001 sin(x^2)=8.987855e-002
x=5.000000e-001 sin(x^2)=2.474040e-001
x=7.000000e-001 sin(x^2)=4.706259e-001
x=9.000000e-001 sin(x^2)=7.242872e-001
x=1.100000e+000 sin(x^2)=9.356160e-001
x=1.300000e+000 sin(x^2)=9.929037e-001
x=1.500000e+000 sin(x^2)=7.780732e-001
x=1.700000e+000 sin(x^2)=2.489468e-001
x=1.900000e+000 sin(x^2)=-4.514658e-001
Замечу, что в языке программирования Си нет знака операции
для возведения в степень (для этого есть функция pow, заголовок
которой описан в заголовочном файле math.h) , поэтому я использовал
знак операции перемножения * для возведения x в квадрат (
sin(x*x) в списке выводимых на экран значений при вызве функции
printf ) . Кроме того применен формат %e для вывода вещественных
значений x и sin(x*x) на экран (формат называется - научная нотация).
В этом формате выражение 1.000000e-001 озбозначает 1.0*10^(-1).
В заключение этой лекции сделаю одно замечание . Необходимо обратить внимание
на строгое соответствие количества выводимых на экран значений функцией printf
и числа спецификаций формата %
в строке формата . В языке Си такое несоответствие никак не
проверяется и ведет к неправильной работе программы. Например
такая строка в программе
printf("x=%3.1f\n",x,z);
является грубейшей ошибкой- значения двух переменных выводятся
с одной спецификацией формата. С такой строкой программа обречена на неправильную работу.
<HR> <A NAME="MET3">
<P>Задача. Используя оператор цикла for и вызов функции printf
написать программу для вывода на экран таблицы заданной функции
в виде:
</A>
</PRE>
<DIV class=INFORMALTABLE><A name=AEN26></A>
<P></P>
<TABLE class=CALSTABLE width="100%" border=1>
<THEAD>
<TR>
<TH vAlign=top align=left width="50%">x </TH>
<TH vAlign=top align=left width="50%">y(x) </TH></TR></THEAD>
<TBODY>
<TR>
<TD vAlign=top align=left width="50%">0.1 </TD>
<TD vAlign=top align=left width="50%">0.00999983 </TD></TR>
<TR>
<TD vAlign=top align=left width="50%">0.3 </TD>
<TD vAlign=top align=left width="50%">0.0898785 </TD></TR>
<TR>
<TD vAlign=top align=left width="50%">0.5 </TD>
<TD vAlign=top align=left width="50%">0.247404 </TD></TR>
<TR>
<TD vAlign=top align=left width="50%">0.7 </TD>
<TD vAlign=top align=left width="50%">0.470626 </TD></TR>
<TR>
<TD vAlign=top align=left width="50%">0.9 </TD>
<TD vAlign=top align=left width="50%">0.724287 </TD></TR>
<TR>
<TD vAlign=top align=left width="50%">1.1 </TD>
<TD vAlign=top align=left width="50%">0.935616 </TD></TR>
<TR>
<TD vAlign=top align=left width="50%">1.3 </TD>
<TD vAlign=top align=left width="50%">0.992904 </TD></TR>
<TR>
<TD vAlign=top align=left width="50%">1.5 </TD>
<TD vAlign=top align=left width="50%">0.778073 </TD></TR>
<TR>
<TD vAlign=top align=left width="50%">1.7 </TD>
<TD vAlign=top align=left width="50%">0.248947 </TD></TR>
<TR>
<TD vAlign=top align=left width="50%">1.9 </TD>
<TD vAlign=top align=left width="50%">-0.451466 </TD></TR></TBODY></TABLE>
<P></P></DIV></DIV>
<PRE>
<A HREF="../index.html" >previous</A> <A HREF="../lecture2/lecture2.html" >next</A>
</PRE>
</BODY></HTML>