double arrow

Лабораторная работа №6. Массивы и строки

 

1. Напишите функцию reversit(), которая переворачивает строку (массив типа char). Используйте цикл for, который меняет местами первый и последний символы, затем следующие и т. д. до предпоследнего. Строка должна передаваться в функцию reversit() как аргумент.

Напишите программу для выполнения функции reversit(). Программа должна принимать строку от пользователя, вызывать функцию reversit(), а затем выводить полученный результат. Используйте метод ввода, который позволяет использовать внутренние пробелы. Протестируйте программу на примере фразы «Аргентина манит негра».

 

// lab6_1.cpp

// reverses a C-string

#include <iostream>

#include <cstring>             //for strlen()

using namespace std;

 

int main()

{

void reversit(char[]);    //prototype

const int MAX = 80;         //array size

char str[MAX];              //string

 

cout << "\nEnter a string: "; //get string from user

cin.get(str, MAX);

 

reversit(str);              //reverse the string

 

cout << "Reversed string is: "; //display it

cout << str << endl;

return 0;

}

//--------------------------------------------------------------

//reversit()

//function to reverse a string passed to it as an argument

void reversit(char s[])

{

int len = strlen(s);        //find length of string

for(int j = 0; j < len/2; j++) //swap each character

{                        // in first half

char temp = s[j];        // with character

s[j] = s[len-j-1];       // in second half

s[len-j-1] = temp;

}

}

 

2. Создайте класс employee, который содержит имя (объект класса string) и номер (тина long) служащего. Включите в него метод getdata(), предназначенный для получения данных от пользователя и помещения их в объект, и метод putdata(), для вывода данных. Предполагаем, что имя может иметь внутренние пробелы.

Напишите функцию main(), использующую этот класс. Вам нужно будет создать массив типа employee, а затем предложить пользователю ввести данные до 100 служащих. Наконец, вам нужно будет вывести данные всех служащих.

 

// lab6_2.cpp

// employee object uses a string as data

#include <iostream>

#include <string>

using namespace std;

////////////////////////////////////////////////////////////////

class employee

{

private:

string name;

long number;

public:

void getdata()     //get data from user

    {

    cout << "\nEnter name: "; cin >> name;

    cout << "Enter number: "; cin >> number;

    }

void putdata()     //display data

    {

    cout << "\n Name: " << name;

    cout << "\n Number: " << number;

    }

};

////////////////////////////////////////////////////////////////

int main()

{

employee emparr[100]; //an array of employees

int n = 0;            //how many employees

char ch;              //user response

                          

do {                  //get data from user

cout << "\nEnter data for employee number " << n+1;

emparr[n++].getdata();

cout << "Enter another (y/n)? "; cin >> ch;

} while(ch!= 'n');

  

for(int j=0; j<n; j++) //display data in array

{

cout << "\nEmployee number " << j+1;

emparr[j].putdata();

}

cout << endl;

return 0;

}

 

 

3. Напишите программу, вычисляющую среднее значение 100 интервалов, введенных пользователем. Создайте массив объектов класса Distance, как это было сделано в примере ENGLARAY этой лабораторной работы. Для вычисления среднего значения вы можете позаимствовать метод add_dist() из примера EN6LC0N лабораторной работы №5. Вам также понадобится метод, который выделяет целую часть из значения Distance. Вот одна из возможностей:

 

Void Distance::div_dist(Distance d2, int divisor) {

Float fitfeet = d2.feet + d2.inches / 12.0;

Fitfeet /= divisor;

Inches = (filfeet – feet) * 12.0;

}

 

 

// lab6_3.cpp

// averages an array of Distance objects input by user

#include <iostream>

using namespace std;

////////////////////////////////////////////////////////////////

class Distance               // English Distance class

{

private:

int feet;

float inches;

public:

Distance()             //constructor (no args)

    { feet = 0; inches = 0; }

Distance(int ft, float in) //constructor (two args)

    { feet = ft; inches = in; }

 

void getdist()         //get length from user

    {

    cout << "\nEnter feet: "; cin >> feet;

    cout << "Enter inches: "; cin >> inches;

    }

 

void showdist()        //display distance

    { cout << feet << "\'-" << inches << '\"'; }

 

void add_dist(Distance, Distance); //declarations

void div_dist(Distance, int);

};

//--------------------------------------------------------------

                     //add Distances d2 and d3

void Distance::add_dist(Distance d2, Distance d3)

{

inches = d2.inches + d3.inches; //add the inches

feet = 0;                 //(for possible carry)

if(inches >= 12.0)        //if total exceeds 12.0,

 {                      //then decrease inches

inches -= 12.0;        //by 12.0 and

feet++;                //increase feet

}                      //by 1

feet += d2.feet + d3.feet; //add the feet

}

//--------------------------------------------------------------

                   //divide Distance by int

void Distance::div_dist(Distance d2, int divisor)

{

float fltfeet = d2.feet + d2.inches/12.0; //convert to float

fltfeet /= divisor;                   //do division

feet = int(fltfeet);                  //get feet part

inches = (fltfeet-feet) * 12.0;       //get inches part

}

////////////////////////////////////////////////////////////////

int main()

{

Distance distarr[100];    //array of 100 Distances

Distance total(0, 0.0), average; //other Distances

int count = 0;            //counts Distances input

char ch;                  //user response character

  

do {

cout << "\nEnter a Distance";      //get Distances

distarr[count++].getdist();        //from user, put

cout << "\nDo another (y/n)? ";    //in array

cin >> ch;

}while(ch!= 'n');

  

for(int j=0; j<count; j++)            //add all Distances

 total.add_dist(total, distarr[j]); //to total

average.div_dist(total, count);     //divide by number

 

cout << "\nThe average is: ";         //display average

average.showdist();

cout << endl;

return 0;

}

 

4. Начните с программы, которая позволяет пользователю вводить целые числа, а затем сохранять их в массиве типа int. Напишите функцию maxint(), которая, обрабатывая элементы массива один за другим, находит наибольший. Функция должна принимать в качестве аргумента адрес массива и количество элементов в нем, а возвращать индекс наибольшего элемента. Программа должна вызвать эту функцию, а затем вывести наибольший элемент и его индекс.

 

5. Начните с класса fraction из упражнений 11 и 12 лабораторной работы №5. Напишите функцию main(), которая получает случайные дробные числа от пользователя, сохраняет их в массиве типа fraction, вычисляет среднее значение и выводит результат.

 

6. В игре бридж каждому из игроков раздают 13 карт, таким образом колода расходуется полностью. Модифицируйте программу CARDARAY этой лабораторной работы так, чтобы после перемешивания колоды она делилась на четыре части по 13 карт каждая. Каждая из четырех групп карт затем должна быть выведена.

 

7. Одним из недостатков C++ является отсутствие для бизнес-программ встроенного типа для денежных значений, такого, как $173 698 001,32. Такой денежный тип должен иметь возможность для хранения числа с фиксированной десятичной точкой точностью около 17 знаков, которого было бы достаточно для хранения национального долга в долларах и центах. К счастью, встроенный тип C++ long double имеет точность 19 цифр, поэтому мы можем использовать его как базисный для класса money, даже используя плавающую точку. Однако нам нужно будет добавить возможность ввода и вывода денежных значений с предшествующим им знаком доллара и разделенными запятыми группы по три числа: так проще читать большие числа. Первым делом при разработке такого класса напишем метод mstold(), который принимает денежную строку, то есть строку, представляющую собой некоторое количество денег типа

 

“$123.456.789.00”

 

в качестве аргумента и возвращает эквивалентное ее значению число типа long double.

Вам нужно будет обработать денежную строку как массив символов и, просматривая ее символ за символом, скопировать из нее только цифры (0-9) и десятичную точку в другую строку. Игнорируется все остальное, включая знак доллара и запятые. Затем вы можете использовать библиотечную функцию _atold() (заметим, что здесь название функции начинается с символа подчеркивания — заголовочные файлы STDLIB.H или МАТН.Н) для преобразования новой строки к числу типа long double. Предполагаем, что денежное значение не может быть отрицательным. Напишите функцию main() для проверки метода mstold(), которая несколько раз получает денежную строку от пользователя и выводит соответствующее число типа long double.

 

8. Другим недостатком C++ является отсутствие автоматической проверки индексов массива на соответствие их границам массива (это делает действия с массивами быстрыми, но менее надежными). Мы можем использовать класс для создания надежного массива, который проверяет индексы при любой попытке доступа к массиву. Напишите класс safearay, который использует массив типа int фиксированного размера (назовем его LIMIT) в качестве своей единственной переменной. В классе будет два метода. Первый, putel(), принимает индекс и значение типа int как аргументы и вставляет это значение в массив по заданному индексу. Второй, getel(), принимает индекс как аргумент и возвращает значение типа int, содержащееся в элементе с этим индексом.

 

safearay sal: // описываем массив

int temp = 12345: // описываем целое

sal.putel (7, temp); // помещаем значение temp в массив

temp = sal.getel(7.4):// получаем значение из массива

 

Оба метода должны проверять индекс аргумента, чтобы быть уверенными, что он не меньше 0 и не больше, чем LIMIT—1. Вы можете использовать этот массив без опаски, что запись будет произведена в другие части памяти.

Использование методов для доступа к элементам массива не выглядит так наглядно, как использование операции [ ]

 

9. Очередь — это устройство для хранения данных, похожее на стек. Отличие в том, что в стеке последний сохраненный элемент будет первым извлеченным, тогда как в очереди первый сохраненный элемент будет первым извлеченным. То есть в стеке используется подход «последний вошел — первый вышел» (LJFO), а в очереди используется подход «первый вошел — первый вышел» (FIFO). Очередь похожа на простую очередь посетителей магазина: первый, кто встал в очередь, будет обслужен первым.

Перепишите программу STAKARAY из этой лабораторной работы, включив в нее класс queue вместо класса stack. Кроме того, класс должен иметь два метода: один, называемый put(), для помещения элемента в очередь; и другой, называемый get(), для извлечения элемента из очереди. Эти методы эквивалентны методам push() и рор() класса stack.

Оба класса, stack и queue, используют массив для хранения данных. Однако вместо одного поля top типа int, как в классе stack, вам понадобятся два поля для очереди: одна, называемая head, указывающая на начало очереди; и вторая, tail, указывающая на конец очереди. Элементы помещаются в конец очереди (как посетители банка, становящиеся в очередь), а извлекаются из начала очереди. Конец очереди перемещается к началу по массиву по мере того, как элементы добавляются и извлекаются из очереди. Такие результаты добавляют сложности: если одна из двух переменных head или tail примут значение конца массива, то следует вернуться на начало. Таким образом, вам нужно выражение типа

 

if (tail == MAX - 1) { tail = -1 };

 

для возврата переменной tail и похожее выражение для возврата переменной head. Массив, используемый в очереди, иногда называют круговым буфером, так как начало и конец очереди циркулируют по нему вместе с ее данными.

 

 

10. Матрица — это двумерный массив. Создайте класс matrix, который предоставляет те же меры безопасности, как и класс из упражнения 7, то есть осуществляет проверку индексов массива на вхождение их в границы массива. Полем класса matrix будет массив 10 на 10. Конструктор должен позволять программисту определить реальный размер массива (допустим, сделать его меньше, чем 10 на 10). Методам, предназначенным для доступа к членам матрицы, теперь нужны два индекса: но одному для каждой размерности массива. Вот фрагмент функции main(), которая работает с таким классом:

 

matrix ml(3,4); // Описываем матрицу

int temp = 12345; // Описываем целое

ml.putel(4, 4, temp); // Помещаем значение

temp = ml.getel(7,4); // Получаем значение из матрицы

 

11. Вернемся к обсуждению денежных строк из упражнения 6. Напишите метод ldtoms() для преобразования числа типа long double в денежную строку, представляющую это число. Для начала вам нужно проверить, что значение long double не очень большое. Мы предполагаем, что вы не будете пытаться преобразовать число, больше чем 9 999 999 999 999 990.00. Затем преобразуем long double в строку (без знака доллара и запятых), хранящуюся в памяти, используя объект ostrstream, как рассматривалось ранее в этой лабораторной работе. Получившаяся отформатированная строка может быть помещена в буфер, называющийся ustring.

Затем вам нужно будет создать другую строку, начинающуюся со знака доллара, далее копируем цифру за цифрой из строки ustring, начиная слева и вставляя запятые через каждые три цифры. Также вам нужно подавлять нули в начале строки. Например, вы должны вывести $3 124.95, а не $0 000 000 000 003 124.95. Не забудьте закончить строку нулевым символом '\0'.

Напишите функцию main() для тестирования этой функции путем многократного ввода пользователем чисел типа long double и вывода результата в виде денежной строки.

 

12. Создайте класс ЬМопеу. Он должен хранить денежные значения как long double. Используйте метод mstold() для преобразования денежной строки, введенной пользователем, в long double, и метод ldtoms() для преобразования числа типа long double в денежную строку для вывода (см. упражнения 6 и 10). Вы можете вызывать для ввода и вывода методы getmoney()и putmoney(). Напишите другой метод класса для сложения двух объектов типа ЬМопеу и назовите его madd(). Сложение этих объектов легко произвести: просто сложите переменную типа long double одного объекта с такой же переменной другого объекта. Напишите функцию main(), которая просит пользователя несколько раз ввести денежную строку, а затем выводит сумму значений этих строк. Вот как может выглядеть определение класса:

 

class bMoney {

private: long double money;

public:

bMoney();

bMoney(char s[]);

void madd(bMoney m1, bMoneym2);

void getmoney();

void putmoney();

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



Сейчас читают про: