18538

Программирование простейших циклов на языке Си. Работа в системе Turbo С (версия 2.0)

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

Информатика, кибернетика и программирование

Лабораторная работа № 1 Программирование простейших циклов на языке Си. Работа в системе Turbo С версия 2.0 Структура программы Любая программа на языке Си состоит из одной или более функций являющихся основными модулями программы. Функция с которой начи...

Русский

2013-07-08

597.78 KB

7 чел.

Лабораторная работа № 1

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

Работа в системе Turbo С (версия 2.0)

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

Любая программа на языке Си состоит из одной или более "функций", являющихся основными модулями программы. Функция, с которой начинается выполнение программы, всегда носит имя 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); /* вывод результата */

}

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

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

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

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

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

328 + 54 = 382

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

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

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

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

тип_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 */

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

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) и некоторых других.

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

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

Hекотоpые арифметические стандартные функции:

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 возводится в степень x;

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

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

sqrt(x) – вычисляется x (корень квадратный из х).

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

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

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

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

Примеры:

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

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

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

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

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

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

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

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

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

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

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

В операторе

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 используется при программировании циклов с предусловием:

ed

f3

e4

 

Формат оператора while:

while (условие)

оператор

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

Обратите внимание, что тело цикла – это один оператор: либо простой, либо составной.

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

> больше,

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

< меньше,

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

== равно,

!= не равно.

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

while (i<=n)

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

Пример.

 

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

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

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

a0 = x

.

 Программа:

