Лабораторная работа №1
Вид программ на С
Существует 32 ключевых слова, при помощи которых создаются программы на языке С. Все ключевые слова С записываются строчными буквами. В С прописные и строчные буквы различаются: else – ключевое слово, а ELSE – нет. Ключевое слово не может быть использовано в каких-либо других целях в С-программах. Таким образом, оно не может служить в качестве имени переменной или функции.
Все С-программы содержат одну или более функций. Единственная функция, которая всегда должна присутствовать, называется main() (в программах на С++ это не обязательно), и она является первой функцией, получающей управление. Хотя main() не является частью языка, тем не менее, она трактуется часть. Не следует пытаться использовать main как, например, имя переменной.
Типичный вид С-программ
глобальные объявления возвращаемый_тип main(список параметров) { последовательность операторов } возвращаемый_тип f1(список параметров) { последовательность операторов } . . . возвращаемый_тип fN(список параметров) { последовательность операторов } |
Операторы манипулируют переменными и константами и тем самым образуют выражения. Все они базовые элементы языков С и С++.
Библиотеки и компоновка
Крайне редко программа на С состоит только из операторов написанных программистом, поскольку стандартный С не предоставляет методов выполнения ввода-вывода.
Язык С определяет стандартные библиотеки, предоставляющие функции, выполняющие наиболее типичные задачи.
Для пользования какой-либо библиотекой её нужно подключить. Для этого используются команды препроцессора. Например:
#include <stdio. h>
подключает библиотеку ввода-вывода,
#include <math. h>
библиотеку математических функций.
Библиотека функций ввода-вывода включает, в частности функции вывода на консоль printf() и ввода с консоли scanf().
Функция printf( ) имеет следующий прототип
int printf(const char *форматная строка, …);
Таблица 1
Код %c %d %i %e %E %f %g %G %o %s %u %x %X %p %n %% | Формат Символ Знаковое десятичное целое число Знаковое десятичное целое число Научная нотация (e – строчная) Научная нотация (E – прописная) Десятичное число с плавающей точкой Использует или %e, или %f, соответствующее более короткому представлению Использует или %E, или %f, соответствующее более короткому представлению Беззнаковое восьмеричное число Строка символов Беззнаковое десятичное число Беззнаковое шестнадцатиричное число (строчные буквы) Беззнаковое шестнадцатиричное число (прописные буквы) Вывод указателя Ассоциированный аргумент – это указатель на целое, в которое записывается число уже выведенных символов Выводит знак % |
Пример (вывод чисел)
#include <stdio. h>
int main(void)
{
double f;
for(f=1.0; f<1.0e+10; f=f*10)
printf("%g ", f);
getchar();
unsigned int num;
for(num=0; num<255; num++) {
printf("%o ", num);
printf("%x ", num);
printf("%X ", num);
}
getchar();
}
Стандартный ввод с консоли, как правило, осуществляется с помощью scanf(). Она читает все стандартные типы данных и автоматически преобразует числа к правильному внутреннему формату. Стандартный вид scanf() следующий:
int scanf(const char * форматная_строка, …);
форматная_строка определяет способ чтения значений в переменные, на которые указывает список аргументов. Форматная строка состоит из трёх типов символов:
- Спецификаторы формата
- Специальные символы
- Стандартные символы
Функция scanf() возвращает число введённых полей. Она возвращает EOF, если обнаруживается преждевременный конец файла.
Спецификаторы формата перечислены в таблице 2.
Таблица 2
Код %c %d %i %e %f %lf %g %o %s %x %p %n %u %[] | Значение Читает одиночные символы Читает десятичное число Читает десятичное число Читает число с плавающей запятой Читает число с плавающей запятой Читает число с плавающей запятой двойной точности Читает число с плавающей запятой Читает восьмеричное число Читает строку Читает шестнадцатеричное число Читает указатель Получает целочисленное значение, равное числу прочитанных символов Читает беззнаковое целое Сканирует множество символов |
В scanf( ) следует передавать адреса. Это означает, что все аргументы должны быть указателями на переменные. Например, для чтения целого в переменную count надо использовать следующий вызов scanf():
scanf(“%d”, &count);
Библиотека математических функций содержит в частности функции sin(), cos(), tan(), pow(). Первые три функции имеют один аргумент и возвращают значения функций синуса, косинуса и тангенса соответственно, четвёртая функция имеет два аргумента – основание a и показатель степени b и возвращает значение функции ab.
Идентификаторы
Имена, использующиеся для переменных, функций, меток и других определяемых пользователем объектов, называются идентификаторами. Идентификаторы могут состоять как из одного, так и из нескольких символов. Тем не менее в С только первые 31 символ являются значимыми. (В С++ - все символы значимые.) Первым символом должна быть буква или знак подчёркивания, а за ним могут стоять буквы, числа или знак подчеркивания.
Идентификатор не может совпадать с ключевым словом С и не должен иметь тоже имя, что и функция, уже содержащаяся в библиотеке С.
Типы данных в С и С++
Имеется 5 базовых типов данных в С: символьный, целочисленный, вещественный с ординарной точностью, вещественный с двойной точностью и void. Значения типа char используются для хранения ASCII-кодов или любых 8-битных величин. Переменные типа int используются для хранения целых величин. Переменные типа float и double содержат вещественные числа.
Тип void имеет три назначения. Первое – указание о невозвращении значения функцией. Второе – указание о неполучении параметров функцией. Третье – создание нетипизированных указателей.
С поддерживает несколько других типов, включая структуры, объединения, битовые поля, перечисления и типы, определяемые пользователем.
С++ содержит дополнительно типы bool и wchar_t. Тип bool принимает булевы значения true и false. Тип wchar_t – для хранения двухбайтных (широких) символов.
Некоторые производители компиляторов поддерживают дополнительные типы данных - __intn, где n число бит (может принимать значения - 8, 16, 32, 64) которые занимает переменная соответствующего типа.
Модификаторы типов
За исключением типа void, основные типы данных могут иметь различные модификаторы. Модификаторы используются для более точного управления ситуацией. Ниже приведён список модификаторов:
signed
unsigned
long
short
Модификаторы signed, unsigned, long и short могут применяться к целочисленным типам. К символам можно применять signed и unsigned. long может применяться к типу double.
Использование signed для целочисленных типов является избыточным (но допустимым), поскольку объявление целочисленных типов по умолчанию предполагает знаковое число.
Различие между знаковыми и беззнаковыми целочисленными типами заключается в способе интерпретации старшего бита. Если использовать знаковый тип, то компилятор генерирует код, предполагающий, что старший бит используется как знак числа. Если знаковый бит равен 0, то число положительное, а если 1 – отрицательное. Ниже приведены простые примеры:
127 в двоичном представлении:
-127 в двоичном представлении:
знаковый бит
Следует предупредить, что фактически все компьютеры используют дополнительную арифметику, что приводит к представлению -127 в виде, отличном от приведённого примера.
Знаковые числа важны для многих алгоритмов, но они могут вмещать только половину значений, которые могут вмещать их беззнаковые собратья. Например, 32767 выглядит следующим образом:
Если старший бит установлен в 1, то число будет интерпретироваться как -1. Если же объявить его как unsigned short int, то, если старший бит установлен, число будет содержать 65535.
Модификаторы доступа
С имеет 2 типа модификаторов, которые используются для контроля за способом доступа или модификации переменных. Эти модификаторы называются const и volatile.
Переменные типа const не могут изменяться во время выполнения программы. Например:
const int a;
создаст целочисленную переменную, называемую а, которая не может быть модифицирована в программе. Она может использоваться в других типах выражений. Она может использоваться в других типах выражений. Переменная с модификатором const получает своё значение или при инициализации, или каким-либо аппаратно-зависимым способом. Например, нижеприведённая строка присваивает count значение 100:
const int count = 100;
Помимо инициализации константа не может быть модифицирована программой.
Модификатор volatile используется для сообщения компилятору о возможности изменения значения способами, не определёнными в программе. Это важно, поскольку компилятор автоматически оптимизирует некоторые выражения, делая предположения, что содержимое переменных не изменяется в выражениях. Также некоторые виды оптимизации могут изменять порядок вычисления выражений во время процесса компиляции. Модификатор volatile предотвращает возникновение данных изменений.
Возможно использование этих модификаторов вместе. Например, если предполагается, что 0х30 является адресом порта, содержимое которого изменяется внешним устройством, то следующее объявление предохранит от побочных эффектов:
const volatile unsigned char *port = 0x30;
Объявление переменных
Все переменные должны объявляется перед использованием. Ниже показана стандартная форма объявления:
тип список_переменных;
Здесь тип должен быть корректным типом данных С, а список_переменных может содержать одно или более имён идентификаторов, разделённых запятыми. Ниже показаны некоторые виды объявлений:
int i, j, k;
short int si;
unsigned int ui;
double balance, profit, loss;
Помните, что в С имя переменной ничего не делает со своим типом.
Имеется три основных места, где объявляются переменные: внутри функций, при определении параметров функции и вне функций. Эти переменные называются соответственно локальными переменными, формальными параметрами и глобальными переменными.
Локальные переменные
Переменные, объявляемые внутри функций, называются локальными переменными. С локальными переменными могут работать только операторы, находящиеся в блоке, где данные переменные объявлены. Вне этого блока локальные переменные неизвестны. Блок кода начинается с открытия фигурной скобки и заканчивается закрытием фигурной скобки.
Пример
void f(void)
{
int t;
scanf(“%d”, &t);
if(t == 1) {
char s[80];
printf(“enter name:”);
gets(s);
puts(s);
}
/* s здесь неизвестна */
}
Поскольку локальные переменные уничтожаются при выходе из функции, в которой они объявлялись, то эти переменные не могут хранить значение между вызовами функций. (Как будет видно, имеется возможность заставить компилятор сохранять значения путём использования модификатора static.)
Формальные параметры
Если функция использует аргументы, то в ней должны объявляться переменные, которые будут принимать значения аргументов. Данные переменные называются формальными параметрами функции. Они ведут себя, как любые другие локальные переменные в функции. Как показано в следующем фрагменте программы, они объявляются в круглых скобках, следующих за именем функции.
int is_in(char *s, char c)
{
while(*s)
if(*s == c) return 1;
else s++;
return 0;
}
Как и с локальными переменными, формальным параметрам можно присваивать значения или использовать их в любых допустимых выражениях С. Даже если эти переменные играют особую роль для некоторых задач по получению значений аргументов, переданных в функцию, то они могут использоваться, как и остальные локальные переменные.
Глобальные переменные
В противоположность локальным переменным глобальные переменные видны всей программе и могут использоваться любым участком кода. Они хранят свои значения на протяжении всей работы программы, Глобальные переменные создаются путём объявления вне функции. К ним можно получить доступ в любом выражении, независимо от того, в какой функции находится данное выражение.
В следующей программе программа count объявлена вне функций. Общепринятым является объявление глобальных переменных в начале программе.
#include <stdio. h>
void func1(void), func2(void);
int count;
int main(void)
{
count = 100;
func1();
return 0;
}
void func1(void)
{
func2();
printf(“count is %d”, count); /* выведет 100 */
}
void func2(void)
{
int count;
for(count=1; count<10; count++)
putchar(‘ ‘);
}
Хотя ни main(), ни func1() не объявляют переменную count, но они оба могут её использовать, func2() объявляет локальную переменную count. Когда func2() обращается к count, она обращается только к локальной переменной, а не к глобальной.
Оператор присваивания
Общий вид оператора присваивания следующий:
имя_переменной = выражение;
где выражение может быть как простой одиночной константой, так и сложной комбинацией переменных, операторов и констант.
Преобразование типов при присваивании
Преобразование типов предназначено для ситуации, в которой переменные одного типа смешиваются с переменными другого типа. Когда возникает подобная ситуация в операторе присваивания, используется следующее правило: значение справа от оператора присваивания преобразуется к типу объекта, стоящего слева.
Константы
Константы в С – это фиксированные значения, которые не могут изменяться программой. Они могут быть любых типов, как показано в таблице
Тип данных | Пример константы |
char int long int short int float double | ‘a’ ‘\n’ ‘9’ 1 35000L -34L 10 -12 90 123.23F 4.34e-3F 123.987654 |
Контрольные вопросы:
1. Какой общий вид программ на языке С?
2. Какие есть основные типы данных на языке С?
3. Какие есть основные типы данных на языке С++?
4. Что такое локальная переменная?
5. Что такое глобальная переменная?
6. Что такое формальный параметр функции?
Задание
Номер варианта | Задание |
1, 10, 19, 28 | Создать программу, производящую вычисления по формуле:
Используйте для переменных сначала тип данных int, потом double. Если в результате вычислений получились расхождения, объясните их. |
2, 11, 20, 29 | Создать программу, производящую вычисления по формуле:
Используйте для переменных сначала тип данных int, потом double. Если в результате вычислений получились расхождения, объясните их. |
3, 12, 21, 30 | Создать программу, производящую вычисления по формуле:
Используйте для переменных сначала тип данных int, потом double. Если в результате вычислений получились расхождения, объясните их. |
4, 13, 22 | Создать программу, производящую вычисления по формуле:
Используйте для переменных сначала тип данных int, потом double. Если в результате вычислений получились расхождения, объясните их. |
5, 14, 23 | Создать программу, вычисляющую площадь поверхности цилиндра с радиусом основания r и высотой h, где эти величины вводятся с клавиатуры при помощи функции scanf(). |
6, 15, 24 | Создать программу, вычисляющую площадь поверхности конуса с радиусом основания r и высотой h, где эти величины вводятся с клавиатуры при помощи функции scanf(). |
7, 16, 25 | Создать программу, вычисляющую площадь поверхности параллелепипеда с длиной а, шириной b и высотой c, где эти величины вводятся с клавиатуры при помощи функции scanf(). |
8, 17, 26 | Создать программу, вычисляющую площадь поверхности сферы с радиусом r, который вводится с клавиатуры при помощи функции scanf(). |
9, 18, 27 | Создать программу, вычисляющую объём шара с радиусом r, который вводится с клавиатуры при помощи функции scanf(). |
Требования к отчету
Отчет должен содержать:
1) конспект теоретической части,
2) лабораторное задание,
3) текст программы (в электронном виде),
4) результаты выполнения программ.


, где a,b вводятся с клавиатуры при помощи функции scanf().
, где a,b вводятся с клавиатуры при помощи функции scanf().
, где a,b вводятся с клавиатуры при помощи функции scanf().
, где a,b вводятся с клавиатуры при помощи функции scanf().