Определение символических констант




Л а б о р а т о р н а я р а б о т а N 2

(4 часа)

Программирование простейших циклов на языке Си

 

Структура программы

 

 

Любая программа на языке Си состоит из одной или более "функций", являющихся основными компонентами программы. Одна из функций, с которой начинается выполнение программы, называется главной и всегда носит имя main. Остальные функции – это подпрограммы, которые могут вызываться либо из главной функции, либо из других подпрограмм. Простая программа, состоящая только из функции main, имеет следующую структуру:

 

Директивы препроцессора

Main ()

{ Описания переменных

Операторы

}

 

Заголовок функции - main(). Круглые скобки после имени main как раз и указывают, что это функция. Тело функции заключается в фигурные скобки и состоит из объявлений переменных и операторов, опиcывающих процесс обработки данных.

В программу можно включать комментарии, начинающиеся с пары символов /* и заканчивающиеся парой */ (они могут быть везде, где могут быть пробелы).

Пример простой программы:

 

/* программа сложения двух целых чисел */

#include <stdio.h>

main ()

{ int a, b; /* объявление целочисленных переменных а и b */

printf ("Задайте два числа: "); /* вывод сообщения */

scanf ("%d %d", &a, &b); /* ввод значений а и b */

printf ("%d + %d = %d\n", a, b, a+b); /* вывод результата */

return 0;

}

 

При выполнении этой программы на экране появится сообщение:

Задайте два числа:

и затем программа будет ждать, пока вы не введете числа (ввести можно в той же строке, разделяя числа пробелом). Например:

Задайте два числа: 328 54

Затем появится результат в виде:

328 + 54 = 382

В этой программе директива препроцессора #include <stdio.h> служит для включения в программу библиотечного файла stdio.h, содержащего объявления стандартных функций ввода/вывода, таких как printf, scanf. Тело функции main() содержит три оператора вызова функций printf() и scanf().

Обратите внимание, что все ключевые слова в языке Си пишутся строчными буквами, директивы препроцессора начинаются с символа #. Для наглядности принята ступенчатая форма записи программы.

Считается, что программы, работающие под управлением операционной системы MS DOS, должны вернуть системе код завершения 0 в случае успешного выполнения и любой другой в случае ненормального завершения. Поэтому функция main() заканчивается оператором возврата значения return 0;

 

 

Объявление переменных и основные типы данных

При объявлении (описании) переменных указываются имена переменных и типы значений этих переменных:

 

тип_1 имя_1;

тип_2 имя_2;

 

Имя (идентификатор) - это последовательность латинских букв и цифр, начинающаяся с буквы. Можно использовать в имени символы подчеркивания вместо пробелов, когда имя состоит из нескольких слов. Если несколько переменных имеют один и тот же тип, то их можно описать вместе, перечислив имена через запятую:

тип имя_1, имя_2,...;

 

К основным типам данных относятся целые типы (int, short, long,unsigned), символьный тип (char) и вещественные типы или типы с плавающей точкой (float, double).

 

Примеры описаний переменных:

 

float x,y,z; /* вещественные числа */

double x1,x2; /* вещ. числа двойной точности */

char simv; /* символ */

int i,j; /* целые числа */

long summa; /* длинное целое */

short k1,k2; /* короткие целые */

unsigned count; /* беззнаковое целое (неотрицательное) число */

 

Объем памяти, занимаемой данными различных типов, зависит от типа компьютера, операционной системы и конкретной реализации языка Си.

При описании переменной можно инициализировать переменную, например:

int k = 0; /* k присваивается начальное значение 0 */

char s = 'a';

Типы используемых в программе констант определяются по их виду, например:

123 -65 - целые константы;

-34.6 3.14159.12E-5 7e4 - константы с плавающей точкой

(.12E-5=.0000012 7e4=70000.);

'A' 'a' '2' '%' - символьные константы.

Рассмотренные типы являются простыми. Более сложные структурированные типы данных, а также описание нестандартных типов данных будут рассмотрены позднее.

 

 

Определение символических констант

 

Часто возникает необходимость использовать в программе именованные константы. Использование символических имен вместо значений делает программу более понятной. Для определения символических констант служит директива препроцессора #define. В начало программы до или после директив #include для каждой константы нужно добавить строку вида:

#define имя значение

 

Например:

#define PI 3.14159

#define RADIUS 16.75