/* Приближенное вычисление 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));

}

Рис.1. Блок-схема алгоритма вычисления y=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

  1.  Запустите систему TURBO C.
  2.   Если окно Edit не пустое, выберите команды меню File | New для создания нового файла.

3. В окне Edit введите текст своей программы, соблюдая ступенчатую запись.После ввода каждой строки нажимайте [Enter].Если заметите ошибки, их легко исправить, вернув курсор в нужную позицию с помощью клавиш управления движением курсора. Работа с редактором Turbo-системы описана на стр.11.

4. Выберите команды меню Compile | Compile для компиляции программы.

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

5. После исправления всех синтаксических ошибок сохраните программу в файле на диске, выполнив команды меню File | Save (или нажав клавишу [F2]).Если на экране появится запрос на изменение имени файла, сотрите NONAME.C (это имя дается вначале всем новым файлам) и введите любое другое имя (идентификатор длиной до 8 символов). Расширение C добавляется к имени автоматически.

Замечание. При многократном сохранении программы сохраняется обычно две последние версии программы: последняя - в файле с расширением C, а предпоследняя - в файле с расширением BAK.

6. Запустите программу на выполнение, выбрав команды меню Run| Run (или нажав одновременно клавиши [Ctrl] и [F9]).

По запросу программы введите тестовые исходные данные. Проверьте результат. Вернуться к экрану с результатами можно, выбрав команды меню Run | User Screen (или нажав одновременно клавиши [Alt] и [F5]).

Для возврата к экрану системы нажмите любую клавишу.

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

Если программа зациклилась, попытайтесь прервать ее выполнение с помощью одновременного нажатия клавиш [Ctrl] и [Break]. Если это сделать не удалось, перезагрузите систему. Если в окне редактирования появится не Ваша программа, выполните команды меню File | Load (можно с помощью клавиши [F3]). На запрос имени файла введите то имя, которое дали файлу при его сохранении. Проверьте и отредактируйте программу и повторите действия с пункта 4.

Порядок выполнения работы.

1. Познакомиться с описанием языка Си и примером программы.

2. Получить у преподавателя индивидуальное задание.

3. Составить схему и программу на языке Си и подобрать тесты для проверки программы на ЭВМ.

4. Отладить программу на компьютере и показать результаты тестирования преподавателю.

5. Оформить и сдать отчет по лабораторной работе.

Задания.

1) Дано действительное число x. Вычислить значение y с помощью стандартной функции и с помощью ряда с точностью 0,0001:

1. 

2. 

3. , где │х<1.

4. 

5. 

6. 

7. 

8. 

9. 

10. , где x>0

11. , где |x|<1

12. , где |x|≤1

13. , где |x|>1

14. , где 0 < x ≤2

15. , где  x > 0.5

2) Дано натуральное число n. Проверить справедливость равенства:

16. 1+2+3++n =

17. 12+22+32++n2 =

18. 1+2+22+2n-1=2n-1

3) Дано натуральное число n.

19. Определить количество цифр в числе n.

20. Определить сумму его цифр.

21. Определить первую цифру числа n.


 

А также другие работы, которые могут Вас заинтересовать

67550. Выбор типа и параметров двигателя, передаточного и усилительно-преобразовательного устройств. Выбор типа электродвигателя 56 KB
  В простейших случаях тип двигателя совпадает с видом напряжения сети. При использовании усилительно-преобразовательного устройства в случае сети постоянного тока применяется мостовая схема четыре силовых электронных ключа и широтно-импульсная модуляция для питания двигателя постоянного тока или инвертор...
67551. СОСТОЯНИЯ МИКРОСИСТЕМ. ПОСТУЛАТЫ КВАНТОВОЙ МЕХАНИКИ 136 KB
  Всякая физическая теория изучает определенный класс физических систем. Одно из основных понятий любой физической теории понятие состояния физической системы которое задается переменными состояния. а Если заданы переменные состояния в некоторый фиксированный момент времени то мы имеем максимально...
67552. СОСТОЯНИЯ МИКРОСИСТЕМ. ПОСТУЛАТЫ КВАНТОВОЙ МЕХАНИКИ (ПРОДОЛЖЕНИЕ) 593.5 KB
  Разные собственные векторы при фиксированном Al автоматически не являются взаимно ортогональными. Но их всегда можно ортогонализовать процедурой Шмидта, а кроме того, их можно и нормировать.
67553. ВОЛНОВАЯ ФУНКЦИЯ ЧАСТИЦЫ. УРАВНЕНИЕ ШРЕДИНГЕРА 317.5 KB
  Здесь множитель i выделен для удобства (чтобы было = - см. ниже), а - некоторый дифференциальный оператор, не включающий производных по времени. Он должен быть линейным, чтобы соблюсти принцип суперпозиции.
67554. А-ПРЕДСТАВЛЕНИЕ КВАНТОВОЙ МЕХАНИКИ 642 KB
  Здесь предполагается, что спектр оператора - невырожденный. Если есть вырождение, то нужен еще один индекс, связанный с необходимостью введения по крайней мере еще одного оператора, коммутирующего с . Тогда строим базис из общих собственных векторов операторов и (см. лекцию 2):
67555. СООТНОШЕНИЯ НЕОПРЕДЕЛЕННОСТЕЙ 611.5 KB
  Зависимость от времени можно ввести в квантовую механику разными способами. До сих пор мы пользовались картиной Шредингера в которой считается что всю зависимость от времени несут векторы состояния волновые функции а в операторы наблюдаемых она может входить лишь в исключительных...
67556. ЗАКОНЫ СОХРАНЕНИЯ 488.5 KB
  В картине Шредингера затруднительно сразу сказать, что такое сохраняющаяся физическая величина, так как операторы наблюдаемых обычно вообще от времени не зависят. Приходится исхитряться (см. ниже). А в картине Гейзенберга все ясно.
67557. НОРМИРОВКА В НЕПРЕРЫВНОМ СПЕКТРЕ 299 KB
  Классическому инфинитному движению отвечают состояния с обобщенными волновыми функциями которые нельзя нормировать а энергетический спектр является непрерывным. Возникает проблема нормировки волновых функций непрерывного спектра. Реально же на самом деле спектр всегда является дискретным так как...
67558. ГАРМОНИЧЕСКИЙ ОСЦИЛЛЯТОР 773 KB
  Мы получили, что волновые функции стационарных состояний осциллятора являются или четными или нечетными. Оказывается, этот результат можно было предсказать заранее, не решая задачу. Сделаем в этой связи отступление, которое представляет и значительный самостоятельный интерес.