Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Лабораторная работа №2
Программирование ветвящихся алгоритмов.
Введение
Данная работа предназначена для отработки базовых навыков по темам спецификаторы хранения, условные операторы и оператор выбора.
Теоретические сведения
Спецификаторы хранения
Имеется 4 спецификатора хранения, поддерживаемые в С. Это
extern
static
register
auto
Они говорят компилятору, как должны храниться переменные. Спецификаторы предшествуют объявлению переменной. В общем случае это выглядит так:
спецификатор_хранения тип имя_переменной;
extern
Поскольку С позволяет выполнять раздельную компиляцию модулей для большой программы, в целях ускорения компиляции и помощи управлению большими проектами, должны быть способы передачи информации о глобальных переменных файлам программы. Решение заключается в объявлении всех глобальных переменных в одном файле и использовании при объявлении в других файлах слова extern.
Таблица 1
Файл 1 |
Файл 2 |
int x, y; char ch; int main(void) { . . . } void func1(void) { x = 23; } |
extern int x, y; extern char ch; void func22(void) { x = y/10; } void func23(void) { y = 10; } |
Имеется другой вариант использования extern. Когда используется глобальная переменная внутри функции, находящейся в том же файле, где происходит объявление глобальной переменной, то можно объявлять её как extern.
static
Статические переменные являются долговременными переменными, существующими на протяжении функции или файла. Они отличаются от глобальных переменных, поскольку не известны за пределами функции или файла, но могут хранить свои значения между вызовами.
Статические локальные переменные
Когда static применяется к локальной переменной, это приводит к тому, что компилятор создаёт долговременную область для хранения переменной почти таким же способом, как это делается для глобальной переменной. Ключевое различие между статической локальной и глобальной переменными заключается в том, что статическая локальная переменная остаётся известной только в том блоке, в котором она была объявлена.
Примером функции, требующей использования статических локальных переменных, является генератор последовательности чисел, создающий новое число, основываясь на старом.
int series(void)
{
static int series_num;
series_num = series_num+23;
return(series_num);
}
В данном примере переменная series_num существует между вызовами функций вместо того, чтобы каждый раз создаваться и уничтожаться как обычная локальная переменная. Это означает, что каждый вызов series( ) может создать новый член серии, основываясь на последнем члене без глобального объявления переменной.
Статические глобальные переменные
Когда оператор static применяется к глобальной переменной, он сообщает компилятору о необходимости создания глобальной переменной, которая будет известна только в файле, где она объявлена. Это означает, что, даже если переменная является глобальной, другие подпрограммы в других файлах не будут знать о ней. Таким образом, не возникает побочных эффектов.
auto
Спецификатор auto может быть задан только при определении объектов блока, например, в теле функции. Этим объектам память выделяется при входе в блок и освобождается при выходе из него. Вне блока объекты класса auto не существуют.
register
Спецификатор register просит, чтобы компилятор сохранил переменную способом, позволяющим осуществлять наибыстрейший доступ. Для целых чисел и символов это обычно подразумевает размещение не в памяти, а в регистрах процессора. Для других типов переменных компилятор может использовать другие способы для уменьшения времени доступа. Компилятор может просто проигнорировать данную просьбу.
Нельзя применять register к глобальным переменным. Также, поскольку регистровая переменная может быть сохранена в регистре процессора, нельзя получить адрес регистровой переменной. (Данное ограничение присутствует только в С, но не в С++.)
Пример 1.
#include <stdio.h>
float pi=3.141593;
int s0;
int s2=5;
int main()
{
extern int s0;
extern char s1;
int s2(4);
// Инициализация по умолчанию:
printf("\n s0=%d", s0);
// Явная инициализация:
printf("\n s1=%c", s1);
// Внутренняя переменная
printf("\n s2=%d", s2);
// Внешняя переменная
printf("\n pi = %f", pi);
getchar();
return 0;
}
char s1='@';
//Конец программы
Условный оператор if
Синтаксис полной формы условного оператора:
if ( логическое выражение ) оператор1;
else оператор2;
Если логическое выражение истинно, т.е. не равно нулю, то выполняется оператор1, иначе выполняется оператор2.
Синтаксис сокращенной формы условного оператора:
if ( логическое выражение ) оператор;
Оператор выполняется только в том случае, если логическое выражение не равно нулю, т.е. истинно.
Под логическим выражением понимается совокупность операций отношений и логических операций. Основные логические операции приведены в табл.2.
Основные логические операции
Операция |
Значение |
Пример |
! |
Логическое НЕ |
!EOF |
= = |
Равно |
value==0 |
!= |
Не равно |
value!=0 |
< |
Меньше |
i<count |
> |
Больше |
i>count |
> = |
Больше или равно |
i>=count |
< = |
Меньше или равно |
i<=count |
|| |
Логическое ИЛИ |
!a || b |
&& |
Логическое И |
a>8 && c<5 |
Часто, каждая из альтернативных возможностей оператора if требует выполнения более одного оператора. В этом случае необходимо заключить группу операторов в фигурные скобки { }.
Список операторов, заключенный в фигурные скобки, называется блоком.
Оператор множественного выбора
Когда необходимо выбрать один из нескольких вариантов, можно воспользоваться конструкцией if else if…else или оператором множественного выбора switch.
Синтаксис оператора switch:
switch ( выражение )
{
case константное выражение: оператор или группа операторов;
break;
case константное выражение: оператор или группа операторов;
break;
case константное выражение: оператор или группа операторов;
break;
. . . . . . . .
defaulf: оператор или группа операторов;
}
Результат вычисленного выражения сравнивается с каждым из константных выражений. Если находится совпадение, то управление передается оператору, связанному с данным case. Исполнение продолжается до конца тела оператора switch или пока не встретится оператор break, который передает управление из тела switch оператору, следующему за switch. Оператор или группа операторов, стоящий после default, выполняется, если выражение не соответствует ни одному из константных выражений в case.
Константные выражения должны быть целого или символьного типа. Если нескольким константным выражениям соответствует один и тот же оператор, то возможна следующая запись:
switch выражение
{
case константное выражение:
case константное выражение:
case константное выражение: оператор или группа операторов;
break;
};
Пример 2
Данная программа решает линейное уравнение с действительными коэффициентами. Коэффициенты должны вводиться в виде десятичной записи, точность решения определяется типом данных double.
#include <stdio.h>
int main()
{
double a,b;
printf("Programm solve equation a*x+b=0.\n");
printf("Enter coef a ");
scanf("%lf", &a);
printf("Enter coef b ");
scanf("%lf", &b);
printf("You enter a=%e, b=%e\n", a, b);
if(a==0){
if(b==0) printf("Root is any value\n");
else printf("Haven't root\n");
}
else printf("Root is %lf\n", -b/a);
getchar();
return 0;
}
Задание.
Создать текст программы из примера №1, откомпилировать программу и разобраться в том, какие переменные относятся к какому классу памяти. Согласно таблице 3 выбрать нужный вариант и разработать программу.
Таблица 3
Номер варианта |
Задание |
1, 9, 17, 25 |
Создать программу, определяющую действительные корни квадратного уравнения, если они существуют. Коэффициенты должны вводиться с клавиатуры. |
2, 10, 18, 26 |
Создать программу, вычисляющую площадь треугольника по формуле , где p полупериметр треугольника, a,b,c длины сторон треугольника. Длины сторон должны вводиться с клавиатуры. Программа должна обрабатывать, в том числе, и некорректно введённые данные. |
3, 11, 19, 27 |
Создать программу, выдающую по номеру дня недели его название (нумерация начинается с понедельника). |
4, 12, 20, 28 |
Создать программу, выдающую по номеру месяца название сезона, к которому он относится. |
5, 13, 21, 29 |
Создать программу, находящую решения линейной системы уравнений с вещественными коэффициентами. Коэффициенты вводить с клавиатуры. |
6, 14, 22, 30 |
Создать программу, вычисляющую значение по формуле . Значения переменных вводить с клавиатуры. Программа должна обрабатывать, в том числе, и некорректно введённые данные. |
7, 15, 23, 31 |
Пусть две прямые задаются в виде y=a*x+b. Разработать программу определяющую пересекаются ли эти прямые и в каких точках. Значения переменных вводить с клавиатуры. |
8, 16, 24, 32 |
Разработать программу, которая выводит в порядке возрастания три числа вводимых с клавиатуры. |
Требования к отчету
Отчет должен содержать: