Лабораторная работа 1
//---------------------------------------------------------------------------
#include <stdio.h>
//---------------------------------------------------------------------------
#define I 555
#define R 5.5
#pragma argsused
int main(int argc, char* argv[])
{
printf("Zakon Oma: U=I*R\n");
printf("I = %d; R = %f\n",I,R);
printf("U = %f\n",I*R);
return 0;
}
//---------------------------------------------------------------------------
Комментарии
Комментарии могут быть двух типов:
8 /*Комментарий*/ – комментарием являются все символы, заключенные между символами «/*» и
«*/» (т.е. независимо от количества строк).
9 //Комментарий – комментарием являются все символы, начиная от символов «//» и до конца
текущей строки.
Типы и описания
Каждое имя и каждое выражение имеет тип, определяющий операции, которые могут над ними
производиться. Например, описание
int inch;
определяет, что inch имеет тип int, то есть, inch является целой переменной.
Описание - это оператор, который вводит имя в программе. Описание задает тип этого имени. Тип
определяет правильное использование имени или выражения. Для целых определены такие операции, как +,
-, * и /. После того, как включен файл stream.h, объект типа int может также быть вторым операндом <<,
когда первый операнд ostream.
Тип объекта определяет не только то, какие операции могут к нему применяться, но и смысл этих операций.
В C++ есть несколько основных типов и несколько способов создавать новые. Простейшие виды типов C++
описываются в следующих разделах, а более интересные оставлены на потом.
Основные типы
Основные типы, наиболее непосредственно отвечающие средствам аппаратного обеспечения, такие:
char символ (символьный)
short int короткий целый
int целый
long int длинный целый
float вещественный
double двойной вещественный
Первые четыре типа используются для представления целых, последние два - для представления чисел с
плавающей точкой. Переменная типа char имеет размер, естественный для хранения символа на данной
машине (обычно, байт), а переменная типа int имеет размер, соответствующий целой арифметике на данной
машине (обычно, слово). Диапазон целых чисел, которые могут быть представлены типом, зависит от его
размера. В C++ размеры измеряются в единицах размера данных типа char, поэтому char по определению
имеет размер единица. Соотношение между основными типами можно записать так:
1 = sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)
sizeof(float) <= sizeof(double)
В целом, предполагать что-либо еще относительно основных типов неразумно. В частности, то, что целое
достаточно для хранения указателя, верно не для всех машин.
К основному типу можно применять прилагательное const. Это дает тип, имеющий те же свойства, что и
исходный тип, за исключением того, что значение переменных типа const не может изменяться после
инициализации.
const float pi = 3.14;
const char plus = '+';
Символ, заключенный в одинарные кавычки, является символьной константой. Заметьте, что часто
константа, определенная таким образом, не занимает память; просто там, где требуется, ее значение может
использоваться непосредственно. Константа должна инициализироваться при описании. Для переменных
инициализация необязательна, но настоятельно рекомендуется. Оснований для введения локальной
переменной без ее инициализации очень немного.
К любой комбинации этих типов могут применяться арифметические операции:
+ (плюс, унарный и бинарный)
- (минус, унарный и бинарный)
* (умножение)
/ (деление)
Заметьте, что целое деление дает целый результат: 7/2 есть 3. Над целыми может выполняться операция %
получения остатка: 7%2 равно 1.
При присваивании и арифметических операциях C++ выполняет все осмысленные преобразования между
основными типами, чтобы их можно было сочетать без ограничений:
double d = 1;
int i = 1;
d = d + i;
i = d + i;
Производные Типы
Вот операции, создающие из основных типов новые типы:
* указатель на
*const константный указатель на
& ссылка на
[] вектор
() функция, возвращающая
Например:
char* p // указатель на символ
char *const q // константный указатель на символ
char v[10] // вектор из 10 символов
Все вектора в качестве нижней границы индекса имеют ноль, поэтому в v десять элементов: v[0] ... v[9].
Переменная указатель может содержать адрес объекта соответствующего типа:
char c;
// ...
p = &c; // p указывает на c
применяются к целым, и что нет отдельного типа данных для логических действий.
Смысл операции зависит от числа операндов; унарное & является операцией взятия адреса, а бинарное & -
это операция логического И. Смысл операции зависит также от типа ее операндов: + в выражении a+b
означает сложение с плавающей точкой, если операнды имеют тип float, но целое сложение, если они типа
int.
В C++ есть операция присваивания =, а не оператор присваивания, как в некоторых языках. Таким образом,
присваивание может встречаться в неожиданном контексте; например, x=sqrt(a=3*x). Это бывает полезно.
a=b=c означает присвоение c объекту b, а затем объекту a. Другим свойством операции присваивания
является то, что она может совмещаться с большинством бинарных операций. Например, x[i+3]*=4 означает
x[i+3]=x[i+3]*4, за исключением того факта, что выражение x[i+3] вычисляется только один раз. Это дает
привлекательную степень эффективности без необходимости обращения к оптимизирующим компиляторам.
К тому же это более кратко.
В большинстве программ на C++ широко применяются указатели. Унарная операция * разыменовывает
указатель, т.е. *p есть объект, на который указывает p. Эта операция также называется косвенной
адресацией. Например, если имеется char* p, то *p есть символ, на который указывает p. Часто при работе с
указателями бывают полезны операция увеличения ++ и операция уменьшения --. Предположим, p
указывает на элемент вектора v, тогда p++ делает p указывающим на следующий элемент.
Операторы выражения
Самый обычный вид оператора - оператор выражение. Он состоит из выражения, за которым следует точка с
запятой. Например:
a = b*3+c;
cout << "go go go";
lseek(fd,0,2);
Пустой оператор
Простейшей формой оператора является пустой оператор:
Он не делает ничего. Однако он может быть полезен в тех случаях, когда синтаксис требует наличие
оператора, а вам оператор не нужен.
Блоки
Блок - это возможно пустой список операторов, заключенный в фигурные скобки:
{ a=b+2; b++; }
Блок позволяет рассматривать несколько операторов как один. Область видимости имени, описанного в
блоке, простирается до конца блока. Имя можно сделать невидимым с помощью описаний такого же имени
во внутренних блоках.
PROG<INFILE
приведет к тому, что PROG будет читать из файла INFILE, а не с терминала. Переключение ввода делается
таким образом, что сама программа PROG не замечает изменения
Функция getchar возвращает значение EOF, когда она попадает на конец файла, какой бы ввод она
при этом не считывала. Стандартная библиотека полагает символическую константу EOF равной -1
(посредством #define в файле stdio.h), но проверки следует писать в терминах EOF, а не -1, чтобы избежать
зависимости от конкретного значения.
Вывод можно осуществлять с помощью функции putchar(c), помещающей символ 'с' в "стандартный
ввод", который по умолчанию является терминалом. Вывод можно направить в некоторый файл с
помощью обозначения > : если PROG использует putchar, то командная строка
PROG>OUTFILE
#include <stdio.h>
"Функции" isupper и tolower на самом деле являются макросами, определенными в stdio.h . Макрос isupper
проверяет, является ли его аргумент буквой из верхнего регистра, и возвращает ненулевое значение, если
это так, и нуль в противном случае. Макрос tolower преобразует букву из верхнего регистра в ту же букву
нижнего регистра. Независимо от того, как эти функции реализованы на конкретной машине, их внешнее
поведение совершенно одинаково, так что использующие их программы избавлены от знания символьного
набора.
Кроме того отметим, что в стандартной библиотеке ввода/вывода "функции" getchar и putchar на
самом деле могут быть макросами. Это позволяет избежать накладных расходов на обращение к функции
для обработки каждого символа.
Форматный вывод - функция printf
Две функции: printf для вывода и scanf для ввода позволяют преобразовывать численные величины в
символьное представление и обратно. Они также позволяют генерировать и интерпретировать форматные
строки. Мы уже всюду в предыдущих главах неформально использовали функцию printf; здесь приводится
более полное и точное описание. Функция
преобразует, определяет формат и печатает свои аргументы в стандартный вывод под управлением строки
control. Управляющая строка содержит два типа объектов: обычные символы, которые просто копируются
в выходной поток, и спецификации преобразований, каждая из которых вызывает преобразование и печать
очередного аргумента printf.
Строка формата используется при каждом обращении к функциям семейства ...printf для указания того,
как функция должна преобразовать, сформатировать и вывести свои аргументы.
Аргументов не должно быть меньше спецификаторов формата. В противном случае результаты
непредсказуемы и, возможно, катастрофические. Лишние аргументы (сверх количества, требуемого
строкой формата) просто игнорируются.
Строка формата - символьная строка, содержащая объекты двух типов: основные символы и
спецификаторы формата.
12 Основные символы просто копируются в выходной поток без изменений.
13 Спецификаторы формата вызывают применение определяемого ими форматирования к значениям
аргументов перед выводом их в поток.
Спецификаторы формата функций семейства ...printf имеют следующую форму:
c,s,d,i,u Не влияет.
Числовые
g floating-point Значение (с учетом знака) либо в виде e, либо в виде f, исходя из за-
данного значения и точности, причем значение точности определяет
количество значащих цифр. Незначащие нули и десятичная точка вы-
водятся, только если это необходимо. Формат е используется, только если
порядок результата преобразования превышает значение точности или
меньше -4.
Символьные
Указатели
!!! Бесконечные числа с плавающей точкой выводятся как +INF и -INF. Не-Число (в смысле IEEE)
выводится как +NAN или -NAN.
Предостережение: printf использует свой первый аргумент для определения числа последующих
аргументов и их типов. Если количество аргументов окажется недостаточным или они будут иметь
несоответственные типы, то возникнет путаница и вы получите бессмысленные результаты.
Функция возвращает количество выведенных символов или EOF в случае ошибки.
Форматный ввод - функция scanf
Осуществляющая ввод функция scanf является аналогом printf и позволяет проводить в обратном
направлении многие из тех же самых преобразований. Функция
...
return;
Ход работы
30 Ознакомиться с необходимым теоретическим материалом.
31 Запустить Dev C++ Builder.
32 Выбрать команду File->Close all для закрытия проекта по умолчанию.
33 Выбрать команду File->Create->Project… В появившемся диалоговом окне выбрать на вкладке
Basic.
34 Также выбрать C-project (не С++!!!); Console Application и изменить имя проекта таким образом,
чтобы он не содержал русских символов (только латинские и цифры) (глюк среды).
35 В появившемся окне кода проконтролировать наличие тела основной функции.
36 При желании использовать прекомпиляцию файлов заголовков по команде Project->Options…
вкладка Compiler проверить установку параметра Generate Debug Information из набора Linker – он
должен быт включен (Yes) для включения возможности отладки программы встроенным
отладчиком.
37 Выбрать команду File->Save all… и сохранить проект в своей рабочей папке в каталоге С:\Work. Не
пытаться сохранять в папке по умолчанию для избежания нарушения прав доступа! Попытка
сохранения проекта в папках с наличием символов не английского алфавита приведет к
невозможности сборки исполняемого файла (глюк среды).
38 В соответствии с вариантом задания составить и отладить программу.
39 Оформить отчет.
Задание
Составить программу вычисления среднего значения из 10 чисел. Вывести исходные данные и результат с
заданной точностью в виде:
Aishod[arg] = znach;
…
Aishod[arg] = znach;
Rezultat = rez
Где arg – номер числа (целое); znach – его значение (вещественное); rez – результат вычисления
(вещественное).
Варианты задания
Вариант задания рассчитывается по номеру студента в журнале преподавателя.
Вариант Длина rez Точность rez Вариант Длина rez Точность rez
(поле [width]) (поле [.prec]) (поле [width]) (поле [.prec])
1 8 5 15 10 3
2 7 4 16 10 4
3 7 3 17 10 5
4 7 2 18 10 6
5 7 1 19 10 7
6 8 4 20 11 7
7 8 3 21 11 6
8 8 2 22 11 5
9 8 1 23 11 4
10 9 7 24 11 3
11 9 6 25 11 2
12 9 5 26 11 1
13 9 4 27 12 5
14 9 3 28 12 7
Содержание отчета
Отчет должен содержать следующие пункты:
40 Титульный лист с темой работы, номером варианта.
41 Цель работы.
42 Задание по варианту.
43 Блок-схема алгоритма программы.
44 Текст программы с комментариями.
45 Результаты работы программы (контрольный пример).
46 Выводы, отражающие трудности и результаты, достигнутые в ходе работы над программой и
алгоритмом, а также возможный анализ путей альтернативного выполнения поставленной задачи.
Литература
Турбо С++. Начальное руководство
Borland C++. Руководство программиста
Керниган Б.В. , Ричи Д.М. Язык С.
Марченко А.Л. C++. Бархатный путь
Бьярн Страустрап Введение в язык Си++
Бьярн Страустрап Справочное руководство по Си++
Borland C++ Builder