Читайте также:
|
|
7. Какие три раздела записываются в круглых скобках для оператора цикла типа for? Какой разделитель между разделами?
8. Что такое вложенные циклы? Примеры.
9. Как образуется бесконечный цикл и как выйти из него?
10. Схема приведения цикла while к эквивалентному ему циклу for.
11. Назовите операторы, способные изменять естественный порядок выполнения вычислений.
12. Для чего нужен оператор break?
13. Где употребляется оператор continue и для чего он используется?
14. Для чего используется оператор return?
15. Какой тип должно иметь выражение?
Пример выполнения лабораторной работы №3:
1. Индивидуальное задание №1:
1.1. Постановка задачи:
Составить UML-диаграмму деятельности и программу с использованием конструкций цикла для решения задачи.
Задача: в 1985 г. урожай ячменя составил 20 ц с га. В среднем каждые 2 года за счет применения передовых агротехнических приемов, урожай увеличился на 5%. Определить, через сколько лет урожай достигнет 25 ц с га.
1.2. UML-диаграмма:
1.3. Листинг программы:
// Лабораторная работа №3
// Индивидуальное задание №1
#include "stdafx.h"
#include <iostream>
#include "conio.h"
#include "math.h"
#include "windows.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "Russian");
const double productivity = 20, prirost = productivity/100*2.5;
int count = 0;
cout<< "Лабораторная работа № 3\n";
cout<< "\nГорошко А.А., БАС-051\n";
cout<< "\nВариант № 6\n";
cout<< "\n\nИндивидуальное задание № 1:\n";
cout<< "\nрешить задачу с использованием конструкций цикла.\n";
cout<< "\n\nЗадача:\n";
cout<< "\nв 1985 г. урожай ячменя составил 20 ц с га. В среднем каждые 2 года за\n";
cout<< "\nсчет применения передовых агротехнических приемов урожай увеличился на 5%.\n";
cout<< "\nОпределить, через сколько лет урожай достигнет 25 ц с га.\n";
cout<< "\n\nРабота программы:\n";
while((prirost*count + 20) < 25)
{
count++;
}
cout<< "\n\nУрожай достигнет 25 ц с га через: " <<count;
// выбор формы согласования (год, года или лет)
while(count - 10 > 0)
{
count = count - 10;
}
switch (count)
{
case 1:
cout<< " год";
break;
case 2:
case 3:
case 4:
cout<<" года";
break;
default:
cout<<" лет";
break;
}
getch();
return 0;
}
1.4. Результаты работы программы:
2. Индивидуальное задание №2:
2.1. Постановка задачи:
Составить UML-диаграмму деятельности и программу для нахождения значения конечной суммы: Вводится целое число .
2.2. UML-диаграмма:
2.3. Листинг программы:
// Лабораторная работа №3
// Индивидуальное задание №2
#include "stdafx.h"
#include <iostream>
#include "conio.h"
#include "math.h"
#include "windows.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "Russian");
double a, S=0;
const double x=1;
int i, N;
cout<<"Лабораторная работа №3\n";
cout<<"\nГорошко А.А., БАС-051\n";
cout<<"\nВариант №6\n";
cout<<"\n\nИндивидуальное задание №2:\n";
cout<<"\nнайти значение конечной суммы S при x=1.\n";
cout<<"\n\nРабота программы:\n";
cout<<"\nВведите значение N>0\n"<<"\nN=";
cin>> N;
for(i=1; i<=N; i++)
{
a=(exp(x/i)+exp(-x/i))/(i+2)*(i+2)*(i+2)*(i+2);
S+=a;
}
cout<<"\nКонечная сумма:\n"<<"\nS=";
cout<< S;
getch();
return 0;
}
2.4. Результаты работы программы:
3. Табуляция функции:
3.1. Постановка задачи:
Составить UML-диаграмму деятельности и написать программу, позволяющую протабулировать функцию в диапазоне от до в равноудаленных точках.
3.2. UML-диаграмма:
3.3. Листинг программы:
// Лабораторная работа №3
// Табуляция функции
// Лабораторная работа №3
// Табуляция функции
#include "stdafx.h"
#include <iostream>
#include "conio.h"
#include "math.h"
#include "windows.h"
using namespace std;
const double x_min=-15;
const double x_max=20;
const int N=1000;
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "Russian");
double y, dx=(x_max-x_min / N);
cout<<"Лабораторная работа №3\n";
cout<<"\nГорошко А.А., БАС-051\n";
cout<<"\nВариант №6\n";
cout<<"\n\nЗадание:\n";
cout<<"\nпротабулировать функцию y в диапазоне от x_min=-15 до x_max=20\n";
cout<<"\nв N=1000 равноудаленных точках.\n";
cout<<"\n\nРабота программы:\n";
for (double x=x_min; x<=x_max; x+=dx)
{
if (x>3.5) y=(log(x)*cos(2*x));
else
if (x=3.5) y=(pow(x*x*x-1,1/3));
else y=(1+sin(x)*sin(x)-2*cos(2*x)*cos(2*x));
cout<< "x=";
cout<< x;
cout<< "\ny=";
cout<< y;
}
getch();
return 0;
}
3.4. Результаты работы программы:
4. Индивидуальное задание №3:
4.1. Постановка задачи:
Составить программу и произвести вычисление значения специальной функции второго интеграла Френеля: по ее разложению в ряд с точностью , аргумент функции вводится с клавиатуры.
4.2. UML-диаграмма:
4.3. Листинг программы:
// Лабораторная работа №3
// Индивидуальное задание №3
#include "stdafx.h"
#include <iostream>
#include "conio.h"
#include "math.h"
#include "windows.h"
#include <tchar.h>
using namespace std;
double fact(double number)
{
int k, i;
i = 1; k = 1;
if (number == 0 || number == 1)
return 1;
else
while (i <= number)
{
k *= i;
i++;
}
return k;
}
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "Russian");
double x, S, eps = 1e-10, a, n, pi;
char buff[256];
pi = 3,14159265358;
cout <<"Лабораторная работа № 3\n";
cout <<"\nГорошко А.А., БАС-051\n";
cout <<"\nВариант № 6\n";
cout <<"\n\nИндивидуальное задание № 3:\n";
cout <<"\nвычислить значение специальной функции второго интеграла Френеля\n";
cout <<"\nпо ее разложению в ряд с точностью eps=10^-10.\n";
cout <<"\n\nРабота программы:\n";
cout <<"\nВведите значение x\n"<< "\nx = ";
cin >> x;
a = 0;
S = x;
for(n = 1; fabs(a) < eps; n++)
{
a = pow(-1,n)*pow((pi/2),2*n+1)*pow(x,(4*n+3)) / (fact(2*n+1),(4*n+3));
S += a;
}
cout << "\nS(" << x <<") = " << S << endl;
getch();
return 0;
}
4.4. Результаты работы программы:
Лабораторная работа №4.
Одномерные массивы в языке C++
Цель работы и содержание: закрепление знаний об одномерных массивах, составление программ с одномерными массивами.
Ход работы
Основные сведения о массивах в языке C++. В случае использования простых переменных каждой области памяти для хранения одной величины соответствует свое имя. Если требуется работать с группой величин одного типа, их располагают в памяти последовательно и дают им общее имя, а различают по порядковому номеру. Такая последовательность однотипных величин называется массивом. Массивы, как и любые другие объекты, можно размещать либо с помощью операторов описания в сегментах данных или стека, либо в динамической области памяти с помощью операций выделения памяти.
При описании массива после имени в квадратных скобках задается количество его элементов (размерность), например int a[10]. Массив располагается в зависимости от места его описания либо в сегменте данных, либо в сегменте стека, и все инструкции по выделению памяти формирует компилятор до выполнения программы. Вследствие этого размерность массива может быть задана только константой или константным выражением. Если при описании массива не указана размерность, должен присутствовать инициализатор, в этом случае компилятор выделит намять по количеству инициализирующих значений. В дальнейшем мы увидим, что размерность может быть опущена также в списке формальных параметров.
Элементы массива нумеруются с нуля. При описании массива используются те же модификаторы (класс памяти, const и инициализатор), что и для простых переменных. При описании массив можно инициализировать, то есть присвоить его элементам начальные значения, например:
int а[10] = {1, 1, 2, 2, 5, 100};
Для данного массива элементы имеют номера от 0 до 9. Номер элемента указывается после его имени в квадратных скобках, например, а[0], а[3]. Инициализирующие значения для массивов записываются в фигурных скобках. Значения элементам присваиваются по порядку. Если элементов в массиве больше, чем инициализаторов, элементы, для которых значения не указаны, обнуляются:
int b[5] = {3. 2, 1}; //b[0]=3,b[l]=2,b[2]=l,b[3]=0,b[4]=0
Для доступа к элементу массива после его имени указывается номер элемента (индекс) в квадратных скобках. В следующем примере подсчитывается сумма элементов массива.
#include <iostream.h>
int main()
{
const int n = 10; int i, sum;
int marks[n] = {3. 4, 5, 4, 4};
setlocale(LC_ALL, "Russian");
for (i =0. sum = 0; i<n; i++) sum += marks[i];
cout << "Сумма элементов: " << sum;
return 0;
}
Размерность массивов предпочтительнее задавать с помощью именованных констант, как это сделано в примере, поскольку при таком подходе для ее изменения достаточно скорректировать значение константы всего лишь в одном месте программы. Обратите внимание, что последний элемент массива имеет номер, на единицу меньший заданной при его описании размерности.
При обращении к элементам массива автоматический контроль выхода индекса за границу массива не производится, что может привести к ошибкам.
Идентификатор массива является константным указателем на его нулевой элемент. Например, для массива из предыдущего листинга имя mark - это то же самое, что & mark[0], а к i-му элементу массива можно обратиться, используя выражение *(mark+i). Можно описать указатель, присвоить ему адрес начала массива и работать с массивом через указатель. Следующий фрагмент программы копирует все элементы массива а в массив b:
int а[100], b[100];
int *ра = а; // или int *p = &а[0];
int *pb = b;
for(int i = 0; i<100; 1++)
*pb++ = *pa++; // или pb[i] = pa[i];
Пример 4.1. Написать программу, которая для целочисленного массива из 100 элементов определяет, сколько положительных элементов располагается между его максимальным и минимальным элементами.
Запишем алгоритм в самом общем виде.
1. Определить, где в массиве расположены его максимальный и минимальный элементы, то есть найти их индексы.
2. Просмотреть все элементы, расположенные между ними. Если элемент массива больше нуля, увеличить счетчик элементов на единицу.
Ясно, что порядок расположения элементов в массиве заранее не известен, и сначала может следовать как максимальный, так и минимальный элемент, кроме того, они могут и совпадать. Поэтому прежде чем просматривать массив в поисках количества положительных элементов, требуется определить, какой из этих индексов больше. Запишем уточненный алгоритм:
1. Определить, где в массиве расположены его максимальный и минимальный элементы:
- задать начальные значения для индексов максимального и минимального элементов (например, равные нулю, но можно использовать любые другие
значения индекса, не выходящие за границу массива).
- просмотреть массив, поочередно сравнивая каждый его элемент с ранее най денными максимумом и минимумом. Если очередной элемент больше ранее
найденного максимума, принять этот элемент за новый максимум (т.е. запомнить его индекс). Если очередной элемент меньше ранее найденного
минимума, принять этот элемент за новый минимум.
2. Определить границы просмотра массива для поиска положительных элементов, находящихся между его максимальным и минимальным элементами:
- если максимум расположен в массиве раньше, чем минимум, принять левую границу просмотра равной индексу максимума, иначе - индексу минимума.
- если максимум расположен в массиве раньше, чем минимум, принять правую границу просмотра равной индексу минимума, иначе - индексу максимума.
3. Обнулить счетчик положительных элементов. Просмотреть массив в указанном диапазоне. Если очередной элемент больше нуля, увеличить счетчик на единицу.
Для экономии времени при отладке значения элементов массива задаются путем инициализации.
Листинг 4.1
#include “stdafx.h”
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
const int n = 10;
int a[n] = {1, 3, -5, 1, -2, 1, -1, 3, 8, 4};
int i, imax, imin, count;
setlocale(LC_ALL, "Russian");
for(i = imax = imin = 0; i < n; i++)
{
if(a[i] > a[imax]) imax = i;
if(a[i] < a[imin]) imin = i;
}
cout << “\n\t max = “ << a[imax] << “\t min = “
<< a[imin] << endl;
int ibeg = (imax < imin)? imax: imin;
int iend = (imax < imin)? imin: imax;
cout << “\n\t ibeg = “ << ibeg << “\t iend = “
<< iend << endl;
for(count = 0, i = ibeg + 1; i < iend; i++)
if(a[i] > 0) count++;
cout <<“Количество положительных “<< count <<endl;
getch();
return 0;
}
В программе использована управляющая последовательность \t, которая задает отступ при выводе на следующую позицию табуляции. Массив просматривается, начиная с элемента, следующего за максимальным (минимальным), до элемента, предшествующего минимальному (максимальному). Индексы границ просмотра хранятся в переменных ibeg и iend. В приведенной выше программе для определения их значений используется тернарная условная операция. Можно поступить и по-другому: просматривать массив всегда от максимума к минимуму, а индекс при просмотре увеличивать или уменьшать в зависимости от их взаимного расположения.
В приведенной ниже программе направление просмотра, то есть приращение индекса, хранится в переменной d. Если массив просматривается «слева направо», она равна 1, иначе - -1. Обратите внимание и на изменившееся условие продолжения этого цикла.
Листинг 4.2
#include “stdafx.h”
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
const int n = 10;
int a[n] = {1, 3, -5, 1, -2, 1, -1, 3, 8, 4};
int i, imax, imin, count;
setlocale(LC_ALL, "Russian");
for(i = imax = imin = 0; i < n; i++)
{
if(a[i] > a[imax]) imax = i;
if(a[i] < a[imin]) imin = i;
}
cout << “\n\t max = “ << a[imax] << “\t min = “
<< a[imin] << endl;
int d = 0;
if(imax < imin) d = 1;
else if(imax > imin) d = -1;
for(count = 0, i = imax + d; i!= imin; i += d)
if(a[i] > 0) count++;
cout << “Количество положительных “ << count
<< endl;
getch();
return 0;
}
Ввод массива в этом варианте программы осуществляется с клавиатуры. Напоминаем, что в этом случае желательно для проверки вывести введенные значения на печать.
Тестовых примеров для этой задачи должно быть по крайней мере три для случаев, когда:
1) a[imin] расположен левее a[imax];
2) a[imin] расположен правее a[imax];
3) a[imin] иa[imax] совпадают.
Последняя ситуация имеет место, когда в массиве все элементы имеют одно и то же значение. Кстати, во втором варианте программы третий случай корректно обрабатывается благодаря значению d = 0 для этой ситуации. Желательно также проверить, как работает программа, если a[imin] и a[imax] расположены рядом, а также в начале и в конце массива (граничные случаи). Элементы массива нужно задавать как положительные, так и отрицательные.
Разница между приведенными способами решения несущественна, но первый вариант более «прозрачен», поэтому он, на наш взгляд, предпочтительнее.
Измените приведенную выше программу так, чтобы она вычисляла произведение отрицательных элементов, расположенных между минимальным и максимальным по модулю элементами массива.
Часто бывает, что точное количество элементов в исходном массиве не задано, но известно, что оно не может превышать некое конкретное значение. В этом случае память под массив выделяется «по максимуму», а затем заполняется только часть этой памяти. Память можно выделить либо с помощью оператора описания в стеке или сегменте данных, либо в динамической области. Фактическое количество введенных элементов запоминается в переменной, которая затем участвует в организации циклов по массиву, задавая его верхнюю границу. Этот подход является весьма распространенным, поэтому мы приводим ниже небольшую, но полезную программу, в которой выполняется только считывание элементов массива с клавиатуры и их вывод на экран:
const int n = 1000;
int a[n];
int i, kol_a;
setlocale(LC_ALL, "Russian");
cout << “Введите количество элементов: “;
cin >> kol_a;
if(kol_a > n)
{
cout << “Превышение размера массива“ << endl;
return 1;
}
for(int i = 0; i < kol_a; i++) cin >> a[i];
for(int i = 0; i < kol_a; i++) cout << a[i] << “ “;
cout << endl;
Несмотря на то, что значение константы n определяется «с запасом», надо обязательно проверять, не запрашивается ли большее количество элементов, чем возможно. Привычка к проверке подобных, казалось бы, маловероятных случаев позволит вам создавать более надежные программы, а нет ничего более важного для программы, чем надежность.
Пример 4.2. Выполнить сортировку массива по возрастанию, состоящего из n элементов методом «пузырька».
На языке C++ пузырьковая сортировка массива может быть запрограммирована следующим образом:
Листинг 4.3
#include “stdafx.h”
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
const int N = 1000;
int a[N];
int n, i, j, temp;
setlocale(LC_ALL, "Russian");
cout << “Введите количество элементов: “;
cin >> n;
if(n <= 0 || n > N)
{
cout << “Неверный размер массива“ << endl;
return 1;
}
for(i = 0; i < n; i++) cin >> a[i];
for(i = 0; i < n; i++) cout << a[i];
cout << endl;
// Сортировка
for(i = 0; i < n; i++)
for(j = i + 1; j < n; j++)
if(a[i] > a[j])
{
temp = a[i]; a[i] = a[j];
a[j] = temp;
}
cout << “После сортировки: “;
for(i = 0; i < n; i++) cout << a[i] << “ “;
cout << endl;
getch();
return 0;
}
Аппаратура и материалы. Для выполнения лабораторной работы необходим персональный компьютер со следующими характеристиками: процессор Intel Pentium-совместимый с тактовой частотой 800 МГц и выше, оперативная память - не менее 64 Мбайт, свободное дисковое пространство - не менее 500 Мбайт, устройство для чтения компакт-дисков, монитор типа Super VGA (число цветов от 256) с диагональю не менее 15². Программное обеспечение - операционная система Windows2000/XP и выше, среда разработки приложений Microsoft Visual Studio.
Указания по технике безопасности. Техника безопасности при выполнении лабораторной работы совпадает с общепринятой для пользователей персональных компьютеров, самостоятельно не производить ремонт персонального компьютера, установку и удаление программного обеспечения; в случае неисправности персонального компьютера сообщить об этом обслуживающему персоналу лаборатории (оператору, администратору); соблюдать правила техники безопасности при работе с электрооборудованием; не касаться электрических розеток металлическими предметами; рабочее место пользователя персонального компьютера должно содержаться в чистоте; не разрешается возле персонального компьютера принимать пищу, напитки.
Методика и порядок выполнения работы. Перед выполнением лабораторной работы каждый студент получает индивидуальное задание. Защита лабораторной работы происходит только после его выполнения (индивидуального задания). При защите лабораторной работы студент отвечает на контрольные вопросы, приведенные в конце, и поясняет выполненное индивидуальное задание. Ход защиты лабораторной работы контролируется преподавателем.Порядок выполнения работы:
1. Проработать примеры, приведенные в лабораторной работе.
2. Составить программу с использованием одномерных массивов для решения задачи. Номер варианта определяется по формуле , где - номер студента по списку преподавателя.
Индивидуальное задание №1. Вариант:
1. Ввести массив А из 10 элементов, найти наибольший элемент и переставить его с первым элементом. Преобразованный массив вывести.
2. Ввести массив А из 10 элементов, найти произведение положительных элементов и вывести его на экран.
3. Ввести массив А из 10 элементов, найти наименьший элемент и переставить его с последним элементом. Преобразованный массив вывести.
4. Ввести массив А из 10 элементов, найти сумму отрицательных элементов и вывести ее на экран.
5. Ввести массив А из 10 элементов, найти сумму элементов, больших 3 и меньших 8 и вывести ее на экран.
6. Ввести массив А из 10 элементов, найти разность положительных элементов, и вывести ее на экран.
7. Ввести массив А из 10 элементов, найти произведение отрицательных элементов и вывести его на экран.
8. В заданном массиве подсчитать число нулевых элементов и вывести на экран их индексы.
9. Составить программу, выдающую индексы заданного элемента или сообщающую, что такого элемента в массиве нет.
10. Ввести массив А из 10 элементов, найти произведение положительных элементов кратных 3, их количество и вывести результаты на экран.
11. Ввести массив А из 10 элементов, найти сумму отрицательных элементов кратных 7, их количество и вывести результаты на экран.
12. Ввести массив А из 10 элементов, найти сумму элементов, больших 2 и меньших 20 и кратных 8, их количество и вывести результаты на экран.
13. Ввести массив А из 10 элементов, найти сумму элементов, меньших по модулю 3 и кратных 9, их количество и вывести результаты на экран.
14. Ввести массив А из 10 элементов, найти разность положительных элементов кратных 11, их количество и вывести результаты на экран.
15. Ввести массив А из 10 элементов, найти произведение элементов, больших 8 и меньших 18 и кратных 10, их количество и вывести результаты на экран.
16. Ввести массив А из 10 элементов, найти сумму элементов кратных 2, их количество и вывести результаты на экран.
17. Ввести массив А из 10 элементов, найти квадраты элементов кратных 4 и их количество. Преобразованный массив вывести.
18. Ввести массив А из 10 элементов, найти сумму положительных элементов кратных 5, их количество и вывести результаты на экран.
19. Ввести массив А из 10 элементов. Определить количество элементов, кратных 3 и индексы последнего такого элемента.
20. В массивах U [7], D [7], V [7] содержатся значения утренней, дневной и вечерней температуры соответственно за каждый день недели. Подсчитать среднее значение дневной температуры за каждый день.
21. В массивах А [ n ], G [ n ], F [ n ] содержатся оценки учащихся по алгебре, геометрии и физике соответственно. Определить, по какому предмету лучше успеваемость.
22. В массивах U [7], D [7], V [7] содержатся значения утренней, дневной и вечерней температуры соответственно за каждый день недели. Сформировать массив S[7], в котором будут содержаться значения среднедневной температуры. Определить среднее значение температуры а неделю.
Дата добавления: 2015-10-26; просмотров: 155 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Операнд_1 ? операнд_2 : операнд_3 4 страница | | | Операнд_1 ? операнд_2 : операнд_3 6 страница |