Операнд_1 ? операнд_2 : операнд_3 5 глава




// Индивидуальное задание №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\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\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\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\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], в котором будут содержаться значения среднедневной температуры. Определить среднее значение температуры а неделю.

23. В массивах А [ n ], G [ n ], F [ n ] содержатся оценки учащихся по алгебре, геометрии и физике соответственно. Определить среднюю оценку по алгебре и количество учащихся, не имеющих ни одной «двойки».

24. Определить средний рост девочек и мальчиков одного класса. В классе учится n учеников. (n > 15).

25. В ЭВМ по очереди поступают результаты соревнований по плаванию на дистанции 200 м, в которых участвует n спортсменов (n > 10). Выдать на экран дисплея лучший результат.

26. Из массива целых чисел составить три других, в первый из которых записать числа, кратные 5, во второй - числа, кратные 7, а в третий - остальные числа.

27. Для заданного массива определить, каких элементов больше: положительных или отрицательных. Вывести на экран их количество.

28. В заданном одномерном массиве все отрицательные элементы заменить нулями и подсчитать их количество.

 

3. Составить программу с использованием одномерных массивов для решения задачи на переупорядочивание элементов массива. В качестве алгоритма сортировки использовать сортировку методом «пузырька». Номер варианта определяется по формуле , где - номер студента по списку преподавателя.

Индивидуальное задание №2. Вариант:

1. В одномерном массиве, состоящем из n вещественных элементов, вычислить:

1) сумму отрицательных элементов массива;

2) произведение элементов массива, расположенных между максимальным и ми­нимальным элементами.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-06-21 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: