Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Информатика_1 / C / lecture1 / lecture1

.html
Скачиваний:
12
Добавлен:
09.06.2015
Размер:
13.91 Кб
Скачать
<!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 и 
специальных символов +, -, /,*, %, =,|, &amp;,^, 
.,,,:,;,(,),[,],&lt;,&gt;,!,\,#. Верхний и нижний регистры букв различаются при 
написании программ. Комментарии в программах ограничиваются символами /* (начало 
комментария) и */ (конец комментария). Комментарии полностью игнорируются 
компилятором и пишутся программистами для лучшей читаемости программ. Пара 
символов // - обозначает комментарий до конца строки. 
<I>Каждая программа на языке С состоит из произвольного числа 
директив препроцессора,прагм, объявлений, описаний и операторов. </I>
Вот пример программы , содержащей все указанные элементы: 
<A HREF=l1.c> (файл l1.c) </A> <PRE class=PROGRAMLISTING>
#include &lt;math.h&gt;         /* это дирктивы препроцессора */
#include &lt;stdio.h&gt;
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. Угловые скобки &lt;&gt; означают, 
что файл ищется по системным путям.  Приведем в качестве примера
 небольшой фрагмент содержимого файла 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 &lt;math.h&gt;.
<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&lt;math.h&gt;
#include&lt;stdio.h&gt;
double x;
int main(void){
	for(x=0.1;x&lt;=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>
Соседние файлы в папке lecture1