Обратите внимание на прописные буквы в именах констант. По традиции символические константы пишутся прописными буквами в отличие от имен переменных. Конечно, вы можете написать константы и строчными буквами, но при этом вы должны чувствовать свою вину, поскольку нарушаете традицию.

 

 

О п е р а т о р ы

 

Оператор присваивания

 

Оператор служит для присвоения переменной значения и имеет формат:

переменная = выражение;

 

При выполнении оператора вычисляется значение выражения и присваивается переменной.

Примеры:

x = 0.1;

i = i+1;

y = (sin(x)-10)*x;

k = n % 3;

 

Выражение может состоять из операндов - переменных, констант и вызовов функций, круглых скобок и знаков операций + (сложение), - (вычитание), * (умножение), / (деление), % (вычисление остатка от целочисленного деления), ++ (увеличение на 1), -- (уменьшение на 1) и некоторых других.

Операции *, /, % имеют более высокий приоритет, чем + и -. Операции с одинаковым приоритетом выполняются слева направо, если нет скобок.

Операндами операции % должны быть значения целого типа, результат тоже целый.

Библиотечные математические функции (объявлены в файле math.h):

abs(x),fabs(x) - вычисляется абсолютное значение x;

atan(x) - вычисляется аpктангенс x;

tan(x) - вычисляется тангенс x (x задается в радианах);

acos(x) - вычисляется аpккосинус x;

cos(x) - вычисляется косинус x (x задается в радианах);

asin(x) - вычисляется аpксинус x;

sin(x) - вычисляется синус x (x задается в радианах);

exp(x) – число e ≈2.7 возводится в степень x;

log(x) - вычисляется натуральный логарифм x;

log10(x) - вычисляется десятичный логарифм x;

__

sqrt(x) - вычисляется Öx;

pow(x,y) - x возводится в степень y.

 

Функция abs() возвращает целое значение типа int, аргумент также должен быть целым. Остальные функции возвращают вещественное (double) значение при вещественных аргументах (типа double).

При использовании указанных функций в программу нужно включить директиву #include <math.h>. Если этого не сделать, компилятор не сможет проверить правильность вызова функций и выполнить необходимые преобразования типов. В следствие чего вы можете получить неверные результаты.

 

Оператор-выражение

 

В языке Си любое выражение, заканчивающееся точкой с запятой “;”, является оператором.

Примеры:

i++; /* увеличение значения i на 1, эквивалентно оператору i=i+1; */

i--; /* уменьшение i на 1 */

a+2; /* смысла не имеет, хотя синтаксически верно */

Примечание. Рассмотренный выше оператор присваивания является частным случаем оператора-выражения, поскольку в выражениях можно использовать операцию присваивания “=” наравне с другими.

 

Оператор вызова функции

 

Оператор вызова функции имеет вид:

имя_функции (аргумент1,..., аргументN);

Он тоже является частным случаем оператора-выражения.

Примерами операторов вызова функции являются уже знакомые вам операторы вызова функций форматированного ввода/вывода printf() и scanf() (см. cтр. 26). Рассмотрим эти функции детальнее.

 

Использование функции printf()

 

Функция printf() служит для вывода на экран монитора сообщений, данных, результатов вычислений. Число аргументов - один или более.

Первый аргумент функции - это форматная строка, которая может содержать тексты, подлежащие выводу на экран, управляющие символы, форматы вывода значений переменных или выражений. Остальные аргументы - это переменные или выражения. Вернемся к примеру программы на стр.26.

В операторе

printf ("Задайте два числа: ");

аргумент только один - форматная строка, содержащая текст. В операторе

printf ("%d + %d = %d\n", a, b, a+b);

четыре аргумента. Первый аргумент - форматная строка (строка символов в кавычках) показывает, как должны быть напечатаны значения остальных аргументов (a, b, а+b). Каждому из аргументов a, b и a+b соответствует одна спецификация преобразования (формат) %d. Это спецификация вывода целого числа. Кроме форматов, форматная строка содержит последовательности символов " + ", " = ", которые нужно вывести, и управляющий символ '\n' (перевод строки), чтобы после вывода результата курсор переместился в начало следующей строки.

Функция printf выводит на экран то, что указано в форматной строке, подставляя вместо каждого формата значение очередного аргумента из списка. Число форматов должно быть равно числу аргументов после форматной строки. Не забудьте это основное требование!

Ниже приведены некоторые форматы:

%d - для вывода целого числа со знаком (типов int, short);

%ld - для вывода целого числа со знаком (типа long);

%u - для вывода целого числа без знака (типа unsigned);

%f - для вывода вещественного числа (типов float, double) в формате

числа с фиксированной точкой (с точностью по умолчанию 6 цифр

после точки);

%e - для вывода вещественного числа в экспоненциальном формате:

[-]d.dddddde{ }dd (здесь d - десятичная цифра);

%c - для вывода символа;

%s - для вывода строки символов.

 

Например, если число 123.68 вывести в формате %f, то будет напечатано 123.680000, если же указать формат %e, то результатом будет 1.236800e+02. В форматах %f и %e можно указать точность, например:

%.1f 123.7

%.4e 1.2368e+02

 

Использование функции scanf()

 

Функция scanf() предназначена для ввода значений переменных с клавиатуры во время выполнения программы.

Список аргументов этой функции почти такой же, как у функции printf(). Первый аргумент - это форматная строка, содержащая форматы ввода значений переменных. Сами переменные, точнее адреса переменных, записываются в списке аргументов после форматной строки.

 

Примеры:

int a,b;

float x,y;

double z;

scanf ("%d %d", &a, &b);

scanf ("%f %e %lf", &x, &y, &z);

 

При выполнении первого оператора scanf() будут прочитаны вводимые пользователем с клавиатуры два целых числа и присвоены переменным a и b. При втором вызове функции scanf() будут введены три вещественных числа и присвоены соответственно переменным x, y и z.

Числа во входном потоке могут разделяться либо пробелами, либо символами "новой строки", либо символами табуляции. Например, входной поток может выглядеть так:

-52 1374

0.5 -17.472

345678.7654

 

Тогда результат выполнения операторов scanf() будет такой:

a=-52; b=1374; x=0.5; y=-17.472; z=345678.7654.

Функция scanf() использует практически тот же набор форматов, что и функция printf(). Основные отличия в случае функции scanf() следующие:

1. Формат %hd служит для ввода коротких целых чисел (типа short).

2. Форматы %f и %e эквивалентны и используются для ввода чисел типа float. Обе спецификации допускают наличие (или отсутствие) знака, строки цифр с десятичной точкой или без нее и поля показателя степени.

3. Форматы %lf и %le определяют тип вводимых данных как double.

 

Составной оператор

 

Составной оператор состоит из одного или большего числа операторов любого типа, заключенных в фигурные скобки.

 

Пример:

{ x=1; y=2; z=3; }

 

Оператор цикла while

 

Оператор цикла служит для многократного выполнения одних и тех же действий. Оператор while используется при программировании циклов с предусловием:

 
 

Формат оператора while: while (условие)

Оператор

 

Оператор while выполняется так, как изображено на схеме. Проверяется условие; если оно истинно, то выполняется оператор, входящий в состав while (так называемое "тело цикла"). Затем снова проверяется условие... Тело цикла будет выполняться до тех пор, пока условие не станет ложным. Затем управление передается следующему оператору программы.

Обратите внимание, что тело цикла - это один оператор: либо простой, либо составной. Если в цикле должны выполняться несколько операторов, заключите их в фигурные скобки.

Условие - это выражение, которое кроме арифметических операций может содержать операции отношения:

> больше,

>= больше или равно,

< меньше,

<= меньше или равно,

== равно,

!= не равно.

 

Пример оператора:

while (i<=n)

{ s=s+i/(i+1); i++; }

 

Пример решения задачи

 

Задача. Дано действительное число x. Вычислить значение sinx с помощью ряда:

 

x 3 x 5 x2n+1

y = sinx = x - + -... + (-1) n ——— +...

3! 5! (2n+1)!

 

с точностью 10 -5 (т.е. учитывая только те члены ряда, которые по абсолютной величине больше либо равны 10-5). Для проверки результата вычислить sinx с помощью стандартной функции.

 

Если при вычислении очередного члена ряда отдельно вычислять числитель и знаменатель, где значения могут быть очень большие, то получится слишком большая погрешность. Поэтому выведем рекуррентную формулу вычисления очередного члена ряда через предыдущий член.

 

Обозначим очередной член данного ряда через an.

 

a0 = x

 

x3 x2

a1= - — = -a0* ——

3! 2*3

 

x5 x2

a2= + — = -a1 * ——

5! 4*5

 

...

 

x2

an = -an-1 * ————

2n(2n+1)

Поскольку для вычисления очередного члена ряда нужно знать только значение предыдущего члена, а все суммируемые значения хранить нет необходимости, то массив не нужен. Достаточно одной простой переменной для вычисления очередного члена ряда. Назовем ее a.

 

       
   
 
 
 


Программа:

 

/* Приближенное вычисление y=sin x */

#include <stdio.h>

#include <math.h>

#define E 1e-5 /* точность вычисления */

 

main()

{

float x, /* аргумент функции */

y; /* сумма ряда */

float a; /* очередной член ряда */

int n; /* номер итерации */

 

printf ("x=");

scanf ("%f",&x);

y=0; a=x; n=0;

while (fabs(a) >= E)

{ y=y+a;

n++; /* n=n+1; */

a=-a*x*x/(2*n*(2*n+1)); /* выч-е очередного члена ряда

через предыдущий */

}

printf ("y=%f\n",y);

printf ("sinx=%f\n",sin(x));

}

 

 

Примеры результатов выполнения программы:

x=3.14159

y=0.000002

sinx=0.000003

 

x=0

y=0.000000

sinx=0.000000

 

x=1.5708

y=1.000004

sinx=1.000000

 

x=-1.5708

y=-1.000004

sinx=-1.000000

 

Отладка программы в TURBO C или Borland C++

 

1. Запустите систему и введите текст своей программы, соблюдая ступенчатую запись.

 

2. Выполните компиляцию программы.

При компиляции могут быть обнаружены синтаксические ошибки в программе. В таком случае в окне Message появятся сообщения об ошибках с указанием номеров строк программы, где обнаружены ошибки. В программе будет выделена первая неверная строка, а курсор укажет на предполагаемое местоположение ошибки в программе. Исправьте ошибки и повторите компиляцию.

 

3. После исправления всех синтаксических ошибок сохраните программу в файле на диске, указав какое-либо имя с расширением.с.

 

4. Запустите программу на выполнение.

По запросу программы введите тестовые исходные данные. Проверьте результат. Если результаты оказались неверными, проверьте программу. После редактирования программы повторите действия с пункта 2.

Если программа зациклилась, попытайтесь прервать ее выполнение с помощью одновременного нажатия клавиш [Ctrl] и [Break]. Если это сделать не удалось, снимите задачу, снова запустите систему и откройте файл со своей программой.

Если причина ошибки не понятна, выполните трассировку программы на компьютере с помощью команд меню Run и Trace into (F7) или Steep over (F8). Эти команды вызывают выполнение одной выделенной строки программы. При этом можно проследить, как меняются значения поременных программы. Для этого служит окно Watch. Чтобы добавить в окно Watch интересующую вас переменную, нажмите одновременно клавиши [ Ctrl ] и [ F7] и введите имя переменной, затем нажмите [Enter].

Прервать выполнение программы при трассировке можно нажатием клавиш [ Ctrl ] - [ F2 ] или выполнив команды меню Run и Program reset.

 

Контрольные вопросы и упражнения

1. Для чего служит директива препроцессора #include <stdio.h>?

2. Какое имя должна иметь главная функция программы?

3. Как описать целочисленную переменную n?

4. Выберите правильные варианты описания вещественной переменной x:

а) int x;

б) float x;

в) char x;

г) double x;

д) long x;

 

5. Для чего служит директива препроцессора #define?

6. Как можно иначе записать оператор n = n+1;?

7. Какое значение будет иметь переменная k после выполнения следующих операций?

int k=0;

k--;

 

8. Как ввести с клавиатуры значение переменной n типа int? Какой из ответов верный:

а) scanf (n);

б) scanf (“%d”,n);

в) scanf (“%d”,&n);

г) scanf (“%f”,n);

д) scanf (“%f”,&n);

 

9. Для чего служит функция printf()? Определите результат выполнения фрагмента программы:

int x=-2;

printf (“%d \n %d”, x*x, abs(x));

 

10. Как записывается и для чего нужен составной оператор?

11. Как изображается и программируется на языке Си циклическая структура с предусловием?

12. Определите результат выполнения фрагмента программы:

int s = 0, n = 1;

while (n < 5)

{ s = s + n; n++; }

printf (“Результат:%d”, s);

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-27 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: