Содержание работы или список заданий
|
Лабораторная работа №1.
"Знакомство с Си++. Выполнение программы простой структуры"
Цель: Знакомство со средой программирования, создание, отладка и выполнение простой программы, содержащей ввод/вывод информации и простейшие вычисления.
1. Краткие теоретические сведения
Язык Си создан в 1972 г. Деннисом Ритчи при разработке ОС Unix. Он проектировался как инструмент системного программирования с ориентацией на разработку хорошо структурированных программ. Таким образом он сочетает в себе, с одной стороны, средства языка программирования высокого уровня: описание типов данных, операторы for, while, if и т. д. , а , с другой стороны, содержит средства языка типа Ассемблер : регистровые переменные, адресную арифметику, возможность работы с полями бит и т. д.
1.1. Структура программы
Программа на языке Си имеет следующую структуру:
#директивы препроцессора
. . . . . . . . .
#директивы препроцессора
функция а ( )
операторы
функция в ( )
операторы
void main ( ) //функция, с которой начинается выполнение программы
операторы
описания
присваивания
функция
пустой оператор
составной
выбора
циклов
перехода
Директивы препроцессора - управляют преобразованием текста программы до ее компиляции. Исходная программа, подготовленная на языке Си в виде текстового файла проходит 3 этапа обработки:
1) препроцессорное преобразование текста;
2) компиляция;
3) компоновка (редактирование связей или сборка).
После этих 3 этапов формируется исполняемый машинный код программы.
Задача препроцессора - преобразование текста программы до ее компиляции. Правила препроцессорной обработки определяет программист с помощью директив препроцессора. Директива начинается с #. Например,
1) #define - указывает правила замены в тексте.
#define ZERO 0.0
Означает , что каждое использование в программе имени ZERO будет заменяться на 0.0.
2) #include< имя заголовочного файла> - предназначена для включения в текст программы текста из каталога «Заголовочных файлов», поставляемых вместе со стандартными библиотеками. Каждая библиотечная функция Си имеет соответствующее описание в одном из заголовочных файлов. Список заголовочных файлов определен стандартом языка. Употребление директивы include не подключает соответствующую стандартную библиотеку, а только позволяют вставить в текст программы описания из указанного заголовочного файла. Подключение кодов библиотеки осуществляется на этапе компоновки, т. е. после компиляции. Хотя в заголовочных файлах содержатся все описания стандартных функций, в код программы включаются только те функции, которые используются в программе.
После выполнения препроцессорной обработки в тексте программы не остается ни одной препроцессорной директивы. Программа представляет собой набор описаний и определений, и состоит из набора функций. Среди этих функций всегда должна быть функция с именем main. Без нее программа не может быть выполнена. Перед именем функции помещаются сведения о типе возвращаемого функцией значения ( тип результата). Если функция ничего не возвращает, то указывается тип void: void main ( ). Каждая функция, в том числе и main должна иметь набор параметров, он может быть пустым, тогда в скобках указывается (void).
За заголовком функции размещается тело функции. Тело функции - это последовательность определений, описаний и исполняемых операторов, заключенных в фигурные скобки. Каждое определение, описание или оператор заканчивается точкой с запятой.
Определения - вводят объекты (объект - это именованная область памяти, частный случай объекта - переменная), необходимые для представления в программе обрабатываемых данных. Примером являются
int y = 10 ; //именованная константа
float x ; //переменная
Описания - уведомляют компилятор о свойствах и именах объектов и функций, описанных в других частях программы.
Операторы - определяют действия программы на каждом шаге ее исполнения.
1.2. Константы и переменные
Константа - это значение, которое не может быть изменено. Синтаксис языка определяет 5 типов констант:
• символы;
• константы перечисляемого типа;
• вещественные числа;
• целые числа;
• нулевой указатель (NULL).
Переменные можно изменять. При задании значения переменной в соответствующую ей область памяти помещается код этого значения. Доступ к значению возможен через имя переменной, а доступ к участку памяти - по его адресу. Каждая переменная перед использованием в программе должна быть определена, т. е. ей должна быть выделена память. Размер участка памяти, выделяемой для переменной и интерпретация содержимого зависят от типа, указанного в определении переменной. Простейшая форма определения переменных:
тип список_имен_переменных;
Основные типы данных
тип данных название размер, бит диапазон значений
unsigned char беззнаковый целый длиной не менее 8 бит 8 0 . . 255
char целый длиной не менее 8 бит 8 -128 . . 127
enum перечисляемый 16 -32768 . . 32767
unsigned int беззнаковый целый 16 0 . . 65535
short int (short) короткий целый 16 -32768 . . 32767
unsigned short беззнаковый короткий целый 16 0 . . 65535
int целый 16 -32768 . . 32767
unsigned long беззнаковый длинный целый 32 0 . . 4294967295
long длинный целый 32 -214748348 . . 2147483647
float вещественный одинарной точности 32 3.4Е-38 . . 3.4Е+38
double вещественный двойной точности 64 1.7Е-308 . . 1.7Е+308
long double вещественный максимальной точности 80 3.4Е-4932 . . 1.1Е+4932
В соответствии с синтаксисом языка переменные автоматической памяти после определения по умолчанию имеют неопределенные значения. Переменным можно присваивать начальные значения, явно указывая их в определениях:
тип имя_переменной = начальное_значение;
Этот прием называется инициализацией.
Примеры:
float pi = 3.14 , cc=1.3456;
unsigned int year = 1999;
1.3. Операции
Унарные:
& получение адреса операнда
* обращение по адресу (разыменование)
- унарный минус, меняет знак арифметического операнда
~ поразрядное инвертирование внутреннего двоичного кода (побитовое отрицание)
! логическое отрицание (НЕ). В качестве логических значений используется 0 - ложь и не 0 - истина, отрицанием 0 будет 1, отрицанием любого ненулевого числа будет 0.
++ увеличение на единицу:
префиксная операция - увеличивает операнд до его использования,
постфиксная операция увеличивает операнд после его использования.
- - уменьшение на единицу:
префиксная операция - уменьшает операнд до его использования,
постфиксная операция уменьшает операнд после его использования.
sizeof вычисление размера (в байтах) для объекта того типа, который имеет операнд
Бинарные операции.
Аддитивные:
+ бинарный плюс (сложение арифметических операндов)
- бинарный минус (вычитание арифметических операндов)
Мультипликативные:
* умножение операндов арифметического типа
/ деление операндов арифметического типа (если операнды целочисленные, то выполняется целочисленное деление)
% получение остатка от деления целочисленных операндов
Операции сдвига (определены только для целочисленных операндов).
Формат выражения с операцией сдвига:
операнд_левый операция_сдвига операнд_правый
<< сдвиг влево битового представления значения левого целочисленного операнда на количество разрядов, равное значению правого операнда
>> сдвиг вправо битового представления значения правого целочисленного операнда на количество разрядов, равное значению правого операнда
Поразрядные операции:
& поразрядная конъюнкция (И) битовых представлений значений целочисленных операндов
| поразрядная дизъюнкция (ИЛИ) битовых представлений значений целочисленных операндов
^ поразрядное исключающее ИЛИ битовых представлений значений целочисленных операндов
Операции сравнения:
< меньше, чем
> больше, чем
<= меньше или равно
>= больше или равно
== равно
!= не равно
Логические бинарные операции:
&& конъюнкция (И) целочисленных операндов или отношений, целочисленный результат ложь(0) или истина(1)
|| дизъюнкция (ИЛИ) целочисленных операндов или отношений, целочисленный результат ложь(0) или истина(1)
Условная операция.
В отличие от унарных и бинарных операций в ней используется три операнда.
Выражение1 ? Выражение2 : Выражение3;
Первым вычисляется значение выражения1. Если оно истинно, то вычисляется значение выражения2, которое становится результатом. Если при вычислении выражения1 получится 0, то в качестве результата берется значение выражения3.
Например:
x<0 ? -x : x ; //вычисляется абсолютное значение x.
Операция явного (преобразования) приведения типа.
Существует две формы: каноническая и функциональная:
1) (имя_типа) операнд
2) имя_типа (операнд)
Приоритеты операций.
Ранг Операции
1 ( ) [ ] -> .
2 ! ~ - ++ -- & * (тип) sizeof тип( )
3 * / % (мультипликативные бинарные)
+ - (аддитивные бинарные)
5 << >> (поразрядного сдвига)
6 < > <= >= (отношения)
7 == != (отношения)
8 & (поразрядная конъюнкция «И»)
9 ^ (поразрядное исключающее «ИЛИ»)
10 | (поразрядная дизъюнкция «ИЛИ»)
11 && (конъюнкция «И»)
12 || (дизъюнкция «ИЛИ»)
13 ?: (условная операция)
14 = *= /= %= -= &= ^= |= <<= >>= (операция присваивания)
15 , (операция запятая)
1.4. Выражения
Из констант, переменных, разделителей и знаков операций можно конструировать выражения. Каждое выражение состоит из одного или нескольких операндов, символов операций и ограничителей, в качестве которых чаще всего выступают квадратные скобки. Если выражение формирует целое или вещественное число, то это арифметическое выражение. В арифметических выражениях допустимы операции: + - * / %.
Отношение - это пара арифметических выражений, объединенных знаком операции отношения. Логический тип в Си отсутствует, поэтому принято, что отношение имеет ненулевое значение, если оно истинно и 0, если оно ложно.
1.5. Ввод и вывод
1.5.1. Ввод и вывод в стандартном Си
Обмен данными с внешним миром программа на стандартном Си реализует с помощью библиотеки функций ввода-вывода
#include
1) printf ( <форматная строка>,<список аргументов>);
<форматная строка> - строка символов, заключенных в кавычки, которая показывает, как должны быть напечатаны аргументы. Например:
printf ( “Значение числа Пи равно %f
”, pi);
Форматная строка может содержать
1) символы печатаемые текстуально;
2) спецификации преобразования
3) управляющие символы.
Каждому аргументу соответствует своя спецификация преобразования:
%d - десятичное целое число;
%f - число с плавающей точкой;
%c - символ;
%s - строка.
- управляющий символ новая строка.
2) scanf ( <форматная строка>,<список аргументов>);
В качестве аргументов используются указатели. Например:
scanf(“ %d%f ”, &x,&y);
1.5.2. Ввод и вывод в Си++
Используется библиотечный файл iostream.h, в котором определены стандартные потоки ввода данных от клавиатуры cin и вывода данных на экран дисплея cout, а также соответствующие операции
1) << - операция записи данных в поток;
2) >> - операция чтения данных из потока.
Например:
#include ;
. . . . . . . . .
cout << “
Введите количество элементов: ”;
cin >> n;
2. Постановка задачи
1. Вычислить значение выражения при различных вещественных типах данных (float и double). Вычисления следует выполнять с использованием промежуточных переменных. Сравнить и объяснить полученные результаты.
2. Вычислить значения выражений. Объяснить полученные результаты.
3. Варианты
№ Задание 1 Задание 2
1 ,
при а=1000, b=0.0001 1) n+++m
2) m-- >n
3) n-- >m
2 ,
при а=1000, b=0.0001 1) ++n*++m
2) m++
3) n++>m
3 ,
при а=1000, b=0.0001 1) n---m
2) m--
3) n++>m
4 ,
при а=1000, b=0.0001 1) n++*m
2) n++
3) m-- >m
5 ,
при а=1000, b=0.0001 1) - -m-++n
2) m*n
3) n-- > m++
6 ,
при а=1000, b=0.0001 1) m-++n
2) ++m>--n
3) --n<++m
7 ,
при а=1000, b=0.0001 1) m+--n
2) m++<++n
3) n--< --m
8 ,
при а=100, b=0.001 1) n++-m
2) m-- >n
3) n-- >m
9 ,
при а=100, b=0.001 1) ++n*++m
2) m++
3) n++>m
10 ,
при а=100, b=0.001 1) n---m
2) m--
3) n++>m
11 ,
при а=100, b=0.001 1) n++*m
2) n++
3) m-- >m
12 ,
при а=1000, b=0.0001 1) - -m-++n
2) m*n
3) n-- > m++
13 ,
при а=1000, b=0.0001 1) m-++n
2) ++m>--n
3) --n<++m
14 ,
при а=1000, b=0.0001 1) m+--n
2) m++<++n
3) n--< --m
15 ,
при а=1000, b=0.0001 1) n++-m
2) m-- >n
3) n-- >m
16 ,
при а=1000, b=0.0001 1) ++n*++m
2) m++
3) n++>m
17 ,
при а=1000, b=0.0001 1) n---m
2) m--
3) n++>m
18 ,
при а=1000, b=0.0001 1) n++*m
2) n++
3) m-- >m
19 ,
при а=100, b=0.001 1) - -m-++n
2) m*n
3) n-- > m++
20 ,
при а=100, b=0.001 1) m-++n
2) ++m>--n
3) --n<++m
21 ,
при а=100, b=0.001 1) n++-m
2) m-- >n
3)n-- >m
22 ,
при а=100, b=0.001 1) ++n*++m
2) m++
3) n++>m
23 ,
при а=1000, b=0.0001 1) n---m
2) m--
3) n++>m
24 ,
при а=1000, b=0.0001 1) n++*m
2) n++
3) m-- >m
25 ,
при а=1000, b=0.0001 1) - -m-++n
2) m*n
3) n-- > m++
4. Методические указания
1. Для ввода и вывода данных использовать операции >> и << и стандартные потоки cin и cout.
2. Для вычисления степени можно использовать функцию pow(x,y) из библиотечного файла math.h.
3. При выполнении задания 1 надо использовать вспомогательные переменные для хранения промежуточных результатов.
Например: c=pow(a,3);d=3*a*a*b;e=3*a*b*b;f=pow(b,3);
5. Содержание отчета
1. Постановка задачи.
2. Программа решения задания1.
3. Результаты работы программы для данных типа float.
4. Результаты работы программы для данных типа double.
5. Объяснение результатов.
6. Программа решения задания2.
7. Результаты работы программы.
8. Объяснение результатов.
Лабораторная работа №2.
"Использование основных операторов языка Си"
Цель : Получение навыков в выборе и использовании операторов Си++; знакомство с итерационными процессами.
1. Краткие теоретические сведения
Операторы управления работой программы называют управляющими конструкциями программы. К ним относят:
• составные операторы;
• операторы выбора;
• операторы циклов;
• операторы перехода.
1.1. Составные операторы
К составным операторам относят собственно составные операторы и блоки. В обоих случаях это последовательность операторов, заключенная в фигурные скобки. Блок отличается от составного оператора наличием определений в теле блока. Например:
{
n++; это составной оператор
summa+=n;
}
{
int n=0;
n++; это блок
summa+=n;
}
1.2. Операторы выбора
Операторы выбора - это условный оператор и переключатель. Условный оператор имеет полную и сокращенную форму.
if ( <выражение-условие> ) <оператор>; //сокращенная форма
В качестве <выражения-условия> могут использоваться арифметическое выражение, отношение и логическое выражение. Если значение <выражения-условия> отлично от нуля (т. е. истинно), то выполняется оператор. Например:
if (x
if ( <выражение-условие> ) <оператор1>; //полная форма
else <оператор2>;
Если значение <выражения-условия> отлично от нуля, то выполняется оператор1, при нулевом значении <выражения-условия> выполняется оператор2.Например:
if (d>=0)
{
x1=(-b-sqrt(d))/(2*a);
x2=(-b+sqrt(d))/(2*a);
cout<< “
x1=”<
}
else cout<<“
Решения нет”;
Переключатель определяет множественный выбор.
switch (<выражение>)
{
case <константа1> : <оператор1 >;
case <константа2> : <оператор2 >;
. . . . . . . . . . .
default: <операторы>;
При выполнении оператора switch, вычисляется выражение, записанное после switch и его значение последовательно сравнивается с константами, которые записаны следом за case. При первом же совпадении выполняются операторы помеченные данной меткой. Если выполненные операторы не содержат оператора перехода, то далее выполняются операторы всех следующих вариантов, пока не появится оператор перехода или не закончится переключатель. Если значение выражения, записанного после switch не совпало ни с одной константой, то выполняются операторы, которые следуют за меткой default. Метка default может отсутствовать.
Пример:
switch ( number )
{
case 1 : cout<< “число=1”;break;
case 2 : cout<< “2 * 2”<
case 3 : cout<< “3 * 3”<
case 4 : cout<< number<<“- это замечательное число”; break;
default: cout<< “Конец работы программы”;
}
1.3. Операторы циклов
1. Цикл с предусловием:
while (<выражение-условие>)
<тело_цикла> ;
В качестве <выражения-условия> чаще всего используется отношение или логическое выражение. Если оно истинно, т. е. не равно 0, то тело цикла выполняется до тех пор пока <выражение-условие> не станет ложным.
2. Цикл с постусловием:
do
<тело_цикла>;
while (<выражение-условие>);
Тело цикла выполняется до тех пор, пока <выражение-условие> истинно.
3. Цикл с параметром:
for ( <выражение_1>;<выражение-условие>;<выражение_3>)
тело_цикла;
<Выражение_1> и <выражение_3> могут состоять из нескольких выражений, разделенных запятыми. <Выражение_1> - задает начальные условия для цикла (инициализация).<Выражение-условие> определяет условие выполнения цикла, если оно не равно 0, цикл выполняется, а затем вычисляется значение <выражения_3>. <Выражение_3> - задает изменение параметра цикла или других переменных (коррекция). Цикл продолжается до тех пор, пока <выражение-условие> не станет равно 0. Любое выражение может отсутствовать, но разделяющие их « ; » должны быть обязательно.
Примеры использования цикла с параметром.
1) Уменьшение параметра:
for ( n=10; n>0; n--)
{ <тело цикла>};
2) Изменение шага корректировки:
for ( n=2; n>60; n+=13)
{ <тело цикла>};
3) Возможность проверять условие отличное от условия, которое налагается на число итераций:
for ( num=1;num*num*num<216; num++)
{ <тело цикла>};
4) Коррекция может осуществляться не только с помощью сложения или вычитания:
for ( d=100.0; d<150.0;d*=1.1)
{ <тело цикла>};
for (x=1;y<=75;y=5*(x++)+10)
{ <тело цикла>};
5) Можно использовать несколько инициализирующих или корректирующих выражений:
for (x=1, y=0; x<10;x++;y+=x);
1.4. Операторы перехода
Операторы перехода выполняют безусловную передачу управления.
1) break - оператор прерывания цикла.
{
< операторы>
if (<выражение_условие>) break;
<операторы>
}
Т. е. оператор break целесообразно использовать, когда условие продолжения итераций надо проверять в середине цикла.
Пример:
// ищет сумму чисел вводимых с клавиатуры до тех пор, пока не будет введено 100 чисел или 0
for(s=0, i=1; i<100;i++)
{
cin>>x;
if( x==0) break; // если ввели 0, то суммирование заканчивается
s+=x;
}
2) continue - переход к следующей итерации цикла. Он используется, когда тело цикла содержит ветвления.
Пример:
//ищет количество и сумму положительных чисел
for( k=0,s=0,x=1;x!=0;)
{
cin>>x;
if (x<=0) continue;
k++;s+=x;
}
2. Постановка задачи
Используя оператор цикла, найти сумму элементов, указанных в конкретном варианте. Результат напечатать, снабдив соответствующим заголовком.
3. Варианты
1) Найти сумму целых положительных чисел, кратных 3 и меньших 200.
2) Найти сумму целых положительных четных чисел, меньших 100.
3) Найти сумму целых положительных нечетных чисел, меньших 200.
4) Найти сумму целых положительных чисел, больших 20, меньших 100 и кратных 3
5) Найти сумму ряда с точностью =10-4, общий член которого
6) Найти сумму ряда с точностью =10-4, общий член которого
7) Найти сумму ряда с точностью =10-4, общий член которого
8) Найти сумму ряда с точностью =10-4, общий член которого
9) Найти сумму ряда с точностью =10-4, общий член которого
10) Найти сумму ряда с точностью =10-4, общий член которого
11) Найти сумму ряда с точностью =10-4, общий член которого
12) Найти сумму ряда с точностью =10-4, общий член которого
13) Найти сумму ряда с точностью =10-4, общий член которого
14) Найти сумму ряда с точностью =10-4, общий член которого
15) Найти сумму ряда с точностью =10-4, общий член которого
16) Найти сумму ряда с точностью =10-4, общий член которого
17) Найти сумму ряда с точностью =10-4, общий член которого
18) Найти сумму ряда с точностью =10-4, общий член которого
19) Найти сумму ряда с точностью =10-4, общий член которого
20) Найти сумму ряда с точностью =10-4, общий член которого
21) Найти сумму 13 членов ряда, в котором
22) Найти сумму 15 членов ряда, в котором
23) Найти сумму 10 членов ряда, в котором
24) Найти сумму 9 членов ряда, в котором
25) Найти сумму 7 членов ряда, в котором
3. Содержание отчета
1. Постановка задачи.
2. Текст программы.
3. Результат решения конкретного варианта.
4. Методические указания
1. При определении суммы членов ряда следует использовать рекуррентную формулу для получения следующего члена ряда.
Например, требуется найти сумму ряда с точностью =10-4, общий член которого .
Для получения рекуррентной формулы вычислим отношение:
,
откуда:
.
2. При составлении программы считать, что точность достигнута, если аn <
Лабораторная работа №3
"Вычисление функций с использованием их разложения в степенной ряд"
Цель: Практика в организации итерационных и арифметических циклов.
1. Краткие теоретические сведения
Действительная функция f(x) называется аналитической в точке , если в некоторой окрестности x-
(1)
При =0 получаем ряд Маклорена:
(2)
Разность (3)
называется остаточным членом и представляет собой ошибку при замене функции f(x) полиномом Тейлора.
Для ряда Маклорена
где 0<<1. (4)
Таким образом, вычисление значения функции можно свести к вычислению суммы числового ряда
а1+а2+ . . . +an+ . . . . (5)
Известно, что числовой ряд называется сходящимся, если существует предел последовательности его частных сумм:
, (6)
где Sn= а1+а2+ . . . +an+ . . . .
Число S называется суммой ряда.
Из формулы (13) получаем S=Sn+Rn ,
где Rn - остаток ряда, причем R0 при n.
Для нахождения суммы S сходящегося ряда (5) с заданной точностью нужно выбрать число слагаемых n столь большим, чтобы имело место неравенство
Rn<.
Тогда частная сумма Sn приближенно может быть принята за точную сумму S ряда (5).
Приближенно n выбрать так, чтобы имело место неравенство
Sn+1-Sn< или an<.
Задача сводится к замене функции степенным рядом и нахождению суммы некоторого количества слагаемых при различных параметрах суммирования х . Каждое слагаемое суммы зависит от параметра х и номера n, определяющего место этого слагаемого в сумме.
Обычно формула общего члена суммы принадлежит одному из следующих трех типов:
а) ; ; ;
б) ; ; ;
в) ; ; .
В случае а) для вычисления члена суммы аn целесообразно использовать рекуррентные соотношения, т. е. выражать последующий член суммы через предыдущий: an+1=(x, n)an. Это позволит существенно сократить объем вычислительной работы. Кроме того, вычисление члена суммы по общей формуле в ряде случаев невозможно (например из-за наличия n!).
В случае б) применение рекуррентных соотношений нецелесообразно. Вычисления будут наиболее эффективными, если каждый член суммы вычислять по общей формуле an=(x, n).
В случае в) член суммы целесообразно представить в виде двух сомножителей, один из которых вычисляется по рекуррентному соотношению, а другой непосредственно an=(x, n)*сn(x,n), где сn=cn-1(x,n).
2. Постановка задачи
Для х изменяющегося от a до b с шагом (b-a)/k, где (k=10), вычислить функцию f(x), используя ее разложение в степенной ряд в двух случаях:
а) для заданного n;
б) для заданной точности (=0.0001).
Для сравнения найти точное значение функции.
3. Варианты
№ функция диапазон
изменения аргумента n сумма
1
10
2
40
3
10
4
10
5
15
6
25
7
10
8
40
9
3
10
20
11
10
12
35
13
10
14
20
15
30
16
40
17
10
18
50
19
20
20
30
21
40
22
35
23
15
24
40
25
20
4. Методические указания
1. Алгоритм решения задачи сводится к трем циклам, причем два из них вложены в третий. Внутренние циклы суммируют слагаемые при фиксированном параметре x, один (арифметический для заданного n), другой (итерационный для заданной точности . При организации этих циклов следует обратить внимание на правильный выбор формулы для вычисления элемента ряда an и правильное присвоение начальных значений переменным цикла. Внешний цикл организует изменение параметра х.
2. Результаты расчетов отпечатать с следующем виде:
Вычисление функции
X=...... SN=...... SE=..... Y=......
X=...... SN=...... SE=..... Y=......
..........
X=...... SN=...... SE=..... Y=......
Здесь X- значение параметра; SN- значение суммы для заданного n; SE- значение суммы для заданной точности; Y-точное значение функции.
5. Содержание отчета
1. Постановка задачи.
2. Вариант задания.
3. Математическая модель (формулы, по которым выполняются вычисления слагаемых ряда).
4. Программа.
5. Полученные результаты.
Лабораторная работа № 4
"Работа с одномерными массивами"
Цель: Получение навыков обработки одномерных массивов.
1. Краткие теоретические сведения
1.1. Определение массива
Определение массива содержит тип элементов, имя массива и количество элементов в массиве.
int mas[10];
0 1 2 3 4 5 6 7 8 9
Т. е. индексы элементов в массиве mas могут меняться от 0 до 9, всего в массиве 10 элементов.
1.2. Инициализация массива
Инициализация массивов возможна при их определении:
double d[] = {1, 2, 3, 4, 5};
Длина массива вычисляется компилятором по количеству значений перечисленных в фигурных скобках.
1.3. Указатели
Каждая переменная в программе это объект, имеющий имя и значение по имени можно обратиться к переменной и получить ее значение. Оператор присваивания ( = ) выполняет обратное действие: имени переменной ставится в соответствие значение.
a=10;
Выражение &a позволяет получить адрес участка памяти, выделенного переменной а. Операция & применима только к объектам имеющим имя и размещенным в памяти.
Имея возможность определить адрес переменной с помощью &, надо иметь возможность работать с этим адресом: сохранять его, передавать, преобразовывать. Для этого вводится понятие указателя. Указатель - это переменная, значением которой служит адрес объекта конкретного типа. Нулевой адрес обозначается константой NULL, которая определена в заголовочном файле stdio.h. Чтобы определить указатель надо сообщить на объект какого типа ссылается этот указатель.
char *z;
int *k,*i;
float *f;
* - это операция разыменования. Операндом этой операции всегда является указатель. Результат операции - это тот объект, который адресует указатель_операнд.
*z=’$ ‘;
*k=*i=0;
Пример:
int e, c, b, *m;
. . . . . . . . .
m = &e ;
*m = c + b ;
Операции над указателями.
• присваивание (=);
• получение значения объекта, на который ссылается указатель (*);
• получение адреса самого указателя (&).
Пример:
int date = 10;
int *i, *k;;
i = &date;
k = i;
z = NULL;
Подобно любым переменным переменная типа указатель имеет имя, арес в памяти и значение.
С помощью унарных операций ++ и –- числовые значения переменных типа указатель меняются по разному, в зависимости от типа данных, с которым связаны эти переменные.
Пример:
char *z;
int *k,*i;
float *f;
. . . . . . .
z++; // значение изменяется на 1
i++; // значение изменяется на 2
f++; // значение изменяется на 4
Т. е. при изменении указателя на 1, указатель переходит к началу следующего (предыдущего) поля той длины, которая определяется типом объекта, адресуемого указателем.
1.4. Указатели и массивы
Имя массива без индекса является указателем-константой, т. е. адресом первого элемента массива (a[0]).
a
*a = = a[0] ;
*(a+1) = = a[1];
. . . . . . . . .
*(a+i) = =a[i];
В соответствии с синтаксисом в Си существуют только одномерные массивы, но их элементами , в свою очередь, тоже могут быть массивы.
int a[5][5];
Для двумерного массива:
a[m][n] = = *(a[m]+n) = = *(*(a+m)+n);
2. Варианты заданий
1.
1) Сформировать одномерный массив целых чисел, используя датчик случайных чисел.
2) Распечатать полученный массив.
3) Удалить элемент с номером К.
4) Добавить после каждого четного элемента массива элемент со значением 0.
5) Распечатать полученный массив.
2.
1) Сформировать одномерный массив целых чисел, используя датчик случайных чисел.
2) Распечатать полученный массив.
3) Удалить первый элемент равный 0.
4) Добавить после каждого четного элемента массива элемент со значением M[ I-1 ]+2.
5) Распечатать полученный массив.
3.
1) Сформировать одномерный массив целых чисел, используя датчик случайных чисел.
2) Распечатать полученный массив.
3) Удалить все элементы равные 0.
4) Добавить после первого четного элемента массива элемент со значением M[ I-1 ]+2.
5) Распечатать полученный массив.
4.
1) Сформировать одномерный массив целых чисел, используя датчик случайных чисел.
2) Распечатать полученный массив.
3) Удалить элементы, индексы которых кратны 3.
4) Добавить после каждого отрицательного элемента массива элемент со значением | M[ I-1 ]+1|.
5) Распечатать полученный массив.
5.
1) Сформировать одномерный массив целых чисел, используя датчик случайных чисел.
2) Распечатать полученный массив.
3) Удалить элементы кратные 7.
4) Добавить после каждого нечетного элемента массива элемент со значением 0.
5) Распечатать полученный массив.
6.
1) Сформировать одномерный массив целых чисел, используя датчик случайных чисел.
2) Распечатать полученный массив.
3) Удалить элемент с заданным номером.
4) Добавить после первого четного элемента массива элемент со значением M[ I-1 ]+2.
5) Распечатать полученный массив.
7.
1) Сформировать одномерный массив целых чисел, используя датчик случайных чисел.
2) Распечатать полученный массив.
3) Удалить последний элемент равный 0.
4) Добавить после элемента массива с заданным индексом элемент со значением 100.
5) Распечатать полученный массив.
8.
1) Сформировать одномерный массив целых чисел, используя датчик случайных чисел.
2) Распечатать полученный массив.
3) Удалить все элементы с заданным значением.
4) Добавить перед каждым четным элементом массива элемент со значением 0.
5) Распечатать полученный массив.
9.
1) Сформировать одномерный массив целых чисел, используя датчик случайных чисел.
2) Распечатать полученный массив.
3) Удалить первый элемент с заданным значением.
4) Сдвинуть массив циклически на К элементов вправо.
5) Распечатать полученный массив.
10.
1) Сформировать одномерный массив целых чисел, используя датчик случайных чисел.
2) Распечатать полученный массив.
3) Удалить 5 первых элементы массива.
4) Добавить в конец массива 3 новых элемента.
5) Распечатать полученный массив.
11.
1) Сформировать одномерный массив целых чисел, используя датчик случайных чисел.
2) Распечатать полученный массив.
3) Удалить 5 последних элементов массива.
4) Добавить в начало массива 3 элемента с значением M[ I+1 ]+2.
5) Распечатать полученный массив.
12.
1) Сформировать одномерный массив целых чисел, используя датчик случайных чисел.
2) Распечатать полученный массив.
3) Поменять местами минимальный и максимальный элементы массива.
4) Удалить из массива все элементы превышающие его среднее значение более, чем на 10%.
5) Распечатать полученный массив.
13.
1) Сформировать одномерный массив целых чисел, используя датчик случайных чисел.
2) Распечатать полученный массив.
3) Удалить из массива все элементы совпадающие с его минимальным значением.
4) Добавить в начало массива 3 элемента с значением равным среднему арифметическому массива.
5) Распечатать полученный массив.
14.
1) Сформировать одномерный массив целых чисел, используя датчик случайных чисел.
2) Распечатать полученный массив.
3) Перевернуть массив и, если число элементов массива нечетное, удалить его средний элемент.
4) Добавить в начало массива 3 элемента с значением M[ I+10 ]-2.
5) Распечатать полученный массив.
15.
1) Реализовать с использованием массива двунаправленное кольцо (просмотр возможен в обе стороны, от последнего элемента можно перейти к первому).
2) Распечатать полученный массив, начиная с К-ого элемента и до К-1 ( по кольцу влево).
3) Удалить из кольца первый и последний элементы.
4) Распечатать полученный массив, начиная с К-ого элемента (и до К+1 по кольцу вправо).
16.
Реализовать с использованием массива очередь (первый пришел, первый ушел), для чего организовать добавление, удаление элементов в массив и печать массива после каждой операции.
17.
1) Реализовать с использованием массива двунаправленное кольцо (просмотр возможен в обе стороны, от последнего элемента можно перейти к первому).
2) Распечатать полученный массив, начиная с К-ого элемента и до К-1 ( по кольцу влево).
3) Добавить в кольцо первый и последний элементы.
4) Распечатать полученный массив, начиная с К-ого элемента (и до К+1 по кольцу вправо).
18.
1) Реализовать с использованием массива однонаправленное кольцо (просмотр возможен слева направо, от последнего элемента можно перейти к первому).
2) Распечатать полученный массив, начиная с К-ого элемента и до К-1.
3) Добавить в кольцо первый и последний элементы.
4) Удалить из кольца четные элементы.
5) Распечатать полученный массив, начиная с К-ого элемента и до К-1.
19.
1) Реализовать с использованием массива однонаправленное кольцо (просмотр возможен справа налево, от первого элемента можно перейти к последнему).
2) Распечатать полученный массив, начиная с К-ого элемента и до К+1.
3) Добавить в кольцо первый и последний элементы.
4) Удалить из кольца нечетные элементы.
5) Распечатать полученный массив, начиная с К-ого элемента и до К+1.
20.
1) Реализовать с использованием массива двунаправленное кольцо (просмотр возможен в обе стороны, от последнего элемента можно перейти к первому).
2) Распечатать полученный массив, начиная с К-ого элемента и до К-1 ( по кольцу влево).
3) Добавить в кольцо после элементов с индексами кратными 5 элементы равные 0.
4) Распечатать полученный массив, начиная с К-ого элемента (и до К+1 по кольцу вправо).
21.
1) Реализовать с использованием массива двунаправленное кольцо (просмотр возможен в обе стороны, от последнего элемента можно перейти к первому).
2) Распечатать полученный массив, начиная с К-ого элемента и до К-1 ( по кольцу влево).
3) Добавить в кольцо первый и 3 последних элемента.
4) Распечатать полученный массив, начиная с К-ого элемента (и до К+1 по кольцу вправо).
22.
Реализовать с использованием массива стек (первый пришел, последний ушел), для чего организовать добавление, удаление элементов в массив и печать массива после каждой операции.
23.
1) Реализовать с использованием массива двунаправленное кольцо (просмотр возможен в обе стороны, от последнего элемента можно перейти к первому).
2) Распечатать полученный массив, начиная с К-ого элемента и до К-1 ( по кольцу влево).
3) Удалить из кольца все элементы совпадающие с его максимальным значением.
4) Распечатать полученный массив, начиная с К-ого элемента (и до К+1 по кольцу вправо).
24.
1) Реализовать с использованием массива однонаправленное кольцо (просмотр возможен слева направо, от последнего элемента можно перейти к первому).
2) Распечатать полученный массив, начиная с К-ого элемента и до К-1.
3) Упорядочить элементы по возрастанию
4) Удалить из кольца четные элементы.
5) Распечатать полученный массив, начиная с К-ого элемента и до К-1.
25.
1) Реализовать с использованием массива однонаправленное кольцо (просмотр возможен справа налево, от первого элемента можно перейти к последнему).
2) Распечатать полученный массив, начиная с К-ого элемента и до К+1.
3) Упорядочить элементы по убыванию
4) Удалить из кольца нечетные элементы.
5) Распечатать полученный массив, начиная с К-ого элемента и до К+1.
3. Методические указания
1) При выполнении работы используются статические массивы. Для организации статических массивов с псевдопеременными границами необходимо объявить массив достаточно большой длины, например, 100 элементов:
int N=100;
int a[N];
Затем пользователь вводит реальную длину массива (не больше N) и работает с массивом той длины, которую он сам указал. Остальные элементы (хотя память под них и будет выделена) не рассматриваются.
2) При уменьшении или увеличении длины массива необходимо изменять его реальную длину.
4. Содержание отчета
1. Вариант задания.
2. Текст программы.
3. Результат решения конкретного варианта.
Лабораторная работа №5
"Функции и массивы"
Цель : Организовать обработку массивов с использованием функций, научиться передавать массивы как параметры функций.
1. Краткие теоретические сведения
1.1. Функции
Функцию в Си можно рассматривать:
• как один из производных типов данных (наряду с массивами и указателями);
|